技术部基本上是一个和尚庙,女生非常少,即使有女生也略微有点抽象,小婉就不一样,她气质绝佳。
上午,同事小婉刚才从老板办公室里出来,看上去一脸不悦的样子。为了表示对同事的关(ba)心(gua),我就主动和她聊一聊。
Apache SkyWalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。这些我是知道的,它提供了分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
至于小婉问我的SkyWalking的告警,我还真不清楚,是我的知识盲区啊,我只能如实跟小婉说了。
哎,我都说了些什么,幸好我机灵一些,拖到了到下午,还有几个小时,赶快恶补一下。
Apache SkyWalking告警是由一组规则驱动,这些规则定义在config/alarm-settings.yml
文件中。
告警规则的定义分为三部分。
告警规则有两种类型,单独规则(Individual Rules)和复合规则(Composite Rules),复合规则是单独规则的组合。
单独规则主要有以下几点:
_rule
结尾。标签的设置必须把数据存储在meter-system中,例如:Prometheus, Micrometer。以上四个标签设置必须实现LabeledValueHolder
接口。
对于多个值指标,例如percentile,阈值是一个数组。像value1
value2
value3
value4
value5
这样描述。
每个值可以作为度量中每个值的阈值。如果不想通过此值或某些值触发警报,则将值设置为 -
。
例如在percentile中,value1
是P50的阈值,value2
是P75的阈值,那么-,-,value3, value4, value5
的意思是,没有阈值的P50和P75的percentile告警规则。
>
, >=
, <
, <=
, =
。true
或者false
,指定规则是否可以发送告警,或者仅作为复合规则的条件。举个例子:
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秒
复合规则仅适用于针对相同实体级别的告警规则,例如都是服务级别的告警规则:service_percent_rule && service_resp_time_percentile_rule
。
不可以编写不同实体级别的告警规则,例如服务级别的一个告警规则和端点级别的一个规则:service_percent_rule && endpoint_percent_rule
。
复合规则主要有以下几点:
_rule
结尾。&&
, ||
, ()
操作符。举个例子:
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 要求一个点对点的 Web 容器。告警的消息会通过 HTTP 请求进行发送,请求方法为 POST
,Content-Type
为 application/json
,JSON 格式包含以下信息:
alarm-settings.yml
中配置的规则名。举个例子:
[{
"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": "[email protected] of one-more-service",
"id0": "dWF0LWxib2Mtc2VydmljZQ==.1_ZTRiMzEyNjJhY2FhNDdlZjkyYTIyYjZhMmI4YTdjYjFAMTcyLjI0LjMwLjEzOA==",
"id1": "",
"ruleName": "instance_jvm_young_gc_count_rule",
"alarmMessage": "实例【[email protected] 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
}]
告警消息将使用 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 {
}
您需要遵循传入Webhooks入门指南并创建新的Webhooks。
如果您按以下方式配置了Slack Incoming Webhooks,则告警消息将按 Content-Type
为 application/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
只有微信的企业版才支持 Webhooks ,如何使用微信的 Webhooks 可参见如何配置群机器人。
如果您按以下方式配置了微信的 Webhooks ,则告警消息将按 Content-Type
为 application/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
您需要遵循自定义机器人开放并创建新的Webhooks。为了安全起见,您可以为Webhook网址配置可选的密钥。
如果您按以下方式配置了钉钉的 Webhooks ,则告警消息将按 Content-Type
为 application/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
基本这些就差不多了,完全可以忽悠住小婉。想想小婉那崇拜的眼神和仰慕的表情,我擦了擦嘴巴的口水。
文章持续更新,微信搜索「万猫学社」第一时间阅读。
关注后回复「电子书」,免费获取12本Java必读技术书籍。