入 SkyWalking 生产落地的关键环节 —— 监控与告警配置。
一份合理的 alarm-settings.yml 文件,能让系统在出现性能瓶颈、错误激增时自动通知你,真正实现“从被动救火到主动防控”。
下面,我为你提供一份 实战级、可落地的告警规则配置指南,包含:
- ✅ 告警规则编写语法
- ✅ 常见场景的规则示例(响应时间、错误率、JVM 等)
- ✅ 生产环境最佳实践
- ✅ 如何测试告警是否生效
🚨 SkyWalking 告警配置:alarm-settings.yml 实战指南
📌 文件路径:
apache-skywalking-apm-bin/config/alarm-settings.yml
一、告警规则基本结构
rules:
# 规则名称(自定义,建议语义化)
rule_name:
metrics-name: service_resp_time # 监控的指标
op: ">" # 比较操作符
threshold: 1000 # 阈值(单位:ms/%等)
period: 10 # 统计周期(分钟)
count: 3 # 连续几个周期满足条件触发
silence-period: 5 # 静默期(分钟),防止重复告警
message: "服务响应超时: {name}, 当前值: {value}ms" # 告警消息模板
二、常用指标名称(metrics-name)
| 指标 | 说明 |
|---|---|
service_resp_time | 服务 P99 响应时间(ms) |
service_sla | 服务成功率(%) |
service_cpm | 每分钟调用次数(Calls Per Minute) |
instance_resp_time | 实例 P99 响应时间 |
jvm_memory_old_usage | JVM 老年代使用率(%) |
jvm_gc_count | Full GC 次数/分钟 |
endpoint_avg | 端点(接口)平均响应时间 |
database_access_resp_time | 数据库访问 P99 耗时 |
database_connection_usage | 数据库连接池使用率 |
🔍 查看所有指标:SkyWalking UI → Metrics Browser
三、实战告警规则示例
1. 🔥 服务响应时间过高(P99 > 1秒 持续10分钟)
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 1000
period: 10
count: 3
silence-period: 5
message: "⚠️ 服务响应超时\n📌 服务: {name}\n📊 P99: {value}ms\n🕒 发生时间: {startTime}"
2. ❌ 服务错误率过高(SLA < 95%)
service_sla_rule:
metrics-name: service_sla
op: "<"
threshold: 95.0
period: 10
count: 3
silence-period: 5
message: "❌ 服务错误率过高\n📌 服务: {name}\n📊 成功率: {value}%\n💡 可能存在异常或依赖故障\n🕒 发生时间: {startTime}"
3. 📉 服务流量突降(可能服务宕机)
service_qps_drop_rule:
metrics-name: service_cpm
op: "<"
threshold: 10
period: 5
count: 3
silence-period: 10
message: "📉 服务流量异常下降\n📌 服务: {name}\n📊 当前QPS: {value}\n💡 可能服务宕机或注册异常\n🕒 发生时间: {startTime}"
4. 🔥 某关键接口响应时间 > 2秒
critical_endpoint_slow:
metrics-name: endpoint_avg
op: ">"
threshold: 2000
period: 5
count: 3
silence-period: 5
endpoint-name: "/api/order/create" # 可选:只监控特定接口
message: "🐌 关键接口超时\n📌 接口: {name}\n📊 平均耗时: {value}ms\n🕒 发生时间: {startTime}"
5. 💣 JVM 老年代内存使用率 > 90%
jvm_memory_high_rule:
metrics-name: jvm_memory_old_usage
op: ">"
threshold: 90.0
period: 10
count: 3
silence-period: 15
message: "MemoryWarning! JVM老年代过高\n📌 服务: {name}\n📊 使用率: {value}%\n💡 建议检查内存泄漏\n🕒 发生时间: {startTime}"
6. 🔄 Full GC 频繁(> 5次/分钟)
jvm_gc_freq_rule:
metrics-name: jvm_gc_count
op: ">"
threshold: 5
period: 1
count: 3
silence-period: 10
message: "'gc' JVM GC频繁\n📌 服务: {name}\n📊 Full GC次数/分钟: {value}\n💡 可能存在内存压力或对象频繁创建\n🕒 发生时间: {startTime}"
四、通知渠道配置(Webhook)
SkyWalking 支持通过 Webhook 发送到:
- 钉钉
- 飞书
- 企业微信
- Prometheus Alertmanager
- 自定义告警中心
webhooks:
# 钉钉机器人(需设置安全令牌)
- https://oapi.dingtalk.com/robot/send?access_token=your-dingtalk-token
# 飞书机器人
- https://open.feishu.cn/open-apis/bot/v2/hook/your-feishu-token
# 企业微信机器人
- https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your-wechat-work-key
# 自定义告警系统
# - http://alert-center.internal/api/v1/alerts
✅ 消息格式:SkyWalking 会自动发送 JSON 到 Webhook,包含告警详情。
五、生产环境最佳实践
| 项目 | 建议 |
|---|---|
| 🎯 分级告警 | 分 CRITICAL / WARN,不同等级通知不同人 |
| 🔕 静默期 | 设置 silence-period 避免刷屏(如 5~15 分钟) |
| 🧩 分环境配置 | dev / test / prod 使用不同阈值或关闭部分告警 |
| 📊 避免误报 | count: 3 表示连续3个周期才触发,避免瞬时抖动 |
| 📅 定期回顾 | 每月 review 无效告警,优化规则 |
| 🛡️ 安全通知 | Webhook 使用加签或 Token 认证 |
六、如何测试告警是否生效?
方法 1:制造异常流量
写一个测试接口,模拟慢响应和错误:
@GetMapping("/test/slow")
public String slow() throws InterruptedException {
Thread.sleep(2000);
return "slow";
}
@GetMapping("/test/error")
public String error() {
if (Math.random() > 0.5) {
throw new RuntimeException("模拟异常");
}
return "ok";
}
连续调用:
for i in {1..100}; do curl http://localhost:8080/test/slow; done
方法 2:查看 OAP 日志
tail -f logs/alarm.log
应看到类似:
[Alarm] Rule: service_resp_time_rule, Service: order-service, Value: 1250ms
[Alarm] Webhook sent to: https://oapi.dingtalk.com/...
方法 3:检查是否收到通知
- 查看钉钉/飞书群消息
- 检查邮件收件箱(如果配置了 email)
七、高级技巧
| 技巧 | 说明 |
|---|---|
| 📌 自定义消息模板 | 使用 {name}, {value}, {startTime} 等变量 |
| 🎯 按服务过滤 | 使用 include-names / exclude-names |
| ⏱️ 动态阈值 | 目前不支持,可通过外部系统实现(如 Prometheus) |
| 📈 结合 Grafana | 将 SkyWalking 指标导出到 Prometheus,用 Alertmanager 做更复杂告警 |
✅ 总结:告警规则编写口诀
“一选指标,二设阈值,三定周期,四配通知”
只要记住:
- 告警是基于聚合指标的
- 规则是周期性检查的
- 消息要清晰可读
- 通知要准确送达
你就能构建一个智能、可靠、不扰民的监控告警体系。
7126

被折叠的 条评论
为什么被折叠?



