1. 简介

具体的组件包括:Prometheus Server、Exporters、PushGateway、Alertmanager、Grafana

1.1. Prometheus 服务发现

在一个复杂的分布式系统中,监控目标可能会频繁变化。虚拟机、容器、云服务等的启动、停止或扩缩容,都会导致监控目标的变化。如果靠手动配置来添加或删除这些目标,将会非常繁琐且容易出错。服务发现机制通过自动识别和注册这些目标,大大简化了这一过程。

Prometheus 服务发现是一种自动发现和注册监控目标的机制,它使得 Prometheus 能够动态地识别和监控系统中新增、删除或变化的目标。这种机制大大减轻了手动管理监控目标的负担,使得监控系统能够自适应地适应基础架构的变化。

1.1.1. 静态配置

静态配置(static_configs):这是最简单的服务发现方式,将监控目标的配置直接写在Prometheus的配置文件中。

这种方式适用于目标不经常变化的情况。【prometheus.yml 】

global:
  scrape_interval: 15s #默认采集监控数据时间间隔
  evaluation_interval: 15s #Evaluate rules every 15 seconds.
scrape_configs:  #监控对象设置
  - job_name: prometheus #任务名称
    scrape_interval: 5s #每隔5s获取一次监控数据
    static_configs: #监控对象地址
      - targets: ['localhost:9090']  # 将自己加入到监控对象中

1.1.2. 文件服务发现

文件服务发现(file_sd_configs):Prometheus周期性地读取存储在指定文件中的监控目标列表。

这种方式适用于一些需要批量生成监控目标的场景。prometheus.yml  配置示例:

global:
  scrape_interval: 15s #默认采集监控数据时间间隔
  evaluation_interval: 15s
scrape_configs:
  - job_name: 'file_sd_targets'
    file_sd_configs:
      - files:
          #- '/etc/prometheus/targets/targets.yml'
          - '/etc/prometheus/targets/*.yml'

/etc/prometheus/targets/targets.yml 内容为:

- targets:
    - localhost:9090
  labels:
    job: prometheus

- targets:
    - localhost:9100
  labels:
    job: node_exporter

- targets:
    - localhost:8080
  labels:
    job: my_app

targets.yml 说明:

  • targets.yml 可以拆成多个文件,以便 target 分组。
  • targets.yml 可以改成 json 格式,效果是一样的。
  • 默认情况下,Prometheus 每隔15秒会重新读取一次配置文件,因此修改了 targets.yml 后,不需要重新 Prometheus。

1.1.3. Kubernetes服务发现

Kubernetes 服务发现(kubernetes_sd_configs):在 Kubernetes 集群中,Prometheus 可以通过查询 Kubernetes API 来自动发现和监控 Pod、Service 等资源。

Prometheus Operator通过 ServiceMonitor 资源自动发现运行在集群中的服务,并根据定义的标签选择器将它们加入监控目标列表。

这种方式适用于K8S集群,同时也可以监控K8S集群外部服务,配置非常方便。

serviceMonitor示例:参考文档《Ingress Nginx日志持久化》

1.1.4. DNS服务发现

DNS服务发现(dns_sd_configs):基于DNS发现监控目标。

基于DNS的服务发现,有两种配置方法,第一种是使用DNA A记录来做自动发现,第二种方法是使用DNS SRV记录来做服务发现。

使用DNA A记录来做服务发现,其实和基于指定文件的服务发现并没有太大差别。使用DNS SRV记录来做服务发现,监控目标的配置就从Prometheus转移到了DNS。

1.1.5. Consul 服务发现

Consul 服务发现(consul_sd_configs):Prometheus 可以与 Consul 等服务发现工具集成,通过查询服务注册表来获取监控目标的信息。

1.1.6. 云厂商集成

云厂商集成:对于使用云服务的场景,Prometheus 可以与云厂商的服务发现机制集成,如 AWS 的 EC2 实例标签、GCP 的 GCE 服务发现等。

1.2. 实现Prometheus服务发现的步骤

无论采用哪种服务发现方式,实现Prometheus的服务发现通常包括以下几个步骤:

1、配置服务发现:在Prometheus 的配置文件中,指定使用哪种服务发现方式。不同的方式需要不同的配置参数。

2、配置目标标签:对于从服务发现获得的监控目标,通常会自动附加一些标签信息,如实例名称、环境等。这些标签将有助于后续查询和区分不同的目标。

3、启用自动发现:配置 Prometheus 定时从服务发现源获取监控目标,并将其添加到监控目标列表中。

4、数据采集与存储:Prometheus 会根据配置的采样频率,定期从监控目标获取指标数据,并将其存储在时间序列数据库中。

5、数据查询与可视化:用户可以通过 Prometheus 提供的查询语言 PromQL 来查询和分析监控数据,并通过 Grafana 等工具进行可视化展示。

2. 安装

docker pull prom/prometheus:v3.5.0
mkdir -p /opt/prometheus/{conf,data}
docker run --name tmp -d prom/prometheus:v3.5.0
docker cp tmp:/etc/prometheus/prometheus.yml /opt/prometheus/conf/
docker rm tmp -f
mkdir -p /opt/prometheus/conf/targets
touch /opt/prometheus/conf/targets/targets.yml
vim /opt/prometheus/conf/prometheus.yml
vim /opt/prometheus/conf/targets/targets.yml

 启动

docker run --name=prometheus -d \
  -u root \
  -p 9090:9090 \
  -v /opt/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /opt/prometheus/conf/targets:/etc/prometheus/targets \
  -v /opt/prometheus/conf/rules:/etc/prometheus/rules \
  -v /opt/prometheus/data:/data/prometheus \
  -v /etc/localtime:/etc/localtime \
  prom/prometheus:v3.5.0 \
  --config.file=/etc/prometheus/prometheus.yml \
  --web.enable-lifecycle \
  --storage.tsdb.path=/data/prometheus \
  --storage.tsdb.retention.time=30d \
  --web.enable-remote-write-receiver

3. 访问Prometheus Server

1、访问Prometheus

浏览器访问 http://192.168.56.102:9090/

2、查看targets

浏览器访问 http://192.168.56.102:9090/targets/

3、查看指标

浏览器访问 http://192.168.56.102:9090/metrics/

4. 安装Node Exporter

4.1. Docker安装Node Exporter

参考文档:github - prometheus/node_exporter

1、下载node-exporter镜像(以v1.6.0为例)

docker pull prom/node-exporter:v1.6.0

更多版本镜像,访问dockerhub - node exporter获取。

2、启动node exporter

docker run --name=node-exporter -d \
  -p 9100:9100 \
  --net="host" \
  --pid="host" \
  -v "/:/host:ro,rslave" \
  prom/node-exporter:v1.6.0 \
  --path.rootfs=/host

3、访问node exporter

curl http://localhost:9100/metrics

4.2. Bin 安装 Node Exporter

bin 安装 node exporter 的优势是适用于所有主机,不管主机上有没有安装 docker。

1、安装node exporter

wget https://github.com/prometheus/node_exporter/releases/download/v1.6.0/node_exporter-1.6.0.linux-amd64.tar.gz
tar -xzvf node_exporter-1.6.0.linux-amd64.tar.gz
mv node_exporter-1.6.0.linux-amd64/node_exporter /usr/local/bin

2、测试启动node exporter

node_exporter

3、配置systemd管理

cat <<EOF > /etc/systemd/system/node_exporter.service 
[Unit]
Description=Node Exporter

[Service]
User=root
ExecStart=/usr/local/bin/node_exporter
Restart=always

[Install]
WantedBy=multi-user.target

EOF

4、启动node exporter

systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter

5、访问node exporter

curl http://localhost:9100/metrics

5. Promserver 采集 Node Exporter 数据

1、修改targets.yml (假设主机IP为 192.168.56.102)

- targets: ['192.168.56.102:9100']
  labels:
    group: 'node-exporter'

2、查看targets

浏览器访问 http://192.168.56.102:9090/targets/

6. 安装PushGateway

1、登录 dockerhub 查看需要的 pushgateway

2、下载 pushgateway 镜像(以v1.1.0为例)

docker pull prom/pushgateway:v1.1.0

3、启动pushgateway

docker run --name=pushgateway -d \
-p 9091:9091 \
prom/pushgateway:v1.1.0

4、测试服务

浏览器访问 http://192.168.56.102:9091/#

5、推送数据给pushgateway

echo "exam_metric 100" | curl --data-binary @- http://127.0.0.1:9091/metrics/job/exam
cat <<EOF | curl --data-binary @- http://127.0.0.1:9091/metrics/job/exam/instance/test
chinese 120
math 150
english 140
EOF

7. Promserver 采集 PushGateway 数据

1、修改targets.yml文件

- targets: ['192.168.56.102:9091']
  labels:
    group: 'pushgateway'

2、在promserver查看数据

8. 安装Alertmanager

1、登录 dockerhub 查看需要的 alertmanager

2、下载alertmanager镜像(以v0.23.0为例)

docker pull prom/alertmanager:v0.23.0

v0.15.0以下版本只支持/api/v1,不支持/api/v2

3、创建配置文件(建议和 prometheus.yml 放在一起)

docker run --name tmp -d prom/alertmanager:v0.23.0
docker cp tmp:/etc/alertmanager/alertmanager.yml /opt/prometheus/conf/alertmanager.yml
docker rm tmp -f

alertmanager.yml 默认配置为:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

修改 alertmanager.yml 为:

global:
  resolve_timeout: 5m
route:
  group_by: ['exam']  #与prometheus告警规则配置的groupname对应
  group_wait: 10s #报警等待时间
  group_interval: 10s #报警间隔时间
  repeat_interval: 1m #重复报警间隔时间
  receiver: 'web.hook' #告警处理方式,我们这里通过web.hook方式,也可以配置成邮件等方式
receivers:
  - name: 'web.hook'
    webhook_configs:
      - url: 'http://192.168.56.102:8080/exam/test' #告警webhook地址,告警信息会post到该地址,需要编写服务接收该告警数据
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning' #目标告警状态
    equal: ['alertname', 'dev', 'instance']

4、启动alertmanager

docker run --name=alertmanager -d \
  -p 9093:9093 \
  -v /opt/prometheus/conf/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
  prom/alertmanager:v0.23.0 \
  --config.file=/etc/alertmanager/alertmanager.yml \
  --storage.path=/alertmanager

5、测试服务

浏览器访问 http://192.168.56.102:9093/

9. 配置告警

1、编辑 prometheus.yml 配置文件,添加 alertmanager 配置和报警规则配置

global:
  scrape_interval: 15s #默认采集监控数据时间间隔
scrape_configs:
  - job_name: 'file_sd_targets'
    file_sd_configs:
    - files:
      - '/etc/prometheus/targets/*.yml'
alerting:   #告警管理器设置
  alertmanagers:
    - static_configs:
      - targets: ['192.168.56.102:9093'] #告警信息会发送给alertmanager进一步处理
rule_files:
  - /etc/prometheus/rules/*.rules   #告警规则文件路径,对应宿主机 /opt/prometheus/conf/rules/*.rules

2、设置报警规则

vim /opt/prometheus/conf/rules/exam.rules

exam.rules内容为:

groups:
  - name: exam
    rules:
      - alert: exam告警测试
        expr: chinese > 100 #语文成绩大于100告警,注:我们在pushgateway推送数据的时候,设置的是120,因此会触发告警
        for: 1m
        labels:
          status: warning
        annotations:
          summary: "{{$labels.instance}}:语文成绩优秀! nb了!!!"
          description: "{{$labels.instance}}: 语文成绩优秀! nbnbnb!!!"

exam.rules 也可以先配置为空。

3、重新加载配置或者重启promserver

4、查看告警

在prometheus alerts页面查看告警

或者在 alertmanager alerts 页面查看告警

10. 告警通知处理

alertmanager.yml文件中配置的告警方式是webhook,告警发送到 http://192.168.56.102:8080/exam/test ,因此,我们需要一个服务来接收处理这个告警。

1、安装golang环境,参考《CentOS7部署beego项目》golang安装一节

2、创建main.go

package main

import (
  "fmt"
  "io/ioutil"
  "github.com/gin-gonic/gin"
)

func main() {
  r := gin.Default()
  r.POST("/exam/test", func(c *gin.Context) {
    res, _ := ioutil.ReadAll(c.Request.Body)
    fmt.Println(string(res)) //这里我们只简单打印告警信息
    c.JSON(200, gin.H{
      "message": "alert message",
    })
  })
  r.Run(":8080")
}

3、运行代码

go get github.com/gin-gonic/gin
go run main.go

  • 无标签
写评论...