MySQL 表达式语法(商业版)

1. 说明

本文主要介绍告警规则中表达式模式语法如何与 MySQL 告警相结合。你可以根据本文的使用场景介绍,体会语法与业务结合的深度用法。

1.1 阅读前必读

在阅读学习本文前,需要了解表达式模式的基本语法。请参考链接:表达式语法

1.2 使用场景

本文将以打车订单为例进行报警展示说明,示例数据库首先创建了一个taxi_service的数据库,数据库里面创建了一个orders表,表字段具体含义如下:

order_id: 订单ID

passenger_name: 乘客姓名

driver_name: 司机姓名

status:订单的状态,可以是以下几种:

  • Payment Successful(支付成功)
  • Order Canceled(订单取消)

abnormal_status:订单的异常状态

  • No Abnormality(无异常)
  • Low Level Abnormality(低级别异常)
  • Medium Level Abnormality(中级别异常)
  • High Level Abnormality(高级别异常)

created_at: 创建时间

updated_at: 更新时间

completed_at: 完成时间

order_amount: 订单金额

order_duration: 订单持续时间(分钟)

mysql表达式001

2 算数运算

2.1 单查询条件运算

计算最近3天的支付成功订单的平均金额,如果平均金额小于60触发报警。

$A.avg_successful_payments < 60

mysql表达式002

2.2 多查询条件优先级运算

计算近3天取消订单金额与总金额占比,如果超过5%触发报警。

$B.total_canceled_orders / ($A.total_successful_payments + $B.total_canceled_orders) * 100 > 5

mysql表达式003

3. 关系运算符

计算近6小时订单无异常状态且订单取消金额大于100或近6小时订单高级别异常状态且订单取消金额大于100,触发报警.

$A.status == 'Order Canceled' && $A.abnormal_status == "No Abnormality" && $A.total_order_amount > 100 || $A.status == 'Order Canceled' && $A.abnormal_status == "High Level Abnormality" && $A.total_order_amount > 100

mysql表达式004

4. 逻辑运算符

计算昨日取消订单量大于前日取消订单量并且昨日支付订单占比前日支付订单低于60%,触发报警。

$A.failed_orders > $B.failed_orders and $A.successful_orders / $B.successful_orders > 0.6

mysql表达式005

5. 元素值比对

计算 Driver13 和 Driver33 两位司机,订单金额大于1000 或 订单数大于50,触发报警。

($A.driver_name in ["Driver13","Driver33"] && $A.total_order_amount > 1000) || ($A.driver_name in ["Driver13","Driver33"] && $A.counts > 50)

mysql表达式006

注意:in 和 not in 是用于检查元素是否存在于数组中,不是模糊匹配。

6. 字符串包含

计算司机姓名包含”Driver9”且订单总金额大于3000,触发报警。(关键词可以是一个 error code)

$A.driver_name contains "Driver9" && $A.total_order_amount > 3000

mysql表达式007

7. 正则规则匹配

计算订单异常状态符合匹配级所有别异常正则且count值大于55,触发报警。

$A.abnormal_status matches ".* Level Abnormality$" && $A.total_counts > 55

mysql表达式008

8. 值范围区间

计算订单金额在50-100区间的单数大于1的,触发告警。

$A.total_counts >1 && between($A.order_amount, [50,100])

mysql表达式009

注意:between 和 not between 适用于非 string 类型值。

9. 时间比对

计算超过60s未更新数据,触发告警。

now().Unix() - $A.create_at >60

mysql表达式010

create_at 是数据的时间戳字段,如下图所示。

mysql表达式011

注意:时间戳只支持加减运算。