Prometheus+Grafana监控Docker容器和Linux主机
- Prometheus概述
- Prometheus部署
- Prometheus配置文件
- prometheus.yml
- scrape_configs
- 使用Prometheus监控docker容器
- 使用cAdvisor采集监控数据(被监控端)
- 修改prometheus配置文件
- 使用Grafana可视化监控数据
- 使用Prometheus监控Linux主机
- 安装node exporter(被监控端)
- 修改prometheus配置文件
- 使用Grafana可视化监控数据
Prometheus概述
Prometheus发布于2016年,比zabbix晚了4年。虽然其社区支持暂时不如后者完善,但是对容器的支持更好,不仅支持swarm原生群集,还支持kubernetes容器集群的监控。
Prometheus的特点包括:
- 多维数据模型:由度量名称和键值对标识的时间序列数据;
- PromQL:一种灵活的查询语言,可以利用多维数据完成复杂查询;
- 不依赖分布式存储,单个服务器节点可直接工作;
- 基于HTTP的pull方式采集时间序列数据;
- 支持通过PushGateway组件推送时间序列数据;
- 通过服务发现(service discovery)或静态配置发现目标;
- 多种图形模式及仪表盘支持(grafana)。
架构
Prometheus+Grafana的架构如下:

组件
主要组件 |
功能 |
Prometheus Server |
收集指标和存储时间序列数据,并提供查询接口 |
ClientLibrary |
客户端库 |
Push Gateway |
短期存储指标数据,主要用于临时性任务 |
Exporters |
采集已有的第三方服务监控指标并暴露metrics |
Alertmanager |
处理告警 |
Web UI |
简单的Web控制台 |
实例和作业
实例(Instance)和作业(Job)是Prometheus中的两个重要概念。实例是指可以抓取的目标(即被监控端,通常是单个的进程),而作业则是指具有相同目标的实例的集合。
Prometheus部署
Prometheus有四种常见的部署方法:
- 使用预编译的二进制文件(pre-compiled binaries)安装;
- 通过源码编译(from source);
- 使用docker部署;
- 通过配置管理系统安装:比如Ansible、Chef、Puppet和SaltStack。
下面主要介绍第三种方法(最简单最方便),其它方法参见 https://prometheus.io/docs/prometheus/latest/installation/
。
使用docker部署
需要准备配置文件prometheus.yml(见后面的内容)。
$ docker run -d -p 9090:9090 prom/prometheus
$ docker run -d --name=prometheus -p 9090:9090 \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
Prometheus配置文件
prometheus.yml
Prometheus的配置语言用YAML语言编写,其格式一般如下:
global:
[ scrape_interval: <duration> | default = 1m ]
[ scrape_timeout: <duration> | default = 10s ]
[ evaluation_interval: <duration> | default = 1m ]
external_labels:
[ <labelname>: <labelvalue> ... ]
[ query_log_file: <string> ]
rule_files:
[ - <filepath_glob> ... ]
scrape_configs:
[ - <scrape_config> ... ]
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
[ - <alertmanager_config> ... ]
remote_write:
[ - <remote_write> ... ]
remote_read:
[ - <remote_read> ... ]
scrape_configs
下面主要介绍scrape_configs的配置参数,它定义了监控目标(target)的集合并描述了从监控目标采集数据的相关参数。监控目标可以通过static_configs
关键字配置,也可以通过使用服务发现机制来动态地发现。使用relabel_configs
关键字可以在采集数据前对任意监控目标及其标签(label)进行进一步的修改。
job_name: <job_name>
[ scrape_interval: <duration> | default = <global_config.scrape_interval> ]
[ scrape_timeout: <duration> | default = <global_config.scrape_timeout> ]
[ metrics_path: <path> | default = /metrics ]
[ honor_labels: <boolean> | default = false ]
[ honor_timestamps: <boolean> | default = true ]
[ scheme: <scheme> | default = http ]
params:
[ <string>: [<string>, ...] ]
basic_auth:
[ username: <string> ]
[ password: <secret> ]
[ password_file: <string> ]
[ bearer_token: <secret> ]
[ bearer_token_file: <filename> ]
tls_config:
[ <tls_config> ]
[ proxy_url: <string> ]
azure_sd_configs:
[ - <azure_sd_config> ... ]
consul_sd_configs:
[ - <consul_sd_config> ... ]
digitalocean_sd_configs:
[ - <digitalocean_sd_config> ... ]
dockerswarm_sd_configs:
[ - <dockerswarm_sd_config> ... ]
dns_sd_configs:
[ - <dns_sd_config> ... ]
ec2_sd_configs:
[ - <ec2_sd_config> ... ]
eureka_sd_configs:
[ - <eureka_sd_config> ... ]
file_sd_configs:
[ - <file_sd_config> ... ]
gce_sd_configs:
[ - <gce_sd_config> ... ]
hetzner_sd_configs:
[ - <hetzner_sd_config> ... ]
kubernetes_sd_configs:
[ - <kubernetes_sd_config> ... ]
marathon_sd_configs:
[ - <marathon_sd_config> ... ]
nerve_sd_configs:
[ - <nerve_sd_config> ... ]
openstack_sd_configs:
[ - <openstack_sd_config> ... ]
serverset_sd_configs:
[ - <serverset_sd_config> ... ]
triton_sd_configs:
[ - <triton_sd_config> ... ]
static_configs:
[ - <static_config> ... ]
relabel_configs:
[ - <relabel_config> ... ]
metric_relabel_configs:
[ - <relabel_config> ... ]
[ sample_limit: <int> | default = 0 ]
[ target_limit: <int> | default = 0 ]
其他参数的配置参见 https://prometheus.io/docs/prometheus/latest/configuration/configuration/
。
详细配置可以参考示例:https://github.com/prometheus/prometheus/blob/release-2.24/documentation/examples/prometheus-dockerswarm.yml。
使用Prometheus监控docker容器
常用的监控指标有内存、CPU、磁盘、网络。一般使用Google开源的cAdvisor (Container Advisor)来收集正在运行的容器资源信息和性能信息(参见 https://github.com/google/cadvisor
)。
使用cAdvisor采集监控数据(被监控端)
使用Docker部署cadvisor。
$ docker run -d --volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro --volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 --detach=true \
--name=cadvisor google/cadvisor:latest
cAdvisor不负责存储采集到的监控数据,因此只能查看实时数据。cAdvisor为Prometheus提供的数据采集接口为http://被监控主机IP:8080/metrics
。
修改prometheus配置文件
在prometheus.yml的scrape_configs中添加监控作业。
- job_name: "my_docker"
static_configs:
- targets: ['被监控主机IP:8080']
然后重启容器:docker restart prometheus
。可以在http://主机IP:9090/targets
页面可以查看prometheus监控的目标。在http://主机IP:9090/graph
页面可以查看监控参数的简单图形化展示。
使用Grafana可视化监控数据
Grafana则是一个开源的度量分析和可视化系统(https://grafana.com/docs/)。它比Prometheus自带的图形化展示功能更强大。
Docker部署Grafana
$ docker run -d --name=grafana -p 3000:3000 grafana/grafana
添加数据源
在添加数据源中选择Prometheus,在HTTP下的URL栏中粘贴http://Prometheus主机IP:9090
并保存。
创建仪表盘(dashboard)
在新建仪表盘(New dashboard)中点击右侧的导入仪表盘(Import dashboard),输入并搜索193(对应仪表盘名称为docker monitoring),在显示的仪表盘选项(Options)中选择数据源为Prometheus,最后点击导入即可。

在 https://grafana.com/grafana/dashboards
上可以发现更多官方和社区提供的仪表盘。
使用Prometheus监控Linux主机
Prometheus监控Linux主机需要在被监控目标上安装Node Exporter。在目标主机上执行以下脚本来部署node exporter。
(参见 https://prometheus.io/docs/guides/node-exporter/#monitoring-linux-host-metrics-with-the-node-exporter
)
安装node exporter(被监控端)
#!/bin/bash
wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz
tar zxf node_exporter-0.17.0.linux-amd64.tar.gz
mv node_exporter-0.17.0.linux-amd64 /usr/local/node_exporter
cat << EOF > /usr/lib/systemd/system/node_exporter.service
[Unit]
Description=https://prometheus.io
[Service]
Restart=on-failure
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable node_exporter
systemctl restart node_exporter
安装完成以后使用ps -ef | grep node_exporter
查看是否正常运行。Node exporter默认会使用9100端口,为Prometheus提供的数据采集接口为http://被监控主机IP:9100/metrics
。
修改prometheus配置文件
在prometheus.yml的scrape_configs中添加监控作业。
- job_name: "my_linux"
static_configs:
- targets: ['被监控主机IP:9100']
然后重启容器:docker restart prometheus
。可以在http://主机IP:9090/targets
页面可以查看prometheus监控的目标。在http://主机IP:9090/graph
页面可以查看监控参数的简单图形化展示。
使用Grafana可视化监控数据
Grafana提供的9276仪表盘可以很好地可视化Linux主机基础监控信息。参照上文中Grafana可视化容器监控的仪表盘导入操作。
