1、Prometheus & Grafana搭建
1.1、Prometheus 介绍
Prometheus 是一套开源的系统监控、报警、时间序列数据库的组合,最初有 SoundCloud 开发的,后来随着越来越多公司使用,于是便独立成开源项目。我们常用的 Kubernetes 容器集群管理中,通常会搭配 Prometheus 一起来进行监控。Prometheus 基本原理是通过 Http 协议周期性抓取被监控组件的状态,而输出这些被监控的组件的 Http 接口为 Exporter,现在各个公司常用的 Exporter 都已经提供了,可以直接安装使用,如 haproxy_exporter、blockbox_exporter、mysqld_exporter、node_exporter 等等,更多支持的组件可查看
Prometheus 官网架构图如下:
上图简化如下:
总体而言,prometheus的核心是在于Server,我们要接入prometheus的话,实际上就是开放接口给prometheus拉取数据,然后在web-ui下配置图形化界面进而实现监控的功能。
1.2、Grafana 介绍
Grafana 是一个可视化仪表盘,它拥有美观的图标和布局展示,功能齐全的仪表盘和图形编辑器,默认支持 CloudWatch、Graphite、Elasticsearch、InfluxDB、Mysql、PostgreSQL、Prometheus、OpenTSDB 等作为数据源。我们可以将 Prometheus 抓取的数据,通过 Grafana 优美的展示出来,非常直观。
示例图:
简而言之,prometheus server采集到的数据通过接入Grafana进行展示,Grafana官网提供了多种采集数据的模板,如mysql 、服务器、docker等。
1.3、Prometheus部署
1.3.1 Docker方式安装
Docker 镜像启动很简单,只需要一条命令即可,使用默认配置的话,可以直接使用如下命令启动。
docker run --name prometheus -d -p 127.0.0.1:9090:9090 prometheus/prometheus
1.3.2 二进制源码安装
下载 Prometheus 二进制源码安装包,可以访问 Prometheus download 页面下载指定版本
cd /opt
wget https://github.com/prometheus/prometheus/releases/download/v2.3.2/prometheus-2.3.2.darwin-amd64.tar.gz
tar -zxvf prometheus-2.3.2.darwin-amd64.tar.gz
启动 Prometheus,使用默认配置文件 prometheus.yml
启动
cd prometheus-2.3.2
./prometheus --config.file="prometheus.yml" & ##启动
pkill prometheus ## 停止
./promtool check config prometheus.yml ##核查yml配置文件是否正确,用于格式检查
安装完成后,访问 IP:9090 web界面
1.4 Grafana部署
Grafana 安装也很方便,根据官网文档 Grafana Install,里面有针对各个系统提供的安装方法
1.4.1 二进制源码安装
cd /opt
wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.2.2.darwin-amd64.tar.gz
tar -zxvf grafana-5.2.2.darwin-amd64.tar.gz
cd grafana-5.2.2
./bin/grafana-server web
1.4.2 Docker方式安装
docker run \
--user root \
-d \
-p 3000:3000 \
--name=grafana \
-v /home/monitor/grafana:/var/lib/grafana \
grafana/grafana
本地浏览器访问 http://localhost:3000
即可打开 Grafana Web 页面(默认账号密码:admin admin )
1.5、Grafana配置监控
既然我们已经起了Grafana了,就直接用Grafana作为监控的可视化工具啦(prometheus有自带的可视化界面,但我们就不用)。进到Grafana首页,配置prometheus作为我们的数据源。
进到配置页面,写下对应的URL,然后保存就好了。
至此,Prometheus和Garafana已经部署完毕,并且接入。
2、Exporter简介
概述
Exporter是Prometheus的指标数据收集组件。它负责从目标Jobs收集数据,并把收集到的数据转换为Prometheus支持的时序数据格式。 和传统的指标数据收集组件不同的是,他只负责收集,并不向Server端发送数据,而是等待Prometheus Server 主动抓取,node-exporter 默认的抓取url地址:http://ip:9100/metrics
。
另外,如果因为环境原因,网络不可达的场景,Prometheus可以使用Pushgateway这个组件推送node-exporter的指标数据到远端Prometheus。
2.1 Node-export
node-export由Prometheus官方提供、维护,属于监控指标收集类UNIX内核操作系统的必备的exporter。
Prometheus使用exporter工具来暴露主机和应用程序上的指标,目前有很多可用于各种目的的exporter。现在我们将专注于一个特定的exporter:Node Exporter。
2.1.1、安装Node Exporter
# 下载
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.0/node_exporter-1.0.0.linux-386.tar.gz
# 解压
tar -zxf node_exporter-1.0.0.linux-386.tar.gz —C/usr/localcd /usr/local
# 重命名
mv node_exporter-1.0.0/ node_exporter
2.1.2、配置到系统服务
cat > /etc/systemd/system/node_exporter.service << EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
2.1.3、启动并查看状态
# 启动
systemctl start node_exporter
# 查看状态
systemctl status node_exporter
或者进入解压目录执行
./node_exporter
2.1.4、 访问web
3、 Prometheus监控Export
3.1 prometheus
新建prometheus的配置文件prometheus.yml
(这份配置其实就是告诉prometheus要去哪个端口中拉取对应的监控数据)
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node-export'
static_configs:
- targets: ['ip:9100'] // TODO ip自己写
3.1.1、 重启prometheus
#二进制包
cd prometheus-2.3.2
./prometheus --config.file="prometheus.yml" & ##启动
如果采用docker安装,配置映射的文件后,重启容器
3.1.2 、web查看
3.2 grafana
使用现有的模板吧,直接import对应的模板,相关的模板可以在 https://grafana.com/grafana/dashboards/ 这里查到
我们直接服务器的监控直接选用8919的就好了
import后就能直接看到高大上的监控页面了:
4、Prometheus监控JVM
Java的监控也特别简单,在项目中多引入两个pom依赖(SpringBoot自带的监控组件actuator)
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--适配prometheus-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
然后在配置文件application.yml 上加上对应的配置(开启监控并可以让prometheus拉取配置)
# 监控配置 TODO
management:
endpoint:
health:
show-details: always
metrics:
enabled: true
prometheus:
enabled: true
endpoints:
web:
exposure:
include: '*'
metrics:
export:
prometheus:
enabled: true
当我们启动服务后,访问/actuator
路径就能看到一大堆输出的指标了,包括prometheus的
能看到这些指标被打印了,说明我们程序接入已经完成了,剩下的就是通过prometheus来采集应用的指标了。
要让prometheus采集到Java应用的数据,其实就是改下对应的配置文件就完事了。在前面写好的的prometheus.yml
文件下添加相关的配置信息:
- job_name: 'austin'
metrics_path: '/actuator/prometheus' # 采集的路径
static_configs:
- targets: ['ip:port'] # todo 这里的ip和端口写自己的应用下的
我们访问:ip:9090/targets
这个路径下,能看到现在prometheus能采集到的端点有哪些,看到都是自己所配置的状态为up
,那就说明正常了
在Grafana配置对应的监控就好啦。这里我选用了4701
模板的JVM监控和12900
SpringBoot监控,可以简单看下他们的效果
4.1 压测
到目前为止,我们想要发消息,都是通过HTTP接口进行调用的,而恰好的是,Spring actuator是能监控到HTTP的数据的。那我们就压测一把看看监控平台的指标会不会变?
这里我使用wrk
这个压测工具来(它足够简单易用)所以,首先安装他(环境Centos 7.6
):
sudo yum groupinstall 'Development Tools'
sudo yum install -y openssl-devel git
git clone https://github.com/wg/wrk.git wrk
cd wrk
make
# 将可执行文件移动到 /usr/local/bin 位置
sudo cp wrk /usr/local/bin
# 验证安装是否成功
wrk -v
wrk -t2 -c100 -d10s --latency http://localhost:8080/login/toLogin (开两个线程 并发100 持续10s)
Grafana监控变化
5、Prometheus监控processExport
5.1、Process Exporter简介
在Prometheus中,可以借助process-exporter用以检测所选进程的状态信息。
用法:
process-exporter [options] -config.path filename.yml
若选择监控的进城并对其进行分组,可以使用命令行参数或者yaml配置文件
。推荐使用-config.path
指定配置文件路径。
详细.yml配置文件格式及规则参考https://github.com/ncabatoff/process-exporter
# 若监控主机上所有进程
process_names:
- name: "{{.Comm}}"
cmdline:
- '.+'
# 若监控主机上某个进程
process_names:
- name: "{{.Matches}}"
cmdline:
- 'hadoop'
可用的模板变量如下
{{.Comm}} 包含原始可执行文件的基本名称,即 /proc/<pid>/stat
{{.ExeBase}} 包含可执行文件的基本名称
{{.ExeFull}} 包含可执行文件的标准路径
{{.Username}} 包含有效用户的用户名
{{.Matches}} 包含所有由于应用cmdline正则表达式而产生的匹配项
{{.PID}} 包含过程的PID。请注意,使用PID意味着该组将仅包含一个进程
{{.StartTime}} 包含过程的开始时间。与PID结合使用时,这很有用,因为PID会随着时间的推移而被重用
不建议使用PID或StartTime
5.2、 安装Process Exporter
# 下载
wget https://github.com/ncabatoff/process-exporter/releases/download/v0.7.2/process-exporter-0.7.2.linux-amd64.tar.gz
# 解压并安装
tar -zxvf process-exporter-0.7.2.linux-amd64.tar.gz -C /usr/local
# 重命名
mv process-exporter-0.7.2.linux-amd64/ process_exporter
注册到系统服务
cat > /usr/lib/systemd/system/process_exporter.service << EOF
[Unit]
Description=process_exporter
Documentation=https://github.com/ncabatoff/process-exporter
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/process_exporter/process-exporter -config.path=/usr/local/process_exporter/process-conf.yaml
Restart=always
[Install]
WantedBy=multi-user.target
EOF
加载并开机自启
systemctl daemon-reload && systemctl enable process_exporter
启动process exporter
systemctl daemon-reload && systemctl enable process_exporter
eg: 监控hadoop进程
vi process-conf.yaml
process_names:
- name: "{{.Matches}}"
cmdline:
- 'hadoop'
启动process exporter后查看metric信息 http://ip:9256
5.3、 接入Prometheus
在prometheus配置文件prometheus.yml
中,添加process exporter信息
- job_name: Process
static_configs:
- targets: ['localhost:9256']
检查prometheus.yml配置文件
./promtool check config prometheus.yml
[root@master prometheus-2.18.1]# ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 0 rule files found
重启prometheus
systemctl restart prometheus
4. 接入Grafana图形化展示
输入导入的模板id 249
,数据源选择Prometheus,点击import导入。
6、docker-compose编排
新建一个prometheus的文件夹,存放docker-compose.yml
的信息
version: '2'
networks:
monitor:
driver: bridge
services:
prometheus:
image: prom/prometheus
container_name: prometheus
hostname: prometheus
restart: always
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
# - ./node_down.yml:/usr/local/etc/node_down.yml:rw
ports:
- "9090:9090"
networks:
- monitor
alertmanager:
image: prom/alertmanager
container_name: alertmanager
hostname: alertmanager
restart: always
# volumes:
# - ./alertmanager.yml:/usr/local/etc/alertmanager.yml
ports:
- "9093:9093"
networks:
- monitor
grafana:
image: grafana/grafana
container_name: grafana
hostname: grafana
restart: always
ports:
- "3000:3000"
networks:
- monitor
node-exporter:
image: quay.io/prometheus/node-exporter
container_name: node-exporter
hostname: node-exporter
restart: always
ports:
- "9100:9100"
networks:
- monitor
cadvisor:
image: google/cadvisor:latest
container_name: cadvisor
hostname: cadvisor
restart: always
volumes:
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- "8899:8080"
networks:
- monitor
这里拉取的镜像分别有:
cadvisor
用于获取docker容器的指标node-exporter
用户获取服务器的指标grafana
监控的web-ui
好用的可视化组件alertmanager
告警组件(目前暂未用到)prometheus
核心监控组件
新建prometheus的配置文件prometheus.yml
(这份配置其实就是告诉prometheus要去哪个端口中拉取对应的监控数据)
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['ip:9090'] // TODO ip自己写
- job_name: 'cadvisor'
static_configs:
- targets: ['ip:8899'] // TODO ip自己写
- job_name: 'node'
static_configs:
- targets: ['ip:9100'] // TODO ip自己写
(这里要注意端口,按自己配置的来)
把这份prometheus.yml
的配置往/etc/prometheus/prometheus.yml
路径下复制一份(有很多配置的信息我都忽略没写了,prometheus的功能还是蛮强大的,对监控想深入了解的可以官网看看文档)
随后在目录下docker-compose up -d
启动,于是我们就可以分别访问:
http://ip:9100/metrics
( 查看服务器的指标)http://ip:8899/metrics
(查看docker容器的指标)http://ip:9090/
(prometheus的原生web-ui)http://ip:3000/
(Grafana开源的监控可视化组件页面)
一个docker-compose起了5个服务器,真好使!
7、Pushgateway
1.Pushgateway简介
Pushgateway是prometheus的一个组件,prometheus server默认是通过exporter主动获取数据(默认采取pull拉取数据),pushgateway则是通过被动方式推送数据到prometheus server,用户可以写一些自定义的监控脚本把需要监控的数据发送给pushgateway, 然后pushgateway再把数据发送给Prometheus server
总结就是pushgateway是普罗米修斯的一个组件,是通过被动的方式将数据上传至普罗米修斯。这个可以解决不在一个网段的问题。
2、pushgateway缺点
- Prometheus拉取状态只针对 pushgateway, 不能对每个节点都有效;
- Pushgateway出现问题,整个采集到的数据都会出现问题
- 监控下线,prometheus还会拉取到旧的监控数据,需要手动清理 pushgateway不要的数据。
3、安装pushgateway
docker run -d --name pushgateway -p 9091:9091 prom/pushgateway
在浏览器访问node ip :9091出现如下ui界面
4、修改prometheus.yaml文件
- job_name: 'pushgateway'
scrape_interval: 5s
static_configs:
- targets: ['192.168.100.6:9091']
honor_labels: true
重启Prometheus
5、推送指定的数据格式到pushgateway
现在普罗米修斯还采集不到任何和pushgateway相关的数据,因为我们需要将数据上报到pushgateway,普罗米修斯才可以采集到,所以现在需要将数据推送到pushgateway。
metric指标名 3.6指标值 test_job这个是job的名字 这些都是固定的格式
echo " metric 3.6" | curl --data-binary @- http://192.168.2.250:9091/metrics/job/test_job
注:--data-binary 表示发送二进制数据,注意:它是使用POST方式发送的
6、把数据上报到pushgateway
在被监控服务所在的机器配置数据上报,这个脚本是采集内存信息的
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.2.250"
cat <<EOF | curl --data-binary @- http://192.168.2.250:9091/metrics/job/$job_name/instance/$instance_name
node_memory_usages $node_memory_usages
EOF
打开pushgateway web ui界面,可看到如下:
打开prometheus ui界面,可看到如下memory_usage的metrics指标
设置计划任务,每分钟定时上报数据
crontab -e
*/1 * * * * /opt/push.sh
【推荐】国内首个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吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类