10分钟搞定SkyWalking告警:MAL语言自定义业务指标全指南
你是否还在为系统异常不能及时发现而烦恼?是否希望根据业务特点定制告警规则?本文将带你通过MAL(Meter Analysis Language)实现SkyWalking告警指标的自定义,无需复杂编程,只需简单配置即可让告警系统精准反映业务健康状态。
MAL语言基础:从数据类型到核心操作
MAL是SkyWalking提供的指标分析语言,支持对指标数据进行过滤、聚合和转换。在MAL中,所有操作围绕两种数据类型展开:Sample family(样本族) 和 Scalar(标量)。样本族是一组具有相同名称的指标集合,如instance_trace_count可能包含多个不同标签的样本:
instance_trace_count{region="us-west",az="az-1"} 100
instance_trace_count{region="us-east",az="az-3"} 20
instance_trace_count{region="asia-north",az="az-1"} 33
标签过滤与值过滤
通过标签过滤可以精准筛选所需样本,MAL提供四种标签操作:tagEqual、tagNotEqual、tagMatch和tagNotMatch。例如筛选特定可用区的样本:
instance_trace_count.tagMatch("region", "us-west|asia-north").tagEqual("az", "az-1")
值过滤则根据数值条件筛选,如找出请求量大于等于33的样本:
instance_trace_count.valueGreaterEqual(33)
聚合运算:从分散数据到业务指标
聚合操作是MAL的核心能力,支持sum、min、max、avg和count等运算。例如按可用区汇总请求量:
instance_trace_count.sum(by=['az'])
输出结果将按az标签聚合:
instance_trace_count{az="az-1"} 133 // 100 + 33
instance_trace_count{az="az-3"} 20
注意:聚合操作仅对单次批量样本有效,如需跨实例聚合,需结合MQE的AggregateLabels操作
实战:自定义业务告警指标
1. 配置文件结构
MAL规则定义在YAML配置文件中,放置于$CLASSPATH/meter-analyzer-config等目录。典型配置结构如下:
initExp: <初始化表达式>
filter: <指标过滤条件>
metricsRules:
- name: <规则名称>
exp: <MAL表达式>
完整示例可参考OAP自监控配置
2. 错误率告警规则
假设需要监控API错误率,当错误率超过20%时触发告警。首先定义错误率计算规则:
metricsRules:
- name: api_error_rate
exp: (sum(instance_trace_analysis_error_count) / sum(instance_trace_count)).service(['service'])
然后在告警配置alarm-settings.yml中添加规则:
rules:
api_error_rate_rule:
expression: sum(api_error_rate > 0.2) >= 1
period: 5
message: API error rate of service {name} is higher than 20%
tags:
level: CRITICAL
3. 响应时间百分位告警
通过MAL的直方图函数可计算响应时间百分位,例如P95延迟:
metricsRules:
- name: endpoint_p95_latency
exp: histogram_percentile(endpoint_latency.histogram(le='le'), 95).endpoint(['service'], ['endpoint'])
对应告警规则:
rules:
endpoint_latency_rule:
expression: sum(endpoint_p95_latency > 500) >= 1
period: 10
message: P95 latency of endpoint {name} exceeds 500ms
tags:
level: WARNING
高级技巧:标签处理与K8s元数据集成
动态标签管理
使用tag函数可灵活修改标签,例如重命名标签:
service_resp_time.tag({ tags -> return ['new_service': tags.service, 'instance': tags.instance] })
K8s元数据增强
通过retagByK8sMeta函数可将Pod标签转换为服务信息:
container_cpu_usage_seconds_total.retagByK8sMeta('service', K8sRetagType.Pod2Service, 'pod', 'namespace')
转换后样本将新增服务标签:
container_cpu_usage_seconds_total{pod="my-nginx-5dc4865748-mbczh", service="nginx-service.default"} 2
规则调试与最佳实践
常见问题排查
性能优化建议
- 避免在规则中使用复杂正则表达式
- 对高频指标使用
downsampling(LATEST)减少计算量 - 通过
filter提前过滤无关指标
总结与扩展学习
通过MAL语言,我们可以将原始监控数据转换为业务告警指标,实现从技术监控到业务监控的跨越。更多高级功能如:
- 时间函数:
rate()计算增长率,increase()计算增量 - 直方图分析:
histogram_percentile()实现延迟分布监控 - 多维度聚合:结合
service()/instance()函数实现层级监控
建议进一步阅读:
通过本文介绍的方法,你可以快速构建贴合业务需求的监控告警体系,让SkyWalking真正成为业务稳定性的守护神。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



