一个计算机技术爱好者与学习者

0%

好好学Docker:使用Docker安装配置Prometheus

1. Prometheus简介

Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud. Since its inception in 2012, many companies and organizations have adopted Prometheus, and the project has a very active developer and user community. It is now a standalone open source project and maintained independently of any company. To emphasize this, and to clarify the project’s governance structure, Prometheus joined the Cloud Native Computing Foundation in 2016 as the second hosted project, after Kubernetes.

Prometheus是在SoundCloud的基础上构建的开源系统监视和警报工具。自从2012年以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。现在,它是一个独立的开源项目,并且独立于任何公司进行维护。为了强调这一点并阐明项目的治理结构,Prometheus在2016年加入了Cloud Native Computing Foundation,这是继Kubernetes之后的第二个托管项目。

Prometheus的主要特性包括:

  • 一个包含时间序列的多维数据模型,由指标名称和键值对进行标记
  • PromQL,一种灵活的查询语言
  • 不依赖分布式存储;单服务器节点是自治的
  • 时间序列收集是通过HTTP拉取模型实现的
  • 支持通过中间网关推送时间序列
  • 通过服务发现或静态配置发现目标
  • 支持多种图形和仪表板

Prometheus生态系统包含多个组件,其中许多是可选的:

  • prometheus server,负责收取并存储时间序列数据
  • client libraries,用于检测应用程序代码
  • push gateway,支持短期工作
  • exporters,适用于特定服务的指标收集器,如HAProxy,StatsD,Graphite
  • alertmanager,处理报警
  • 各种支持工具

本文中,会使用Docker安装配置Prometheus生态系统的组件(已知主机IP为192.168.56.102)。

参考文档:

2. 安装prometheus server

1、下载prometheus镜像(以v2.18.0为例)

1
docker pull prom/prometheus:v2.18.0

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

2、准备配置文件

1
2
3
4
5
6
7
8
docker run --rm \
-u root \
--entrypoint cp \
-v /opt:/opt \
prom/prometheus:v2.18.0 \
-rf /etc/prometheus /opt/

vim /opt/prometheus/prometheus.yml

prometheus.yml文件内容为:

1
2
3
4
5
6
7
8
9
global:
scrape_interval: 15s #默认采集监控数据时间间隔
external_labels:
monitor: 'my-monitor'
scrape_configs: #监控对象设置
- job_name: prometheus #任务名称
scrape_interval: 5s #每隔5s获取一次监控数据
static_configs: #监控对象地址
- targets: ['127.0.0.1:9090'] # 将自己加入到监控对象中

3、启动prometheus

1
2
3
4
docker run --name=prometheus -d \
-p 9090:9090 \
-v /opt/prometheus:/etc/prometheus \
prom/prometheus:v2.18.0 --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle

如果使用 file_sd_configs ,那么修改启动命令为:

1
2
3
4
5
docker run --name=prometheus -d \
-p 9090:9090 \
-v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
-v /opt/prometheus/targets:/etc/prometheus/targets \
prom/prometheus:v2.18.0 --config.file=/etc/prometheus/prometheus.yml --web.enable-lifecycle

4、访问Prometheus
浏览器访问 http://192.168.56.102:9090/

5、查看targets
浏览器访问 http://192.168.56.102:9090/targets/

6、查看指标
浏览器访问 http://192.168.56.102:9090/metrics/

3. 安装node exporter

参考文档:prometheus/node_exporter

3.1. Docker安装node exporter

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

1
docker pull prom/node-exporter:v1.0.0

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

2、启动node exporter

1
2
3
4
5
6
7
docker run --name=node-exporter -d \
-p 9100:9100 \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
prom/node-exporter:v1.0.0 \
--path.rootfs=/host

3、访问node exporter

1
curl http://localhost:9100/metrics

3.2. bin安装node exporter

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

1、安装node exporter

1
2
3
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.0/node_exporter-1.0.0.linux-amd64.tar.gz
tar -xzvf node_exporter-1.0.0.linux-amd64.tar.gz
mv node_exporter-1.0.0.linux-amd64/node_exporter /usr/local/bin

2、测试启动node exporter

1
node_exporter

3、配置systemd管理

1
2
3
4
5
6
7
8
9
10
11
12
13
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

1
2
3
systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter

5、访问node exporter

1
curl http://localhost:9100/metrics

4. promserver收集exporter数据

1、修改prometheus.yml

1
2
3
4
5
6
7
8
9
10
11
12
global:
scrape_interval: 15s #默认采集监控数据时间间隔
external_labels:
monitor: 'my-monitor'
scrape_configs: #监控对象设置
- job_name: prometheus #任务名称
scrape_interval: 5s #每隔5s获取一次监控数据
static_configs: #监控对象地址
- targets: ['127.0.0.1:9090'] # 将自己加入到监控对象中
- targets: ['192.168.56.102:9100']
labels:
group: 'client-node-exporter'

2、重新加载配置文件

1
curl -X POST http://localhost:9090/-/reload

然而重新加载配置文件并不生效,最后重启了prometheus才生效。

3、查看targets
浏览器访问 http://192.168.56.102:9090/targets/

5. push gateway

Prometheus采集数据是用的pull方式,prometheus配置文件设置的5秒就是采集数据的频率。但是有些数据并不适合采用这样的方式,对这样的数据可以使用Push Gateway服务。PushGateway比较适合临时作业和批处理作业,由于这些作业是short-lived的,如果采用pull的模式,可能在prometheus采集之前,作业已经执行结束。pushgateway相当于一个暂存器,这些临时作业将metrics数据缓存到pushgateway中,然后等待Prometheus来pull数据。

1、登录dockerhub查看需要的pushgateway

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

1
docker pull prom/pushgateway:v1.1.0

3、启动push gateway

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

4、测试服务
浏览器访问 http://192.168.56.102:9091/#

5、推送数据给push gateway

1
2
3
4
5
6
7
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

6. promserver收集pushgateway数据

1、修改prometheus.yml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
global:
scrape_interval: 15s #默认采集监控数据时间间隔
external_labels:
monitor: 'my-monitor'
scrape_configs: #监控对象设置
- job_name: prometheus #任务名称
scrape_interval: 5s #每隔5s获取一次监控数据
static_configs: #监控对象地址
- targets: ['127.0.0.1:9090'] # 将自己加入到监控对象中
- targets: ['192.168.56.102:9100']
labels:
group: 'client-node-exporter'
- targets: ['192.168.56.102:9091']
labels:
group: 'pushgateway'

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

3、在promserver查看数据

7. alertmanager

1、登录dockerhub查看需要的alertmanager

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

1
docker pull prom/alertmanager:v0.15.0

高版本比如v0.20.0打开页面后会报错,Uncaught TypeError: Cannot read property ‘elmFs’ of undefined

3、创建配置文件

1
2
mkdir -p /opt/alertmanager/
vim /opt/alertmanager/alertmanager.yml

alertmanager.yml内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

1
2
3
4
docker run --name=alertmanager -d \
-p 9093:9093 \
-v /opt/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager:v0.15.0 --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager

5、测试服务
浏览器访问 http://192.168.56.102:9093/

8. 告警配置

1、设置报警规则

1
2
mkdir -p /opt/prometheus/rules/
vim /opt/prometheus/rules/exam.rules

exam.rules内容为

1
2
3
4
5
6
7
8
9
10
11
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!!!"

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
global:
scrape_interval: 15s #默认采集监控数据时间间隔
external_labels:
monitor: 'my-monitor'
scrape_configs: #监控对象设置
- job_name: prometheus #任务名称
scrape_interval: 5s #每隔5s获取一次监控数据
static_configs: #监控对象地址
- targets: ['127.0.0.1:9090'] # 将自己加入到监控对象中
- targets: ['192.168.56.102:9100']
labels:
group: 'client-node-exporter'
- targets: ['192.168.56.102:9091']
labels:
group: 'pushgateway'
alerting: #告警管理器设置
alertmanagers:
- static_configs:
- targets: ['192.168.56.102:9093'] #告警信息会发送给alertmanager进一步处理
rule_files:
- /etc/prometheus/rules/*.rules #告警规则文件路径,对应宿主机 /opt/prometheus/rules/*.rules

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

4、在prometheus alerts页面查看告警

或者在alertmanager alerts页面查看告警

9. 告警通知处理

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

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

2、创建main.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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、运行代码

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


如上图,服务接收到了告警信息。

10. grafana

grafana常被用来展示prometheus的数据,详情参考《使用Docker安装配置Grafana》

11. 后记

以上,配置完成了promserver、exporter、pushgateway、alertmanager,跑通了数据的收集和显示,测试了告警信息的收集。
但是,Prometheus也有不少问题,比如数据量大的时候需要拆分集群,聚合数据很难数据去重,可用性较低等。因此出现了Thanos,能够解决Prometheus的很多问题,详情参考 Thanos官网分布式 Promethues 之 Thanos

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-docker-prometheus/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~