1. 简介
具体的组件包括:Prometheus Server、Exporters、PushGateway、Alertmanager、Grafana
- 《Prometheus入门篇》
- Prometheus官方文档
- Prometheus - GETTING STARTED
- Prometheus下载
- Prometheus - CONFIGURATION
- Prometheus实战 - Prometheus配置
- Prometheus监控系统之入门篇
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
- 无标签
添加评论