Slack作為一款即時通訊工具,協作溝通主要通過Channel(平台)來完成,用戶可以在企業中根據用途添加多個Channel,並且通過Channel來集成各種第三方工具。
例如,我們可以為監控建立一個單獨的Channel用於接收各種監控信息:
通過一個獨立的Channle可以減少信息對用戶工作的干擾,並且將相關信息聚合在一起:
Slack的強大之處在於在Channel中添加各種第三方服務的集成,用戶也可以基於Slack開發自己的聊天機器人來實現一些更高級的能力,例如自動化運維,提高開發效率等。
添加應用:Incomming Webhooks
為了能夠在Monitoring中接收來自Alertmanager的消息,在Channel的設置選項中使用"Add an App"為Monitoring channel添加一個名為Incoming WebHooks的應用:
添加成功后Slack會顯示Incoming WebHooks配置和使用方式:
Incomming Webhook的工作方式很簡單,Slack為當前Channel創建了一個用於接收消息的API地址:
用戶只需要使用Post方式向Channel發送需要通知的消息即可.,例如,我們可以在命令行中通過curl模擬一次消息通知:
curl -X POST --data-urlencode "payload={\"channel\": \"#monitoring\", \"username\": \"webhookbot\", \"text\": \"This is posted to #monitoring and comes from a bot named webhookbot.\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/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
除了發送純文本以外,slack還支持在文本內容中添加鏈接,例如:
payload={"text": "A very important thing has occurred! <https://alert-system.com/alerts/1234|Click here> for details!"}
此時接收到的消息中還包含一個可點擊的超鏈接地址。除了payload以外,Incomming Webhhook還支持一些其他的參數:
例如,使用以上參數發送一條更有趣的消息:
curl -X POST --data-urlencode "payload={'channel': '#monitoring', 'username': 'webhookbot', 'text': 'This is posted to #monitoring and comes from a bot named webhookbot.', 'icon_emoji': ':ghost:'}" https://hooks.slack.com/services/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
在網絡正常的情況下,在Channel中會顯示新的通知信息,如下所示:
結合AlertManager使用
在Alertmanager的全局配置中,將Incomming Webhhook地址作為slack_api_url添加到全局配置中即可:
global:
slack_api_url: https://hooks.slack.com/services/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
也可以在每個receiver中單獨定義自己的slack_configs即可:
receivers:
- name: slack
slack_configs:
- channel: '#monitoring'
send_resolved: true
收到的告警示例:
對於Incomming Webhhook支持的其它自定義參數,也可以在slack_config中進行定義,slack_config的主要配置如下:
channel: <tmpl_string>
[ send_resolved: <boolean> | default = false ]
[ api_url: <secret> | default = global.slack_api_url ]
[ icon_emoji: <tmpl_string> ]
[ icon_url: <tmpl_string> ]
[ link_names: <boolean> | default = false ]
[ username: <tmpl_string> | default = '{{ template "slack.default.username" . }}' ]
[ color: <tmpl_string> | default = '{{ if eq .Status "firing" }}danger{{ else }}good{{ end }}' ]
[ footer: <tmpl_string> | default = '{{ template "slack.default.footer" . }}' ]
[ pretext: <tmpl_string> | default = '{{ template "slack.default.pretext" . }}' ]
[ text: <tmpl_string> | default = '{{ template "slack.default.text" . }}' ]
[ title: <tmpl_string> | default = '{{ template "slack.default.title" . }}' ]
[ title_link: <tmpl_string> | default = '{{ template "slack.default.titlelink" . }}' ]
[ image_url: <tmpl_string> ]
[ thumb_url: <tmpl_string> ]
如果要覆蓋默認的告警內容,直接使用Go Template即可。例如:
color: '{{ if eq .Status "firing" }}danger{{ else }}good{{ end }}'