背景
Zabbix作为常用的开源监控系统,提供了丰富的告警规则用于系统监控,同时支持多种告警通知渠道。您可以将日志服务告警系统设为Zabbix的一个通知渠道,由日志服务告警系统完成告警降噪、通知等处理,并且通过包括短信、电话、微信、钉钉、邮箱在内的10多种通知渠道发送给用户。
Zabbix接入SLS
要将zabbix的告警消息接入SLS,主要分为两个步骤:在SLS中创建开放告警应用;将SLS开放告警作为新的MediaType接入zabbix。创建开放告警应用的具体步骤,可以参考文章SLS开放告警简介。下面介绍下如何将zabbix的告警消息接入到SLS中。
获取回调地址
在创建开放告警应用之后,通过点击接口按钮,打开如下图所示的回调地址查看窗口。
接口信息
办议:Zabbix
河源
地域:
局域网/PC,注意需要将(ACCESSKEYID替换为具备权限的密钥ID密钥配置
nheyuanzintanetlogalyuns.omnwM
公网,注意需要将(ACCESSKEY_ID替换为具备权限的密钥ID密钥配置
ch-heyuanlogalyuns.omntw
关闭
回调地址由两部分构成:域名部分和子路径部分。其中域名部分属于SLS的接入地址,和地域相关,每个地域都有各自不同的接入地址;子路径部分包括用于发送消息的Access Key Id和开放告警应用。如下所示为一个完整的SLS回调地址:
cn-heyuan-intranet.log.aliyuncs.com/event/webhook/RAMAK_{ACCESS_KEY_ID}/a123_asdad
其中"cn-heyuan-intranet.log.aliyuncs.com"为域名部分,属于SLS通用的接入地址(endpoint);event/webhook/RAMAK_{ACCESS_KEY_ID}/a123_asdad 则为子路径部分。需要注意的是,用户需要将子路径部分中的{ACCESS_KEY_ID}替换为具体阿里云RAM账户的Access Key Id,并且将权限策略AliyunLogOpenEventWrite赋予该账户;a123_asdad则为该开放告警应用的id,用于唯一区别不同的开放告警应用。
Zabbix接入配置
配置全局变量ZABBIX.SERVER.URL
全局变量{$ZABBIX.SERVER.URL}用来指定zabbix页面的跳转地址,在告警消息中生成跳转链接。如果不设置,使用默认值127.0.0.1。
配置步骤
- 在左侧导航栏中,选择Administration > General > Macros。
- 在Macros页面中,单击Add。
- 添加全局变量ZABBIX.SERVER.URL,值为Zabbix控制台的访问地址。
127.0.0.1/zabbix.php?actionmacrosedit
ZABBIX
Macros
Zabbadocker
Q
Description
Value
Macro
Remove
SSNMPCOMMUNITY
descipton
pUbLIC
Monitoring
(SZABBIX.SERVERURL)
description
127.0.0.1
lnventory
Add
u
Reports
Updato
Connguration
Administration
Gui
Autoreglstraton
Proxles
Housekeeping
Authentcaton
lmagos
Uscrgroups
iconmapplng
Userroles
RoguLarexpresslons
Users
Macros
Tnggerdsplayingoptions
Medlatypes
Modules
Scripts
APItokens
Queue
Other
添加通知渠道Alibaba Cloud SLS (Log Service)
通过导入文件alibaba_cloud_sls.yml将Alibaba Cloud SLS作为新的通知渠道添加到zabbix的media types中。
配置步骤
- 在左侧导航栏中,选择Administration > Media types。
- 在Media types页面的右上角,单击Import。
- 在Import对话框中,选择您已下载的alibaba_cloud_sls.yml文件,选中Update existing,然后单击Import。
- 在Media types页面中,单击Alibaba Cloud SLS (Log Service)。
- 在Parameters配置项中,修改hook_url字段的值,然后单击Update。
将hook_url字段的值修改为您在日志服务中创建开放告警服务和应用后生成的接口信息(完整URL)。如何获取,请参见获取接口信息。
为用户设置通知渠道
添加完新的通知渠道,还需要为用户添加通知刚刚创建的SLS通知渠道。这样发送给该用户的通知消息才能够发送到SLS中。
配置步骤
- 在左侧导航栏中,选择Administration > Users。
- 在用户列表中,单击目标用户。您也可以单击Create user,创建一个新用户。
- 在Media页签中,单击其中一个Media对应的Edit。您也可以单击Add,创建一个新的Media。
- 在Media面板中,选择Type为Alibaba Cloud SLS (Log Service),然后单击Update。
Permissions
User
Media
Media
Useifseverity
Action
SendtoWhenactive
Status
Type
x
Media
AlibabaCloudSLsLogService
Type
Alibaba
Sendto
1-7,00:00-24:00
*Whenactive
Notclassified
Useifseverity
lnformation
Warning
Average
High
Disaster
Enabled
Update
Cancel
配置触发器
如果您对触发器的通知渠道进行了限制,才需要变更触发器配置,否则保持之前配置即可。
配置步骤
- 在左侧导航栏中,选择Configuration > Actions > Trigger actions。
- 在Trigger actions页面中,单击您已创建的触发器。
- 查看Send only to 选项是否限制了通知渠道(无限制为All),如果没有选择All或者Alibaba Cloud SLS,则该触发器发送的告警消息不会发送到SLS中。所以需要配置为All或者Alibaba Cloud SLS。
告警消息解析
Zabbix告警消息中包含100多种变量。更多信息,请参见Zabbix官方文档。日志服务只选取其中几十个消息变量组成告警消息。Alibaba Cloud SLS (Log Service)通知渠道发往SLS的告警消息示例,如下所示:
{ "status": "firing", "starts_at": "2021.06.10 19:23:01 +0800", "fires_at": "2021.06.11 15:30:32 +0800", "resolved_at": "", "severity": "medium", "alert_name": "test used", "alert_id": "19006", "alert_instance_id": "1036", "drill_down_query": "127.0.0.1/tr_events.php?triggerid=19006&eventid=1036", "labels": { "host_name": "zabbix-agent" }, "annotations": { "event_tags": "Application:Memory", "action_id": "3", "action_name": "Report problems to Zabbix administrators", "event_ack_status": "No", "event_age": "20h 7m 31s", "event_duration": "20h 7m 31s", "event_opdata": "73.34 %", "event_status": "PROBLEM", "trigger_description": "The system is running out of free memory.", "trigger_events_ack": "4", "trigger_events_problem_ack": "4", "trigger_events_problem_unack": "7", "trigger_events_unack": "17", "trigger_hostgroup_name": "Linux servers", "trigger_expression": "min(/zabbix-agent/vm.memory.utilization,1m)>10", "trigger_status": "PROBLEM", "trigger_url": "", "trigger_value": "1", "host_ip": "172.20.240.4", "title": "test used", "desc": "Trigger test used AT 2021.06.10 19:23:01: The system is running out of free memory." } }
可以看出,大部分的字段名称和zabbix的变量名称是一一对应的,例如event_status字段对应zabbix变量{EVENT_STATUS}。上面的告警消息示例,则会转换为SLS的告警消息:
{ "aliuid": "aliuid1", "alert_instance_id": "1036", "alert_id": "19006", "alert_type": "sls_pub", "alert_name": "test used", "region": "", "project": "", "project_id": 0, "next_eval_interval": 0, "alert_time": 1626408294, "fire_time": 1623324181, "fire_results": null, "fire_results_count": 0, "resolve_time": 0, "status": "firing", "results": null, "labels": { "host_name": "zabbix-agent" }, "annotations": { "Application": "Memory", "__config_app__": "sls_pub_alert", "__host_group_name__": "Linux servers", "__host_ip__": "172.20.240.4", "__pub_alert_app__": "appid1", "__pub_alert_protocol__": "zabbix", "__pub_alert_region__": "e", "__pub_alert_service__": "serverid1", "desc": "Trigger test used AT 2021.06.10 19:23:01: The system is running out of free memory.", "event_duration": "20h 7m 31s", "event_opdata": "73.34 %", "title": "test used", "trigger_expression": "min(/zabbix-agent/vm.memory.utilization,1m)\\u003e10" }, "severity": 6, "policy": { "alert_policy_id": "", "action_policy_id": "", "use_default": false, "repeat_interval": "0s" }, "template": null, "drill_down_query": "http://127.0.0.1/tr_events.php?triggerid=19006\\u0026eventid=1036"}
具体的转换规则,请参考官方文档接入Zabbix告警。
总结
通过将zabbix告警消息接入到SLS,可以不再受限于zabbix提供的告警功能,从而更为高效的了解以及处理服务出现的问题。