0%

使用Docker安装配置Prometheus

Prometheus简介

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,处理报警
  • 各种支持工具

更多内容参考Prometheus文档
本文中,我们会使用Docker来安装配置Prometheus,主要参考Prometheus监控系统之入门篇
前置条件是安装配置好了docker环境,安装方法参考《Docker入门》。已知docker宿主机IP为192.168.56.102。

prometheus server

1、登录dockerhub查看需要的prometheus server

2、下载prometheus server镜像(以v2.18.0为例)
docker pull prom/prometheus:v2.18.0

3、创建配置文件
创建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'] # 将自己加入到监控对象中

创建rules.yml,内容为空。

4、启动prometheus server

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

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

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

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

node exporter

1、登录dockerhub查看需要的node exporter

2、下载node-exporter镜像(以v1.0.0为例)
docker pull prom/node-exporter:v1.0.0

3、启动node exporter

1
2
3
4
5
6
7
8
9
10
11
docker run --name=node-exporter -d \
-p 9100:9100 \


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

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、重新加载配置文件
curl -X POST http://localhost:9090/-/reload
然而我重新加载配置文件并不生效,最后重启了prometheus server。

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

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为例)
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

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查看数据

alertmanager

1、登录dockerhub查看需要的alertmanager

2、下载alertmanager镜像(以v0.15.0为例)
docker pull prom/alertmanager:v0.15.0

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

3、创建配置文件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配置文件rules.yml中配置规则名对应
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、启动push gateway

1
2
3
4
docker run --name=alertmanager -d \
-p 9093:9093 \
-v $(pwd)/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager:v0.20.0 --config.file=/etc/alertmanager/alertmanager.yml --storage.path=/alertmanager

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

告警配置

1、编辑rules.yml,设置报警规则

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配置和rules.yml文件

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'
rule_files:
- /etc/prometheus/rules.yml #告警规则文件路径
alerting: #告警管理器设置
alertmanagers:
- static_configs:
- targets: ['192.168.56.102:9093'] #告警信息会发送给alertmanager进一步处理

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

4、在alertmanager查看alerts

告警通知处理

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


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

配置

更多prometheus配置,参考CONFIGURATIONPrometheus 配置

后记

以上,配置完成了promserver、exporter、pushgateway、alertmanager,跑通了数据的收集和显示,测试了告警信息的收集。本文就到这里,需要用到prometheus的其他内容时,再继续学习,比如thanos