大家好,我是小斐呀。
前面文章分享了很多网络设备监控以及 Grafana
仪表盘相关案例演示,那其实监控这块数据可视化已经完成差不多,接下来就需要针对网络设备指标做告警了,我这边是优先推荐使用夜莺作为告警引擎的,整体的监控告警架构如下所示:
上面就是整套的监控告警平台组件,可以很方便的实现个性化需求,其他对象的告警其实也是一样的套用,无非就是采集器有所不同而已了,这里需要说下夜莺的仪表盘问题,总体看夜莺是知道仪表盘的不足,故夜莺也不硬刚,打不赢就加入,直接集成 Grafana
不就好了,故这个架构中我是直接把 Grafana
集成到夜莺控制台中的,比如我适配的所有网络设备监控面板基本上是基于 Grafana
做的,但是我又用到夜莺告警引擎,希望统一在夜莺里面查看仪表板和告警,那就直接在夜莺仪表盘下集成 Grafana
即可,如下所示:
看到上面是不是觉得很方便,我既可以很方便的用到 Grafana
超强可视化,又可以无缝使用夜莺的告警引擎,特别是最近更新的版本,那告警又适配了很多好用的场景,夜莺团队真的很贴心。
告警引擎
在夜莺中告警引擎还是比较全面的,这里以 v8.0.0-beta.7
版本作为演示,这个新版本增加了很多新的逻辑,适配了更多告警场景,同时夜莺本身内置了很多告警通知媒介,消息模板,在夜莺控制台中告警引擎主要常用的有两个栏目,一个是告警管理,一个是告警通知。
日常配置告警主要用到的属于红色框起来的栏目中,如果用到短信、电话语音、邮件等通知媒介还需要在人员组织下用户管理添加对应的手机或邮箱信息。
下面我们先来对新版本的告警通知做一个简单介绍,老版本的告警通知里面只有通知设置和通知模版两个栏目,新版本最重要的就是对告警规则和告警通知做了强耦合解绑,从中抽象出 通知规则
使的告警规则直接关联通知规则,下面以一张图呈现:
那日常其实在用夜莺告警引擎的过程中,不要直接上来就写告警规则,而是要想清楚几个问题?
需要通知的团队有哪些,是否需要不同团队不同模版或不同的通知群 需要通知的媒介有哪些,是否需要多媒介通知(电话语音、邮件、短信、Webhook) 需要通知的消息是否需要分等级关联不同的通知媒介,比如严重告警通知到电话语音、短信、和群机器人,不严重告警只通知到群机器人即可 需要设置的告警规则是否需要基于不同阈值设置不同的告警等级,从而路由不同的通知媒介
更大的团队可能还需要考虑告警聚合降噪、告警升级、告警认领、告警排班、告警协同以及告警数据分析可视化等需求,那就是另外的话题。
所以基于开源版本的夜莺我们使用告警引擎的时候就可以依照这个顺序去执行操作:
建议操作按照上面的 消息媒介
> 消息模版
> 消息规则
的顺序去执行操作,比较容易理解三者之间的关联性,那新版本到底有解决了哪些痛点问题呢?
解决通知媒介和告警规则绑定写死的耦合性问题,可以基于不同阈值使用不同等级然后调用不同的通知媒介发送告警,比如严重告警使用电话和短信,一般告警使用群机器人消息等。 告警规则关联通知规则解决耦合性问题,可以灵活修改通知规则,某一批告警规则绑定同一个通知规则,修改起来也是非常方便,直接修改通知规则即可对所有绑定的告警规则生效。 新版本消息模版可以一个通知媒介关联多个消息模版,比如三个团队都使用同一个飞书告警机器人,但是通知消息模版不一样,现在就可以做到不同团队用同一个通知媒介但是消息模版可以不一样。 短信和电话等通知方式不方便,这次更新提供了通用的 HTTP
协议和脚本发送方式,并且HTTP
的参数、Header、Body 都可以在页面自定义,这样就可以更方便接入不同通知媒介了。
所以最终新版本的夜莺一个告警事件发送逻辑和流程如下所示:
之前版本的告警规则是直接绑定 通知媒介
和指定 告警接收组
如下所示:
这样子耦合非常严重,适应场景有限,新版本的告警规则直接绑定 通知规则
如下所示:
那么其实告警规则这里更加专注了,告警通知的逻辑统一放到通知规则里面设置,在告警规则这里只需要专注于写告警规则即可。
所以新版本的告警通知,主要的就是如何配置通知规则,如果把不同分告警规则绑定到不同的通知规则,不管你是多对一还是一对多,所有的关联关系都是通过通知规则进行串起来形成最终告警引擎的核心功能。
通知规则
通知规则里面可以支持不同的通知媒介,不管你目前的告警规则需要对接哪些通知媒介都可以支持,首先内置了一些常用的通知媒介,如内置支持国内三大主流 IM
工具 钉钉
、 飞书
、 企微
的群机器人,还有常规的邮箱以及阿里云和腾讯的短信、电话语音,其他第三方短信和语音可以通过 HTTP
或 脚本
方式自定义实现即可。
根据告警等级设置不同的告警媒介,比如告警等级 Critical
通过触发电话语音来通知以便及时触达到负责人,通知媒介为群机器人的可以设置勾选 Critical
、 Warning
、 Info
都发送到群机器人,具体规则你可以自定义:
除此之外,还可以单独对某一个通知配置做适用时段的设置,比如某些不不重要的告警,在非工作日直接忽略不发送告警信息,还可以通过标签和属性做筛选,如下所示:
通过通知规则和不同的通知媒介以及消息模板就可以非常方便的对告警做动态适配,匹配不同团队不同模板需求,甚至匹配多媒介告警需求,不同团队一个媒介适配多个群机器人需求等等。
告警示例
下面就以配置网络设备告警规则为案例来说明如何使用最新版本夜莺告警,并展开说明下网络设备常用的几个告警规则。
首先到夜莺控制台 人员组织-团队管理
里面新增一个 基础设施-网络运维
团队:
打开 告警通知
> 消息媒介
查看是否有我们需要的媒介,这里我以企微机器人演示一下整个过程。
基于 HTTP
协议的调用媒介,我们可以简单分为三个模块配置:
基础配置
变量配置
HTTP 配置
在对 HTTP
模块做配置的时候,我们首先需要分析一下企业微信群机器人的 HTTP
格式:
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx-5347-45d0-xxxx-cxaemioe9fxx6
这里我们又要回顾一下 HTTP
常用 URL
的结构是 协议://域名/路径?查询参数#片段
所以我们可以看到企微机器人是通过传入请求参数 key
来区分定位机器人的,故在 HTTP
这里需要设置请求参数:
这个区域总体逻辑就是通过可视化的方式构建动态参数的 HTTP
请求 URL
,比如钉钉群机器人:
https://oapi.dingtalk.com/robot/send?access_token=xxa4xxxxxx8ecxxacxx77xx2xxafbb49xxxfx4xbx6x1xx1xxx3xx2xx08xx4xxx24
那么钉钉的变量配置和 HTTP
配置如下所示:
飞书的机器人还有点小区别,不是通过查询参数去构建的 HTTP
而是直接通过路径参数传入的:
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxcc-2xxe-40xx-84dc-fexxxxxxx8qq
如果是这样就不是直接在请求参数中调用参数值了,而是直接在路径中调用参数值即可,如下所示:
熟悉 HTTP
协议的肯定清楚,就不多展开,总体就是动态传参数,构建群机器人的 Webhook
请求地址接口。
动态调用
假如现在有这么一个场景,有两个团队,不同团队的告警消息需要发送到不同的告警群下我们该如何做,其实本质上无非是不同的机器人的 Webhook
的 access_token
不同,故我们通过传入不同的 access_token
的值以及适用属性基于业务组即可实现:
上面以企业微信群机器人为例,通过传入通知媒介中定义的变量值,注意 Key
和 Bot Name
就是在企微媒介中定义的变量配置参数标识:
在通知规则中,我们可以基于同一个规则定义添加多个通知配置,那不同的通知配置即可调用不同的媒介或者相同媒介不同的参数(区分不同的机器人)。
企微告警
添加 网络设备告警
通知规则,并把告警消息通过企业微信群机器人媒介发送出来:
接下来配置通知规则:
注意 Key
是从你新建的群机器人的链接中获取得到的,就是 key=xxxxxxxx
那串长字符复制黏贴到通知配置里的 Key
中即可。
配置好通知规则后,可以去添加告警规则,这里以交换机告警为案例演示一下告警如何实现,点击新增告警规则:
上面的配置完成后,点击保存即可,接下来我们需要去修改消息模版,如果利用内置的默认模版,消息会呈现如下所示:
这样看起来是不是很费劲,一堆标签信息在一起,我们需要通过 告警规则
> 基础配置
> 备注
来携带进标签数据,然后在消息模版中匹配调用备注信息即可,最终可以如下所示:
你需要在消息中呈现指标中的哪个标签就在备注中写变量调用即可,但是要确保指标中存在该标签。
企业微信消息模版如下所示:
### {{if $event.IsRecovered}}💚{{$event.RuleName}}{{else}}💔{{$event.RuleName}}{{end}}
{{$time_duration := sub now.Unix $event.FirstTriggerTime}}{{- if $event.IsRecovered}}{{$time_duration = sub $event.LastEvalTime $event.FirstTriggerTime}}{{- end}}
**级别状态**: {{if $event.IsRecovered}}💚S{{$event.Severity}} 恢复{{else}}💔S{{$event.Severity}} 触发{{end}}
**规则标题**: {{$event.RuleName}}
{{- if $event.RuleNote}}
{{$event.RuleNote}}
{{- end}}
{{- if $event.TargetIdent}}
**监控对象**: {{$event.TargetIdent}}
{{- end}}
{{- if ne $event.AnnotationsJSON.Note "1"}}
**监控指标**: {{$event.TagsJSON}}
{{- end}}
{{- if not $event.IsRecovered}}
**触发时值**: {{$event.TriggerValue}}
**触发时间**: {{timeformat $event.TriggerTime}}
**持续时长**: {{humanizeDurationInterface $time_duration}}
{{- else}}
{{- if $event.AnnotationsJSON.recovery_value}}
**恢复时值**: {{formatDecimal $event.AnnotationsJSON.recovery_value 0}}
{{- end}}
**首次触发**: {{timeformat $event.FirstTriggerTime}}
**恢复时间**: {{timeformat $event.LastEvalTime}}
**持续时长**: {{humanizeDurationInterface $time_duration}}
{{- end}}
**发送时间**: {{timestamp}}
{{$domain := "http://请联系管理员修改通知模板将域名替换为实际的域名" }}
[事件详情]({{$domain}}/alert-his-events/{{$event.Id}})|[屏蔽1小时]({{$domain}}/alert-mutes/add?busiGroup={{$event.GroupId}}&cate={{$event.Cate}}&datasource_ids={{$event.DatasourceId}}&prod={{$event.RuleProd}}{{range $key, $value := $event.TagsMap}}&tags={{$key}}%3D{{$value}}{{end}})|[查看曲线]({{$domain}}/metric/explorer?data_source_id={{$event.DatasourceId}}&data_source_name=prometheus&mode=graph&prom_ql={{$event.PromQl|escape}})
原始文件在网盘中提供,如果你复制发现格式出现问题,可以直接下载网盘中的 go.tmpl
为后缀文件复制进消息模版中,把上面的消息模版复制到夜莺对于的企业微信模版:
如何调试,确保目前有活跃的告警,可以通过调整阈值做告警调试:
勾选当前测试指标的历史触发告警或者历史恢复告警做通知测试,查看最终消息和数据是否符合预期。
飞书告警
添加 网络设备告警
通知规则,并把告警消息通过飞书群机器人媒介发送出来:
这里选择使用飞书卡片的消息格式,消息更加丰富好看。
接下来配置通知规则:
注意 Access Token
是从你新建的群机器人的链接中获取得到的,就是 access_token=xxxxxxxx
那串长字符复制黏贴到通知配置里的 Access Token
中即可。
配置好通知规则后,可以去添加告警规则,这里以交换机告警为案例演示一下告警如何实现,点击新增告警规则:
上面的配置完成后,点击保存即可,接下来我们需要去修改消息模版,如果利用内置的默认模版,消息会呈现如下所示:
这样告警消息看起来没啥东西,我们需要通过 告警规则
> 基础配置
> 备注
来携带进标签数据,然后在消息模版中匹配调用备注信息即可,最终可以如下所示:
你需要在消息中呈现指标中的哪个标签就在备注中写变量调用即可,但是要确保指标中存在该标签。
飞书卡片消息模版如下所示:
{{$time_duration := sub now.Unix $event.FirstTriggerTime }}{{if $event.IsRecovered}}{{$time_duration = sub $event.LastEvalTime $event.FirstTriggerTime }}{{end}}
{{if $event.IsRecovered}}
{{- if ne $event.Cate "host"}}
**🏁告警集群:** {{$event.Cluster}}{{end}}
**🚥级别状态:** S{{$event.Severity}} 恢复
**❇️告警名称:** {{$event.RuleName}}
**🕓首次触发:** {{timeformat $event.FirstTriggerTime}}
**🕓恢复时间:** {{timeformat $event.LastEvalTime}}
**🕧持续时长:** {{humanizeDurationInterface $time_duration}}
{{- if $event.AnnotationsJSON.recovery_value}}
**📌 恢复时值:** {{formatDecimal $event.AnnotationsJSON.recovery_value 0}}
{{- end}}
{{if $event.RuleNote }}{{$event.RuleNote}}{{- end}}
{{- if ne $event.AnnotationsJSON.Note "1"}}
**对象标签:** {{$event.TagsJSON}}
{{- end}}
{{- else}}
{{- if ne $event.Cate "host" }}
**🏁告警集群:** {{$event.Cluster}}{{end}}
**🚥级别状态:** S{{$event.Severity}} 触发
**❇️告警名称:** {{$event.RuleName}}
**🕐触发时间:** {{timeformat $event.TriggerTime}}
**🕝发送时间:** {{timestamp}}
**🕧持续时长:** {{humanizeDurationInterface $time_duration}}
**📌触发时值:** {{$event.TriggerValue}}
{{if $event.RuleNote }}{{$event.RuleNote}}{{- end}}
{{- if ne $event.AnnotationsJSON.Note "1"}}
**对象标签:** {{$event.TagsJSON}}
{{- end}}
{{- end -}}
{{$domain := "http://请联系管理员修改通知模板将域名替换为实际的域名" }}
[事件详情]({{$domain}}/alert-his-events/{{$event.Id}})|[屏蔽1小时]({{$domain}}/alert-mutes/add?busiGroup={{$event.GroupId}}&cate={{$event.Cate}}&datasource_ids={{$event.DatasourceId}}&prod={{$event.RuleProd}}{{range $key, $value := $event.TagsMap}}&tags={{$key}}%3D{{$value}}{{end}})|[查看曲线]({{$domain}}/metric/explorer?data_source_id={{$event.DatasourceId}}&data_source_name=prometheus&mode=graph&prom_ql={{$event.PromQl|escape}})
原始文件在网盘中提供,如果你复制发现格式出现问题,可以直接下载网盘中的 go.tmpl
为后缀文件复制进消息模版中,把上面的消息模版复制到夜莺对应的飞书卡片模版:
如何调试,确保目前有活跃的告警,可以通过调整阈值做告警调试:
勾选当前测试指标的历史触发告警或者历史恢复告警做通知测试,查看最终消息和数据是否符合预期。
钉钉告警
添加 网络设备告警
通知规则,并把告警消息通过钉钉群机器人媒介发送出来:
这里选择使用钉钉的 markdown
消息格式。
接下来配置通知规则:
注意 Access Token
是从你新建的群机器人的链接中获取得到的,就是 access_token=xxxxxxxx
那串长字符复制黏贴到通知配置里的 Access Token
中即可。
配置好通知规则后,可以去添加告警规则,这里以交换机告警为案例演示一下告警如何实现,点击新增告警规则:
上面的配置完成后,点击保存即可,接下来我们需要去修改消息模版,如果利用内置的默认模版,消息会呈现如下所示:
这样告警消息也是很乱的,我们需要通过 告警规则
> 基础配置
> 备注
来携带进标签数据,然后在消息模版中匹配调用备注信息即可,最终可以如下所示:
你需要在消息中呈现指标中的哪个标签就在备注中写变量调用即可,但是要确保指标中存在该标签,钉钉这里后面有个 @
这个是为了匹配告警群并 @
对应的业务人,可以去除:
钉钉 markdown
消息模版如下所示:
### {{if $event.IsRecovered}}💚{{$event.RuleName}}{{else}}💔{{$event.RuleName}}{{end}}
{{$time_duration := sub now.Unix $event.FirstTriggerTime}}{{- if $event.IsRecovered}}{{$time_duration = sub $event.LastEvalTime $event.FirstTriggerTime}}{{- end}}
**级别状态**: {{if $event.IsRecovered}}💚S{{$event.Severity}} 恢复{{else}}💔S{{$event.Severity}} 触发{{end}}
**规则标题**: {{$event.RuleName}}
{{- if $event.RuleNote}}
{{$event.RuleNote}}
{{- end}}
{{- if $event.TargetIdent}}
**监控对象**: {{$event.TargetIdent}}
{{- end}}
{{- if ne $event.AnnotationsJSON.Note "1"}}
**监控指标**: {{$event.TagsJSON}}
{{- end}}
{{- if not $event.IsRecovered}}
**触发时值**: {{$event.TriggerValue}}
**触发时间**: {{timeformat $event.TriggerTime}}
**持续时长**: {{humanizeDurationInterface $time_duration}}
{{- else}}
{{- if $event.AnnotationsJSON.recovery_value}}
**恢复时值**: {{formatDecimal $event.AnnotationsJSON.recovery_value 0}}
{{- end}}
**首次触发**: {{timeformat $event.FirstTriggerTime}}
**恢复时间**: {{timeformat $event.LastEvalTime}}
**持续时长**: {{humanizeDurationInterface $time_duration}}
{{- end}}
**发送时间**: {{timestamp}}
{{$domain := "http://请联系管理员修改通知模板将域名替换为实际的域名" }}
[事件详情]({{$domain}}/alert-his-events/{{$event.Id}})|[屏蔽1小时]({{$domain}}/alert-mutes/add?busiGroup={{$event.GroupId}}&cate={{$event.Cate}}&datasource_ids={{$event.DatasourceId}}&prod={{$event.RuleProd}}{{range $key, $value := $event.TagsMap}}&tags={{$key}}%3D{{$value}}{{end}})|[查看曲线]({{$domain}}/metric/explorer?data_source_id={{$event.DatasourceId}}&data_source_name=prometheus&mode=graph&prom_ql={{$event.PromQl|escape}})
原始文件在网盘中提供,如果你复制发现格式出现问题,可以直接下载网盘中的 go.tmpl
为后缀文件复制进消息模版中,把上面的消息模版复制到夜莺对应的钉钉消息模版:
如何调试,确保目前有活跃的告警,可以通过调整阈值做告警调试:
勾选当前测试指标的历史触发告警或者历史恢复告警做通知测试,查看最终消息和数据是否符合预期。
待实现
消息模版中,具体消息字体设置颜色,这个场景应用在告警如果是触发状态那么就把告警消息的告警事件标签值设置为 红色
,如果恢复状态就把告警消息的告警事件标签值设置为 绿色
,这样比较醒目。
消息模版中,针对钉钉机器人告警消息发出 At
具体群成员,这个场景应用多个人在一个群里面做排班告警,以及消息提醒。
告警消息字体设置颜色以及钉钉 @
人的功能在夜莺 v8.0.0-beta.8
中实现,补全告警消息丰富度,可体验最新版本 v8.0.0-beta.8
昨天晚上已发布修复了这些问题。
网络设备具体的告警表达式在星球单独的一篇文章中展开,可直接进星球查看后续。
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...