• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

docker部署简易Prometheus

武飞扬头像
kali_yao
帮助1

注:部署前可以先系统的学习一下:Introduction · Prometheus中文技术文档

在之后需要书写自定义告警的,需要在学习一下PromQL语言,一般网上也能搜到,可以在安装一个grafana可视乎验证PromQL语言

一.概述


1.什么是普罗米修斯


普罗米修斯是一个开源系统,Prometheus 收集其指标并将其存储为时间序列数据,即指标信息与记录它的时间戳一起存储,以及称为标签的可选键值对

https://prometheus.io/docs/introduction/media/

2.特征


普罗米修斯的主要特点是:

  • 具有由指标名称和键/值对标识的时间序列数据的多维数据模型

  • 不依赖分布式存储;单服务器节点是自治的

  • 时序收集通过 HTTP 上的拉取模型进行

  • 通过服务发现或静态配置发现目标

  • 多种图形和仪表板支持模式

3.什么是指标?

通俗地说,指标是数字度量。时间序列意味着随时间记录更改。用户想要测量的内容因应用程序而异。对于Web服务器,它可能是请求时间,对于数据库,它可能是活动连接数或活动查询数等。

指标在理解应用程序以某种方式工作的原因方面起着重要作用。假设您正在运行一个 Web 应用程序,发现该应用程序很慢。您将需要一些信息来了解您的应用程序发生了什么。例如,当请求数很高时,应用程序可能会变慢。如果您有请求计数指标,则可以找出原因并增加处理负载的服务器数量。

4.组件


普罗米修斯生态系统由多个组件组成,其中许多组件是 自选:

  • HAProxy、StatsD、Graphite等服务的特殊用途出口商

  • 各种支持工具

大多数普罗米修斯组件都是用 Go 编写的,使得 它们易于构建和部署为静态二进制文件

5.架构图


5.1官网结构图

学新通

5.2.本文简易架构图

学新通

Prometheus 直接从检测的作业中抓取指标,也可以通过 用于短期作业的中间推送网关。它存储所有刮擦的样品 在本地并对此数据运行规则以聚合和记录新时间 从现有数据中序列或生成警报。格拉法纳或 其他 API 使用者可用于可视化收集的数据。

5.3.组件概述

  • Prometheus Server

  • 于收集和存储时间序列数据。Prometheus Server 是 Prometheus 组件中的核心部分,负责实现对监控数据的获取,存储以及查询。 Prometheus Server 可以通过静态配置管理监控目标,也可以配合使用 Service Discovery 的方式动态管理监控目标,并从这些监控目标中获取数据。其次 Prometheus Server 需要对采集到的监控数据进行存储,Prometheus Server 本身就是一个时序数据库,将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。最后Prometheus Server 对外提供了自定义的 PromQL 语言,实现对数据的查询以及

  • Node-Exporter

  • 用于暴露已有的第三方服务的 metrics 给 Prometheus。Exporter 将监控数据采集的端点通过 HTTP 服务的形式暴露给 Prometheus Server,Prometheus Server 通过访问该 Exporter 提供的 Endpoint 端点,即可获取到需要采集的监控数据。

  • Grafana

  • 第三方展示工具,可以编写 PromQL 查询语句,通过 http 协议与 prometheus 集成

  • AlertManager

  • 从 Prometheus Server 端接收到 alerts 后,会进行去除重复数据,分组,并路由到对方的接受方式,发出报警。常见的接收方式有:电子邮件,钉钉、企业微信,pagerduty等

  • Push Gateway

  • 主要用于短期的 jobs。由于这类 jobs 存在时间较短,可能在 Prometheus 来 pull 之前就消失了。为此,这些 jobs 可以直接向 Prometheus server 端推送它们的 metrics。

5.4.Prometheus工作流程

  • 指标采集

  • prometheus server 通过 pull 形式采集监控指标,可以直接拉取监控指标,也可以通过 pushgateway 做中间环节,监控目标先 push 形式上报数据到 pushgateway;

  • 指标处理

  • prometheus server 将采集的数据存储在自身 db 或者第三方 db;

  • 指标展示

  • prometheus server 通过提供 http 接口,提供自带或者第三方展示系统;

  • 指标告警

  • prometheus server 通过 push 告警信息到 alert-manager,alert-manager 通过"静默-抑制-整合-下发"4个阶段处理通知到观察者

5.5.Prometheus四种指标分类

  • Counter

  • 计数器类型,只增不减,如机器的启动时间,HTTP 访问量等。机器重启不会置零,在使用这种指标类型时,通常会结合rate()方法获取该指标在某个时间段的变化率。

  • Gauge

  • 仪表盘,可增可减,如CPU使用率,大部分监控数据都是这种类型的。

  • Summary

  • 客户端定义;Summary,Histogram 都属于高级指标,用于凸显数据的分布情况。

二.安装prometheus


1.下载镜像


1.1.prometheus镜像

  1.  
    # 主服务数据库
  2.  
    ~]# docker search prometheus
  3.  
    ~]# docker pull bitnami/prometheus

1.2.node-exporter镜像

  1.  
    # 暴露被监控节点
  2.  
    ~]# docker search node-exporter
  3.  
    ~]# docker pull prom/node-exporter

1.3.alertmanager镜像

  1.  
    # 告警服务
  2.  
    ~]# docker search alertmanager
  3.  
    ~]# docker pull prom/alertmanager

1.4.webhook镜像需要后续制作

# Webhook是一个API概念,webhook是一种web回调或者http的push API.Webhook作为一个轻量的事件处理应用
xxxxxx

2.安装prometheus部署节点


2.1.先书写主配置文件

  1.  
    ~]# vim prometheus.yml
  2.  
    global:
  3.  
    scrape_interval: 60s
  4.  
    evaluation_interval: 60s
  5.  
  6.  
    alerting:
  7.  
    alertmanagers:
  8.  
    - static_configs:
  9.  
    - targets: ["alertmanager的本机真实ip:9093"]
  10.  
  11.  
    rule_files:
  12.  
    -"/etc/prometheus/rule.yml"
  13.  
  14.  
    scrape_configs:
  15.  
    - job_name: 'prometheus'
  16.  
    static_configs:
  17.  
    - targets: ["prometheus的本机真实ip:9090"]
  18.  
    - job_name: 'node-exporter'
  19.  
    static_configs:
  20.  
    - targets: ["node节点的真实ip:9100","node节点的真实ip:9100","node节点的真实ip:9100"]
  21.  
    - job_name: 'alertmanager'
  22.  
    static_configs:
  23.  
    - targets: ["alertmanager的本机真实ip:9093"]
学新通

2.2创建rule告警阈值

  1.  
    # 这里为例方便测试设置为up==1
  2.  
    ~]# vim rule.yml
  3.  
    groups:
  4.  
    - name: Hosts.rules
  5.  
    rules:
  6.  
    - alert: HostDown
  7.  
    expr: up{job=~"node-exporter|prometheus|grafana|alertmanager"} == 0
  8.  
    for: 0m
  9.  
    labels:
  10.  
    severity: ERROR
  11.  
    annotations:
  12.  
    title: 'Instance down'
  13.  
    summary: "{{$labels.instance}}"
  14.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  15.  
    ## 注意==0为报警条件,当有服务宕机测会告警,如果测试需改为1
  16.  
    注:- alert: HostDown这个数据本机基本数据类,如果要监控其他的可以设置例外的名字
学新通

2.3.启动容器

  1.  
    # 创建数据目录
  2.  
    ~]# mkdir /data/prometheus/data/
  3.  
    # 启动
  4.  
    ~]# docker run -d -p 9090:9090 --name prometheus --restart=always -v /data/prometheus/data/:/data -v /root/docker-prometheus/prometheus.yml:/data/prometheus.yml -v /root/docker-prometheus/rule.yml:/data/rule.yml prom/prometheus --config.file=/data/prometheus.yml --web.enable-lifecycle --storage.tsdb.retention=90d
  5.  
  6.  
  7.  
    ## --restart=always 还可以设置自动重启容器
  8.  
  9.  
    # -d --detach=false, 指定容器运行于前台还是后台,默认为false
  10.  
    # --net 网络模式,host网络互通模式
  11.  
    # --web.enable-lifecycle 热更新
  12.  
    # -v 给容器挂载存储卷,挂载到容器的某个目录(宿主机目录:/docker目录),注意本地需要要该文件

2.4.查看主服务部署状况

http://172.17.0.62:9090访问Prometheus的UI界面

学新通

2.5.其他命令

  1.  
    # 查看日志
  2.  
    ~]# docker ps -a | grep prome
  3.  
    d54fc1e2751d prom/prometheus "/bin/prometheus --c…" 7 hours ago Up 13 minutes 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
  4.  
    ~]# docker logs d54fc1e2751d
  5.  
  6.  
    # 进容器查看配置文件是否报错
  7.  
    ~]# promtool check config /etc/prometheus/prometheus.yml

3.安装暴露节点node-exporter


3.1.安装容器

  1.  
    ~]# docker run -d --name node-exporter --restart=always -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" prom/node-exporter
  2.  
  3.  
    # 常用选项说明
  4.  
    -d, --detach=false, 指定容器运行于前台还是后台,默认为false
  5.  
  6.  
    --net="host", 容器网络设置:
  7.  
    bridge 使用docker daemon指定的网桥
  8.  
    host 容器使用主机的网络
  9.  
    container:NAME_or_ID > 使用其他容器的网路,共享IP和PORT等网络资源
  10.  
    none 容器使用自己的网络(类似--net=bridge),但是不进行配置
  11.  
     
  12.  
    --cap-add=[], 添加权限,权限清单如下,SYS_TIME:设置实时时间:
  13.  
    --pid="host" 将 PID 模式设置为主机 PID 模式。这将打开之间的共享 容器和主机操作系统的 PID 地址空间。 使用此标志启动的容器可以访问和操作其他 裸机计算机命名空间中的容器,反之亦然。
  14.  
    -v 给容器挂载存储卷,挂载到容器的某个目录(/宿主机目录:/docker目录)
  15.  
    -e, --env=[], 指定环境变量,容器中可以使用该环境变量,设置容器 ,HOST=ip,PORTO=端口
  16.  
    /start 启动之后要执行的命令(可以是shell也可以是脚本),如带/bin/bash则是解释器(注:脚本启动失败则容器启动失败)
  17.  
  18.  
    --restart=always 还可以设置自动重启容器
学新通

3.2.参数概述

--cap-add所有参数

Capability Key

Capability Description

AUDIT_WRITE

Write records to kernel auditing log.

CHOWN

Make arbitrary changes to file UIDs and GIDs (see chown(2)).

DAC_OVERRIDE

Bypass file read, write, and execute permission checks.

FOWNER

Bypass permission checks on operations that normally require the file system UID of the process to match the UID of the file.

FSETID

Don’t clear set-user-ID and set-group-ID permission bits when a file is modified.

KILL

Bypass permission checks for sending signals.

MKNOD

Create special files using mknod(2).

NET_BIND_SERVICE

Bind a socket to internet domain privileged ports (port numbers less than 1024).

NET_RAW

Use RAW and PACKET sockets.

SETFCAP

Set file capabilities.

SETGID

Make arbitrary manipulations of process GIDs and supplementary GID list.

SETPCAP

Modify process capabilities.

SETUID

Make arbitrary manipulations of process UIDs.

SYS_CHROOT

Use chroot(2), change root directory.

The next table shows the capabilities which are not granted by default and may be added.

Capability Key

Capability Description

AUDIT_CONTROL

Enable and disable kernel auditing; change auditing filter rules; retrieve auditing status and filtering rules.

AUDIT_READ

Allow reading the audit log via multicast netlink socket.

BLOCK_SUSPEND

Allow preventing system suspends.

BPF

Allow creating BPF maps, loading BPF Type Format (BTF) data, retrieve JITed code of BPF programs, and more.

CHECKPOINT_RESTORE

Allow checkpoint/restore related operations. Introduced in kernel 5.9.

DAC_READ_SEARCH

Bypass file read permission checks and directory read and execute permission checks.

IPC_LOCK

Lock memory (mlock(2), mlockall(2), mmap(2), shmctl(2)).

IPC_OWNER

Bypass permission checks for operations on System V IPC objects.

LEASE

Establish leases on arbitrary files (see fcntl(2)).

LINUX_IMMUTABLE

Set the FS_APPEND_FL and FS_IMMUTABLE_FL i-node flags.

MAC_ADMIN

Allow MAC configuration or state changes. Implemented for the Smack LSM.

MAC_OVERRIDE

Override Mandatory Access Control (MAC). Implemented for the Smack Linux Security Module (LSM).

NET_ADMIN

Perform various network-related operations.

NET_BROADCAST

Make socket broadcasts, and listen to multicasts.

PERFMON

Allow system performance and observability privileged operations using perf_events, i915_perf and other kernel subsystems

SYS_ADMIN

Perform a range of system administration operations.

SYS_BOOT

Use reboot(2) and kexec_load(2), reboot and load a new kernel for later execution.

SYS_MODULE

Load and unload kernel modules.

SYS_NICE

Raise process nice value (nice(2), setpriority(2)) and change the nice value for arbitrary processes.

SYS_PACCT

Use acct(2), switch process accounting on or off.

SYS_PTRACE

Trace arbitrary processes using ptrace(2).

SYS_RAWIO

Perform I/O port operations (iopl(2) and ioperm(2)).

SYS_RESOURCE

Override resource Limits.

SYS_TIME

Set system clock (settimeofday(2), stime(2), adjtimex(2)); set real-time (hardware) clock.

SYS_TTY_CONFIG

Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals.

SYSLOG

Perform privileged syslog(2) operations.

WAKE_ALARM

Trigger something that will wake up the system.

3.3.查看

http://172.17.0.62:9100

学新通

3.4.其他命令

  1.  
    ## 查看日志
  2.  
    ~]# docker ps -a | grep ale
  3.  
    ed860d9e67d6 prom/alertmanager "/bin/alertmanager -…" 5 hours ago Up 31 minutes 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp alertmanager
  4.  
    ~]# docker logs ed8

4.安装告警主机


4.1.书写基本邮件告警

  1.  
    ~]# vim alertmanager.yml
  2.  
    global:
  3.  
    resolve_timeout: 5m
  4.  
    smtp_smarthost: 'smtp.qq.com:465'
  5.  
    smtp_from: '269528094@qq.com'
  6.  
    smtp_auth_username: '269528094@qq.com'
  7.  
    smtp_auth_password: 'xfjoexdzymztbjac' # 注意不是邮件密码
  8.  
    smtp_require_tls: false
  9.  
    smtp_hello: 'qq.com'
  10.  
  11.  
    route:
  12.  
    group_by: ['alertname']
  13.  
    group_wait: 5s
  14.  
    group_interval: 5s
  15.  
    repeat_interval: 5m
  16.  
    receiver: 'email'
  17.  
     
  18.  
    receivers:
  19.  
    - name: 'email'
  20.  
    email_configs:
  21.  
    - to: '2023630895@qq.com'
  22.  
    send_resolved: true
学新通
  • 全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;

  • 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;

  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;

  • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;

  • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生

4.2.启动容器

  1.  
    ~]# docker run -d -p 9093:9093 --restart always --name alertmanager -v /root/docker-prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager
  2.  
  3.  
    # -d --detach=false, 指定容器运行于前台还是后台,默认为false
  4.  
    # --net 网络模式,host网络互通模式
  5.  
    # --restart=always 还可以设置自动重启容器

4.3.查看并等待告警

学新通
学新通
学新通

三.告警配置


1.邮件告警


1.1.指定告警配置

  1.  
    # 书写自定义告警配置
  2.  
    ~]# vim email.tmpl
  3.  
    {{ define "email.to.html" }} # 告警标题在alertmagar引用
  4.  
    {{- if gt (len .Alerts.Firing) 0-}} # 告警有两种状态(Firing和Resolved)
  5.  
    {{- range $index, $alert := .Alerts -}} # 格式书写
  6.  
  7.  
    ========= <span style=color:red;font-size:36px;font-weight:bold;> 监控告警 </span>=========<br>
  8.  
    告警程序: Alertmanager <br>
  9.  
    告警类型: {{ $alert.Labels.alertname }} <br>
  10.  
    告警级别: {{ $alert.Labels.severity }} 级 <br>
  11.  
    告警状态: {{ .Status }} <br>
  12.  
    故障主机: {{ $alert.Labels.instance }} {{ $alert.Labels.device }} <br>
  13.  
    告警主题: {{ .Annotations.summary }} <br>
  14.  
    告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}} <br>
  15.  
    主机标签: {{ range .Labels.SortedPairs }} <br> [{{ .Name }}: {{ .Value | html }} ]{{ end }}<br>
  16.  
    故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
  17.  
  18.  
    {{- end }}
  19.  
    {{- end }}
  20.  
    ========== end = =========
  21.  
    {{- if gt (len .Alerts.Resolved) 0-}}
  22.  
    {{- range $index, $alert := .Alerts -}}
  23.  
    ========= <span style=color:#00FF00;font-size:24px;font-weight:bold;> 告警恢复 </span>=========<br>
  24.  
    告警程序: Alertmanager <br>
  25.  
    告警类型: {{ $alert.Labels.alertname }} <br>
  26.  
    告警级别: {{ $alert.Labels.severity }} 级 <br>
  27.  
    告警状态: {{ .Status }} <br>
  28.  
    故障主机: {{ $alert.Labels.instance }} {{ $alert.Labels.device }} <br>
  29.  
    告警主题: {{ .Annotations.summary }} <br>
  30.  
    告警详情: {{ $alert.Annotations.message }}{{ $alert.Annotations.description}} <br>
  31.  
    主机标签: {{ range .Labels.SortedPairs }} <br> [{{ .Name }}: {{ .Value | html }} ]{{ end }}<br>
  32.  
    故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}<br>
  33.  
    {{- end }}
  34.  
    {{- end }}
  35.  
    ========== end = =========
  36.  
    {{- end }}
  37.  
  38.  
    # 注:时间任意只要格式相同,系统默认会输出当前时间
  39.  
  40.  
    ##------------------------------------------##
  41.  
    ## 修改alertmanager告警配置,指定自定义告警配置
  42.  
    ~]# vim alertmanager
  43.  
    global:
  44.  
    resolve_timeout: 5m
  45.  
    smtp_smarthost: 'smtp.qq.com:465'
  46.  
    smtp_from: '269528094@qq.com'
  47.  
    smtp_auth_username: '269528094@qq.com'
  48.  
    smtp_auth_password: 'xfjoexdzymztbjac'
  49.  
    smtp_require_tls: false
  50.  
    smtp_hello: 'qq.com'
  51.  
  52.  
    templates:
  53.  
    -'/etc/alertmanager/*.tmpl'
  54.  
  55.  
    route:
  56.  
    group_by: ['alertname']
  57.  
    group_wait: 5s
  58.  
    group_interval: 5s
  59.  
    repeat_interval: 5m
  60.  
    receiver: 'email'
  61.  
     
  62.  
    receivers:
  63.  
    - name: 'email'
  64.  
    email_configs:
  65.  
    - to: '2023630895@qq.com'
  66.  
    html: '{{ template "email.to.html" . }}'
  67.  
    headers: { Subject: "[WARN]告警" }
  68.  
    send_resolved: true
  69.  
  70.  
    # (group_wait: 5s ;group_interval: 5s repeat_interval: 5m注意这三者之间的时间)
  71.  
    ##-----------------------------------------##
  72.  
    # 重新起容器,这个旧的关闭
  73.  
    ~]# docker run -d -p 9093:9093 --restart always --name alertmanager -v /root/docker-prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/docker-prometheus/email.tmpl:/etc/alertmanager/email.tmpl prom/alertmanager
  74.  
  75.  
  76.  
    ## 基本参数概述
  77.  
    # -d --detach=false, 指定容器运行于前台还是后台,默认为false
  78.  
    # --net 网络模式,host网络互通模式
  79.  
    --cap-add=[], 添加权限,权限清单如下,SYS_TIME:设置实时时间:SYS_PTRACE:防止进程agetty占用宿主机的cpu
  80.  
    --pid="host" 将 PID 模式设置为主机 PID 模式。这将打开之间的共享 容器和主机操作系统的 PID 地址空间。 使用此标志启动的容器可以访问和操作其他 裸机计算机命名空间中的容器,反之亦然。
  81.  
    -v 给容器挂载存储卷,挂载到容器的某个目录(/宿主机目录:/docker目录)
  82.  
    -e, --env=[], 指定环境变量,容器中可以使用该环境变量,设置容器 ,HOST=ip,PORTO=端口
学新通

注:-cap-add参数是出于对安全的考虑,在启动容器时,docker容器里的系统只具有一些普通的linux权限,并不具有真正root用户的所有权限。而--privileged=true参数可以让docker容器具有linux root用户的所有权限。

为了解决这个问题,docker后来的版本中docker run增加了两个选项参数"--cap-add"和"--cap-drop"。则是避免混淆权限,SYS_TIME:设置实时时间;SYS_PTRACE防止进程agetty占用宿主机的cpu

1.2.查看容器状态及告警

  1.  
    # 查看容器是否启动
  2.  
    ~]# docker ps -a | grep alertmanager
  3.  
    ed860d9e67d6 prom/alertmanager "/bin/alertmanager -…" 5 hours ago Up 31 minutes 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp alertmanager

查看告警是否正常

学新通

修改Prometheus自定阀值参数(之前为1)

  1.  
    ~]# vim rule.yml
  2.  
    groups:
  3.  
    - name: Hosts.rules
  4.  
    rules:
  5.  
    - alert: HostDown
  6.  
    expr: up{job=~"node-exporter|prometheus|grafana|alertmanager"} ==0 # 等于0则会恢复告警
  7.  
    for: 0m
  8.  
    labels:
  9.  
    severity: ERROR
  10.  
    annotations:
  11.  
    title: 'Instance down'
  12.  
    summary: "{{$labels.instance}}"
  13.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  14.  
    # 重启容器(之前有做持久化-v)
  15.  
    ~]# docker ps -a | grep prome
  16.  
    ~]# docker stop d54
  17.  
    ~]# docker start d54
学新通

告警状态

学新通

2.企业微信机器人告警


2.1.创建机器人

学新通
学新通

注:首先要有个群

2.2.创建webhook容器

1.flask程序代码

  1.  
    ~]# vim app.py
  2.  
    # -*- coding: utf-8 -*-
  3.  
    importos
  4.  
    importjson
  5.  
    importrequests
  6.  
    importarrow
  7.  
     
  8.  
    fromflaskimportFlask
  9.  
    fromflaskimportrequest
  10.  
     
  11.  
    app = Flask(__name__)
  12.  
     
  13.  
    defbytes2json(data_bytes):
  14.  
    data = data_bytes.decode('utf8').replace("'", '"')
  15.  
    returnjson.loads(data)
  16.  
     
  17.  
    defmakealertdata(data):
  18.  
    foroutputindata['alerts'][:]:
  19.  
    ifoutput['status'] == 'firing':
  20.  
    status_zh = '<font color=\"warning\">告警</font>'
  21.  
    title = '【%s】TAPD告警 %s 有新的报警'% (status_zh,output['labels']['instance'])
  22.  
    send_data = {
  23.  
    "msgtype": "markdown",
  24.  
    "markdown": {
  25.  
    "content": "## %s \n\n"%title
  26.  
    ">**告警类型**: %s \n\n"%output['labels']['alertname']
  27.  
    ">**告警级别**: %s \n\n"%output['labels']['severity']
  28.  
    ">**告警状态**: %s \n\n"%output['status']
  29.  
    ">**告警主机**: %s \n\n"%output['annotations']['summary']
  30.  
    ">**告警负责人**: %s \n\n"%"<@v_keyao>"
  31.  
    ">**告警详情**: %s \n\n"%output['annotations']['description']
  32.  
    ">**触发时间**: %s \n\n"%arrow.get(output['startsAt']).to('Asia/Shanghai').format(
  33.  
    'YYYY-MM-DD HH:mm:ss ZZ')
  34.  
    }
  35.  
    }
  36.  
    elifoutput['status'] == 'resolved':
  37.  
    status_zh = '<font color=\"info\">恢复</font>'
  38.  
    title = '【%s】TAPD环境 %s 有报警恢复'% (status_zh, output['labels']['instance'])
  39.  
    send_data = {
  40.  
    "msgtype": "markdown",
  41.  
    "markdown": {
  42.  
    "content": "## %s \n\n"%title
  43.  
    ">**告警类型**: %s \n\n"%output['labels']['alertname']
  44.  
    ">**告警级别**: %s \n\n"%output['labels']['severity']
  45.  
    ">**告警状态**: %s \n\n"%output['status']
  46.  
    ">**告警主机**: %s \n\n"%output['annotations']['summary']
  47.  
    ">**告警负责人**: %s \n\n"%"<@v_keyao>"
  48.  
    ">**告警详情**: %s \n\n"%output['annotations']['description']
  49.  
    ">**触发时间**: %s \n\n"%arrow.get(output['startsAt']).to('Asia/Shanghai').format(
  50.  
    'YYYY-MM-DD HH:mm:ss ZZ')
  51.  
    ">**触发结束时间**: %s \n"%arrow.get(output['endsAt']).to('Asia/Shanghai').format(
  52.  
    'YYYY-MM-DD HH:mm:ss ZZ')
  53.  
    }
  54.  
    }
  55.  
    returnsend_data
  56.  
    defsend_alert(data):
  57.  
    token = os.getenv('ROBOT_TOKEN')
  58.  
    ifnottoken:
  59.  
    print('you must set ROBOT_TOKEN env')
  60.  
    return
  61.  
    url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=%s'%token
  62.  
     
  63.  
    send_data = makealertdata(data)
  64.  
    req = requests.post(url, json=send_data)
  65.  
    result = req.json()
  66.  
    ifresult['errcode'] != 0:
  67.  
    print('notify dingtalk error: %s'%result['errcode'])
  68.  
     
  69.  
     
  70.  
    @app.route('/', methods=['POST', 'GET'])
  71.  
    defsend():
  72.  
    ifrequest.method == 'POST':
  73.  
    post_data = request.get_data()
  74.  
    send_alert(bytes2json(post_data))
  75.  
    return'success'
  76.  
    else:
  77.  
    return'weclome to use prometheus alertmanager dingtalk webhook server!'
  78.  
     
  79.  
     
  80.  
    if__name__ == '__main__':
  81.  
    app.run(host='0.0.0.0', port=5000)
学新通

注:中间的先发一个普通的邮件告警看一下有哪些键值如下:

学新通

2.python模块依赖

  1.  
    ~]# vim requirements.txt
  2.  
    certifi==2018.10.15
  3.  
    chardet==3.0.4
  4.  
    Click==7.0
  5.  
    Flask==1.0.2
  6.  
    idna==2.7
  7.  
    itsdangerous==1.1.0
  8.  
    Jinja2==2.10
  9.  
    MarkupSafe==1.1.0
  10.  
    requests==2.20.1
  11.  
    urllib3==1.24.1
  12.  
    Werkzeug==0.14.1
  13.  
    arrow==0.13.1

3.书写dockerfile

  1.  
    ~]# vim Dockerfile
  2.  
    FROM python:3.6.4
  3.  
    # set working directory
  4.  
    WORKDIR /src
  5.  
    # add app
  6.  
    ADD . /src
  7.  
    # install requirements
  8.  
    RUN pip install selectivesearch -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  9.  
    RUN pip install -r requirements.txt
  10.  
    EXPOSE 500
  11.  
    # run server
  12.  
    CMD python app.py

4.运行

  1.  
    ~]# docker run -d -p 8060:5000 --restart always --name webhook -v /etc/localtime:/etc/localtime:ro -v /data/alertmanager/app.py:/src/app.py -e ROBOT_TOKEN=eb25f0c4-69ac-458c-af07-a6999beb05cd webhook:v128baf72d5f6a42e9c1c8374e57836d1659bb109981d5bf7a9654aa599532c314
  2.  
  3.  
    # 注意-v文件的位置(本地文件位置可能改变)
  4.  
    -e:指定机器人密钥
  5.  
  6.  
    # 查看启动状态
  7.  
    ~]# docker ps -a | grep webhook
  8.  
    ~]# docker exec -it xxx sh
  9.  
    # env
  10.  
    HOSTNAME=28baf72d5f6a
  11.  
    GPG_KEY=0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D
  12.  
    ROBOT_TOKEN=eb25f0c4-69ac-458c-af07-a6999beb05cd

2.3.修改alertmanager

  1.  
    ~]# vim alertmanager.yml
  2.  
    global:
  3.  
    resolve_timeout: 5m
  4.  
  5.  
    route:
  6.  
    group_by: ['alertname']
  7.  
    group_wait: 5s
  8.  
    group_interval: 5s
  9.  
    repeat_interval: 5m
  10.  
    receiver: 'web.hook'
  11.  
  12.  
    receivers:
  13.  
    - name: 'web.hook'
  14.  
    webhook_configs:
  15.  
    - url: '172.17.0.62:8060'
  16.  
    send_resolved: true
  17.  
  18.  
    # 重启容器alertmanager
  19.  
    ~]# docker ps -a | grep alertmanager
  20.  
    ed860d9e67d6 prom/alertmanager "/bin/alertmanager -…" 6 hours ago Up About a minute 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp alertmanager
  21.  
    ~]# docker stop ed8
  22.  
    ~]# docker start ed8
学新通

2.4.查看

  1.  
    # 1.查看Prometheus是否报错
  2.  
    ~]# docker ps -a | grep prometheus
  3.  
    d54fc1e2751d prom/prometheus "/bin/prometheus --c…" 11 hours ago Up 4 minutes 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
  4.  
  5.  
    ~]# docker logs d54
  6.  
     
  7.  
    # 2.查看alermanager是否报错
  8.  
    ]# docker ps -a | grep alertmanager
  9.  
    d4301871c6e3 prom/alertmanager "/bin/alertmanager -…" 43 minutes ago Up 4 minutes 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp alertmanager
  10.  
  11.  
    ~]# docker logs d43
  12.  
     
  13.  
    # 3.查看webhook是否报错
  14.  
    ~]# docker ps -a | grep webhook
  15.  
    fb8620f47a65 webhook:v1 "/bin/sh -c 'python …" About an hour ago Up About an hour 500/tcp, 0.0.0.0:8060->5000/tcp, :::8060->5000/tcp webhook
  16.  
  17.  
    ~]# docker logs fb86
  18.  
    * Serving Flask app "app" (lazy loading)
  19.  
    * Environment: production
  20.  
    WARNING: Do not use the development server in a production environment.
  21.  
    Use a production WSGI server instead.
  22.  
    * Debug mode: off
  23.  
    * Running on http://0.0.0.0:5000/ (Press CTRL C to quit)
  24.  
    172.18.0.1 -- [02/Feb/2023 20:24:13] "POST / HTTP/1.1"200-
  25.  
    172.18.0.1 -- [02/Feb/2023 20:29:18] "POST / HTTP/1.1"200-
  26.  
    # 以上为正常
  27.  
    ## 告警排查
  28.  
    # 1.排查alertmanager是否挂载入容器
  29.  
    # 2.排查prometheus告警阈值是否设置为错
  30.  
    # 3.webhook是否正确
学新通
学新通

修改告警参数,告警恢复(注意重启容器)

学新通

3.测试alertmanager机器


  1.  
    ~]# vim ceshi.sh
  2.  
    #!/bin/bash
  3.  
    alerts_message='[
  4.  
    {
  5.  
    "labels": {
  6.  
    "alertname": "磁盘已满",
  7.  
    "dev": "sda1",
  8.  
    "instance": "实例1",
  9.  
    "msgtype": "testing"
  10.  
    },
  11.  
    "annotations": {
  12.  
    "info": "程序员小王提示您:这个磁盘sda1已经满了,快处理!",
  13.  
    "summary": "请检查实例示例1"
  14.  
    }
  15.  
    },
  16.  
    {
  17.  
    "labels": {
  18.  
    "alertname": "磁盘已满",
  19.  
    "dev": "sda2",
  20.  
    "instance": "实例1",
  21.  
    "msgtype": "testing"
  22.  
    },
  23.  
    "annotations": {
  24.  
    "info": "程序员小王提示您:这个磁盘sda2已经满了,快处理!",
  25.  
    "summary": "请检查实例示例1",
  26.  
    "runbook": "以下链接http://test-url应该是可点击的"
  27.  
    }
  28.  
    }
  29.  
    ]'
  30.  
    curl-XPOST-d"$alerts_message" http://127.0.0.1:9093/api/v1/alerts
  31.  
    ~]# bash ceshi.sh
  32.  
    {"status":"success"}
学新通
  • 测试结果

学新通

四.添加redis和mysql监控


1.redis监控


1.1.安装redis

  1.  
    ~]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
  2.  
    ~]# tar -zvxf redis-5.0.7.tar.gz
  3.  
    ~]# mv /root/redis-5.0.7 /usr/local/redis
  4.  
    ~]# cd /usr/local/redis
  5.  
    ~]# make
  6.  
    ~]# make PREFIX=/usr/local/redis install

学新通

1.2.启动redis

  1.  
    ~]# cd /usr/local/redis
  2.  
    # 设置外网可以访问
  3.  
    ~]# vim /usr/local/redis/redis.conf
  4.  
    daemonize yes
  5.  
    # 启动
  6.  
    ~]# ./bin/redis-server ./redis.conf
  7.  
    ~]# ss -nutlp | grep 6379
  8.  
    ~]# ps -ef | grep redis
  9.  
    ~]# cd /usr/local/redis/
  10.  
    ~]# cp src/redis-cli bin/
  11.  
    ~]# cd bin/
  12.  
    ~]# ./redis-cli
  13.  
    CONFIG GET * # 查看详情
  14.  
    注:这里不做过多的redis概述

1.3.安装Redis Exporter监控redis

  1.  
    # 部署redis exporter
  2.  
    ~]# wget https://github.com/oliver006/redis_exporter/releases/download/v1.6.1/redis_exporter-v1.6.1.linux-amd64.tar.gz
  3.  
    ~]# tar -xf redis_exporter-v1.6.1.linux-amd64.tar.gz
  4.  
    ~]# mv redis_exporter-v1.3.2.linux-amd64 /data/redis_exporter
  5.  
  6.  
    #################################################
  7.  
    ## 测试
  8.  
    # 无密码
  9.  
    ./redis_exporter redis//172.17.0.107:6379 &
  10.  
    # 有密码
  11.  
    ./redis_exporter -redis.addr 172.17.0.107:6379 -redis.password 123456 &
  12.  
  13.  
  14.  
    -redis.addr string:Redis实例的地址,可以使一个或者多个,多个节点使用逗号分隔,默认为 "redis://localhost:6379"
  15.  
    -redis.password string:Redis实例的密码
  16.  
    -web.listen-address string:服务监听的地址,默认为 0.0.0.0:9121
  17.  
  18.  
    ##################################################
  19.  
    ## 设置systemd管理
  20.  
    ~]# cat > /etc/systemd/system/redis_exporter.service <<EOF
  21.  
  22.  
    [Unit]
  23.  
    Description=redis_exporter
  24.  
    After=network.target
  25.  
  26.  
    [Service]
  27.  
    Type=simple
  28.  
    User=prometheus
  29.  
    ExecStart=/data/redis_exporter/redis_exporter redis//172.17.0.107:6379 # 这里填写启动命令(没有密码就用上面那个)
  30.  
    Restart=on-failure
  31.  
  32.  
    [Install]
  33.  
    WantedBy=multi-user.target
  34.  
    EOF
  35.  
    # 注:这里启动用户是prometheus所以需要创建
  36.  
    ~]# groupadd prometheus
  37.  
    ~]# useradd -g prometheus -m -d /var/lib/prometheus -s /sbin/nologin prometheus
  38.  
    ~]# chown -R prometheus:prometheus /data/redis_exporter
  39.  
    ~]# systemctl daemon-reload
  40.  
    # 注:启动前先kill掉之前用当前启动的方式(ps -ef | grep resi)
  41.  
    ~]# systemctl start redis_exporter
  42.  
    ~]# ss -tln | grep 9121
  43.  
    LISTEN 0 128 [::]:9121 [::]:*
  44.  
    ~]# systemctl stop redis_exporter
  45.  
    ~]# ss -tln | grep 9121
学新通

1.4.添加监控目标

  1.  
    ~]# vim prometheus.yml
  2.  
    global:
  3.  
    scrape_interval: 60s
  4.  
    evaluation_interval: 60s
  5.  
  6.  
    alerting:
  7.  
    alertmanagers:
  8.  
    - static_configs:
  9.  
    - targets: ["172.17.0.62:9093"]
  10.  
  11.  
    rule_files:
  12.  
    - "/etc/prometheus/rule.yml"
  13.  
  14.  
    scrape_configs:
  15.  
    - job_name: 'prometheus'
  16.  
    static_configs:
  17.  
    - targets: ["172.17.0.62:9090"]
  18.  
    - job_name: 'node-exporter'
  19.  
    static_configs:
  20.  
    - targets: ["172.17.0.62:9100","172.17.0.107:9100","172.17.0.110:9100"]
  21.  
    - job_name: 'alertmanager'
  22.  
    static_configs:
  23.  
    - targets: ["172.17.0.62:9093"]
  24.  
    - job_name: redis # 添加如下:
  25.  
    static_configs:
  26.  
    - targets: ['172.17.0.107:9121']# 监控redis机器的ip
  27.  
    labels:
  28.  
    instance: redis
  29.  
    # 重启Prometheus容器(之前做了持久化所以可以直接重启)
  30.  
    ~]# docker ps -a | grep prome
  31.  
    d54fc1e2751d prom/prometheus "/bin/prometheus --c…" 25 hours ago Up 2 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
  32.  
    ~]# docker stop d54
  33.  
    d54
  34.  
    ~]# docker start d54
  35.  
    d54
  36.  
    ~]# docker ps -a | grep prome
  37.  
    d54fc1e2751d prom/prometheus "/bin/prometheus --c…" 25 hours ago Up 2 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
学新通

1.5.验证并查看

学新通
学新通

设置告警阈值测试

  1.  
    ~]# vim rule.yml
  2.  
    groups:
  3.  
    - name: Hosts.rules
  4.  
    rules:
  5.  
    - alert: HostDown
  6.  
    expr: up{job=~"node-exporter|prometheus|grafana|alertmanager"} ==0
  7.  
    for: 0m
  8.  
    labels:
  9.  
    severity: ERROR
  10.  
    annotations:
  11.  
    title: 'Instance down'
  12.  
    summary: "{{$labels.instance}}"
  13.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  14.  
    - alert: redis
  15.  
    expr: up{job=~"redis"} ==1
  16.  
    for: 0m
  17.  
    labels:
  18.  
    severity: ERROR
  19.  
    annotations:
  20.  
    title: 'Instance down'
  21.  
    summary: "{{$labels.instance}}"
  22.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  23.  
    ## 之前有做持久化直接重启容器
  24.  
    ~]# docker stop d54
  25.  
    d54
  26.  
    ~]# docker start d54
学新通
学新通

在把阈值修改为正确的则会恢复

学新通

2.mysql监控


2.1.安装mysql

1.下载tar包

链接:https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz

学新通
学新通

2.解压安装(绿色软件可直接使用)

  1.  
    ~]# tar -xf mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz
  2.  
    ~]# mv mysql-5.7.41-linux-glibc2.12-x86_64 /usr/local/mysql
  3.  
    ~]# ls /usr/local/mysql/
  4.  
    bin docs include lib LICENSE man README share support-files

3.创建数据目录

  1.  
    ~]# groupadd mysql
  2.  
    ~]# useradd -r -g mysql mysql
  3.  
    ~]# mkdir -p /data/mysql
  4.  
    ~]# mkdir -p /data/mysql

4.创建my.cnf配置文件

  1.  
    ~]# vim /etc/my.cnf
  2.  
    [mysqld]
  3.  
    bind-address=172.17.0.110 #自己的ip
  4.  
    port=3306
  5.  
    user=mysql
  6.  
    basedir=/usr/local/mysql # 软件包解压的位置
  7.  
    datadir=/data/mysql # 数据目录
  8.  
    socket=/tmp/mysql.sock
  9.  
    log-error=/data/mysql/mysql.err
  10.  
    pid-file=/data/mysql/mysql.pid
  11.  
    #character config
  12.  
    character_set_server=utf8mb4
  13.  
    symbolic-links=0
  14.  
    explicit_defaults_for_timestamp=true

5.初始化数据库

  1.  
    # 进入mysql的bin目录
  2.  
    ~]# cd /usr/local/mysql/bin/
  3.  
    ~]# yum -y install numactl.x86_64
  4.  
    # 初始化
  5.  
    ~]# ./mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql/ --datadir=/data/mysql/ --user=mysql --initialize
  6.  
  7.  
    # 查看密码
  8.  
    ~]# cat /data/mysql/mysql.err
  9.  
    2023-02-03T06:13:22.872091Z 1 [Note] A temporary password is generated for root@localhost: yWLcd2pmQF=1
  10.  
    # 密码是 yWLcd2pmQF=1
  11.  
  12.  
  13.  
    ## 启动mysql,并更改root 密码
  14.  
    #先将mysql.server放置到/etc/init.d/mysql中
  15.  
    ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
  16.  
  17.  
    # 启动!!!
  18.  
    ~]# service mysql start
  19.  
    ~]# ps -ef|grep mysql
  20.  
  21.  
    # 下面修改密码,首先登录mysql,前面的那个是随机生成的。
  22.  
    ~]# cd
  23.  
    ~]# ./mysql -u root -p #bin目录下
  24.  
  25.  
    ## 重置密码
  26.  
    SET PASSWORD = PASSWORD('123456');
  27.  
    ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
  28.  
    FLUSH PRIVILEGES;
  29.  
    use mysql #访问mysql库
  30.  
    update user set host ='%' where user ='root'; #使root能再任何host访问
  31.  
    FLUSH PRIVILEGES;
  32.  
  33.  
    # mysql命令直接使用
  34.  
    ~]# ln -s /usr/local/mysql/bin/mysql /usr/bin
  35.  
    ~]# mysql -uroot -p123456
学新通

2.2.安装并配置mysql-exporter

1.下载并设置

  1.  
    ~]# wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.12.1/mysqld_exporter-0.12.1.linux-amd64.tar.gz
  2.  
    ~]# tar -xf mysqld_exporter-0.12.1.linux-amd64.tar.gz
  3.  
  4.  
    ~]# mv mysqld_exporter-0.12.1.linux-amd64 /data/mysqld_exporter
  5.  
    ~]# chmod x /data/mysqld_exporter/mysqld_exporter

暂时还0.14还没有linux版本所以还是用1.12.1

学新通

2.配置基本需求

  1.  
    # 设置用户下面配置文件需要
  2.  
    ~]# mysql -uroot -p123456
  3.  
    mysql>GRANT PROCESS, REPLICATION CLIENT,SELECTON*.*TO'exporter'@'%' identified by 'Abc@123456';
  4.  
    mysql>flushprivileges;

3.创建配置文件

  1.  
    ## 创建配置文件
  2.  
    ~]# cd /data/mysqld_exporter
  3.  
    ~]# vim .my.cnf
  4.  
    [client]
  5.  
    host=172.17.0.110 # 或localhost
  6.  
    user=exporter
  7.  
    password=Abc@123456
  8.  
    # 启动的时候,指定这个配置文件即可

4.创建启动文件(使用systemd管理)

  1.  
    ~]# cat > /usr/lib/systemd/system/mysqld_exporter.service <<EOF
  2.  
    [Unit]
  3.  
    Description=mysqld_exporter
  4.  
    After=network.target
  5.  
  6.  
    [Service]
  7.  
    Type=simple
  8.  
    User=prometheus
  9.  
    ExecStart=/data/mysqld_exporter/mysqld_exporter --config.my-cnf=/data/mysqld_exporter/.my.cnf
  10.  
    Restart=on-failure
  11.  
  12.  
    [Install]
  13.  
    WantedBy=multi-user.target
  14.  
    EOF
  15.  
    # 这里我也是用prometheus用户启动mysqld_exporter,所以要创建prometheus用户并授权。
学新通

5.创建数据目录

  1.  
    ~]# groupadd prometheus
  2.  
    ~]# useradd -g prometheus -m -d /var/lib/prometheus -s /sbin/nologin prometheus
  3.  
    ~]# chown -R prometheus:prometheus /data/mysqld_exporter

6.启动mysqld_exporter

  1.  
    ~]# systemctl daemon-reload
  2.  
    ~]# systemctl start mysqld_exporter
  3.  
    ~]# systemctl status mysqld_exporter
  4.  
    ~]# systemctl enable mysqld_exporter
  5.  
    ~]# ss -tln | grep 9104

2.3.添加监控目标

  1.  
    # 添加
  2.  
    ~]# vim prometheus.yml
  3.  
    global:
  4.  
    scrape_interval: 60s
  5.  
    evaluation_interval: 60s
  6.  
  7.  
    alerting:
  8.  
    alertmanagers:
  9.  
    - static_configs:
  10.  
    - targets: ["172.17.0.62:9093"]
  11.  
  12.  
    rule_files:
  13.  
    - "/etc/prometheus/rule.yml"
  14.  
  15.  
    scrape_configs:
  16.  
    - job_name: 'prometheus'
  17.  
    static_configs:
  18.  
    - targets: ["172.17.0.62:9090"]
  19.  
    - job_name: 'node-exporter'
  20.  
    static_configs:
  21.  
    - targets: ["172.17.0.62:9100","172.17.0.107:9100","172.17.0.110:9100"]
  22.  
    - job_name: 'alertmanager'
  23.  
    static_configs:
  24.  
    - targets: ["172.17.0.62:9093"]
  25.  
    - job_name: redis
  26.  
    static_configs:
  27.  
    - targets: ['172.17.0.107:9121']
  28.  
    labels:
  29.  
    instance: redis
  30.  
    - job_name: 'mysql' # 添加如下:
  31.  
    static_configs:
  32.  
    - targets: ['172.17.0.110:9104']
  33.  
    labels:
  34.  
    instance: db
  35.  
    ## 设置告警阈值测试
  36.  
    ~]# vim rule.yml
  37.  
    groups:
  38.  
    - name: Hosts.rules
  39.  
    rules:
  40.  
    - alert: HostDown
  41.  
    expr: up{job=~"node-exporter|prometheus|grafana|alertmanager"} == 0
  42.  
    for: 0m
  43.  
    labels:
  44.  
    severity: ERROR
  45.  
    annotations:
  46.  
    title: 'Instance down'
  47.  
    summary: "{{$labels.instance}}"
  48.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  49.  
    - alert: redis
  50.  
    expr: up{job=~"redis"} == 0
  51.  
    for: 0m
  52.  
    labels:
  53.  
    severity: ERROR
  54.  
    annotations:
  55.  
    title: 'Instance down'
  56.  
    summary: "{{$labels.instance}}"
  57.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  58.  
    - alert: db
  59.  
    expr: up{job=~"mysql"} == 0
  60.  
    for: 0m
  61.  
    labels:
  62.  
    severity: ERROR
  63.  
    annotations:
  64.  
    title: 'Instance down'
  65.  
    summary: "{{$labels.instance}}"
  66.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  67.  
  68.  
    # 重启Prometheus容器(之前做了持久化所以可以直接重启)
  69.  
    ~]# docker ps -a | grep prome
  70.  
    d54fc1e2751d prom/prometheus "/bin/prometheus --c…" 25 hours ago Up 2 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
  71.  
    ~]# docker stop d54
  72.  
    d54
  73.  
    ~]# docker start d54
  74.  
    d54
  75.  
    ~]# docker ps -a | grep prome
  76.  
    d54fc1e2751d prom/prometheus "/bin/prometheus --c…" 25 hours ago Up 2 seconds 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
学新通

2.5.验证并查看

学新通
学新通

告警阈值设置回后

学新通

五.邮件告警和webhook告警组合


主:之前写的邮件告警和webhook告警类似,这里就直接修改配置文件了

1.修改alertmanager


  1.  
    ~]# vim alertmanager.yml
  2.  
    global:
  3.  
    resolve_timeout: 5m
  4.  
    smtp_smarthost: 'smtp.qq.com:465'
  5.  
    smtp_from: '269528094@qq.com'
  6.  
    smtp_auth_username: '269528094@qq.com'
  7.  
    smtp_auth_password: 'xfjoexdzymztbjac'
  8.  
    smtp_require_tls: false
  9.  
    smtp_hello: 'qq.com'
  10.  
  11.  
    templates:
  12.  
    - '/etc/alertmanager/*.tmpl'
  13.  
  14.  
    route:
  15.  
    group_by: ['alertname']
  16.  
    group_wait: 5s
  17.  
    group_interval: 5s
  18.  
    repeat_interval: 5m
  19.  
    receiver: 'email'
  20.  
    routes:
  21.  
    - receiver: 'web.hook'
  22.  
    match:
  23.  
    severity: Warning # 与prometheus自定义告警阈值一致如下:severity: Warning
  24.  
  25.  
    receivers:
  26.  
    - name: 'email'
  27.  
    email_configs:
  28.  
    - to: '2023630895@qq.com'
  29.  
    html: '{{ template "email.to.html" . }}'
  30.  
    headers: { Subject: "TAPD告警"}
  31.  
    - name: 'web.hook'
  32.  
    webhook_configs:
  33.  
    - url: 'http://172.17.0.62:8060'
  34.  
    send_resolved: true
  35.  
  36.  
    inhibit_rules:
  37.  
    - source_match:
  38.  
    severity: 'critical'
  39.  
    target_match:
  40.  
    severity: 'warning'
  41.  
    equal: ['alertname', 'dev', 'instance']
学新通

2.修改自定义告警阈值文件


  1.  
    ~]# vim rule.yml
  2.  
    groups:
  3.  
    - name: Hosts.rules
  4.  
    rules:
  5.  
    - alert: HostDown
  6.  
    expr: up{job=~"node-exporter|prometheus|grafana|alertmanager"} == 1
  7.  
    for: 0m
  8.  
    labels:
  9.  
    severity: ERROR # 这个是区分邮件还是告警的表字
  10.  
    annotations:
  11.  
    title: 'Instance down'
  12.  
    summary: "{{$labels.instance}}"
  13.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  14.  
    - alert: redis
  15.  
    expr: up{job=~"redis"} == 1
  16.  
    for: 0m
  17.  
    labels:
  18.  
    severity: Warning # 这个是区分邮件还是告警的表字
  19.  
    annotations:
  20.  
    title: 'Instance down'
  21.  
    summary: "{{$labels.instance}}"
  22.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
  23.  
    - alert: db
  24.  
    expr: up{job=~"mysql"} == 1
  25.  
    for: 0m
  26.  
    labels:
  27.  
    severity: Warning # 这个是区分邮件还是告警的表字
  28.  
    annotations:
  29.  
    title: 'Instance down'
  30.  
    summary: "{{$labels.instance}}"
  31.  
    description: "主机: 【{{ $labels.instance }}】has been down for more than 1 minute"
学新通

3.重启Prometheus和alertmanager容器

  1.  
    ~]# docker ps -a | grep prometheus
  2.  
    d5657322a891 bitnami/prometheus "/opt/bitnami/promet…" 7 hours ago Up 6 minutes 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp prometheus
  3.  
    ~]# docker stop d56
  4.  
    ~]# docker start d56
  5.  
  6.  
    ~]# docker ps -a | grep alertmanager
  7.  
    d4301871c6e3 prom/alertmanager bin/alertmanager -…" 29 hours ago Up 14 minutes 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp alertmanager
  8.  
    ~]# docker stop d43
  9.  
    ~]# docker stop d43

4.查看告警


webhook内告警

学新通

邮件告警

学新通

修改回则恢复

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfkajbg
系列文章
更多 icon
同类精品
更多 icon
继续加载