Prometheus Alertmanager告警之邮件、钉钉群、企业微信群机器人报警

news2025/4/7 7:56:11

文章目录

  • 一、部署alertmanager相关组件
    • 1.alertmanager-config
    • 2.alertmanager-message-tmpl
    • 3.alertmanager
  • 二、调试邮件告警
  • 三、钉钉群/企业微信群 报警
    • 3.1添加钉钉群机器人
    • 3.2添加企业微信群机器人
    • 3.3部署alertmanager-webhook-adapter
      • message-tmpl
      • alertmanager-webhook-adapter
      • alertmanager-config
    • 3.4钉钉群报警信息效果
    • 3.5企业微信群报警信息效果
  • 总结


Prometheus报警功能利用Alertmanager组件完成,Prometheus会对接收的指标数据比对告警规则,如果满足条件,则将告警时间发送给Alertmanager组件,Alertmanager组件发送到接收人
使用步骤:

  1. 部署Alertmanager
  2. 配置告警接收人
  3. 配置Prometheus与Alertmanager通信
  4. 在Prometheus中创建告警规则
    在这里插入图片描述

一、部署alertmanager相关组件

1.alertmanager-config

#alertmanager-config.yaml主配置文件,主要配置altermanager的告警配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager-config
  namespace: ops
data:
  alertmanager.yml: |
    global:
      #恢复告警等待时间,如果5m没收到来自prometheus的告警 则发送恢复告警通知
      resolve_timeout: 5m
      #邮箱服务器
      smtp_smarthost: 'smtp.exmail.qq.com:465'
      #发送告警的邮箱地址
      smtp_from: 'fanxxxxuai@cxxxxne.com'
      #发送者的邮箱登陆用户名
      smtp_auth_username: 'fanxxxxuai@cxxxxne.com'
      #发送者的邮箱授权吗(若是企业微信邮箱的话为发送者的登陆邮箱密码)
      smtp_auth_password: '123456'
      #关闭tls,默认是开启tls的,若不关闭则会报错,错误为本篇总结出所示
      smtp_require_tls: false
    #alertmanager告警消息的模版
    templates:
    - '/etc/alertmanager/msg-tmpl/*.tmpl'
  
    #主路由
    route: 
      #指定告警接收者
      receiver: 'mail-receiver'
      #分组(通过alertname标签的值分组)
      group_by: [cluster, alertname]
      #第一次产生告警,等待30s,足内有告警的话就一起发出,没有则单独发
      group_wait: 30s
      #第二次产生告警,先等待5m,如果5m后还没有恢复就进入repeat_interval。(定义相同的Group之间发送告警通知的时间间隔)
      group_interval: 5m
      #在最终发送消息前再等待30m,30m后还没恢复就发送第二次告警
      repeat_interval: 30m
      ##所以每次告警之间的间隔时间为35m(group_interval+repeat_interval)

    #配置告警接受者
    receivers:
    - name: 'mail-receiver'
      #使用邮件接收
      email_configs:
      - to: 'fanxxxxuai@cxxxxne.com'
        send_resolved: true
        html: '{{ template "emailMessage" . }}'

2.alertmanager-message-tmpl

#alertmanager-message-tmpl.yaml 告警模版(邮件)

apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager-message-tmpl
  namespace: ops
data:
  email.tmpl: |
    {{ define "emailMessage" }}
    {{- if gt (len .Alerts.Firing) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 }}
    ------ 告警问题 ------<br>
    告警状态:{{ .Status }}<br>
    告警级别:{{ .Labels.severity }}<br>
    告警名称:{{ .Labels.alertname }}<br>
    故障实例:{{ .Labels.instance }}<br>
    告警概要:{{ .Annotations.summary }}<br>
    告警详情:{{ .Annotations.description }}<br>
    故障时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
    ------ END ------<br>
    {{- end }}
    {{- end }}
    {{- end }}

    {{- if gt (len .Alerts.Resolved) 0 -}}
    {{- range $index, $alert := .Alerts -}}
    {{- if eq $index 0 }}
    ------ 告警恢复 ------<br>
    告警状态:{{ .Status }}<br>
    告警级别:{{ .Labels.severity }}<br>
    告警名称:{{ .Labels.alertname }}<br>
    恢复实例:{{ .Labels.instance }}<br>
    告警概要:{{ .Annotations.summary }}<br>
    告警详情:{{ .Annotations.description }}<br>
    故障时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
    恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
    ------ END ------<br>
    {{- end }}
    {{- end }}
    {{- end }}
    {{- end }}

3.alertmanager

#alertmanager.yaml 部署altermanager

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alertmanager
  namespace: ops
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alertmanager
  template:
    metadata:
      labels:
        app: alertmanager
    spec:
      containers:
        #用于热加载配置文件
        - name: prometheus-alertmanager-configmap-reload
          image: "jimmidyson/configmap-reload:v0.1"
          imagePullPolicy: "IfNotPresent"
          args:
            - --volume-dir=/etc/config
            - --webhook-url=http://localhost:9093/-/reload
          volumeMounts:
            - name: config
              mountPath: /etc/config
              readOnly: true
          resources:
            limits:
              cpu: 10m
              memory: 10Mi
            requests:
              cpu: 10m
              memory: 10Mi

        - name: alertmanager
          image: "prom/alertmanager:latest"
          ports:
            - containerPort: 9093
          readinessProbe:
            httpGet:
              path: /#/status
              port: 9093
            initialDelaySeconds: 30
            timeoutSeconds: 30
          livenessProbe:
            httpGet:
              path: /#/status
              port: 9093
            initialDelaySeconds: 30
            timeoutSeconds: 30
          resources:
            requests:
              cpu: 100m
              memory: 256Mi
            limits:
              cpu: 500m
              memory: 512Mi
          volumeMounts:
            - name: config
              mountPath: /etc/alertmanager
            - name: message-tmpl 
              mountPath: /etc/alertmanager/msg-tmpl
            - name: data
              mountPath: /data
            - name: timezone
              mountPath: /etc/localtime
      volumes:
        - name: config
          configMap:
            name: alertmanager-config
        - name: message-tmpl
          configMap:
            name: alertmanager-message-tmpl
        - name: data
          persistentVolumeClaim:
            claimName: alertmanager-data
        - name: timezone
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: alertmanager-data
  namespace: ops
spec:
  storageClassName: "managed-nfs-storage"
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "2Gi"
---
apiVersion: v1
kind: Service
metadata:
  name: alertmanager
  namespace: ops
spec:
  type: NodePort
  ports:
    - name: http
      port: 9093
      protocol: TCP
      targetPort: 9093
      nodePort: 30093
  selector:
    app: alertmanager

部署完成后访问 IP:30093即可访问altermanager的web展示界面
在这里插入图片描述



二、调试邮件告警

此时可以尝试重启一个pod进行调试
将资源配额调至超出可申请资源 让其为pending状态 如下:
test-alertmanager.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "24Gi"
            cpu: "12000m"
          limits:
            memory: "24Gi"
            cpu: "12000m"

启动此Pod观察
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

邮件告警如下:
在这里插入图片描述



三、钉钉群/企业微信群 报警

(webhook自定义机器人类型即可)

目前prometheus没有集成钉钉群和企业微信群接口,需要自己写webhook(数据转换)或者用别人写的
例如:https://github.com/bougou/alertmanager-webhook-adapter
在这里插入图片描述

3.1添加钉钉群机器人

在这里插入图片描述

创建完成后会有一个webhook地址,稍后会使用到此webhook的token
在这里插入图片描述



3.2添加企业微信群机器人

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建完成后会有一个webhook地址,稍后会使用到此webhook的key
在这里插入图片描述


3.3部署alertmanager-webhook-adapter

message-tmpl

#message-tmpl.yaml告警模版我把钉钉的和企业微信的放一起了
模版来源于:https://github.com/bougou/alertmanager-webhook-adapter/tree/main/pkg/models/templates

apiVersion: v1
kind: ConfigMap
metadata:
  name: message-tmpl
  namespace: ops
data:
####################################################################################################################
  dingding.tmpl: |
    {{ define "__subject" -}}
    【{{ .Signature }}】
    {{- if eq (index .Alerts 0).Labels.severity "ok" }} OK{{ end }}
    {{- if eq (index .Alerts 0).Labels.severity "info" }} INFO{{ end }}
    {{- if eq (index .Alerts 0).Labels.severity "warning" }} WARNING{{ end }}
    {{- if eq (index .Alerts 0).Labels.severity "error" }} ERROR{{ end }}
    {{- ` • ` }}
    {{- if .CommonLabels.alertname_cn }}{{ .CommonLabels.alertname_cn }}{{ else if .CommonLabels.alertname_custom }}{{ .CommonLabels.alertname_custom }}{{ else if .CommonAnnotations.alertname  }}{{ .CommonAnnotations.alertname }}{{ else }}{{ .GroupLabels.alertname }}{{ end }}
    {{- ` • ` }}
    {{- if gt (.Alerts.Firing|len) 0 }}告警中:{{ .Alerts.Firing|len }}{{ end }}
    {{- if and (gt (.Alerts.Firing|len) 0) (gt (.Alerts.Resolved|len) 0) }}/{{ end }}
    {{- if gt (.Alerts.Resolved|len) 0 }}已恢复:{{ .Alerts.Resolved|len }}{{ end }}
    {{ end }}


    {{ define "__externalURL" -}}
    {{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}
    {{- end }}

    {{ define "__alertinstance" -}}
    {{- if ne .Labels.alertinstance nil -}}{{ .Labels.alertinstance }}
    {{- else if ne .Labels.instance nil -}}{{ .Labels.instance }}
    {{- else if ne .Labels.node nil -}}{{ .Labels.node }}
    {{- else if ne .Labels.nodename nil -}}{{ .Labels.nodename }}
    {{- else if ne .Labels.host nil -}}{{ .Labels.host }}
    {{- else if ne .Labels.hostname nil -}}{{ .Labels.hostname }}
    {{- else if ne .Labels.ip nil -}}{{ .Labels.ip }}
    {{- end -}}
    {{- end }}

    {{ define "__alert_list" }}
    {{ range . }}
    ---
    > **告警名称**: {{ if .Labels.alertname_cn  }}{{ .Labels.alertname_cn }}{{ else if .Labels.alertname_custom  }}{{ .Labels.alertname_custom }}{{ else if .Annotations.alertname  }}{{ .Annotations.alertname }}{{ else }}{{ .Labels.alertname }}{{ end }}
    >
    > **告警级别**: {{ ` ` }}
    {{- if eq .Labels.severity "ok" }}OK{{ end -}}
    {{- if eq .Labels.severity "info" }}INFO{{ end -}}
    {{- if eq .Labels.severity "warning" }}WARNING{{ end -}}
    {{- if eq .Labels.severity "error" }}ERROR{{ end }}
    >
    > **告警实例**: `{{ template "__alertinstance" . }}`
    >
    {{- if .Labels.region }}
    > **地域**: {{ .Labels.region }}
    >
    {{- end }}
    {{- if .Labels.zone }}
    > **可用区**: {{ .Labels.zone }}
    >
    {{- end }}
    {{- if .Labels.product }}
    > **产品**: {{ .Labels.product }}
    >
    {{- end }}
    {{- if .Labels.component  }}
    > **组件**: {{ .Labels.component }}
    >
    {{- end }}
    > **告警状态**: {{ if eq .Status "firing" }}🚨{{ else }}{{ end }} {{ .Status | toUpper }}
    >
    > **开始时间**: {{ .StartsAt.Format "2006-01-02T15:04:05Z07:00" }}
    >
    > **结束时间**: {{ if .EndsAt.After .StartsAt }}{{ .EndsAt.Format "2006-01-02T15:04:05Z07:00" }}{{ else }}Not End{{ end }}
    >
    {{- if eq .Status "firing" }}
    > 告警描述: {{ if .Annotations.description_cn }}{{ .Annotations.description_cn }}{{ else }}{{ .Annotations.description }}{{ end }}
    >
    {{- end }}
    {{ end }}
    {{ end }}


    {{ define "__alert_summary" }}
    {{ range . }}- {{ template "__alertinstance" . }}
    {{ end }}
    {{ end }}

    {{ define "prom.title" }}
    {{ template "__subject" . }}
    {{ end }}


    {{ define "prom.markdown" }}
    {{ .MessageAt.Format "2006-01-02T15:04:05Z07:00" }}
    #### **摘要**

    {{ if gt (.Alerts.Firing|len ) 0 }}
    ##### **🚨 触发中告警 [{{ .Alerts.Firing|len }}]**
    {{ template "__alert_summary" .Alerts.Firing }}
    {{ end }}


    {{ if gt (.Alerts.Resolved|len) 0 }}
    ##### **✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]**
    {{ template "__alert_summary" .Alerts.Resolved }}
    {{ end }}

    #### **详请**

    {{ if gt (.Alerts.Firing|len ) 0 }}
    ##### **🚨 触发中告警 [{{ .Alerts.Firing|len }}]**
    {{ template "__alert_list" .Alerts.Firing }}
    {{ end }}


    {{ if gt (.Alerts.Resolved|len) 0 }}
    ##### **✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]**
    {{ template "__alert_list" .Alerts.Resolved }}
    {{ end }}
    {{ end }}

    {{ define "prom.text" }}
    {{ template "prom.markdown" . }}
    {{ end }}

####################################################################################################################
  wechat.tmpl: | 
    {{ define "__subject" -}}
    【{{ .Signature }}】

    {{- if eq (index .Alerts 0).Labels.severity "ok" }} OK{{ end }}
    {{- if eq (index .Alerts 0).Labels.severity "info" }} INFO{{ end }}
    {{- if eq (index .Alerts 0).Labels.severity "warning" }} WARNING{{ end }}
    {{- if eq (index .Alerts 0).Labels.severity "error" }} ERROR{{ end }}

    {{- ` • ` }}

    {{- if .CommonLabels.alertname_cn }}{{ .CommonLabels.alertname_cn }}{{ else if .CommonLabels.alertname_custom }}{{ .CommonLabels.alertname_custom }}{{ else if .CommonAnnotations.alertname  }}{{ .CommonAnnotations.alertname }}{{ else }}{{ .GroupLabels.alertname }}{{ end }}

    {{- ` • ` }}

    {{- if gt (.Alerts.Firing|len) 0 }}告警中:{{ .Alerts.Firing|len }}{{ end }}
    {{- if and (gt (.Alerts.Firing|len) 0) (gt (.Alerts.Resolved|len) 0) }}/{{ end }}
    {{- if gt (.Alerts.Resolved|len) 0 }}已恢复:{{ .Alerts.Resolved|len }}{{ end }}

    {{ end }}


    {{ define "__externalURL" -}}
    {{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}
    {{- end }}

    {{ define "__alertinstance" -}}
    {{- if ne .Labels.alertinstance nil -}}{{ .Labels.alertinstance }}
    {{- else if ne .Labels.instance nil -}}{{ .Labels.instance }}
    {{- else if ne .Labels.node nil -}}{{ .Labels.node }}
    {{- else if ne .Labels.nodename nil -}}{{ .Labels.nodename }}
    {{- else if ne .Labels.host nil -}}{{ .Labels.host }}
    {{- else if ne .Labels.hostname nil -}}{{ .Labels.hostname }}
    {{- else if ne .Labels.ip nil -}}{{ .Labels.ip }}
    {{- end -}}
    {{- end }}

    {{ define "__alert_list" }}
    {{ range . }}
    > <font color="comment"> 告警名称 </font>: {{ if .Labels.alertname_cn  }}{{ .Labels.alertname_cn }}{{ else if .Labels.alertname_custom  }}{{ .Labels.alertname_custom }}{{ else if .Annotations.alertname  }}{{ .Annotations.alertname }}{{ else }}{{ .Labels.alertname }}{{ end }}
    >
    > <font color="comment"> 告警级别 </font>:{{ ` ` }}
    {{- if eq .Labels.severity "ok" }}OK{{ end -}}
    {{- if eq .Labels.severity "info" }}INFO{{ end -}}
    {{- if eq .Labels.severity "warning" }}WARNING{{ end -}}
    {{- if eq .Labels.severity "error" }}ERROR{{ end }}
    >
    > <font color="comment"> 实例 </font>: `{{ template "__alertinstance" . }}`
    >
    {{- if .Labels.region }}
    > <font color="comment"> 地域 </font>: {{ .Labels.region }}
    >
    {{- end }}
    {{- if .Labels.zone }}
    > <font color="comment"> 可用区 </font>: {{ .Labels.zone }}
    >
    {{- end }}
    {{- if .Labels.product }}
    > <font color="comment"> 产品 </font>: {{ .Labels.product }}
    >
    {{- end }}
    {{- if .Labels.component  }}
    > <font color="comment"> 组件 </font>: {{ .Labels.component }}
    >
    {{- end }}
    > <font color="comment"> 告警状态 </font>: {{ if eq .Status "firing" }}🚨{{ else }}{{ end }} <font color="{{ if eq .Status "firing" }}warning{{ else }}info{{ end }}">{{ .Status | toUpper }}</font>
    >
    > <font color="comment"> 开始时间 </font>: {{ .StartsAt.Format "2006-01-02T15:04:05Z07:00" }}
    >
    > <font color="comment"> 结束时间 </font>: {{ if .EndsAt.After .StartsAt }}{{ .EndsAt.Format "2006-01-02T15:04:05Z07:00" }}{{ else }}Not End{{ end }}
    {{- if eq .Status "firing" }}
    >
    > <font color="comment"> 告警描述 </font>: {{ if .Annotations.description_cn }}{{ .Annotations.description_cn }}{{ else }}{{ .Annotations.description }}{{ end }}
    {{- end }}

    {{ end }}
    {{ end }}


    {{ define "__alert_summary" -}}
    {{ range . }}
    <font color="{{ if eq .Status "firing" }}warning{{ else }}info{{ end }}">{{ template "__alertinstance" . }}</font>
    {{ end }}
    {{ end }}

    {{ define "prom.title" -}}
    {{ template "__subject" . }}
    {{ end }}


    {{ define "prom.markdown" }}
    {{ .MessageAt.Format "2006-01-02T15:04:05Z07:00" }}
    #### 摘要

    {{ if gt (.Alerts.Firing|len ) 0 }}
    ##### <font color="warning">🚨 触发中告警 [{{ .Alerts.Firing|len }}]</font>
    {{ template "__alert_summary" .Alerts.Firing }}
    {{ end }}


    {{ if gt (.Alerts.Resolved|len) 0 }}
    #####  <font color="info">✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]</font>
    {{ template "__alert_summary" .Alerts.Resolved }}
    {{ end }}

    #### 详请

    {{ if gt (.Alerts.Firing|len ) 0 }}
    ##### <font color="warning">🚨 触发中告警 [{{ .Alerts.Firing|len }}]</font>
    {{ template "__alert_list" .Alerts.Firing }}
    {{ end }}


    {{ if gt (.Alerts.Resolved|len) 0 }}
    #####  <font color="info">✅ 已恢复告警 [{{ .Alerts.Resolved|len }}]</font>
    {{ template "__alert_list" .Alerts.Resolved }}
    {{ end }}
    {{ end }}

    {{ define "prom.text" }}
    {{ template "prom.markdown" . }}
    {{ end }}

alertmanager-webhook-adapter

#alertmanager-webhook-adapter.yaml webhook连接器服务
来源于:https://github.com/bougou/alertmanager-webhook-adapter/tree/main/deploy/k8s

apiVersion: apps/v1
kind: Deployment
metadata:
  name: alertmanager-webhook-adapter
  namespace: ops
spec:
  replicas: 1
  selector:
    matchLabels:
      app: alertmanager-webhook-adapter
  template:
    metadata:
      labels:
        app: alertmanager-webhook-adapter
    spec:
      containers:
      - name: webhook
        image: bougou/alertmanager-webhook-adapter:v1.1.7
        command:
        - /alertmanager-webhook-adapter
        #监听端口
        - --listen-address=:8090
        #告警第一行告警数据来源(随便写)
        - --signature=MyIDC
        #告警模版所在目录
        - --tmpl-dir=/msg-tmpl
        #使用哪个告警模版(这里取决于你想用什么应用报警)
        #钉钉群机器人的话就写 --tmpl-name=dingding
        #企业微信群机器人的话就写 --tmpl-name=wechat
        - --tmpl-name=dingding
        #- --tmpl-lang=zh
        env:
        - name: TZ
          value: Asia/Shanghai
        resources:
          requests:
            memory: 50Mi
            cpu: 100m
          limits:
            memory: 250Mi
            cpu: 500m
        volumeMounts:
            - name: message-tmpl
              mountPath: /msg-tmpl
      volumes:
        - name: message-tmpl
          configMap:
            name: message-tmpl
      restartPolicy: Always

---
apiVersion: v1
kind: Service
metadata:
  name: alertmanager-webhook-adapter
  namespace: ops
spec:
  ports:
  - port: 80
    targetPort: 8090
    protocol: TCP
  selector:
    app: alertmanager-webhook-adapter
  sessionAffinity: None

alertmanager-config

#alertmanager-config.yaml主配置文件,这里主要是修改发送告警的方式

apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager-config
  namespace: ops
data:
  alertmanager.yml: |
    global: 
      resolve_timeout: 5m
      smtp_smarthost: 'smtp.exmail.qq.com:465'
      smtp_from: 'fanxxxxuai@cxxxxne.com'
      smtp_auth_username: 'fanxxxxuai@cxxxxne.com'
      smtp_auth_password: '12345'
      smtp_require_tls: false

    templates:
    - '/etc/alertmanager/msg-tmpl/*.tmpl'

    route:
      #receiver: 'email-receiver'
      receiver: 'dingding-receiver'
      #receiver: 'wechat-receiver'
      group_by: [cluster, alertname]
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 30m
      
    receivers:
      #邮件告警
    - name: 'email-receiver'
      email_configs:
      - to: 'fanxxxxuai@cxxxxne.com'
        send_resolved: true
        html: '{{ template "emailMessage" . }}'

      #钉钉群告警
    - name: 'dingding-receiver'
      webhook_configs:
      #如下url只需将地址串里的token 
      #替换为创建钉钉群机器人时webhook的token即可
      #531c0f251944b69c6e731a3bea9a609d9557ebdbcf17b1bc0df8f7b9cf506734
      - url: http://alertmanager-webhook-adapter:80/webhook/send?channel_type=dingtalk&token=531c0f251944b69c6e731a3bea9a609d9557ebdbcf17b1bc0df8f7b9cf506734
        #是否发送告警恢复通知
        send_resolved: true

      #企业微信群告警
    - name: 'wechat-receiver'
      webhook_configs:
      #如下url只需将地址串里的token 
      #替换为创建企业微信群机器人时webhook的token即可
      #1cb01f46-f536-4c98-aeac-1455e1472e5d
      - url: http://alertmanager-webhook-adapter:80/webhook/send?channel_type=weixin&token=1cb01f46-f536-4c98-aeac-1455e1472e5d
        #是否发送告警恢复通知
        send_resolved: true 

ps:将prometheus的告警规则 label处添加个’alertinstance’ 若是没有则没有效果里的标题、描述等
规则如下:
在这里插入图片描述
在这里插入图片描述

3.4钉钉群报警信息效果

在这里插入图片描述

在这里插入图片描述


3.5企业微信群报警信息效果

在这里插入图片描述

在这里插入图片描述


总结

在使用alertmanager报警时, 若开启tlssmtp_require_tls: true 的话在发送告警时会报如下错误,需要设置成false即可发送成功;
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2065290.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows环境下,使用bat脚本配置本地域名解析(含新增、修改、清理)

适用场景&#xff1a; 1.内部不存在DNS服务器的客户&#xff1b; 2.客户电脑不知道前期是否过某域名的本地解析。 整体思路&#xff1a; 1.备份原始hosts配置文件&#xff1b; 2.将hosts配置文件中包含xxxxxxxxxx.com域名的解析清空&#xff1b; 3.写入正确的解析到hosts配置文…

发布MindSearch到ModelScope创空间

一、创建空间 1.点击【我要创建】来创建一个应用 2.填写完基础信息 会出现一个未发布的应用 二、上传代码 1.参照当前页的指示一步一步将MindSearch部署需要的文件上传到指定的repo即可 2.在当前页点击【空间文件】查看刚才通过命令上传的文件 三、上线应用 1.点击【设置】可…

【论文阅读】A Closer Look at Parameter-Efficient Tuning in Diffusion Models

Abstract 大规模扩散模型功能强大&#xff0c;但微调定制这些模型&#xff0c;内存和时间效率都很低。 本文通过向大规模扩散模型中插入小的学习器(称为adapters)&#xff0c;实现有效的参数微调。 特别地&#xff0c;将适配器的设计空间分解为输入位置、输出位置、函数形式的…

什么是ConcurrentHashMap?实现原理是什么?

什么是ConcurrentHashMap&#xff1f;实现原理是什么&#xff1f; 在多线程环境下&#xff0c;使用HashMap进行put操作时存在丢失数据的情况&#xff0c;为了避免这种bug的隐患&#xff0c;强烈建议使用ConcurrentHashMap代替HashMap。 HashTable是一个线程安全的类&#xff…

HashMap是线程安全的吗?为什么呢?

HashMap是线程安全的吗&#xff1f;为什么呢&#xff1f; HashMap是线程不安全的&#xff01; 线程不安全体现在JDK.1.7时在多线程的情况下扩容可能会出现死循环或数据丢失的情况&#xff0c;主要是在于扩容的transfer方法采用的头插法&#xff0c;头插法会把链表的顺序给颠倒…

【亲测有效】JS Uncaught TypeError: [function] is not a constructor

【亲测有效】JS Uncaught TypeError: [function] is not a constructor 在JavaScript编程中&#xff0c;Uncaught TypeError: [function] is not a constructor 是一个相对常见的错误&#xff0c;通常发生在尝试使用某个值作为构造函数&#xff0c;但实际上它不是构造函数的情况…

鸿蒙卡片服务开发

首先先创建一个项目 在该项目下创建一个卡片服务 在module.json5文件下配置 {"module": {..."extensionAbilities": [{"name": "EntryFormAbility","srcEntry": "./ets/entryformability/EntryFormAbility.ets",…

Linux文件操作:文件描述符fd

文章目录 前言&#xff1a;回顾一下文件提炼一下关于文件的理解&#xff1a; 理解文件&#xff1a;通过系统调用操作文件&#xff1a;理解标志位传参&#xff1a;打开文件 open写入信息 write 理解文件描述符&#xff1a;对于open的返回值&#xff1a;文件描述fd的本质是什么呢…

设计模式之Decorator装饰者、Facade外观、Adapter适配器(Java)

装饰者模式 设计模式的基本原则&#xff0c;对内关闭修改。 Decorator Pattern&#xff0c;装饰者模式&#xff0c;也叫包装器模式(Wrapper Pattern)&#xff1a;将一个对象包装起来&#xff0c;增加新的行为和责任。一定是从外部传入&#xff0c;并且可以没有顺序&#xff0…

Qml 实现仿前端的 Notification (悬浮出现页面上的通知消息)

【写在前面】 经常接触前端的朋友应该经常见到下面的控件&#xff1a; 在前端中一般称它为 Notification 或 Message&#xff0c;但本质是一种东西&#xff0c;即&#xff1a;悬浮弹出式的消息提醒框。 这种组件一般具有以下特点&#xff1a; 1、全局/局部显示&#xff1a;它不…

基于单片机的信号发生器设计

本设计采用了STM32F103C8T6单片机作为控制核心&#xff0c;通过控制DDS模块产生不同频率且高稳定和低失真的信号&#xff0c;再通过放大电路对信号的幅值进行放大。此外通过按键可以使用户对频率进行调节以及对输出波形进行切换&#xff0c;由于AD9833输出的幅值是固定的&#…

启动docker镜像

1、运行容器 2、当前运行的进程 3、当前位置和启动时间 4、cat/etc/redhat-release查看版本 5.镜像是模版&#xff0c;容器是实例 6.容器中没有命令运 7.容器总是能轻易获取 8.配置yum 9.安装http 10.修改index⽂件 11.httpd -k start 12.访问 13.退出就没有服务了 14…

细谈LCM驱动电压VGHVGL电路原理

前言&#xff1a; ***在液晶显示屏驱动电路中&#xff0c;VGH电压负责对TFT栅极电容进行充电开启&#xff0c;并使电容电压保持一个场周期&#xff0c;VGL电压负责TFT栅极的关闭。 如果VGH和VGL电压出现不稳或者幅度变化&#xff0c;都会引起图像显示故障&#xff0c;例如花屏…

委托发布 | 进迭时空联合移动云能力中心实现业界首个RISC-V IO虚拟化方案

仟江水商业电讯&#xff08;8月22日 北京 委托发布&#xff09;虚拟化是云计算技术基石&#xff0c;是RISC-V走进云计算等高性能计算场景的必然要求。RISC-V国际基金会2021年制定了Hypervisor 1.0规范&#xff0c;2023年制定了AIA 1.0规范和IOMMU 1.0规范&#xff0c;这3个规范…

CentOS 7使用RPM安装MySQL5.7

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1&#xff1a;下载MySQL5.7的rpm安装包2&#xff1a;卸载已安装的MySQL&#xff08;没安装过则跳过&#xff09;3&#xff1a;MySQL安装环境准备4&#xff1a;安…

网络竞赛可视化:打造线上赛事

通过图扑网络竞赛可视化&#xff0c;可以实时跟踪和分析参赛者的表现&#xff0c;直观展示比赛进程和结果。这不仅提高了观赛体验&#xff0c;还帮助组织者更有效地管理和优化赛事。

STM32——SPI通信协议以及软件读写

1、SPI协议 SPI相对于I2C传输速度更快&#xff1b;设计简单&#xff0c;通信协议使用硬件线比较多&#xff0c;有些资源浪费 以下设备需要进行共地&#xff0c;如果从机没有独立的供电源&#xff0c;主机需要给供电 SS线低电平有效&#xff0c;主机只能选择一个从机 推挽输出…

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

SpringCloudAlibaba Seata分布式事务

分布式事务 事务是数据库的概念&#xff0c;数据库事务&#xff08;ACID&#xff1a;原子性、一致性、隔离性和持久性&#xff09;&#xff1b; 分布式事务的产生&#xff0c;是由于数据库的拆分和分布式架构(微服务)带来的&#xff0c;在常规情况下&#xff0c;我们在一个进…

自己动手写CPU_step4_逻辑运算|移位指令

序 上一篇中我们解决了流水线的数据相关问题&#xff0c;本篇将添加多条逻辑运算和移位运算指令&#xff0c;这些指令的格式严格按照MIPS的指令格式设计。 MIPS指令格式 由于本人也是处于学习的一个过程&#xff0c;如有不对之处&#xff0c;还请大牛指正。 就逻辑运算和移位运…