|
导航:这里主要是列出一个prometheus一些系统的学习过程,最后按照章节顺序查看,由于写作该文档经历了不同时期,所以在文中有时出现
的云环境不统一,但是学习具体使用方法即可,在最后的篇章,有一个完整的腾讯云的实战案例。
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
参考:
https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config
https://yunlzheng.gitbook.io/prometheus-book/part-iii-prometheus-shi-zhan/readmd/use-prometheus-monitor-kubernetes
https://www.bookstack.cn/read/prometheus_practice/introduction-README.md
https://www.kancloud.cn/huyipow/prometheus/521184
https://www.qikqiak.com/k8s-book/docs/
|
因为记录此文档经历了几次云环境的更换,且在各篇章讲解的过程中配置列出不够详细,所以这里做一个汇总,更容易查阅。(代码中敏感信息已经隐藏)
1.主prometheus配置
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- /opt/prometheus/rule/*.rules
#remote_write:
# - url: "http://influxdb:8086/api/v1/prom/write?u=root&p=huawei&db=prometheus"
#basic_auth:
#username: root
#password: huawei
#remote_read:
#- url: "http://influxdb:8086/api/v1/prom/read?u=root&p=huawei&db=prometheus"
#basic_auth:
#username: root
#password: huawei
alerting:
alertmanagers:
- static_configs:
- targets: ["10.10.1.10:9093","10.10.1.5:9093"]
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['prometheus01:9100','prometheus02:9100','influxdb:9100']
labels:
project: prometheus
relabel_configs:
- source_labels: [__address__]
regex: ([a-zA-Z0-9-.]+):(\d{1,4})
target_label: hostname
replacement: ${1}
- job_name: "cn-lcm-prod"
scrape_interval: 20s
scrape_timeout: 20s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
- '{job="cn-lcm-prod-kubernetes-kubelet"}'
- '{job="cn-lcm-prod-kubernetes-cadvisor"}'
- '{job="cn-lcm-prod-kubernetes-pods"}'
- '{job="cn-lcm-prod-kubernetes-apiservers"}'
- '{job="cn-lcm-prod-kubernetes-services"}'
- '{job="cn-lcm-prod-kubernetes-service-endpoints"}'
static_configs:
- targets:
- 'x.x.x.x:9090'
labels:
project: cn-lcm-prod-k8s
- job_name: "cn-gc"
scrape_interval: 2s
scrape_timeout: 2s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
- '{job="cn-gc-consul-node"}'
- '{job="cn-gc-consul-process"}'
- '{job="cn-gc-nginx01"}'
- '{job="cn-gc-nginx02"}'
static_configs:
- targets:
- 'x.x.x.x:9090'
labels:
project: cn-gc
主prometheus配置
2.主prometheus告警模版样例
cat cn-lcm-prod-kubernetes.rules
groups:
- name: cn-lcm-prod
rules:
- alert: PodCpu
expr: (sum(rate(container_cpu_usage_seconds_total{job=~'cn-lcm-prod.*',container_name!=''}[3m])) by(job,cluster,namespace,container_name,pod_name))/(sum(container_spec_cpu_quota) by(job,cluster,namespace,container_name,pod_name) /100000)*100 > 70
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD PodCpu CPU使用率已达到告警阈值"
description: "{{ $labels.pod_name }} 告警阈值为70%, 当前值为: {{ $value }}"
- alert: PodMem
expr: sum(container_memory_rss{image!="",job=~'cn-lcm-prod.*'}) by(job,cluster,namespace,container_name,pod_name) / sum(container_spec_memory_limit_bytes{image!="",job=~'cn-lcm-prod.*'}) by(job,cluster,namespace,container_name,pod_name) * 100 != +inf > 90
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD PodMem 内存使用率已达到告警阈值"
description: "{{ $labels.pod_name }} 告警阈值为90%, 当前值为: {{ $value }}"
- alert: PodNetworkIn
expr: sum by (namespace,job,pod_name) (irate(container_network_receive_bytes_total{image!="",job=~'cn-lcm-prod.*'}[1m])) / 1024 /1024 > 30
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD PodNetworkIn NETWORK入带宽使用率已达到告警阈值"
description: "{{ $labels.pod_name }} 告警阈值为20MB, 当前值为: {{ $value }} MB"
- alert: PodNetworkOut
expr: sum by (namespace,job,pod_name) (irate(container_network_transmit_bytes_total{image!="",job=~'cn-lcm-prod.*'}[1m])) / 1024 /1024 > 30
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD PodNetworkOut NETWORK出带宽使用率已达到告警阈值"
description: "{{ $labels.pod_name }} 告警阈值为10MB, 当前值为: {{ $value }} MB"
- alert: PodRestart
expr: changes(kube_pod_container_status_restarts_total{job=~"cn-lcm-prod.*"}[3m]) > 0
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD PodRestart POD重启"
description: "{{ $labels.pod }} 有重启记录"
- alert: PodCpu
expr: (sum(rate(container_cpu_usage_seconds_total{job=~'cn-lcm-prod.*',container_name!=""}[3m])) by(job,cluster,namespace,container_name,pod_name))/(sum(container_spec_cpu_quota) by(job,cluster,namespace,container_name,pod_name) /100000)*100 > 90
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD PodCpu CPU使用率已达到告警阈值"
description: "{{ $labels.pod_name }} 告警阈值为90%, 当前值为: {{ $value }}"
- alert: PodMem
expr: sum(container_memory_rss{image!="",job=~'cn-lcm-prod.*'}) by(job,cluster,namespace,container_name,pod_name) / sum(container_spec_memory_limit_bytes{image!="",job=~'cn-lcm-prod.*'}) by(job,cluster,namespace,container_name,pod_name) * 100 != +inf > 90
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD PodMem 内存使用率已达到告警阈值"
description: "{{ $labels.pod_name }} 告警阈值为90%, 当前值为: {{ $value }}"
cat cn-lcm-prod-node.rules
groups:
- name: cn-lcm-prod
rules:
- alert: NodeCpu
expr: (1-((sum(increase(node_cpu_seconds_total{mode="idle",job=~'cn-lcm-prod.*'}[1m])) by (instance,job,hostname)) / (sum(increase(node_cpu_seconds_total[1m])) by (instance,job,hostname)))) * 100 > 70
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeCpu 使用率已达到告警阈值"
description: "{{ $labels.hostname }} 告警阈值为70%, 当前值为: {{ $value }}"
- alert: NodeMem
expr: (1-((node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes) / node_memory_MemTotal_bytes {job=~'cn-lcm-prod.*'})) * 100 > 80
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeMem 使用率已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为80%, 当前值为: {{ $value }}"
- alert: NodeNetworkIn
expr: irate(node_network_receive_bytes_total{job=~"cn-lcm-prod.*",device='eth0'}[5m]) /1024 /1024 > 10
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeNetworkIn 网卡 ETH0 使用率已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为10MB, 当前值为: {{ $value }} MB"
- alert: NodeNetworkOut
expr: irate(node_network_transmit_bytes_total{job=~"cn-lcm-prod.*",device='eth0'}[5m]) /1024 /1024 > 5
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeNetworkOut 网卡 ETH0 使用率已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为5MB, 当前值为: {{ $value }} MB"
- alert: NodeDiskUsed
expr: (sum(node_filesystem_size_bytes{job=~'cn-lcm-prod.*'}) by(instance,device,hostname) - sum(node_filesystem_free_bytes{job=~'cn-lcm-prod.*'}) by(instance,device,hostname)) / sum(node_filesystem_size_bytes{job=~'cn-lcm-prod.*'}) by(instance,device,hostname) * 100 > 70
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskUsed 磁盘使用率已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为70%, 当前值为: {{ $value }}"
- alert: NodeDiskIopsRead
expr: irate(node_disk_reads_completed_total{job=~"cn-lcm-prod.*"}[1m]) > 500
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskIopsRead 磁盘读取IOPS已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为500, 当前值为: {{ $value }}"
- alert: NodeDiskIopsWrite
expr: irate(node_disk_writes_completed_total{job=~"cn-lcm-prod.*"}[1m]) > 500
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskIopsWrite 磁盘写入IOPS已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为500, 当前值为: {{ $value }}"
- alert: NodeDiskReadTime
expr: irate(node_disk_read_time_seconds_total{job=~"cn-lcm-prod.*"}[1m]) > 2
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskReadTime 磁盘读取时间已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为2s, 当前值为: {{ $value }} s"
- alert: NodeDiskWriteTime
expr: irate(node_disk_write_time_seconds_total{job=~"cn-lcm-prod.*"}[1m]) > 2
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskWriteTime 磁盘写入时间已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为2s, 当前值为: {{ $value }} s"
- alert: NodeTcpCurrEstab
expr: node_netstat_Tcp_CurrEstab{job=~"cn-lcm-prod.*"} > 4000
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeTcpCurrEstab TCP当前连接已达到告警阈值"
description: "{{ $labels.instance }} 告警阈值为500, 当前值为: {{ $value }}"
- alert: NodeSystemLoad
expr: node_load5{hostname=~"$node"} > 10
for: 1m
labels:
severity: warning
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeSystemLoad Node 5分钟内负载已达到告警阈值"
description: "{{ $labels.instance }} 5分钟内负载告警阈值为10, 当前值为: {{ $value }}"
###################high#####################
- alert: NodeCpu
expr: (1-((sum(increase(node_cpu_seconds_total{mode="idle",job=~'cn-lcm-prod.*'}[1m])) by (instance,job,hostname)) / (sum(increase(node_cpu_seconds_total[1m])) by (instance,job,hostname)))) * 100 > 90
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeCpu 使用率已达到告???阈值(严重)"
description: "{{ $labels.hostname }} 告警阈值为90%, 当前值为: {{ $value }}"
- alert: NodeMem
expr: (1-((node_memory_Buffers_bytes + node_memory_Cached_bytes + node_memory_MemFree_bytes) / node_memory_MemTotal_bytes {job=~'cn-lcm-prod.*'})) * 100 > 90
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeMem 使用率已达到告警阈值(严重)"
description: "{{ $labels.instance }} 告警阈值为90%, 当前值为: {{ $value }}"
- alert: NodeDiskUsed
expr: (sum(node_filesystem_size_bytes{job=~'cn-lcm-prod.*'}) by(instance,device,hostname) - sum(node_filesystem_free_bytes{job=~'cn-lcm-prod.*'}) by(instance,device,hostname)) / sum(node_filesystem_size_bytes{job=~'cn-lcm-prod.*'}) by(instance,device,hostname) * 100 > 90
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskUsed 磁盘使用率已达???告警阈值(严重)"
description: "{{ $labels.instance }} 告警阈值为90%, 当前值为: {{ $value }}"
- alert: NodeDiskIopsRead
expr: irate(node_disk_reads_completed_total{job=~"cn-lcm-prod.*"}[1m]) > 2000
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskIopsRead 磁盘读取IOPS已达到告警阈值(严重)"
description: "{{ $labels.instance }} 告警阈值为2000, 当前值为: {{ $value }}"
- alert: NodeDiskIopsWrite
expr: irate(node_disk_writes_completed_total{job=~"cn-lcm-prod.*"}[1m]) > 2000
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeDiskIopsWrite 磁盘写入IOPS已达到告警阈值(严重)"
description: "{{ $labels.instance }} 告警阈值为2000, 当前值为: {{ $value }}"
- alert: NodeTcpCurrEstab
expr: node_netstat_Tcp_CurrEstab{job=~"cn-lcm-prod.*"} > 6000
for: 1m
labels:
severity: high
project: cn-lcm-prod
annotations:
summary: "CN-LCM-PROD NodeTcpCurrEstab TCP当前连接已达到告警阈值(严重)"
description: "{{ $labels.instance }} 告警阈值为6000, 当前值为: {{ $value }}"
主prometheus告警模版样例
3.备prometheus配置以及告警模版样例
和主配置,一点都不需要更改
4.主备alertmanager配置
alertmanager主备配置都一样,只是启动的时候命令不相同。
global:
#该参数定义了当Alertmanager持续多长时间未接收到告警后标记告警状态为resolved(已解决)。该参数的定义可能会影响到告警恢复通知的接收时间,读者可根据自己的实际场景进行定义,其默认值为5分钟
resolve_timeout: 5m
smtp_smarthost: 'smtp.qiye.163.com:465'
smtp_from: 'monitor@em.denachina.com'
smtp_auth_username: 'monitor@em.denachina.com'
smtp_auth_password: '3tkvGD8G4giGmAu'
smtp_require_tls: false
#wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
#wechat_api_secret: 'CahXkrW-B12Il05HDqB79DIO8yRjLF8jhym0_hgZNUg'
#wechat_api_corp_id: 'wwd30f74a2a3aca657'
templates:
- "/opt/alertmanager/templates/*.tmpl"
route:
receiver: 'default-receiver'
#这里是被监控的标签key,比如一个alertname标签的信息为一封邮件发送
group_by: ['alertname','project','severity']
#两组告警的间隔时间
group_interval: 1m
#为了分组发送,在多少秒之内的告警合为一条
group_wait: 20s
#如果已经发送了通知,还要等多久才能再次发送
repeat_interval: 120m
routes:
- receiver: cn-lcm-prod
group_wait: 20s
match_re:
project: cn-lcm-prod
- receiver: cn-gc
group_wait: 20s
match_re:
project: cn-gc
receivers:
- name: 'default-receiver'
email_configs:
- to: "zexiong.li@xx.com,zhaohe.ji@xx.com,xin.a.yao@xx.com,lizexiong@huawei.com"
send_resolved: true
#html: '{{ template "email.html" . }}'
#headers: { Subject: " {{ .CommonLabels.alertname }} {{ .CommonAnnotations.summary }}" }
headers: { Subject: "{{ .CommonAnnotations.summary }}" }
- name: 'cn-lcm-prod'
email_configs:
- to: "{{ template "lizexiongmail" }}"
send_resolved: true
headers: { Subject: "{{ .CommonAnnotations.summary }}" }
webhook_configs:
- url: "http://10.10.1.16:5000"
send_resolved: true
- name: 'cn-gc'
email_configs:
- to: "{{ template "lizexiongmail" }}"
send_resolved: true
headers: { Subject: " {{ .CommonAnnotations.summary }}" }
webhook_configs:
- url: "http://10.10.1.16:5000"
send_resolved: true
#wechat_configs:
#- corp_id: 'wwd30f74a2a3aca657'
#to_party: '1'
#send_resolved: true
#agent_id: '1000002'
#to_user: '@all'
#api_secret: 'CahXkrW-B12Il05HDqB79DIO8yRjLF8jhym0_hgZNUg'
#message: '{{ template "wechat.default.message" . }}'
inhibit_rules:
#source_match: 匹配当前告警发生后其他告警抑制掉
- source_match:
#severity: 指定告警级别
severity: 'high'
#target_match:抑制告警
target_match:
#severity: 指定抑制告警级别
severity: 'warning'
#equal: 只有包含指定标签才可成立规则
equal: ['alertname', 'instance']
主备alertmanager配置
5.Alertmanager模版示例
可以看到alertmanager用了lizexiongmail模版变量,这里看看模版变量怎么写的。
cat email.tmpl
{{ define "lizexiongmail" }} zexiong.li@dena.com {{ end }}
{{ define "email.html" }}
"5">
| 报警项 |
磁盘 |
报警阀值 |
开始时间 |
{{ range $i, $alert := .Alerts }}
| {{ index $alert.Labels "alertname" }} |
{{ index $alert.Labels "instance" }} |
{{ index $alert.Labels "value" }} |
{{ $alert.StartsAt }} |
{{ end }}
{{ end }}
还有官方自带的模版
cat email.tmpl
{{ define "lizexiongmail" }} zexiong.li@dena.com {{ end }}
{{ define "email.html" }}
"5">
| 报警项 |
磁盘 |
报警阀值 |
开始时间 |
{{ range $i, $alert := .Alerts }}
| {{ index $alert.Labels "alertname" }} |
{{ index $alert.Labels "instance" }} |
{{ index $alert.Labels "value" }} |
{{ $alert.StartsAt }} |
{{ end }}
{{ end }}
还有官方自带的模版
cat default.tmpl
{{ define "__alertmanager" }}Alertmanager{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/
#/alerts?receiver={{ .Receiver | urlquery }}{{ end }}
{{ define "__subject" }}[{{ .Status | toUpper }}{{
if eq .Status
"firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join
" " }} {{
if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join
" " }}{{ end }}){{ end }}{{ end }}
{{ define "__description" }}{{ end }}
{{ define "__text_alert_list" }}{{ range . }}Labels:
{{ range .Labels.SortedPairs }} - {{ .Name }} =
{{ .Value }}
{{ end }}Annotations:
{{ range .Annotations.SortedPairs }} - {{ .Name }} =
{{ .Value }}
{{ end }}Source: {{ .GeneratorURL }}
{{ end }}{{ end }}
{{ define "slack.default.title" }}{{ template
"__subject" . }}{{ end }}
{{ define "slack.default.username" }}{{ template
"__alertmanager" . }}{{ end }}
{{ define "slack.default.fallback" }}{{ template
"slack.default.title" . }} | {{ template
"slack.default.titlelink" . }}{{ end }}
{{ define "slack.default.callbackid" }}{{ end }}
{{ define "slack.default.pretext" }}{{ end }}
{{ define "slack.default.titlelink" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "slack.default.iconemoji" }}{{ end }}
{{ define "slack.default.iconurl" }}{{ end }}
{{ define "slack.default.text" }}{{ end }}
{{ define "slack.default.footer" }}{{ end }}
{{ define "pagerduty.default.description" }}{{ template
"__subject" . }}{{ end }}
{{ define "pagerduty.default.client" }}{{ template
"__alertmanager" . }}{{ end }}
{{ define "pagerduty.default.clientURL" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "pagerduty.default.instances" }}{{ template
"__text_alert_list" . }}{{ end }}
{{ define "opsgenie.default.message" }}{{ template
"__subject" . }}{{ end }}
{{ define "opsgenie.default.description" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 -
}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{-
end }}
{{ if gt (len .Alerts.Resolved) 0 -
}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{-
end }}
{{-
end }}
{{ define "opsgenie.default.source" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "wechat.default.message" }}{{ template
"__subject" . }}
{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 -
}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{-
end }}
{{ if gt (len .Alerts.Resolved) 0 -
}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{-
end }}
AlertmanagerUrl:
{{ template "__alertmanagerURL" . }}
{{-
end }}
{{ define "wechat.default.to_user" }}{{ end }}
{{ define "wechat.default.to_party" }}{{ end }}
{{ define "wechat.default.to_tag" }}{{ end }}
{{ define "wechat.default.agent_id" }}{{ end }}
{{ define "victorops.default.state_message" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 -
}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{-
end }}
{{ if gt (len .Alerts.Resolved) 0 -
}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{-
end }}
{{-
end }}
{{ define "victorops.default.entity_display_name" }}{{ template
"__subject" . }}{{ end }}
{{ define "victorops.default.monitoring_tool" }}{{ template
"__alertmanager" . }}{{ end }}
{{ define "email.default.subject" }}{{ template
"__subject" . }}{{ end }}
{{ define "email.default.html" }}
"
-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
"
http://www.w3.org/1999/xhtml" xmlns=
"http://www.w3.org/1999/xhtml" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"
viewport" content=
"width=device-width" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"
Content-Type" content=
"text/html; charset=UTF-8" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{{ template "__subject" . }}
"" itemtype=
"http://schema.org/EmailMessage" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; height: 100%; line-height: 1.6em; width: 100% !important; background-color: #f6f6f6; margin: 0; padding: 0;" bgcolor=
"#f6f6f6">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;" bgcolor="#f6f6f6">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"> |
"600" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max-width: 600px !important; clear: both !important; width: 100% !important; margin: 0 auto; padding: 0;" valign="top">
" font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 0;">
"100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;" bgcolor="#fff">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; vertical-align: top; color: #fff; font-weight: 500; text-align: center; border-radius: 3px 3px 0 0; background-color: #E6522C; margin: 0; padding: 20px;" align="center" bgcolor="#E6522C" valign="top">
{{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}
{{ .Name }}={{ .Value }}
{{ end }}
|
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 10px;" valign="top">
"100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"{{ template "__alertmanagerURL" . }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #348eda; margin: 0; border-color: #348eda; border-style: solid; border-width: 10px 20px;">View in {{ template "__alertmanager" . }}
|
{{ if gt (len .Alerts.Firing) 0 }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">[{{ .Alerts.Firing | len }}] Firing
|
{{ end }}
{{ range .Alerts.Firing }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Labels "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ if gt (len .Annotations) 0 }}"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Annotations "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
"{{ .GeneratorURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #348eda; text-decoration: underline; margin: 0;">Source "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
|
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
{{ if gt (len .Alerts.Firing) 0 }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
|
{{ end }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">[{{ .Alerts.Resolved | len }}] Resolved
|
{{ end }}
{{ range .Alerts.Resolved }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Labels "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ if gt (len .Annotations) 0 }}"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Annotations "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
"{{ .GeneratorURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #348eda; text-decoration: underline; margin: 0;">Source "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
|
{{ end }}
|
" font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;">
"100%" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; text-align: center; color: #999; margin: 0; padding: 0 0 20px;" align="center" valign="top">"{{ .ExternalURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: underline; margin: 0;">Sent by {{ template "__alertmanager" . }} |
|
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"> |
{{ end }}
{{ define "pushover.default.title" }}{{ template
"__subject" . }}{{ end }}
{{ define "pushover.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 }}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{ end }}
{{ end }}
{{ define "pushover.default.url" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "sns.default.subject" }}{{ template
"__subject" . }}{{ end }}
{{ define "sns.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 }}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{ end }}
{{ end }}
[root@prometheus01 templates]# cat default.tmpl ^C
[root@prometheus01 templates]
# vim default.tmpl
[root@prometheus01 templates]
# cat default.tmpl | wc -l
231
[root@prometheus01 templates]# vim default.tmpl ^C
[root@prometheus01 templates]
# cat default.tmpl
{{ define
"__alertmanager" }}Alertmanager{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/
#/alerts?receiver={{ .Receiver | urlquery }}{{ end }}
{{ define "__subject" }}[{{ .Status | toUpper }}{{
if eq .Status
"firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join
" " }} {{
if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join
" " }}{{ end }}){{ end }}{{ end }}
{{ define "__description" }}{{ end }}
{{ define "__text_alert_list" }}{{ range . }}Labels:
{{ range .Labels.SortedPairs }} - {{ .Name }} =
{{ .Value }}
{{ end }}Annotations:
{{ range .Annotations.SortedPairs }} - {{ .Name }} =
{{ .Value }}
{{ end }}Source: {{ .GeneratorURL }}
{{ end }}{{ end }}
{{ define "slack.default.title" }}{{ template
"__subject" . }}{{ end }}
{{ define "slack.default.username" }}{{ template
"__alertmanager" . }}{{ end }}
{{ define "slack.default.fallback" }}{{ template
"slack.default.title" . }} | {{ template
"slack.default.titlelink" . }}{{ end }}
{{ define "slack.default.callbackid" }}{{ end }}
{{ define "slack.default.pretext" }}{{ end }}
{{ define "slack.default.titlelink" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "slack.default.iconemoji" }}{{ end }}
{{ define "slack.default.iconurl" }}{{ end }}
{{ define "slack.default.text" }}{{ end }}
{{ define "slack.default.footer" }}{{ end }}
{{ define "pagerduty.default.description" }}{{ template
"__subject" . }}{{ end }}
{{ define "pagerduty.default.client" }}{{ template
"__alertmanager" . }}{{ end }}
{{ define "pagerduty.default.clientURL" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "pagerduty.default.instances" }}{{ template
"__text_alert_list" . }}{{ end }}
{{ define "opsgenie.default.message" }}{{ template
"__subject" . }}{{ end }}
{{ define "opsgenie.default.description" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 -
}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{-
end }}
{{ if gt (len .Alerts.Resolved) 0 -
}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{-
end }}
{{-
end }}
{{ define "opsgenie.default.source" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "wechat.default.message" }}{{ template
"__subject" . }}
{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 -
}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{-
end }}
{{ if gt (len .Alerts.Resolved) 0 -
}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{-
end }}
AlertmanagerUrl:
{{ template "__alertmanagerURL" . }}
{{-
end }}
{{ define "wechat.default.to_user" }}{{ end }}
{{ define "wechat.default.to_party" }}{{ end }}
{{ define "wechat.default.to_tag" }}{{ end }}
{{ define "wechat.default.agent_id" }}{{ end }}
{{ define "victorops.default.state_message" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 -
}}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{-
end }}
{{ if gt (len .Alerts.Resolved) 0 -
}}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{-
end }}
{{-
end }}
{{ define "victorops.default.entity_display_name" }}{{ template
"__subject" . }}{{ end }}
{{ define "victorops.default.monitoring_tool" }}{{ template
"__alertmanager" . }}{{ end }}
{{ define "email.default.subject" }}{{ template
"__subject" . }}{{ end }}
{{ define "email.default.html" }}
"
-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
"
http://www.w3.org/1999/xhtml" xmlns=
"http://www.w3.org/1999/xhtml" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"
viewport" content=
"width=device-width" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"
Content-Type" content=
"text/html; charset=UTF-8" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">{{ template "__subject" . }}
"" itemtype=
"http://schema.org/EmailMessage" style=
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; height: 100%; line-height: 1.6em; width: 100% !important; background-color: #f6f6f6; margin: 0; padding: 0;" bgcolor=
"#f6f6f6">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; background-color: #f6f6f6; margin: 0;" bgcolor="#f6f6f6">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"> |
"600" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; display: block !important; max-width: 600px !important; clear: both !important; width: 100% !important; margin: 0 auto; padding: 0;" valign="top">
" font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; max-width: 600px; display: block; margin: 0 auto; padding: 0;">
"100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; border-radius: 3px; background-color: #fff; margin: 0; border: 1px solid #e9e9e9;" bgcolor="#fff">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 16px; vertical-align: top; color: #fff; font-weight: 500; text-align: center; border-radius: 3px 3px 0 0; background-color: #E6522C; margin: 0; padding: 20px;" align="center" bgcolor="#E6522C" valign="top">
{{ .Alerts | len }} alert{{ if gt (len .Alerts) 1 }}s{{ end }} for {{ range .GroupLabels.SortedPairs }}
{{ .Name }}={{ .Value }}
{{ end }}
|
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 10px;" valign="top">
"100%" cellpadding="0" cellspacing="0" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"{{ template "__alertmanagerURL" . }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #FFF; text-decoration: none; line-height: 2em; font-weight: bold; text-align: center; cursor: pointer; display: inline-block; border-radius: 5px; text-transform: capitalize; background-color: #348eda; margin: 0; border-color: #348eda; border-style: solid; border-width: 10px 20px;">View in {{ template "__alertmanager" . }}
|
{{ if gt (len .Alerts.Firing) 0 }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">[{{ .Alerts.Firing | len }}] Firing
|
{{ end }}
{{ range .Alerts.Firing }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Labels "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ if gt (len .Annotations) 0 }}"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Annotations "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
"{{ .GeneratorURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #348eda; text-decoration: underline; margin: 0;">Source "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
|
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
{{ if gt (len .Alerts.Firing) 0 }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
|
{{ end }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">[{{ .Alerts.Resolved | len }}] Resolved
|
{{ end }}
{{ range .Alerts.Resolved }}
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0; padding: 0 0 20px;" valign="top">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Labels "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
{{ range .Labels.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ if gt (len .Annotations) 0 }}"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">Annotations "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
{{ range .Annotations.SortedPairs }}{{ .Name }} = {{ .Value }} "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />{{ end }}
"{{ .GeneratorURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; color: #348eda; text-decoration: underline; margin: 0;">Source "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;" />
|
{{ end }}
|
" font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; width: 100%; clear: both; color: #999; margin: 0; padding: 20px;">
"100%" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; margin: 0;">
| "font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 12px; vertical-align: top; text-align: center; color: #999; margin: 0; padding: 0 0 20px;" align="center" valign="top">"{{ .ExternalURL }}" style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 12px; color: #999; text-decoration: underline; margin: 0;">Sent by {{ template "__alertmanager" . }} |
|
"font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; box-sizing: border-box; font-size: 14px; vertical-align: top; margin: 0;" valign="top"> |
{{ end }}
{{ define "pushover.default.title" }}{{ template
"__subject" . }}{{ end }}
{{ define "pushover.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 }}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{ end }}
{{ end }}
{{ define "pushover.default.url" }}{{ template
"__alertmanagerURL" . }}{{ end }}
{{ define "sns.default.subject" }}{{ template
"__subject" . }}{{ end }}
{{ define "sns.default.message" }}{{ .CommonAnnotations.SortedPairs.Values | join
" " }}
{{ if gt (len .Alerts.Firing) 0 }}
Alerts Firing:
{{ template "__text_alert_list" .Alerts.Firing }}
{{ end }}
{{ if gt (len .Alerts.Resolved) 0 }}
Alerts Resolved:
{{ template "__text_alert_list" .Alerts.Resolved }}
{{ end }}
{{ end }}
官方自带模版