Prometheus

作者: 想成为大师的学徒小纪 | 来源:发表于2022-02-28 14:22 被阅读0次

一、简介

Prometheus是一个开源系统监控和报警工具包,具有活跃的生态系统。是一个多维数据模型,其中的时间序列数据由指标名称和键/值对识别。它不依赖分布式存储,单个服务器节点是自治的。通过一个中间网关支持推送时间序列,可以通过服务发现或静态配置来发现目标,支持多种模式的图表和仪表盘制作。

Prometheus具体架构图如下:

普罗米修斯架构

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

二、词汇表

  • Alert

    警报是Prometheus中主动触发的警报规则的结果。警报从Prometheus发送到Alertmanager。

  • Alertmanager

    Alertmanager接收警报,将它们聚合成组、去重复、应用静音、限制,然后将通知发送到电子邮件、Pagerduty、Slack等。

  • Bridge

    桥接器是从客户端库中获取样本并将其暴露给非Prometheus监控系统的组件。例如Python、Go和Java客户端可以将指标导出到Graphite。

  • Client library

    客户端库是某种语言(例如Go、Java、Python、Ruby)的库,可以轻松直接检测您的代码、编写自定义收集器以从其他系统提取指标并将指标公开给 Prometheus。

  • Collector

    收集器是表示一组指标的导出器的一部分。如果它是直接检测的一部分,它可能是单个指标,或者如果它从另一个系统提取指标,则它可能是多个指标。

  • Endpoint

    可以抓取的指标来源,通常对应于单个流程。

  • Exporter

    导出器是与您要从中获取指标的应用程序一起运行的二进制文件。导出器公开Prometheus指标,通常通过将以非Prometheus格式公开的指标转换为Prometheus支持的格式。

  • Instance

    实例是唯一标识作业中目标的标签。

  • Job

    具有相同目的的一组目标,例如监视一组为可扩展性或可靠性而复制的类似进程,称为作业。

  • Notification

    通知代表一组一个或多个警报,由Alertmanager发送到电子邮件、Pagerduty、Slack等。

  • Pushgateway

    Pushgateway会保留来自批处理作业的最新指标推送。这允许Prometheus在它们终止后抓取它们的指标。

  • Remote Read

    远程读取是Prometheus的一项功能,允许从其他系统(例如长期存储)透明读取时间序列作为查询的一部分。

  • Remote Read Adapter

    并非所有系统都直接支持远程读取。remote read adapter位于Prometheus和另一个系统之间,在它们之间转换时间序列请求和响应。

  • Remote Read Endpoint

    remote read endpoint是Prometheus在进行远程读取时与之对话的端点。

  • Sample

    样本是时间序列中某个时间点的单个值。在Prometheus中,每个样本由一个float64值和一个毫秒精度的时间戳组成。

  • Silence

    Alertmanager中的静音可防止带有与静音匹配的标签的警报包含在通知中。

  • Target

    目标是要抓取的对象的定义。 例如,要应用的标签、连接所需的任何身份验证或定义刮擦将如何发生的其他信息。

三、命令行参数

--config.file="prometheus.yml" Prometheus配置文件路径。

--web.listen-address="0.0.0.0:9090" 用于监听UI、API和遥测的地址。

--web.config.file="" [EXPERIMENTAL] 可以启用TLS或认证的配置文件的路径。

--web.read-timeout=5m 超时读取请求和关闭空闲连接之前的最大持续时间。

--web.max-connections=512 最大同时连接数。

--web.external-url=<URL> 外部可访问Prometheus所在的URL(例如,如果Prometheus通过反向代理提供服务)。用于生成返回到Prometheus本身的相对和绝对链接。如果URL有路径部分,它将用于为Prometheus服务的所有HTTP端点添加前缀。如果省略,将自动派生相关的URL组件。

--web.route-prefix=<path> Web端点的内部路线的前缀。默认为-web.external-url的路径。

--web.user-assets=<path> 静态资源目录的路径,位于 /user。

--web.enable-lifecycle 通过HTTP请求启用关闭和重新加载。

--web.enable-admin-api 启用管理控制行动的API端点。

--web.console.templates="consoles" 控制台模板目录的路径,位于/consoles。

--web.console.libraries="console_libraries" 控制台库目录的路径。

--storage.tsdb.path="data/" 指标存储的基本路径。仅用于server模式。

--storage.tsdb.retention.time= 样本在储存中保留多长时间。设置此标志后,它会覆盖“storage.tsdb.retention”。如果此标志、“storage.tsdb.retention”或“storage.tsdb.retention.size”均未设置,则保留时间默认为15d。支持的单位:y、w、d、h、m、s、ms。仅用于server模式。

--storage.tsdb.retention.size= 块存储的最大字节数。需要一个单位,支持的单位:B、KB、MB、GB、TB、PB、EB。例如:“512MB”。仅用于server模式。

--storage.tsdb.no-lockfile 不在数据目录中创建锁文件。仅用于server模式。

--storage.tsdb.allow-overlapping-blocks 允许重叠块,从而启用垂直压缩和垂直查询合并。仅用于服务器模式。

--storage.agent.path="data-agent/" 指标存储的基本路径。仅用于agent模式。

--storage.agent.wal-compression 压缩代理WAL。仅用于agent模式。

--storage.agent.retention.min-time= 当WAL被截断时,样本在被强行删除之前的最小年龄,仅用于agent模式。

--storage.agent.retention.max-time= 当WAL被截断时,样本在被强行删除之前的最大年龄,仅用于agent模式。

--storage.agent.no-lockfile 不在数据目录中创建锁文件。仅用于agent模式。

--storage.remote.flush-deadline=<duration> 在关闭或重新加载配置时等待刷新样本的时间。

--storage.remote.read-sample-limit=5e7 在单个查询中通过远程读取接口返回的最大样本总数。 0 表示没有限制。对于流式响应类型,将忽略此限制。仅用于server模式。

--storage.remote.read-concurrent-limit=10 并发远程读取调用的最大数量。 0 表示没有限制。仅用于server模式。

--rules.alert.for-outage-tolerance=1h 为恢复“for”警报状态而容忍Prometheus中断的最长时间。仅用于server模式。

--rules.alert.for-grace-period=10m 警报和恢复“for”状态之间的最短持续时间。这仅适用于配置的“for”时间大于宽限期的警报。仅用于server模式。

--rules.alert.resend-delay=1m 在向 Alertmanager 重新发送警报之前等待的最短时间。仅用于server模式。

--alertmanager.notification-queue-capacity=10000 等待Alertmanager通知的队列容量。仅用于server模式。

--query.lookback-delta=5m 在表达式评估和联合期间,检索指标的最长回溯持续时间。仅用于server模式。

--query.timeout=2m 查询在中止之前可能需要的最长时间。仅用于server模式。

--query.max-concurrency=20 并发执行的最大查询数。仅用于server模式。

--query.max-samples=50000000 单个查询可以加载到内存中的最大样本数。请注意,如果查询尝试将比这更多的样本加载到内存中,查询将失败,因此这也限制了查询可以返回的样本数量。仅用于server模式。

--enable-feature= 逗号分隔的要启用的功能名称。有效选项:agent、exemplar-storage、expand-external-labels、memory-snapshot-on-shutdown、promql-at-modifier、promql-negative-offset、remote-write-receiver。extra-scrape-metrics、new-service-discovery-manager。

--log.level=info 只记录给定严重程度或以上的信息。其中之一:[debug, info, warn, error]。

--log.format=logfmt 日志信息的输出格式。其中之一:[logfmt, json]。

四、配置文件详解

通用占位符定义如下:

  • <boolean>:可以取值为 true 或 false 的布尔值
  • <duration>:与正则表达式匹配的持续时间 ((([0-9]+)y)?(([0-9]+)w)?(([0-9]+)d)?(([0-9] +)h)?(([0-9]+)m)?(([0-9]+)s)?(([0-9]+)ms)?|0), 例如 1d, 1h30m, 5m、10s
  • <filename>:当前工作目录中的有效路径
  • <host>:由主机名或 IP 后跟可选端口号组成的有效字符串
  • <int>:整数值
  • <labelname>:匹配正则表达式[a-zA-Z_][a-zA-Z0-9_]*的字符串
  • <labelvalue>:unicode字符
  • <path>:有效的 URL 路径
  • <scheme>:可以采用值 http 或 https 的字符串
  • <secret>:密码,常规字符串
  • <string>:常规字符串
  • <size>:以字节为单位的大小,例如 512MB。支持的单位:B、KB、MB、GB、TB、PB、EB。
  • <tmpl_string>:使用前模板扩展的字符串

全局配置区域:

global:
  # 默认情况下抓取目标的频率。
  [ scrape_interval: <duration> | default = 1m ]

  # 抓取请求超时时间
  [ scrape_timeout: <duration> | default = 10s ]

  # 评估规则的频率
  [ evaluation_interval: <duration> | default = 1m ]

  # 与任何时间序列或警报通信时添加的标签
  # 外部系统(federation, remote storage, Alertmanager).
  external_labels:
    [ <labelname>: <labelvalue> ... ]

  # PromQL查询记录到的文件。
  # 重新加载配置将重新打开文件。
  [ query_log_file: <string> ]

# 规则文件指定的globs列表,从中读取规则和警报
# 所有匹配的文件
rule_files:
  [ - <filepath_glob> ... ]

# 抓取配置列表
scrape_configs:
  [ - <scrape_config> ... ]

# 警报指定与警报管理器相关的设置
alerting:
  alert_relabel_configs:
    [ - <relabel_config> ... ]
  alertmanagers:
    [ - <alertmanager_config> ... ]

# 与远程写入功能相关的设置
remote_write:
  [ - <remote_write> ... ]

# 与远程读取功能相关的设置
remote_read:
  [ - <remote_read> ... ]

# 运行时可重新加载的存储相关设置
storage:
  [ - <exemplars> ... ]

scrape_config部分指定了一组描述如何抓取它们的目标和参数,目标可以通过static_configs参数静态配置或使用支持的服务发现机制之一动态发现。

# 默认情况下,分配给抓取指标的任务名称
job_name: <job_name>

# 从任务中抓取目标的频率
[ scrape_interval: <duration> | default = <global_config.scrape_interval> ]

# 抓取此任务时的每次抓取超时时间
[ scrape_timeout: <duration> | default = <global_config.scrape_timeout> ]

# 从目标获取指标的HTTP资源路径
[ metrics_path: <path> | default = /metrics ]

# Honor_labels控制Prometheus如何处理标签之间的冲突
# 抓取的数据中已经存在,而Prometheus则会附上标签
# 服务器端(“job”和“instance”标签、手动配置的目标标签以及由服务发现实现生成的标签)
#
# 如果honor_labels被设置为"true",标签冲突的解决方式是保留抓取数据中的标签值,而忽略冲突的服务器端标签
#
# 如果honor_labels设置为"false",标签冲突的解决方法是将抓取数据中的冲突标签重命名为 "exported_<original-label>" (例如 "exported_instance", "exported_job"),然后附加服务器端标签。
#
# 将Honor_labels设置为“true”对于联邦和抓取Pushgateway等用例很有用,在这些用例中应保留目标中指定的所有标签
#
# 请注意,任何全局配置的“external_labels”都不受此设置的影响。在与外部系统通信时,它们总是仅在时间序列还没有给定标签时才应用,否则将被忽略
[ honor_labels: <boolean> | default = false ]

# Honor_timestamps控制Prometheus是否遵守抓取数据中存在的时间戳
#
# 如果Honor_timestamps设置为“true”,则将使用目标公开的指标的时间戳
#
# 如果Honor_timestamps设置为“false”,则目标公开的指标时间戳将被忽略
[ honor_timestamps: <boolean> | default = true ]

# 配置用于请求的协议方案
[ scheme: <scheme> | default = http ]

# 可选的HTTP URL参数
params:
  [ <string>: [<string>, ...] ]

# 使用配置的用户名和密码在每个抓取请求上设置`Authorization`标头
# password和password_file是互斥的
basic_auth:
  [ username: <string> ]
  [ password: <secret> ]
  [ password_file: <string> ]

# 使用配置的凭据在每个抓取请求上设置`Authorization`标头
authorization:
  # 设置请求的认证类型
  [ type: <string> | default: Bearer ]
  # 设置请求的凭据。它与`credentials_file`互斥
  [ credentials: <secret> ]
  # 设置请求凭证的文件路径。它与`credentials`相互排斥
  [ credentials_file: <filename> ]

# 可选的OAuth 2.0配置
# 不能与basic_auth或authorization同时使用
oauth2:
  [ <oauth2> ]

# 配置抓取请求是否遵循HTTP 3xx重定向
[ follow_redirects: <bool> | default = true ]

# 配置抓取请求的TLS设置
tls_config:
  [ <tls_config> ]

# 可选的代理URL
[ proxy_url: <string> ]

# Azure服务发现配置列表
azure_sd_configs:
  [ - <azure_sd_config> ... ]

# Consul服务发现配置列表
consul_sd_configs:
  [ - <consul_sd_config> ... ]

# DigitalOcean服务发现配置列表
digitalocean_sd_configs:
  [ - <digitalocean_sd_config> ... ]

# Docker服务发现配置列表
docker_sd_configs:
  [ - <docker_sd_config> ... ]

# Docker Swarm服务发现配置列表
dockerswarm_sd_configs:
  [ - <dockerswarm_sd_config> ... ]

# DNS服务发现配置列表
dns_sd_configs:
  [ - <dns_sd_config> ... ]

# EC2服务发现配置列表
ec2_sd_configs:
  [ - <ec2_sd_config> ... ]

# Eureka服务发现配置列表
eureka_sd_configs:
  [ - <eureka_sd_config> ... ]

# 文件服务发现配置列表
file_sd_configs:
  [ - <file_sd_config> ... ]

# GCE服务发现配置列表
gce_sd_configs:
  [ - <gce_sd_config> ... ]

# Hetzner服务发现配置列表
hetzner_sd_configs:
  [ - <hetzner_sd_config> ... ]

# HTTP服务发现配置列表
http_sd_configs:
  [ - <http_sd_config> ... ]

# Kubernetes服务发现配置列表
kubernetes_sd_configs:
  [ - <kubernetes_sd_config> ... ]

# Kuma服务发现配置列表
kuma_sd_configs:
  [ - <kuma_sd_config> ... ]

# Lightsail服务发现配置列表
lightsail_sd_configs:
  [ - <lightsail_sd_config> ... ]

# Linode服务发现配置列表
linode_sd_configs:
  [ - <linode_sd_config> ... ]

# Marathon服务发现配置列表
marathon_sd_configs:
  [ - <marathon_sd_config> ... ]

# AirBnB的Nerve服务发现配置列表
nerve_sd_configs:
  [ - <nerve_sd_config> ... ]

# OpenStack服务发现配置列表
openstack_sd_configs:
  [ - <openstack_sd_config> ... ]

# PuppetDB服务发现配置列表
puppetdb_sd_configs:
  [ - <puppetdb_sd_config> ... ]

# Scaleway服务发现配置列表
scaleway_sd_configs:
  [ - <scaleway_sd_config> ... ]

# Zookeeper Serverset服务发现配置列表
serverset_sd_configs:
  [ - <serverset_sd_config> ... ]

# Triton服务发现配置列表
triton_sd_configs:
  [ - <triton_sd_config> ... ]

# Uyuni服务发现配置列表
uyuni_sd_configs:
  [ - <uyuni_sd_config> ... ]

# 此任务的标记静态配置目标的列表
static_configs:
  [ - <static_config> ... ]

# 目标重新标记配置列表
relabel_configs:
  [ - <relabel_config> ... ]

# 指标重新标记配置列表
metric_relabel_configs:
  [ - <relabel_config> ... ]

# 大于这么多字节的未压缩响应正文将导致抓取失败。0表示没有限制。示例:100MB
# 这是一项实验性功能,将来可能会更改或删除
[ body_size_limit: <size> | default = 0 ]
# Per-scrape限制被接受的抓取样品数量
# 如果在指标重新标记后存在超过此数量的样本,则整个抓取将被视为失败。0表示没有限制
[ sample_limit: <int> | default = 0 ]

# Per-scrape限制被样本可接受的标签数量
# 如果在指标重新标记后存在超过此数量的标签,则整个抓取将被视为失败。0表示没有限制
[ label_limit: <int> | default = 0 ]

# Per-scrape限制被样本可接受的标签名称长度
# 如果标签名称在指标重新标记后长于此数字,则整个抓取将被视为失败。0表示没有限制
[ label_name_length_limit: <int> | default = 0 ]

# Per-scrape限制被样本可接受的标签值长度
# 如果在指标重新标记后标签值长于此数字,则整个抓取将被视为失败。0表示没有限制
[ label_value_length_limit: <int> | default = 0 ]

# Per-scrape配置限制将被接受的唯一目标的数量。如果在目标重新标记后存在超过此数量的目标,Prometheus会将目标标记为失败而不抓取它们
# 0表示没有限制。这是一个实验性功能,将来可能会改变
[ target_limit: <int> | default = 0 ]

五、部署流程

  • 安装软件

    $ cd /usr/local/src && wget https://github.com/prometheus/prometheus/releases/download/v2.32.0/prometheus-2.32.0.linux-amd64.tar.gz
    $ tar zxf prometheus-2.32.0.linux-amd64.tar.gz -C /usr/local/
    $ cd /usr/local/ && mv prometheus-2.32.0.linux-amd64/ prometheus
    
  • 创建指定本地存储路径

    $ mkdir -p /data/prometheus
    
  • 创建程序用户并授权

    $ groupadd prometheus
    $ useradd -g prometheus -M -s /sbin/nologin prometheus
    $ chown -R prometheus. /data/prometheus/
    $ chown -R prometheus. /usr/local/prometheus/
    
  • 修改本地Prometheus自身监控端口

    $ vim /usr/local/prometheus/prometheus.yml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
    rule_files:
    scrape_configs:
      - job_name: "prometheus"
        static_configs:
          - targets: ["localhost:9022"]
    
  • 设置systemd管理并启动Prometheus

    $ cat > /etc/systemd/system/prometheus.service <<'EOF'
    [Unit]
    Description=prometheus
    After=network.target
    [Service]
    Type=simple
    User=prometheus
    ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml \
        --storage.tsdb.path=/data/prometheus \
        --storage.tsdb.retention.time=30d \
        --storage.tsdb.retention.size=30GB \
        --web.enable-lifecycle \
        --web.listen-address=0.0.0.0:9022 \
        --web.external-url=http://10.81.0.100:9022/
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOF
    $ systemctl daemon-reload
    $ systemctl start prometheus
    $ systemctl enable prometheus
    
  • 测试访问是否正常

    $ curl http://10.81.0.100:9022/metrics
    
  • web端图形界面地址

    http://10.81.0.100:9022/graph

六、修改访问路径前缀

  • 涉及参数

    --web.external-url #可从外部访问Prometheus的URL(例如,如果Prometheus是通过反向代理提供的)。用于生成相对和绝对链接返回到Prometheus本身。如果URL包含路径部分,它将用于为所有HTTP端点添加前缀由Prometheus服务。如果省略,则会自动派生相关的URL组件。

    --web.route-prefix #Web端点内部路由的前缀。 默认为--web.external-url的路径。

  • 修改启动命令

    $ cat > /etc/systemd/system/prometheus.service <<'EOF'
    [Unit]
    Description=prometheus
    After=network.target
    [Service]
    Type=simple
    User=prometheus
    ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml \
        --storage.tsdb.path=/data/prometheus \
        --storage.tsdb.retention.time=30d \
        --storage.tsdb.retention.size=30GB \
        --web.enable-lifecycle \
        --web.listen-address=0.0.0.0:9022 \
        --web.external-url=http://10.81.0.100:9022/prometheus/
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOF
    $ systemctl daemon-reload
    $ systemctl restart prometheus
    
  • 修改监控目标配置

    $ vim /usr/local/prometheus/prometheus.yml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
    rule_files:
    scrape_configs:
      - job_name: "prometheus"
        metrics_path: "/prometheus/metrics"
        static_configs:
          - targets: ["localhost:9022"]
    $ curl -I -X POST http://10.81.0.100:9022/prometheus/-/reload
    
  • 验证访问

    $ curl http://10.81.0.100:9022/prometheus/metrics
    

七、开启用户认证功能

Prometheus自身支持basic验证和TLS(将来可能会改变),也可以通过nginx开启basic验证。

1、Prometheus自带basic验证

  • Bcrypt密码生成python脚本

    import getpass
    import bcrypt
    
    password = getpass.getpass("password: ")
    hashed_password = bcrypt.hashpw(password.encode("utf-8"), bcrypt.gensalt())
    print(hashed_password.decode())
    
  • 创建web配置文件

    $ cat >/usr/local/prometheus/auth_user.yml <<'EOF'
    basic_auth_users:
      用户名: 密码(此处密码类型为Bcrypt,使用Bcrypt密码在线生成计算器) 
    EOF
    $ cd /usr/local/prometheus && ./promtool check web-config auth_user.yml
    $ chown -R prometheus. /usr/local/prometheus
    
  • 修改启动命令

    $ cat >/etc/systemd/system/prometheus.service <<'EOF'
    [Unit]
    Description=prometheus
    After=network.target
    [Service]
    Type=simple
    User=prometheus
    ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml \
        --storage.tsdb.path=/data/prometheus \
        --storage.tsdb.retention.time=30d \
        --storage.tsdb.retention.size=30GB \
        --web.enable-lifecycle \
        --web.listen-address=0.0.0.0:9022 \
        --web.config.file=/usr/local/prometheus/auth_user.yml \
        --web.external-url=http://10.81.0.100:9022/prometheus/
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOF
    $ systemctl daemon-reload
    $ systemctl restart prometheus
    
  • 测试验证

    $ curl -u 用户名 http://10.81.0.100:9022/prometheus/metrics
    
  • 修改监控目标配置

    $ cat >/usr/local/prometheus/pass <<'EOF'
    密码
    EOF
    $ chmod 600 /usr/local/prometheus/pass
    $ chown -R prometheus. /usr/local/prometheus
    $ vim /usr/local/prometheus/prometheus.yml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
    rule_files:
    scrape_configs:
      - job_name: "prometheus"
        metrics_path: "/test/metrics"
        basic_auth:
          username: 用户名
          password_file: pass
        static_configs:
          - targets: ["localhost:9022"]
    $ curl -u 用户名 -I -X POST http://10.81.0.100:9022/prometheus/-/reload
    

2、通过nginx开启basic验证

  • 创建用户密码文件

    #使用openssl passwd工具加密密码
    $ openssl passwd -crypt 密码
    $ vim /etc/nginx/.pass_list
    #用户密码表
    用户名:加密密钥
    $ chmod 600 /etc/nginx/.pass_list
    
  • 设置nginx配置

    $ cat >/etc/nginx/conf.d/prometheus.conf <<'EOF'
    server {
      listen 80;
      server_name localhost;
      auth_basic "prometheus";
      auth_basic_user_file .pass_list;
      location / {
        proxy_pass http://localhost:9022;
        include proxy.conf;
      }
    }
    $ nginx -t
    $ nginx -s reload
    
  • 测试验证

    $ curl -u 用户名 http://10.81.0.100/prometheus/-/healthy
    

八、使用exporter监控指标

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

一般来说可以将Exporter分为2类:

1、直接采集:这一类Exporter直接内置了对Prometheus监控的支持,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露监控数据的端点。

2、间接采集:间接采集,原有监控目标并不直接支持Prometheus,因此我们需要通过Prometheus提供的Client  Library编写该监控目标的监控采集程序。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。
  • 安装软件

    $ cd /usr/local/src && wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
    $ tar zxf node_exporter-1.3.1.linux-amd64.tar.gz -C /usr/local/
    $ cd .. && mv node_exporter-1.3.1.linux-amd64/ node_exporter
    
  • 授权目录

    $ chown -R prometheus. /usr/local/node_exporter
    
  • 设置systemd管理

    $ cat > /etc/systemd/system/node_exporter.service <<'EOF'
    [Unit]
    Description=node_exporter
    After=network.target
    
    [Service]
    Type=simple
    User=prometheus
    ExecStart=/usr/local/node_exporter/node_exporter --web.listen-address=:19100 --web.telemetry-path=/prometheus/metrics
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    $ systemctl daemon-reload
    $ systemctl start node_exporter
    $ systemctl enable node_exporter
    
  • 在Prometheus配置文件添加抓取任务

    $ vim /usr/local/prometheus/prometheus.yml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
    rule_files:
    scrape_configs:
      - job_name: "prometheus"
        basic_auth:
          username: 用户名
          password_file: pass
        metrics_path: "/prometheus/metrics"
        static_configs:
          - targets: ["localhost:9022"]
            labels:
              jobname: prometheus
      - job_name: "node"
        basic_auth:
          username: 用户名
          password_file: pass
        metrics_path: "/prometheus/metrics"
        static_configs:
          - targets: ["localhost:19100"]
            labels:
              instance: vm-10.81.0.100
              jobname: node_exporter
    $ curl -u 用户名 -I -X POST http://10.81.0.100:9022/prometheus/-/reload
    
image-20220105100324732.png

九、Grafana监控可视化

Prometheus UI提供了快速验证PromQL以及临时可视化支持的能力,而在大多数场景下引入监控系统通常还需要构建可以长期使用的监控数据可视化面板(Dashboard)。这时用户可以考虑使用第三方的可视化工具如Grafana,Grafana是一个开源的可视化平台,并且提供了对Prometheus的完整支持。

1、安装

  • 下载软件

    $ cd /usr/local/src && wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.3.3.linux-amd64.tar.gz
    $ tar zxf grafana-enterprise-8.3.3.linux-amd64.tar.gz -C /usr/local/
    
  • 修改配置文件

    $ cd /usr/local/grafana-8.3.3/conf
    $ vim defaults.ini
    
  • 创建程序用户并授权

    $ mkdir -p /data/grafana/{data,log}
    $ groupadd grafana
    $ useradd -g grafana -M -s /sbin/nologin grafana
    $ chown -R grafana. /data/grafana
    $ chown -R grafana. /usr/local/grafana-8.3.3/
    
  • 设置systemd管理

    $ cat > /etc/systemd/system/grafana-server.service <<'EOF'
    [Unit]
    Description=Grafana
    After=network.target
    
    [Service]
    User=grafana
    Group=grafana
    Type=simple
    ExecStart=/usr/local/grafana-8.3.3/bin/grafana-server -homepath /usr/local/grafana-8.3.3
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    $ systemctl daemon-reload
    $ systemctl start grafana-server
    $ systemctl enable grafana-server
    

2、使用

  • 添加数据源

    image-20220211101807928.png
  • 官网搜索仪表盘模板导入

    https://grafana.com/grafana/dashboards/

    image-20220211102205011.png image-20220211102243538.png image-20220211102431046.png image-20220211102512127.png image-20220211102554470.png

十、Alertmanager警报管理

在Prometheus Server中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警,而告警的后续处理流程则由AlertManager进行管理。在AlertManager中我们可以与邮件,Slack等等内置的通知方式进行集成,也可以通过Webhook自定义告警处理方式。AlertManager即Prometheus体系中的告警处理中心。

Alertmanager 处理客户端应用程序(例如 Prometheus 服务器)发送的警报。 它负责对它们进行重复数据删除、分组和路由到正确的接收器集成,例如Email、PagerDuty 或 OpsGenie。 它还负责警报的静音和抑制。

1、安装

  • 下载软件

    $ cd /usr/local/src && wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz
    $ tar -xf alertmanager-0.23.0.linux-amd64.tar.gz -C /usr/local/
    $ cd .. && mv alertmanager-0.23.0.linux-amd64/ alertmanager
    
  • 创建存储目录并授权

    $ mkdir -p /data/alertmanager/data
    $ chown -R prometheus. /data/alertmanager
    $ chown -R prometheus. /usr/local/alertmanager
    
  • 设置systemd管理

    $ cat > /etc/systemd/system/alertmanager.service <<'EOF'
    [Unit]
    Description=Alertmanager
    After=network.target
    
    [Service]
    User=prometheus
    Group=prometheus
    Type=simple
    ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/data/alertmanager/data
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    EOF
    $ systemctl daemon-reload
    $ systemctl start alertmanager
    $ systemctl enable alertmanager
    
  • WEBUI页面

    http://10.81.0.100:9093

2、设置邮件警报

  • 修改alertmanager配置文件

    $ vim /usr/local/alertmanager/alertmanager.yml
    global:
      #发件邮箱地址
      smtp_from: '109359727@qq.com'
      #发送电子邮件的SMTP主机
      smtp_smarthost: 'smtp.qq.com:465'
      #发件邮箱用户名
      smtp_auth_username: '109359727@qq.com'
      #发件邮箱密码
      smtp_auth_password: 'rpokxixlarhngh'
      smtp_require_tls: false
      #在报警恢复的时候不是立马发送的,在接下来的这个时间内,如果没有此报警信息触发,才发送报警恢复消息。 默认值为5m
      resolve_timeout: 5m
    templates:
      #自定义通知模板文件
      - 'templates/*.tmpl'
    route:
      #分组名称
      group_by: ['warning']
      #第一次等待多久时间发送一组警报通知
      group_wait: 30s
      #等待多久时间发送最新报警
      group_interval: 5m
      #发送重复报警的周期
      repeat_interval: 1h
      #接收者名称
      receiver: 'dev'
    receivers:
    #接收者名称
    - name: 'dev'
      email_configs:
      #是否通知已解决的警报
      - send_resolved: true
        #发送通知的电子邮件地址
        to: 'zt17879@163.com,zt17774@163.com'
        #电子邮件通知的HTML正文
        html: '{{ template "email.html" . }}'
        #邮件标题
        headers: { Subject: "[WARN] 报警邮件" }
    inhibit_rules:
      #源告警(当匹配的告警产生时,目标告警会被抑制)
      - source_match:
          level: 'critical'
        #目标告警(被抑制的告警)
        target_match:
          level: 'warning'
        #必须在源告警和目标告警中具有相等值的标签才能使抑制生效
        equal: ['alertname', 'instance']
    
  • 编写通知模板文件

    $ mkdir /usr/local/alertmanager/templates
    $ vim /usr/local/alertmanager/templates/email.tmpl
    {{ define "email.html" }}
    {{ range .Alerts }}
     <pre>
    告警级别: {{ .Labels.level }}
    告警实例: {{ .Labels.instance }}
    告警信息: {{ .Annotations.summary }}
    告警详情: {{ .Annotations.description }}
    告警时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
     </pre>
    {{ end }}
    {{ end }}
    $ vim wechat.tmpl
    {{ define "wechat.html" }}
    {{- if gt (len .Alerts.Firing) 0 -}}{{ range .Alerts }}
    @警报
    告警级别: {{ .Labels.level }}
    告警实例: {{ .Labels.instance }}
    告警信息: {{ .Annotations.summary }}
    告警详情: {{ .Annotations.description }}
    告警时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    {{ end }}{{ end -}}
    {{- if gt (len .Alerts.Resolved) 0 -}}{{ range .Alerts }}
    @恢复
    告警级别: {{ .Labels.level }}
    告警实例: {{ .Labels.instance }}
    告警信息: {{ .Annotations.summary }}
    告警时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    告警恢复: {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
    {{ end }}{{ end -}}
    {{- end }}
    
  • 修改Prometheus配置文件

    $ vim /usr/local/prometheus/prometheus.yml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    alerting:
      alertmanagers:
        - static_configs:
            - targets:
                - 127.0.0.1:9093
    rule_files:
      - "rule/systemalerts_rule.yml"
    scrape_configs:
      - job_name: "prometheus"
        basic_auth:
          username: admin
          password_file: pass
        metrics_path: "/prometheus/metrics"
        static_configs:
          - targets: ["localhost:9022"]
            labels:
              jobname: prometheus
      - job_name: "node"
        basic_auth:
          username: admin
          password_file: pass
        metrics_path: "/prometheus/metrics"
        static_configs:
          - targets: ["localhost:19100"]
            labels:
              instance: vm-10.81.0.100
              jobname: node-exporter
    
  • 编写告警规则文件

    规则参考网址https://awesome-prometheus-alerts.grep.to/rules

    $ mkdir /usr/local/prometheus/rule
    $ vim /usr/local/prometheus/rule/systemalerts_rule.yml
    groups:
    - name: 系统监控告警
      rules:
      - alert: 主机状态-监控告警
        expr: up == 0
        for: 1m
        labels:
          level: disasters
          team: OPS
        annotations:
          summary: "服务器宕机!!!"
          description: "{{ $labels.instance }} {{ $labels.jobname }}已经离线超过5分钟!!!"
      - alert: CPU使用情况告警
        expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 80
        for: 1m
        labels:
          level: critical
          team: OPS
        annotations:
          summary: "CPU使用率过高!"
          description: "{{ $labels.instance }} CPU使用大于80%(目前使用:{{$value}}%)"
      - alert: 内存使用情况告警
        expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
        for: 1m
        labels:
          level: critical
          team: OPS
        annotations:
          summary: "内存使用率过高!"
          description: "{{ $labels.instance }} 内存使用大于80%(目前使用:{{$value}}%)"
      - alert: IO性能情况告警
        expr: (avg(irate(node_disk_io_time_seconds_total[1m])) by(instance)* 100) > 80
        for: 10m
        labels:
          level: warning
          team: OPS
        annotations:
          summary: "流入磁盘IO使用率过高!"
          description: "{{ $labels.instance }} 流入磁盘IO大于80%(目前使用:{{$value}})"
      - alert: 网络流入带宽情况告警
        expr: ((sum(rate (node_network_receive_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
        for: 10m
        labels:
          level: warning
          team: NA
        annotations:
          summary: "流入网络带宽过高!"
          description: "{{ $labels.instance }} 流入网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}" 
      - alert: 网络流出带宽情况告警
        expr: ((sum(rate (node_network_transmit_bytes_total{device!~'tap.*|veth.*|br.*|docker.*|virbr*|lo*'}[5m])) by (instance)) / 100) > 102400
        for: 10m
        labels:
          level: warning
          team: NA
        annotations:
          summary: "流出网络带宽过高!"
          description: "{{ $labels.instance }} 流出网络带宽持续2分钟高于100M. RX带宽使用率{{$value}}"      
      - alert: TCP连接高并发情况告警
        expr: node_netstat_Tcp_CurrEstab > 1000
        for: 5m
        labels:
          level: warning
          team: OPS
        annotations:
          summary: "TCP_ESTABLISHED并发过高!"
          description: "{{ $labels.instance }} TCP_ESTABLISHED大于1000(目前使用:{{$value}}%)" 
      - alert: 磁盘容量情况告警
        expr: 100-(node_filesystem_free_bytes{fstype=~"ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) > 80
        for: 1m
        labels:
          level: critical
          team: OPS
        annotations:
          summary: "磁盘分区使用率过高!"
          description: "{{ $labels.instance }} 磁盘分区使用大于80%(目前使用:{{$value}}%)"
      - alert: 1分钟内系统负载情况告警
        expr: (sum by (instance) (node_load1)) > ((count by(instance)(node_cpu_seconds_total{mode="system"}))*1.2)
        for: 10m
        labels:
          level: warning
          team: OPS
        annotations:
          summary: "系统1分钟负载过高!"
          description: "{{ $labels.instance }} 系统1分钟负载超过cpu核数(当前值:{{$value}})"
    
  • 重载配置

    $ chown -R prometheus. /usr/local/alertmanager
    $ chown -R prometheus. /usr/local/prometheus
    $ curl -u 用户名 -I -X POST http://localhost:9022/prometheus/-/reload
    $ curl -I -X POST http://localhost:9093/-/reload
    

3、设置钉钉、飞书报警

报警全家桶https://github.com/feiyu563/PrometheusAlert

  • 安装docker

    $ yum -y remove docker \
                      docker-client \
                      docker-client-latest \
                      docker-common \
                    docker-latest \
                      docker-latest-logrotate \
                      docker-logrotate \
                      docker-engine
    $ yum install -y yum-utils
    $ yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    $ yum list docker-ce --showduplicates | sort -r
    $ yum -y install docker-ce-20.10.12-3.el7
    $ mkdir /etc/docker
    $ cat >/etc/docker/daemon.json <<'EOF'
    {
      "log-driver": "local",
      "log-opts": {
        "max-size": "200m",
        "max-file": "3"
      },
      "dns": ["192.168.94.94", "192.168.94.95", "114.114.114.114"]
    }
    EOF
    $ systemctl start docker
    $ systemctl enable docker
    
  • 安装PrometheusAlert

    $ mkdir /etc/prometheusalert-center/
    $ wget https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/conf/app-example.conf -O /etc/prometheusalert-center/app.conf
    $ docker run -d -p 8080:8080 -v /etc/prometheusalert-center:/app/conf --name prometheusalert-center feiyu563/prometheus-alert:latest
    
  • 修改PrometheusAlert配置文件

    $ vim /etc/prometheusalert-center/app.conf
    #---------------------↓全局配置-----------------------
    appname = PrometheusAlert
    #登录用户名
    login_user=prometheusalert
    #登录密码
    login_password=prometheusalert
    #监听地址
    httpaddr = "0.0.0.0"
    #监听端口
    httpport = 8080
    runmode = dev
    #设置代理 proxy = http://123.123.123.123:8080
    proxy =
    #开启JSON请求
    copyrequestbody = true
    #告警消息标题
    title=PrometheusAlert
    #链接到告警平台地址
    GraylogAlerturl=http://graylog.org
    #钉钉告警 告警logo图标地址
    logourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png
    #钉钉告警 恢复logo图标地址
    rlogourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png
    #短信告警级别(等于3就进行短信告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难
    messagelevel=3
    #电话告警级别(等于4就进行语音告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难
    phonecalllevel=4
    #默认拨打号码(页面测试短信和电话功能需要配置此项)
    defaultphone=xxxxxxxx
    #故障恢复是否启用电话通知0为关闭,1为开启
    phonecallresolved=0
    #自动告警抑制(自动告警抑制是默认同一个告警源的告警信息只发送告警级别最高的第一条告警信息,其他消息默认屏蔽,这么做的目的是为了减少相同告警来源的消息数量,防止告警炸弹,0为关闭,1为开启)
    silent=0
    #是否前台输出file or console
    logtype=file
    #日志文件路径
    logpath=logs/prometheusalertcenter.log
    #转换Prometheus,graylog告警消息的时区为CST时区(如默认已经是CST时区,请勿开启)
    prometheus_cst_time=0
    #数据库驱动,支持sqlite3,mysql,postgres如使用mysql或postgres,请开启db_host,db_port,db_user,db_password,db_name的注释
    db_driver=sqlite3
    #db_host=127.0.0.1
    #db_port=3306
    #db_user=root
    #db_password=root
    #db_name=prometheusalert
    #是否开启告警记录 0为关闭,1为开启
    AlertRecord=0
    # 是否将告警记录写入es7,0为关闭,1为开启
    alert_to_es=0
    # es地址,是[]string
    # beego.Appconfig.Strings读取配置为[]string,使用";"而不是","
    to_es_url=http://localhost:9200
    # to_es_url=http://es1:9200;http://es2:9200;http://es3:9200
    # es用户和密码
    # to_es_user=username
    # to_es_pwd=password
    
    #---------------------↓webhook-----------------------
    #是否开启钉钉告警通道,可同时开始多个通道0为关闭,1为开启
    open-dingding=1
    #默认钉钉机器人地址
    ddurl=https://oapi.dingtalk.com/robot/send?access_token=5103d2a9e199fe79213751d6e536b7256a531557b7c93d1e11a0a9a55fd942ae
    #是否开启 @所有人(0为关闭,1为开启)
    dd_isatall=1
    
    #是否开启微信告警通道,可同时开始多个通道0为关闭,1为开启
    open-weixin=0
    #默认企业微信机器人地址
    wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx
    
    #是否开启飞书告警通道,可同时开始多个通道0为关闭,1为开启
    open-feishu=1
    #默认飞书机器人地址
    fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/1d85ad5c-a9d7-45db-8c68-e5c
    
    #---------------------↓腾讯云接口-----------------------
    #是否开启腾讯云短信告警通道,可同时开始多个通道0为关闭,1为开启
    open-txdx=0
    #腾讯云短信接口key
    TXY_DX_appkey=xxxxx
    #腾讯云短信模版ID 腾讯云短信模版配置可参考 prometheus告警:{1}
    TXY_DX_tpl_id=xxxxx
    #腾讯云短信sdk app id
    TXY_DX_sdkappid=xxxxx
    #腾讯云短信签名 根据自己审核通过的签名来填写
    TXY_DX_sign=腾讯云
    
    #是否开启腾讯云电话告警通道,可同时开始多个通道0为关闭,1为开启
    open-txdh=0
    #腾讯云电话接口key
    TXY_DH_phonecallappkey=xxxxx
    #腾讯云电话模版ID
    TXY_DH_phonecalltpl_id=xxxxx
    #腾讯云电话sdk app id
    TXY_DH_phonecallsdkappid=xxxxx
    
    #---------------------↓华为云接口-----------------------
    #是否开启华为云短信告警通道,可同时开始多个通道0为关闭,1为开启
    open-hwdx=0
    #华为云短信接口key
    HWY_DX_APP_Key=xxxxxxxxxxxxxxxxxxxxxx
    #华为云短信接口Secret
    HWY_DX_APP_Secret=xxxxxxxxxxxxxxxxxxxxxx
    #华为云APP接入地址(端口接口地址)
    HWY_DX_APP_Url=https://rtcsms.cn-north-1.myhuaweicloud.com:10743
    #华为云短信模板ID
    HWY_DX_Templateid=xxxxxxxxxxxxxxxxxxxxxx
    #华为云签名名称,必须是已审核通过的,与模板类型一致的签名名称,按照自己的实际签名填写
    HWY_DX_Signature=华为云
    #华为云签名通道号
    HWY_DX_Sender=xxxxxxxxxx
    
    #---------------------↓阿里云接口-----------------------
    #是否开启阿里云短信告警通道,可同时开始多个通道0为关闭,1为开启
    open-alydx=0
    #阿里云短信主账号AccessKey的ID
    ALY_DX_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx
    #阿里云短信接口密钥
    ALY_DX_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx
    #阿里云短信签名名称
    ALY_DX_SignName=阿里云
    #阿里云短信模板ID
    ALY_DX_Template=xxxxxxxxxxxxxxxxxxxxxx
    
    #是否开启阿里云电话告警通道,可同时开始多个通道0为关闭,1为开启
    open-alydh=0
    #阿里云电话主账号AccessKey的ID
    ALY_DH_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx
    #阿里云电话接口密钥
    ALY_DH_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx
    #阿里云电话被叫显号,必须是已购买的号码
    ALY_DX_CalledShowNumber=xxxxxxxxx
    #阿里云电话文本转语音(TTS)模板ID
    ALY_DH_TtsCode=xxxxxxxx
    
    #---------------------↓容联云接口-----------------------
    #是否开启容联云电话告警通道,可同时开始多个通道0为关闭,1为开启
    RLY_DH_open-rlydh=0
    #容联云基础接口地址
    RLY_URL=https://app.cloopen.com:8883/2013-12-26/Accounts/
    #容联云后台SID
    RLY_ACCOUNT_SID=xxxxxxxxxxx
    #容联云api-token
    RLY_ACCOUNT_TOKEN=xxxxxxxxxx
    #容联云app_id
    RLY_APP_ID=xxxxxxxxxxxxx
    
    #---------------------↓邮件配置-----------------------
    #是否开启邮件
    open-email=0
    #邮件发件服务器地址
    Email_host=smtp.qq.com
    #邮件发件服务器端口
    Email_port=465
    #邮件帐号
    Email_user=xxxxxxx@qq.com
    #邮件密码
    Email_password=xxxxxx
    #邮件标题
    Email_title=运维告警
    #默认发送邮箱
    Default_emails=xxxxx@qq.com,xxxxx@qq.com
    
    #---------------------↓七陌云接口-----------------------
    #是否开启七陌短信告警通道,可同时开始多个通道0为关闭,1为开启
    open-7moordx=0
    #七陌账户ID
    7MOOR_ACCOUNT_ID=Nxxx
    #七陌账户APISecret
    7MOOR_ACCOUNT_APISECRET=xxx
    #七陌账户短信模板编号
    7MOOR_DX_TEMPLATENUM=n
    #注意:七陌短信变量这里只用一个var1,在代码里写死了。
    #-----------
    #是否开启七陌webcall语音通知告警通道,可同时开始多个通道0为关闭,1为开启
    open-7moordh=0
    #请在七陌平台添加虚拟服务号、文本节点
    #七陌账户webcall的虚拟服务号
    7MOOR_WEBCALL_SERVICENO=xxx
    # 文本节点里被替换的变量,我配置的是text。如果被替换的变量不是text,请修改此配置
    7MOOR_WEBCALL_VOICE_VAR=text
    
    #---------------------↓telegram接口-----------------------
    #是否开启telegram告警通道,可同时开始多个通道0为关闭,1为开启
    open-tg=0
    #tg机器人token
    TG_TOKEN=xxxxx
    #tg消息模式 个人消息或者频道消息 0为关闭(推送给个人),1为开启(推送给频道)
    TG_MODE_CHAN=0
    #tg用户ID
    TG_USERID=xxxxx
    #tg频道name或者id, 频道name需要以@开始
    TG_CHANNAME=xxxxx
    #tg api地址, 可以配置为代理地址
    #TG_API_PROXY="https://api.telegram.org/bot%s/%s"
    
    #---------------------↓workwechat接口-----------------------
    #是否开启workwechat告警通道,可同时开始多个通道0为关闭,1为开启
    open-workwechat=0
    # 企业ID
    WorkWechat_CropID=xxxxx
    # 应用ID
    WorkWechat_AgentID=xxxx
    # 应用secret
    WorkWechat_AgentSecret=xxxx
    # 接受用户
    WorkWechat_ToUser="zhangsan|lisi"
    # 接受部门
    WorkWechat_ToParty="ops|dev"
    # 接受标签
    WorkWechat_ToTag=""
    # 消息类型, 暂时只支持markdown
    # WorkWechat_Msgtype = "markdown"
    
    #---------------------↓百度云接口-----------------------
    #是否开启百度云短信告警通道,可同时开始多个通道0为关闭,1为开启
    open-baidudx=0
    #百度云短信接口AK(ACCESS_KEY_ID)
    BDY_DX_AK=xxxxx
    #百度云短信接口SK(SECRET_ACCESS_KEY)
    BDY_DX_SK=xxxxx
    #百度云短信ENDPOINT(ENDPOINT参数需要用指定区域的域名来进行定义,如服务所在区域为北京,则为)
    BDY_DX_ENDPOINT=http://smsv3.bj.baidubce.com
    #百度云短信模版ID,根据自己审核通过的模版来填写(模版支持一个参数code:如prometheus告警:{code})
    BDY_DX_TEMPLATE_ID=xxxxx
    #百度云短信签名ID,根据自己审核通过的签名来填写
    TXY_DX_SIGNATURE_ID=xxxxx
    
    #---------------------↓百度Hi(如流)-----------------------
    #是否开启百度Hi(如流)告警通道,可同时开始多个通道0为关闭,1为开启
    open-ruliu=0
    #默认百度Hi(如流)机器人地址
    BDRL_URL=https://api.im.baidu.com/api/msg/groupmsgsend?access_token=xxxxxxxxxxxxxx
    #百度Hi(如流)群ID
    BDRL_ID=123456
    #---------------------↓bark接口-----------------------
    #是否开启telegram告警通道,可同时开始多个通道0为关闭,1为开启
    open-bark=0
    #bark默认地址, 建议自行部署bark-server
    BARK_URL=https://api.day.app
    #bark key, 多个key使用分割
    BARK_KEYS=xxxxx
    # 复制, 推荐开启
    BARK_COPY=1
    # 历史记录保存,推荐开启
    BARK_ARCHIVE=1
    # 消息分组
    BARK_GROUP=PrometheusAlert
    
    $ docker restart prometheusalert-center
    
  • 钉钉告警模板

    {{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
    {{if eq $v.status "resolved"}}
    ## [✅🎉告警恢复-通知]({{$v.generatorURL}})
    <font color="info">告警类型</font>:{{$v.labels.alertname}}    
    <font color="info">告警级别</font>:{{$v.labels.level}}    
    <font color="info">告警主机</font>:{{$v.labels.instance}}    
    <font color="info">故障时间</font>:{{GetCSTtime $v.startsAt}}    
    <font color="info">恢复时间</font>:{{GetCSTtime $v.endsAt}}    
    **<font color="info">告警主题</font>:{{$v.annotations.summary}}**
    ![Prometheus](https://img0.baidu.com/it/u=3287181154,2287098173&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500)
    {{else}}
    ## [⚠️📢监控告警-通知]({{$v.generatorURL}})
    <font color="#FF0000">告警类型</font>:{{$v.labels.alertname}}    
    <font color="#FF0000">告警级别</font>:{{$v.labels.level}}    
    <font color="#FF0000">告警主机</font>:{{$v.labels.instance}}    
    <font color="#FF0000">故障时间</font>:{{GetCSTtime $v.startsAt}}    
    <font color="#FF0000">归属部门</font>:{{$v.labels.team}}    
    #### =======<font color="#FF0000">告警详情</font>=======
    **<font color="#FF0000">告警主题</font>:{{$v.annotations.summary}}**    
    **<font color="#FF0000">告警内容</font>:{{$v.annotations.description}}**    
    **<font color="#FF0000">告警值</font>:{{$v.annotations.value}}**    
    [点击打开grafana]($v.annotations.grafana)
    ![Prometheus](https://img0.baidu.com/it/u=3287181154,2287098173&fm=253&fmt=auto&app=138&f=JPEG?w=889&h=500)
    {{end}}
    {{ end }}
    
  • 钉钉告警模板2

    {{ $var := .externalURL}}{{ $status := .status}}{{ range $k,$v:=.alerts }} {{if eq $status "resolved"}}
    ## [✅🎉告警恢复-通知]({{$var}})
    #### 监控指标: {{$v.labels.alertname}}
    {{ if eq $v.labels.level "warning" }}
    #### 告警级别: **<font color="#E6A23C">{{$v.labels.level}}</font>**
    {{ else if eq $v.labels.level "critical"  }}
    #### 告警级别: **<font color="#F56C6C">{{$v.labels.level}}</font>**
    {{ else if eq $v.labels.level "disasters"  }}
    #### 告警级别: **<font color="#8E2323">{{$v.labels.level}}</font>**
    {{ end }}
    #### 当前状态: **<font color="#67C23A" size=4>已恢复</font>**
    #### 故障主机: {{$v.labels.instance}}
    * ###### 告警概述: {{$v.annotations.summary}}
    * ###### 归属部门: {{$v.labels.team}}
    * ###### 开始时间: {{GetCSTtime $v.startsAt}}
    * ###### 恢复时间: {{GetCSTtime $v.endsAt}}
    {{ else }}
    ## [⚠️📢监控告警-通知]({{$var}})
    #### 监控指标: {{$v.labels.alertname}}
    {{ if eq $v.labels.level "warning" }}
    #### 告警级别: **<font color="#E6A23C" size=4>{{$v.labels.level}}</font>**
    #### 当前状态: **<font color="#E6A23C">需要处理</font>**
    {{ else if eq $v.labels.level "critical"  }}
    #### 告警级别: **<font color="#F56C6C" size=4>{{$v.labels.level}}</font>**
    #### 当前状态: **<font color="#F56C6C">需要处理</font>**
    {{ else if eq $v.labels.level "disasters"  }}
    #### 告警级别: **<font color="#8E2323" size=4>{{$v.labels.level}}</font>**
    #### 当前状态: **<font color="#8E2323">需要处理</font>**
    {{ end }}
    #### 故障主机: {{$v.labels.instance}}
    * ###### 告警概述: {{$v.annotations.summary}}
    * ###### 归属部门: {{$v.labels.team}}
    * ###### 触发时间: {{GetCSTtime $v.startsAt}}
    {{ if eq $v.labels.level "warning" }}
    #### 告警触发: <font color="#E6A23C">{{$v.annotations.description}}</font>
    {{ else if eq $v.labels.level "critical" }}
    #### 告警触发: <font color="#F56C6C">{{$v.annotations.description}}</font>
    {{ else if eq $v.labels.level "disasters"  }}
    #### 告警触发: <font color="#8E2323">{{$v.annotations.description}}</font>
    {{ end }}
    {{ end }}
    {{ end }}
    
  • 飞书告警模板

    {{ $var := .externalURL}}{{ range $k,$v:=.alerts }}
    {{if eq $v.status "resolved"}}
    **[✅🎉 告警恢复-通知]({{$v.generatorURL}})**
    **🚩 告警概述:**{{$v.annotations.summary}}
    **🔔 告警状态:**{{$v.status}}
    **📌 告警主机:**{{$v.labels.instance}}
    **👥 归属部门:**{{$v.labels.team}}
    **⏰ 开始时间:**{{GetCSTtime $v.startsAt}}
    **⏰ 结束时间:**{{GetCSTtime $v.endsAt}}
    {{else}}
    **[⚠️📢 监控告警-通知]({{$v.generatorURL}})**
    **📋 监控指标:**{{$v.labels.alertname}}
    **🚥 告警级别:**{{$v.labels.level}}
    **📌 告警主机:**{{$v.labels.instance}}
    **👥 归属部门:**{{$v.labels.team}}
    **🕙 触发时间:**{{GetCSTtime $v.startsAt}}
    **-------告警详情-------**
    😱😭{{$v.annotations.summary}} {{$v.annotations.description}}
    {{end}}
    {{ end }}
    
  • UI界面设置模板

    image-20220222165014529.png image-20220222165041788.png image-20220222165108109.png
  • 修改alertmanager配置文件

    $ vim /usr/local/alertmanager/alertmanager.yml
    global:
      smtp_from: '109359727@qq.com'
      smtp_smarthost: 'smtp.qq.com:465'
      smtp_auth_username: '109359727@qq.com'
      smtp_auth_password: 'rpokxixlarhngh'
      smtp_require_tls: false
      resolve_timeout: 5m
    templates:
      - 'templates/*.tmpl'
    route:
      group_by: ['warning']
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 1h
      receiver: 'dev'
      routes:
        - receiver: 'ops'
          group_by: ['critical', 'disasters']
          group_wait: 30s
          matchers:
            - level=~"critical|disasters"
    receivers:
    - name: 'dev'
      webhook_configs:
        - send_resolved: true
          url: 'http://localhost:8080/prometheusalert?type=dd&tpl=prometheus-dingtalk'
    - name: 'ops'
      webhook_configs:
        - send_resolved: true
          url: 'http://10.81.0.100:8080/prometheusalert?type=fs&tpl=prometheus-feishu'
    inhibit_rules:
      - source_match:
          level: 'critical'
        target_match:
          level: 'warning'
        equal: ['alertname', 'instance']
    $ curl -I -X POST http://localhost:9093/-/reload
    

相关文章

网友评论

    本文标题:Prometheus

    本文链接:https://www.haomeiwen.com/subject/ycelrrtx.html