prometheus node-exporter cadvisor grafana alertmanager 安装及服务发现
prometheus node-exporter cadvisor grafana alertmanager 安装及服务发现
本次搭建基于docker环境
前期准备#
拉取镜像
1 2 3 4 | docker pull google/cadvisor docker pull prom/prometheus docker pull grafana/grafana docker pull prom/alertmanager |
创建持久化目录
1 2 3 4 | mkdir -p /home/prometheus/{config,data,rules} chmod -R 777 /home/prometheus/data mkdir /home/grafana mkdir -p /home/alertmanager/data |
启动node-exporter硬件系统监控#
1 2 3 4 5 6 | docker run -d -p 9100:9100 \ -v /proc:/host/proc:ro \ -v /sys:/host/sys:ro \ -v /:/rootfs:ro \ --name=node-exporter \ prom/node-exporter |
启动cadvisor容器监控#
1 2 3 4 5 6 7 8 9 10 | docker run \ -v /:/rootfs:ro \ -v / var /run:/ var /run:rw \ -v /sys:/sys:ro \ -v / var /lib/docker/:/ var /lib/docker:ro \ -p 9080:8080 \ --detach= true \ --name=cadvisor \ google/cadvisor #--detach=true #分离容器 |
启动grafana#
1 2 3 4 5 6 | docker run -d -p 3000:3000 \ --user=root \ --name=grafana \ -v /home/grafana:/ var /lib/grafana \ grafana/grafana #--user=root #以root用户运行 |
启动prometheus#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #取得prometheus.yml文件,也可直接新建 docker run -d -p 9090:9090 --name prometheus prom/prometheus docker cp prometheus:/etc/prometheus/prometheus.yml /home/prometheus/ docker rm -f prometheus docker run -d -p 9090:9090 \ --name prometheus \ -v /home/prometheus:/etc/prometheus \ -v /home/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus \ --web.enable-lifecycle \ --config.file= "/etc/prometheus/prometheus.yml" \ --storage.tsdb.path= "/etc/prometheus/data" #--web.enable-lifecycle #热加载参数,需要配合配置文件--config.file使用,否则会报错 #curl -X POST http://localhost:9090/-/reload #热加载prometheus配置文件 #--config.file #配置文件路径 #--storage.tsdb.path="/etc/prometheus/data" #数据存储路径 |
Prometheus配置grafana
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [root@localhost prometheus]# vim prometheus.yml global: # 全局设置,可以被覆盖 scrape_interval: 15s # 抓取采样数据的时间间隔,每15秒去被监控机上采样,即数据采集频率 evaluation_interval: 15s # 监控数据规则的评估频率,比如设置文件系统使用率>75%发出告警则每15秒执行一次该规则,进行文件系统检查 #告警管理 alerting: alertmanagers: - static_configs: #告警静态目标配置 # - targets: ['192.168.31.131:9093'] #告警ui地址 #告警规则 rule_files: #- /etc/prometheus/rules/*.rules #告警规则文件路径 scrape_configs: # 抓取配置 #静态发现 - job_name: 'grafana' #任务名 全局唯一 scrape_interval: 5s # 抓取采样数据的时间间隔 static_configs: #静态目标配置 - targets: [ '192.168.31.131:3000' ] #抓取地址,默认为/metrics labels: #标签 instance: grafana |
1 | curl -X POST http: //localhost:9090/-/reload #热加载prometheus配置文件 |
启动pushgateway#
1 2 3 4 | docker run -d \ --name pushgateway \ -p 9091:9091 \ prom/pushgateway |
推送exporter到pushgateway
1 2 | curl http: //localhost:9090/metrics | curl --data-binary @- http://192.168.31.158:9091/metrics/job/prometheus/instance/131-普罗米修斯 curl http: //192.168.31.158:9104/metrics | curl --data-binary @- http://192.168.31.158:9091/metrics/job/mysql/instance/158-MYSQL |
注:推送到pushgateway的指标不会显示在prometheus的网页界面上,只能通过promsql查询
1 | curl -X DELETE http: //192.168.31.158:9104/metrics/job/mysql |
Prometheus配置pushgateway
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [root@localhost prometheus]# vim prometheus.yml scrape_configs: # 抓取配置 #静态发现 - job_name: 'grafana' #任务名 全局唯一 scrape_interval: 5s # 抓取采样数据的时间间隔 static_configs: #静态目标配置 - targets: [ '192.168.31.131:3000' ] #抓取地址,默认为/metrics labels: #标签 instance: grafana #pushgateway中转 - job_name: pushgateway static_configs: - targets: [ '192.168.31.158:9091' ] labels: instance: pushgateway |
1 | curl -X POST http: //localhost:9090/-/reload #热加载prometheus配置文件 |
启动告警管理alertmanager#
1 2 3 4 5 6 7 8 9 10 11 | docker run --name alertmanager -d -p 9093:9093 prom/alertmanager docker cp alertmanager:/etc/alertmanager/alertmanager.yml /home/alertmanager/ docker rm -f alertmanager docker run -d --name alertmanger -p 9093:9093 \ -v /home/alertmanager:/etc/alertmanager \ prom/alertmanager \ --storage.path= "/etc/alertmanager/data" \ --config.file= "/etc/alertmanager/alertmanager.yml" #--storage.path 数据存储路径 #--config.file 配置文件路径 |
Prometheus配置alertmanager连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [root@localhost rules]# cat hoststats-alert.rules groups: - name: hostStatsAlert rules: - alert: hostCpuUsageAlert expr: sum(avg without (cpu)(irate(node_cpu_seconds_total{mode!= "idle" }[5m]))) by (instance) > 0.85 for : 1m labels: severity: page annotations: summary: "Instance {{ $labels.instance }} CPU usgae high" description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})" - alert: hostMemUsageAlert expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)/node_memory_MemTotal_bytes > 0.85 for : 1m labels: severity: page annotations: summary: "Instance {{ $labels.instance }} MEM usgae high" description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})" |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [root@localhost prometheus]# vim prometheus.yml global: # 全局设置,可以被覆盖 scrape_interval: 15s # 抓取采样数据的时间间隔,每15秒去被监控机上采样,即数据采集频率 evaluation_interval: 15s # 监控数据规则的评估频率,比如设置文件系统使用率>75%发出告警则每15秒执行一次该规则,进行文件系统检查 #告警管理 alerting: alertmanagers: - static_configs: #告警静态目标配置 - targets: [ '192.168.31.131:9093' ] #告警ui地址 #告警规则 rule_files: - /etc/prometheus/rules/*.rules #告警规则文件路径 |
1 | curl -X POST http: //localhost:9090/-/reload #热加载prometheus配置文件 |
Prometheus的服务发现机制#
prometheus获取数据源target的方式有多种,如静态配置和服务发现配置,prometheus支持多种服务发现,在prometheus中的服务发现主要分为以下几种:
- static_configs:静态服务发现
- kubernetes_sd_configs: 基于Kubernetes的服务发现
- consul_sd_configs: Consul 服务发现
- dns_sd_configs: DNS 服务发现
- file_sd_configs: 文件服务发现
- promethues的静态静态服务发现static_configs:每当有一个新的目标实例需要监控,都需要手动配置目标target。
- promethues的consul服务发现consul_sd_configs:Prometheus 一直监视consul服务,当发现在consul中注册的服务有变化,prometheus就会自动监控到所有注册到consul中的目标资源。
- promethues的k8s服务发现kubernetes_sd_configs:Prometheus与Kubernetes的API进行交互,动态的发现Kubernetes中部署的所有可监控的目标资源。
配置基于文件发现#
1 2 3 4 5 6 7 8 9 10 11 | [root@localhost config]# cat /home/prometheus/config/target.yml - targets: [ '192.168.31.131:9090' ] #prometheus的地址端口,监控Prometheus信息 labels: app: 'app1' env: 'game1' region: 'reg1' - targets: [ '192.168.31.158:9100' ] #另外服务器的node-exporter的地址端口,监控服务器信息 labels: app: 'app2' env: 'game2' region: 'reg2' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | [root@localhost prometheus]# cat /home/prometheus/prometheus.yml global: # 全局设置,可以被覆盖 scrape_interval: 15s # 抓取采样数据的时间间隔,每15秒去被监控机上采样,即数据采集频率 evaluation_interval: 15s # 监控数据规则的评估频率,比如设置文件系统使用率>75%发出告警则每15秒执行一次该规则,进行文件系统检查 #告警管理 alerting: alertmanagers: - static_configs: #静态目标配置 - targets: [ '192.168.31.131:9093' ] #告警ui地址 #告警规则 rule_files: - /etc/prometheus/rules/*.rules #告警规则文件路径 scrape_configs: # 抓取配置 #静态发现 - job_name: 'grafana' #任务名 全局唯一 scrape_interval: 5s # 抓取采样数据的时间间隔 static_configs: #静态目标配置 - targets: [ '192.168.31.131:3000' ] #抓取地址,默认为/metrics labels: #标签 instance: grafana #pushgateway中转 - job_name: pushgateway static_configs: - targets: [ '192.168.31.158:9091' ] labels: instance: pushgateway #文件发现 - job_name: 'file_ds' #任务名 全局唯一 file_sd_configs: #基于文件发现配置 - files: [ '/etc/prometheus/config/*.yml' ] #配置文件路径,匹配config目录下所有yml文件 refresh_interval: 5s #每五秒扫描刷新配置文件 |
1 | curl -X POST http: //localhost:9090/-/reload #热加载prometheus配置文件 |
配置基于服务发现#
安装consul
1 2 3 4 5 | wget https: //releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip unzip consul_1.5.3_linux_amd64.zip ./consul agent -dev 或者 docker run --name consul -d -p 8500:8500 consul |
注销服务
1 | curl -X PUT http: //192.168.31.131:8500/v1/agent/service/deregister/node-exporter<br>#node-exporter就是"id": "node-exporter" |
注册服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #vim /home/prometheus/config/consul-1.json { "ID" : "node-exporter" , "Name" : "node-exporter-192.168.31.131" , "Tags" : [ "node-exporter" ], "Address" : "192.168.31.131" , "Port" : 9100, "Meta" : { "app" : "spring-boot" , "team" : "appgroup" , "project" : "bigdata" }, "EnableTagOverride" : false , "Check" : { "HTTP" : "http://192.168.31.131:9100/metrics" , "Interval" : "10s" }, "Weights" : { "Passing" : 10, "Warning" : 1 } } # 更新注册服务 #curl --request PUT --data @/home/prometheus/config/consul-1.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1 $ vim /home/prometheus/config/consul-2.json { "ID" : "cadvisor-exporter" , "Name" : "cadvisor-exporter-192.168.31.131" , "Tags" : [ "cadvisor-exporter" ], "Address" : "192.168.31.131" , "Port" : 9080, "Meta" : { "app" : "docker" , "team" : "cloudgroup" , "project" : "docker-service" }, "EnableTagOverride" : false , "Check" : { "HTTP" : "http://192.168.31.131:9080/metrics" , "Interval" : "10s" }, "Weights" : { "Passing" : 10, "Warning" : 1 } } # 注册服务 # curl --request PUT --data @/home/prometheus/config/consul-2.json http://192.168.31.131:8500/v1/agent/service/register?replace-existing-checks=1 |
更新Prometheus.yml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | [root@localhost prometheus]# vim /home/prometheus/prometheus.yml #文件发现 - job_name: 'file_ds' #任务名 全局唯一 file_sd_configs: #基于文件发现配置 - files: [ '/etc/prometheus/config/*.yml' ] #配置文件路径 refresh_interval: 5s #每五秒扫描刷新配置文件 #服务发现 - job_name: 'consul-node-exporter' consul_sd_configs: #基于服务发现类型 - server: '192.168.31.131:8500' #服务地址 services: [] relabel_configs: - source_labels: [__meta_consul_tags] #注意两个横杠 "__" regex: .*node-exporter.* #匹配__meta_consul_tags中值包含node-exporter的 action: keep #keep丢弃未匹配到regex中内容的数据 - regex: __meta_consul_service_metadata_(.+) #获取__meta_consul_service_metadata_的值(标签) action: labelmap #将获取的值作为新的标签 - job_name: 'consul-cadvisor-exproter' consul_sd_configs: - server: '192.168.31.131:8500' services: [] relabel_configs: - source_labels: [__meta_consul_tags] regex: .*cadvisor-exporter.* action: keep - regex: __meta_consul_service_metadata_(.+) action: labelmap |
1 | curl -X POST http: //localhost:9090/-/reload #热加载prometheus配置文件 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | [root@localhost prometheus]# cat prometheus.yml global: # 全局设置,可以被覆盖 scrape_interval: 15s # 抓取采样数据的时间间隔,每15秒去被监控机上采样,即数据采集频率 evaluation_interval: 15s # 监控数据规则的评估频率,比如设置文件系统使用率>75%发出告警则每15秒执行一次该规则,进行文件系统检查 #告警管理 alerting: alertmanagers: - static_configs: #静态目标配置 - targets: [ '192.168.31.131:9093' ] #告警ui地址 #告警规则 rule_files: - /etc/prometheus/rules/*.rules #告警规则文件路径 scrape_configs: # 抓取配置 #静态发现 - job_name: 'grafana' #任务名 全局唯一 scrape_interval: 5s # 抓取采样数据的时间间隔 static_configs: #静态目标配置 - targets: [ '192.168.31.131:3000' ] #抓取地址,默认为/metrics labels: #标签 instance: grafana #pushgateway中转 - job_name: pushgateway static_configs: - targets: [ '192.168.31.158:9091' ] labels: instance: pushgateway #文件发现 - job_name: 'file_ds' #任务名 全局唯一 file_sd_configs: #基于文件发现配置 - files: [ '/etc/prometheus/config/*.yml' ] #配置文件路径 refresh_interval: 5s #每五秒扫描刷新配置文件 #服务发现 - job_name: 'consul-prometheus' consul_sd_configs: - server: '192.168.31.131:8500' services: [] relabel_configs: - source_labels: [__meta_consul_tags] regex: .*test.* action: keep - job_name: 'consul-node-exporter' consul_sd_configs: - server: '192.168.31.131:8500' services: [] relabel_configs: - source_labels: [__meta_consul_tags] regex: .*node-exporter.* action: keep - regex: __meta_consul_service_metadata_(.+) action: labelmap - job_name: 'consul-cadvisor-exproter' consul_sd_configs: - server: '192.168.31.131:8500' services: [] relabel_configs: - source_labels: [__meta_consul_tags] regex: .*cadvisor-exporter.* action: keep - regex: __meta_consul_service_metadata_(.+) action: labelmap - job_name: 'redis-exproter' consul_sd_configs: - server: '192.168.31.131:8500' services: [] relabel_configs: - source_labels: [__meta_consul_tags] regex: .*redis-exporter.* action: keep - regex: __meta_consul_service_metadata_(.+) action: labelmap |
参考#
Prometheus的服务发现机制 | Ray (gitee.io)
Prometheus核心组件 · Prometheus中文技术文档
Prometheus 通过 consul 实现自动服务发现_哎_小羊的博客-CSDN博客
Prometheus监控神器-服务发现篇(一)_青牛踏雪御苍穹的博客-CSDN博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App