【实用Docker项目】基于Prometheus、Grafana的可视化监控
本文最后更新于 2024-07-17,
若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益, 请联系我 删除。
本站只有Telegram群组为唯一交流群组, 点击加入
文章内容有误?申请成为本站文章修订者或作者? 向站长提出申请
前言
Prometheus普罗米修斯,是一个开源的监控解决方案。而Grafana则是一个开源的跨平台的度量分析、可视化工具。两者组合使用即可快速搭建出一个漂亮的监控系统
由于我业务需求需要监控一万多台vps,之前使用探针或者zabbix。要么是性能不足造成卡顿,要么是配置繁琐。观察不直观。所以这次使用Prometheus+Grafana的方案进行监控。
普罗米修斯中文文档:https://prometheus.fuckcloudnative.io/
项目地址:https://github.com/prometheus/prometheus
node_exporter:https://github.com/prometheus/node_exporter
blackbox_exporter:https://github.com/prometheus/blackbox_exporter
推荐的一键脚本(自动安装配置所有组件)
bash <(curl -Ls https://raw.githubusercontent.com/Sm1rkBoy/monitor_config/main/install.sh)
安装Docker🐳
配置Prometheus普罗米修斯
通过下述命令拉取Prometheus镜像
# 拉取镜像
docker pull prom/prometheus
可通过下述链接下载prometheus的配置文件,并将其存放在 root/Prometheus/Config
路径下
https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus.yml
我这里直接贴出来,你也可以直接创建新文件粘贴进去:
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
然后,启动一个该镜像的容器
# 启动容器
docker run --name Prometheus \
-d -p 9090:9090 \
-v /root/Prometheus/Config/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
现在访问其Web管理页面( http://localhost:9090 ),即可看到Prometheus服务被正确启动了
事实上,对于Prometheus服务而言,其是负责收集、存储、查看监控数据。而真正直接进行监控则是通过Exporter完成的。可以看到,Exporter相当于是Prometheus服务的客户端,负责向其提供监控数据。具体地,针对不同的被监控目标,我们需要使用不同的Exporter。这里,我们期望能够监控本机的运行状态(CPU、内存、磁盘等参数)。故这里我们需要下载一个Node Exporter用来采集主机(MacBook Pro)的监控数据。由于这里我们需要监控的是主机,所以一般不推荐使用Docker来部署Node Exporter
# 下载 node exporter(MacOS 64bit)
wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.darwin-amd64.tar.gz
# 解压
tar xvfz node_exporter-1.0.1.darwin-amd64.tar.gz
# 启动 Node Exporter
cd node_exporter-1.0.1.darwin-amd64
./node_exporter
至此我们的Node Exporter就已经启动成功了,且运行在9100端口
故通过 http://localhost:9100/metrics 即可直接访问看到其采集的监控数据
现在只需在Prometheus服务的配置文件prometheus.yml中添加相应的配置,即可收集Node Exporter的监控数据。具体地,我们在scrape_configs下添加一个新的名为MacBook Pro的job即可。这里本机IP为192.168.0.108
...
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# 收集主机的监控数据
- job_name: 'MacBook Pro'
static_configs:
- targets: ['192.168.0.108:9100']
重启prometheus服务后进入其Web管理页面( http://localhost:9090 ),输入up后点击Execute按钮后,即可看到一个我们刚刚添加的job。其中,1表示正常,0表示异常
配置Grafana
事实上,Prometheus中也提供了一个可视化方案——Prometheus UI,但其功能较为简单、无法实时关注相关监控指标的变化趋势,故这里我们选择Grafana作为可视化的解决方案。其作为一个通用的可视化工具,自然也支持Prometheus。这里我们直接拉取镜像并启动一个Grafana的容器
# 拉取镜像
docker pull grafana/grafana
# 启动容器
docker run --name myGrafana \
-d -p 3000:3000 \
grafana/grafana
然后通过 http://localhost:3000 可访问Grafana的Web页面,账号、缺省密码均为admin。首先,我们需要添加一个Prometheus类型的数据源,依次选择Configuration → Data Sources → Add data source
选择Time series databases时序数据库中的Prometheus即可
依次填写数据源名称、URL地址,最后保存即可
在Grafana中我们可以自定义各种监控所需的仪表盘,但是如果完全自己搭建较为麻烦。为此我们可在现有模板的基础上根据需要进行微调。进入Grafana官网( https://grafana.com )选择仪表盘
过滤出适用Node Exporter类型的相关模板,这里我们选择支持中文的模板
然后复制该模板的ID——8919即可
现在回到Grafana的Web管理页面,导入我们所需的模板
选择数据源,继续导入
至此,一个仪表盘就创建完成了,效果如下所示
监控MySQL
如果需要利用Prometheus来监控MySQL同样也很方便,只需选择相应的Exporter即可。具体地,选择MySQLD Exporter来采集MySQL的监控数据。命令如下,其中通过DATA_SOURCE_NAME环境变量设置MySQL服务的账号、密码、URL信息
# 拉取镜像
docker pull prom/mysqld-exporter
# 启动容器
docker run -d --name mysqldExporter \
-p 9104:9104 \
-e DATA_SOURCE_NAME="root:123456@(192.168.0.108:3306)/" \
prom/mysqld-exporter
通过 http://localhost:9104/metrics 即可查看MySQLD Exporter采集的MySQL监控数据
类似地,我们可以在Prometheus服务的配置文件prometheus.yml中添加相应的配置,用于收集MySQLD Exporter的监控数据
...
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# 收集主机的监控数据
- job_name: 'MacBook Pro'
static_configs:
- targets: ['192.168.0.108:9100']
# 收集MySQL的监控数据
- job_name: 'MySQL'
static_configs:
- targets: ['192.168.0.108:9104']
重启Prometheus服务后,即可看到该job已经生效
类似地对于可视化配置而言,在Grafana官网选择适用于监控MySQL的模板(过滤条件:name/description=mysql and data source=Prometheus),复制其ID——12826
导入后,效果如下所示
容器监控cAdvisor
现如今Docker部署已经愈来愈流行,为了更好监控Dcoker整体的运行情况。Google开源的一款用于分析、展示容器运行状态的可视化工具——cAdvisor。这里我们依然选择Docker来部署实践
# 拉取镜像
docker pull google/cadvisor
# 启动容器
docker run --name=mycAdvisor \
-p 8080:8080 -d \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
-v /dev/disk/:/dev/disk:ro \
--privileged \
--device=/dev/kmsg \
google/cadvisor
具体地,我们可通过 http://localhost:8080 来访问其监控页面,查看Dcoker中整体及各容器的监控指标。值得一提的是,cAdvisor原生支持Prometheu,通过 http://localhost:8080/metrics 即可看到其采集的监控数据
故在prometheus.yml配置文件继续添加一个名为cAdvisor的job,并重启Prometheus服务
...
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']
# 收集主机的监控数据
- job_name: 'MacBook Pro'
static_configs:
- targets: ['192.168.0.108:9100']
# 收集MySQL的监控数据
- job_name: 'MySQL'
static_configs:
- targets: ['192.168.0.108:9104']
# 收集Docker容器的监控数据
- job_name: 'cAdvisor'
static_configs:
- targets: ['192.168.0.108:8080']
类似地对于可视化配置而言,在Grafana官网选择适用于cAdvisor的模板(过滤条件:name/description=cAdvisor and data source=Prometheus),复制其ID——893。导入后,效果如下所示
相关插件:
blackbox_exporter
黑盒导出器允许通过 HTTP、HTTPS、DNS、TCP、ICMP 和 gRPC 对端点进行黑盒探测。
Using the docker image
Note: You may want to enable ipv6 in your docker configuration
docker run --rm \
-p 9115/tcp \
--name blackbox_exporter \
-v $(pwd):/config \
quay.io/prometheus/blackbox-exporter:latest --config.file=/config/blackbox.yml
检查结果
访问http://localhost:9115/probe?target=google.com&module=http_2xx 将返回针对 google.com 的 HTTP 探测的指标。该 probe_success
指标指示探测是否成功。添加 debug=true
参数将返回该探测器的调试信息。
有关导出器本身操作的指标可在端点http://localhost:9115/metrics 处获得。
TLS 和基本身份验证
Blackbox Exporter 支持 TLS 和基本身份验证。这可以更好地控制各种 HTTP 端点。
要使用 TLS 和/或基本身份验证,您需要使用参数传递配置文件 --web.config.file
。文件的格式在导出工具包存储库中描述 。
请注意,TLS 和基本身份验证设置会影响所有 HTTP 端点:用于抓取的 /metrics、用于探测的 /probe 以及 Web UI。
HTTP 探针
可以接受一个附加 hostname
参数来设置 Host
标头和 TLS SNI。这对于以下情况特别有用 dns_sd_config
:
scrape_configs:
- job_name: blackbox_all
metrics_path: /probe
params:
module: [ http_2xx ] # Look for a HTTP 200 response.
dns_sd_configs:
- names:
- example.com
- prometheus.io
type: A
port: 443
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
replacement: https://$1/ # Make probe URL be like https://1.2.3.4:443/
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9115 # The blackbox exporter's real hostname:port.
- source_labels: [__meta_dns_name]
target_label: __param_hostname # Make domain name become 'Host' header for probe requests
- source_labels: [__meta_dns_name]
target_label: vhost # and store it in 'vhost' label
node_exporter
Prometheus 导出器,用于 NIX 内核公开的硬件和操作系统指标,用 Go 编写,带有可插入指标收集器。
建议 Windows 用户使用Windows导出器。要公开 NVIDIA GPU 指标, 可以使用prometheus-dcgm 。
部署
node_exporter
旨在监控主机系统。在容器中部署需要格外小心,以避免监视容器本身。
对于需要容器化部署的情况,必须使用一些额外的标志来允许 node_exporter
访问主机命名空间。
请注意,您想要监视的任何非根安装点都需要绑定安装到容器中。
如果启动容器进行主机监控,请指定 path.rootfs
参数。此参数必须与主机根的绑定安装中的路径匹配。 node_exporter 将用作 path.rootfs
访问主机文件系统的前缀。
docker run -d \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
对于 Docker compose,需要类似的标志更改。
---
version: '3.8'
services:
node_exporter:
image: quay.io/prometheus/node-exporter:latest
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
在某些系统上,timex
收集器需要额外的 Docker 标志 , --cap-add=SYS_TIME
才能访问所需的系统调用。
反向代理
参考教程:安装及使用
⚠️Nginx Proxy Manager(以下简称NPM)会用到80、443端口,所以本机不能占用(比如原来就有Nginx)
互联网使用请确保完成了域名解析