详解Apache SkyWalking 告警配置指南


Posted in Servers onApril 22, 2021

Apache SkyWalking

Apache SkyWalking是分布式系统的应用程序性能监视工具(Application Performance Management,APM),专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。

它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。

Apache SkyWalking告警

Apache SkyWalking告警是由一组规则驱动,这些规则定义在config/alarm-settings.yml文件中。

告警规则的定义分为三部分。

  • 告警规则:定义了触发告警所考虑的条件。
  • webhook:当告警触发时,被调用的服务端点列表。
  • gRPCHook:当告警触发时,被调用的远程gRPC方法的主机和端口。
  • Slack Chat Hook:当告警触发时,被调用的Slack Chat接口。
  • 微信 Hook:当告警触发时,被调用的微信接口。
  • 钉钉 Hook:当告警触发时,被调用的钉钉接口。

告警规则

告警规则有两种类型,单独规则(Individual Rules)和复合规则(Composite Rules),复合规则是单独规则的组合。

单独规则(Individual Rules)

单独规则主要有以下几点:

  • 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
  • metrics-name:度量名称,也是OAL脚本中的度量名。默认配置中可以用于告警的度量有:服务,实例,端点,服务关系,实例关系,端点关系。它只支持long,double和int类型。
  • include-names:包含在此规则之内的实体名称列表。
  • exclude-names:排除在此规则以外的实体名称列表。
  • include-names-regex:提供一个正则表达式来包含实体名称。如果同时设置包含名称列表和包含名称的正则表达式,则两个规则都将生效。
  • exclude-names-regex:提供一个正则表达式来排除实体名称。如果同时设置排除名称列表和排除名称的正则表达式,则两个规则都将生效。
  • include-labels:包含在此规则之内的标签。
  • exclude-labels:排除在此规则以外的标签。
  • include-labels-regex:提供一个正则表达式来包含标签。如果同时设置包含标签列表和包含标签的正则表达式,则两个规则都将生效。
  • exclude-labels-regex:提供一个正则表达式来排除标签。如果同时设置排除标签列表和排除标签的正则表达式,则两个规则都将生效。

标签的设置必须把数据存储在meter-system中,例如:Prometheus, Micrometer。以上四个标签设置必须实现LabeledValueHolder接口。

  • threshold:阈值。

对于多个值指标,例如percentile,阈值是一个数组。像value1 value2 value3 value4 value5这样描述。
每个值可以作为度量中每个值的阈值。如果不想通过此值或某些值触发警报,则将值设置为 -
例如在percentile中,value1是P50的阈值,value2是P75的阈值,那么-,-,value3, value4, value5的意思是,没有阈值的P50和P75的percentile告警规则。

  • op:操作符,支持>, >=, <, <=, =
  • period:多久告警规则需要被检查一下。这是一个时间窗口,与后端部署环境时间相匹配。
  • count:在一个周期窗口中,如果按op计算超过阈值的次数达到count,则发送告警。
  • only-as-condition:true或者false,指定规则是否可以发送告警,或者仅作为复合规则的条件。
  • silence-period:在时间N中触发报警后,在N -> N + silence-period这段时间内不告警。 默认情况下,它和period一样,这意味着相同的告警(同一个度量名称拥有相同的Id)在同一个周期内只会触发一次。
  • message:该规则触发时,发送的通知消息。

举个例子:

rules:
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
  service_instance_resp_time_rule:
    metrics-name: service_instance_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 10
    message: 实例【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
  endpoint_resp_time_rule:
    metrics-name: endpoint_avg
    threshold: 1000
    op: ">"
    period: 10
    count: 2
    message: 端点【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

复合规则(Composite Rules)

复合规则仅适用于针对相同实体级别的告警规则,例如都是服务级别的告警规则:service_percent_rule && service_resp_time_percentile_rule
不可以编写不同实体级别的告警规则,例如服务级别的一个告警规则和端点级别的一个规则:service_percent_rule && endpoint_percent_rule

复合规则主要有以下几点:

  • 规则名称:在告警信息中显示的唯一名称,必须以_rule结尾。
  • expression:指定如何组成规则,支持&&, ||, ()操作符。
  • message:该规则触发时,发送的通知消息。

举个例子:

rules:
  service_resp_time_rule:
    metrics-name: service_resp_time
    op: ">"
    threshold: 1000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的平均响应时间在最近10分钟内有2分钟超过1秒
  service_sla_rule:
    metrics-name: service_sla
    op: "<"
    threshold: 8000
    period: 10
    count: 2
    silence-period: 10
    message: 服务【{name}】的成功率在最近10分钟内有2分钟低于80%
composite-rules:
  comp_rule:
    expression: service_resp_time_rule && service_sla_rule
    message: 服务【{name}】在最近10分钟内有2分钟超过1秒平均响应时间超过1秒并且成功率低于80%

Webhook

Webhook 要求一个点对点的 Web 容器。告警的消息会通过 HTTP 请求进行发送,请求方法为 POSTContent-Typeapplication/json,JSON 格式包含以下信息:

  • scopeId:目标 Scope 的 ID。
  • name:目标 Scope 的实体名称。
  • id0:Scope 实体的 ID。id1:未使用。
  • ruleName:您在 alarm-settings.yml 中配置的规则名。
  • alarmMessage. 告警消息内容。
  • startTime. 告警时间戳,当前时间与 UTC 1970/1/1 相差的毫秒数。

举个例子:

[{
	"scopeId": 1, 
	"scope": "SERVICE",
	"name": "one-more-service", 
	"id0": "b3JkZXItY2VudGVyLXNlYXJjaC1hcGk=.1",  
	"id1": "",  
    "ruleName": "service_resp_time_rule",
	"alarmMessage": "服务【one-more-service】的平均响应时间在最近10分钟内有2分钟超过1秒",
	"startTime": 1617670815000
}, {
	"scopeId": 2,
	"scope": "SERVICE_INSTANCE",
	"name": "e4b31262acaa47ef92a22b6a2b8a7cb1@192.168.30.11 of one-more-service",
	"id0": "dWF0LWxib2Mtc2VydmljZQ==.1_ZTRiMzEyNjJhY2FhNDdlZjkyYTIyYjZhMmI4YTdjYjFAMTcyLjI0LjMwLjEzOA==",
	"id1": "",
    "ruleName": "instance_jvm_young_gc_count_rule",
	"alarmMessage": "实例【e4b31262acaa47ef92a22b6a2b8a7cb1@192.168.30.11 of one-more-service】的YoungGC次数在最近10分钟内有2分钟超过10次",
	"startTime": 1617670815000
}, {
	"scopeId": 3,
	"scope": "ENDPOINT",
	"name": "/one/more/endpoint in one-more-service",
	"id0": "b25lcGllY2UtYXBp.1_L3RlYWNoZXIvc3R1ZGVudC92aXBsZXNzb25z",
	"id1": "",
    "ruleName": "endpoint_resp_time_rule",
	"alarmMessage": "端点【/one/more/endpoint in one-more-service】的平均响应时间在最近10分钟内有2分钟超过1秒",
	"startTime": 1617670815000
}]

gRPCHook

告警消息将使用 Protobuf 类型通过gRPC远程方法发送。消息格式的关键信息定义如下:

syntax = "proto3";

option java_multiple_files = true;
option java_package = "org.apache.skywalking.oap.server.core.alarm.grpc";

service AlarmService {
    rpc doAlarm (stream AlarmMessage) returns (Response) {
    }
}

message AlarmMessage {
    int64 scopeId = 1;
    string scope = 2;
    string name = 3;
    string id0 = 4;
    string id1 = 5;
    string ruleName = 6;
    string alarmMessage = 7;
    int64 startTime = 8;
}

message Response {
}

Slack Chat Hook

您需要遵循传入Webhooks入门指南并创建新的Webhooks。

如果您按以下方式配置了Slack Incoming Webhooks,则告警消息将按 Content-Typeapplication/json 通过HTTP的 POST 方式发送。

举个例子:

slackHooks:
  textTemplate: |-
    {
      "type": "section",
      "text": {
        "type": "mrkdwn",
        "text": ":alarm_clock: *Apache Skywalking Alarm* \n **%s**."
      }
    }
  webhooks:
    - https://hooks.slack.com/services/x/y/z

微信Hook

只有微信的企业版才支持 Webhooks ,如何使用微信的 Webhooks 可参见如何配置群机器人

如果您按以下方式配置了微信的 Webhooks ,则告警消息将按 Content-Typeapplication/json 通过HTTP的 POST 方式发送。

举个例子:

wechatHooks:
  textTemplate: |-
    {
      "msgtype": "text",
      "text": {
        "content": "Apache SkyWalking 告警: \n %s."
      }
    }
  webhooks:
    - https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=dummy_key

钉钉 Hook

您需要遵循自定义机器人开放并创建新的Webhooks。为了安全起见,您可以为Webhook网址配置可选的密钥。

如果您按以下方式配置了钉钉的 Webhooks ,则告警消息将按 Content-Typeapplication/json 通过HTTP的 POST 方式发送。

举个例子:

dingtalkHooks:
  textTemplate: |-
    {
      "msgtype": "text",
      "text": {
        "content": "Apache SkyWalking 告警: \n %s."
      }
    }
  webhooks:
    - url: https://oapi.dingtalk.com/robot/send?access_token=dummy_token
      secret: dummysecret

到此这篇关于Apache SkyWalking 告警配置指南的文章就介绍到这了,更多相关SkyWalking 告警配置内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
nginx前后端同域名配置的方法实现
Mar 31 Servers
nginx location中多个if里面proxy_pass的方法
Mar 31 Servers
nginx proxy_cache 缓存配置详解
Mar 31 Servers
nginx反向代理时如何保持长连接
Mar 31 Servers
apache基于端口创建虚拟主机的示例
Apr 24 Servers
教你快速开启Apache SkyWalking的自监控
Apr 25 Servers
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
Nov 17 Servers
为Centos安装指定版本的Docker
Apr 01 Servers
CentOS7安装MySQL8的超级详细教程(无坑!)
Jun 10 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
git中cherry-pick命令的使用教程
Jun 25 Servers
ubuntu开机后ROS程序自启动问题
Dec 24 Servers
apache基于端口创建虚拟主机的示例
Apr 22 #Servers
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
Apr 04 #Servers
Nginx工作原理和优化总结。
利用Nginx代理如何解决前端跨域问题详析
Apr 02 #Servers
Nginx URL重写rewrite机制原理及使用实例
Apr 01 #Servers
nginx限制并发连接请求数的方法
Apr 01 #Servers
Nginx已编译的nginx-添加新模块
You might like
php面向对象全攻略 (九)访问类型
2009/09/30 PHP
数据库中排序的对比及使用条件详解
2012/02/23 PHP
php中获取主机名、协议及IP地址的方法
2014/11/18 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
Zend Framework教程之Zend_Config_Ini用法分析
2016/03/23 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
PHP simplexml_load_file()函数讲解
2019/02/03 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
(仅IE下有效)关于checkbox 三态
2007/05/12 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
AngularJs 弹出模态框(model)
2016/04/07 Javascript
javascript中获取class的简单实现
2016/07/12 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
mpvue+vant app搭建微信小程序的方法步骤
2019/02/11 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
[01:38]完美世界DOTA2联赛PWL S3 集锦第四期
2020/12/21 DOTA
详解Python中的文本处理
2015/04/11 Python
Python中isnumeric()方法的使用简介
2015/05/19 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
Python新手入门最容易犯的错误总结
2017/04/24 Python
对Python中range()函数和list的比较
2018/04/19 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
介绍一下RMI的基本概念
2016/12/17 面试题
本科毕业生求职信
2014/06/15 职场文书
2014年宣传思想工作总结
2014/12/10 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
小学语文继续教育研修日志
2015/11/13 职场文书
导游词之介休绵山
2019/12/31 职场文书
《没有任何借口》读后感:完美的执行能力
2020/01/07 职场文书
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸