Prometheus 和 Grafana 监控系统指南
Prometheus 是源于 Google Borgmon 的一个开源监控系统,用 Golang 开发。被很多人称为下一代监控系统。
Prometheus 基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供 HTTP 接口就可以接入监控系统,不需要任何 SDK 或者其他的集成过程。这样做非常适合虚拟化环境比如 VM 或者 Docker 。
Prometheus 应该是为数不多的适合 Docker、Mesos 、Kubernetes 环境的监控系统之一。
输出被监控组件信息的 HTTP 接口被叫做 exporter 。目前互联网公司常用的组件大部分都有 exporter 可以直接使用,比如 Varnish、Haproxy、Nginx、MySQL、Linux 系统信息 (包括磁盘、内存、CPU、网络等等)。
Grafana 是一个开源的图表可视化系统,简单说图表配置比较方便、生成的图表比较漂亮。
但是 Prometheus 还比较新,要用在生产环境还需要解决一系列的问题,比如和 Grafana 集成相关资料并不多,这篇文章简单介绍了这些问题的解决方法。
1. Prometheus 的查询系统
Prometheus 提供了一个简单的查询界面 http://127.0.0.1:9090/graph
在这里可以查询各个 exporter 的基础信息,比如 node_load1, haproxy_backend_http_responses_total, nginx_http_requests_total 等等图标和标签:
这些信息分两种,一种是状态信息,比如 node_load1, 表示组件当前的状态。
查询 node_load1 会输出每台服务器的 CPU 负载图表和标签:
node_load1{alias="web",instance="y.y.y.x:9100",job="linux"} node_load1{alias="web",instance="y.y.y.y:9100",job="linux"} node_load1{alias="db",instance="y.y.y.y:9100",job="linux"} ...
{} 内部的 Key-Value 对是查询过滤的维度,这样可以方便的根据标签合并计算,比如按业务类型聚合、或者按服务器类型聚合、或者按机架聚合。
node_load1 是不加任何过滤条件的查询会输出所有机器的信息。 node_load1{alias="web"} 只输出 alias="web" 的机器信息。 node_load1{alias="web",instance="y.y.y.x:9100"} 只输出 alias="web" 并且 instance="y.y.y.x:9100" 的机器信息。
另外 = (相等) 还可以换成 =~ 正则匹配,
更多信息可以查看 prometheus 查询官方文档,(虽然例子并不是完整):https://prometheus.io/docs/querying/basics/
这类信息可以直接绘制到 Grafana 系统中。
另外一种是累加值信息,比如 haproxy_backend_http_responses_total,node_network_transmit_bytes
node_network_transmit_bytes{alias="web",device="lo",instance="x.x.x.x:9100",job="linux"} node_network_transmit_bytes{alias="web",device="eth1",instance="x.x.x.x:9100",job="linux"} node_network_transmit_bytes{alias="web",device="eth2",instance="x.x.x.x:9100",job="linux"} node_network_transmit_bytes{alias="web",device="eth3",instance="x.x.x.x:9100",job="linux"}
这类信息实际上更加常用,需要再次处理才能转换成我们熟悉的类似于 QPS 之类的 Rate 曲线才能输出到 Grafana 系统中,转换方式如下:
rate(nginx_http_requests_total{instance="$node", status="200"}[5m])
这个 Query 是输出某台服务器 Nginx 200 请求的 QPS 。
更多例子见文章最后的小密圈。
完整文档可以参考:
https://prometheus.io/docs/querying/operators/
2. Prometheus 的安装和启动,这里参考 percona 的一篇文章:
wget https://github.com/prometheus/prometheus/releases/download/0.17.0rc2/prometheus-0.17.0rc2.linux-amd64.tar.gz mkdir /opt/prometheus tar zxf prometheus-0.17.0rc2.linux-amd64.tar.gz -C /opt/prometheus --strip-components=1 cat << EOF > /opt/prometheus/prometheus.yml global: scrape_interval: 5s evaluation_interval: 5s scrape_configs: - job_name: linux target_groups: - targets: ['x.x.x.x:9100'] labels: alias: db1 - job_name: mysql target_groups: - targets: ['x.x.x.x:9104'] labels: alias: db1 EOF cd /opt/prometheus ./prometheus
即可完成。
3. Node exporter (Linux 服务器基础信息)的安装和启动:
wget https://github.com/prometheus/node_exporter/releases/download/0.12.0rc3/node_exporter-0.12.0rc3.linux-amd64.tar.gz tar zxf node_exporter-0.12.0rc3.linux-amd64.tar.gz -C /opt/prometheus_exporters cd /opt/prometheus_exporters ./node_exporter
即可完成。
至此,你已经可以在 Prometheus 查询到 Node 相关的图表了。/
可以发现要把这些用在自己的系统中,需要自己做 init 启动管理脚本或者打包成 RPM 。
关于如何非常方便的快速打包, 互联网架构小密圈 Roundabout 里有一个非常实用的工具链接。
4. Grafana 的安装和启动 (这里用比较稳定的 2.6.0 版本)
yum install https://grafanarel.s3.amazonaws.com/builds/grafana-2.6.0-1.x86_64.rpm
打 2.6.0 补丁
sed -i 's/step_input:""/step_input:c.target.step/; s/ HH:MM/ HH:mm/; s/,function(c)/,"templateSrv",function(c,g)/; s/expr:c.target.expr/expr:g.replace(c.target.expr,c.panel.scopedVars)/' /usr/share/grafana/public/app/plugins/datasource/prometheus/query_ctrl.js sed -i 's/h=a.interval/h=g.replace(a.interval, c.scopedVars)/' /usr/share/grafana/public/app/plugins/datasource/prometheus/datasource.js /etc/init.d/grafana-server start
至此安装完成。
浏览器打开 http://127.0.0.1:3000 ,输入默认用户名密码 (admin/admin) 可以进入 Grafana 。
然后配置数据源:
Prometheus: URL: http://127.0.0.1:9090/
即可完成 Prometheus 和 Grafana 的对接。
5. Grafana 图表的创建和编辑
在界面上点击绿色色块,可以添加图表 Graph:
点击现有图表的标题可以复制和编辑, 这里可以编辑图表标题和宽度、高度:
这里可以编辑 Prometheus 的查询语句:
Grafana 支持 Y 轴单位的选择,比如流量、吞吐量、磁盘使用量等等:
Grafana 支持堆叠图和曲线、柱状图各种漂亮的图表:
6. 常见问题:
6.1. 关于高可用
很多人担心这种抓取的模式的高可用问题,比如和目标节点的通讯异常或者某次的采集丢失怎么办?Prometheus 的模型和计算方式是采样然后聚合计算,假如某些样本没有采集到则这些样本不参与计算。
6.2. Prometheus 的 Grafana 图表模板比较少:
Grafana 并没有太多的配置好的图表模板,除了 Percona 开源的一些外,很多需要自行配置。
Grafana 提供了一些例子,但是还是很少:https://grafana.net/dashboards
这里准备了几个常用的组件 Linux Node、Varnish、Nginx、Memcache、Haproxy、MySQL 的简单模板例子 (可以直接导入 Grafana 2.6.0 使用)和 Exporter 安装方法可以从 互联网架构小密圈 Roundabout 查看和下载:
prometheus_20161121.txt
prometheus_20161121.zip
相关参考信息:
- https://grafana.net/dashboards
- https://medium.com/@griggheo/initial-experiences-with-the-prometheus-monitoring-system-167054ac439c#.l6w73g5dt
- https://www.robustperception.io/rate-then-sum-never-sum-then-rate/
- http://aldusleaf.org/monitoring-elixir-apps-in-2016-prometheus-and-grafana/
- https://prometheus.io/docs/querying/examples/
- https://www.robustperception.io/setting-up-grafana-for-prometheus/
- https://www.digitalocean.com/community/tutorials/how-to-query-prometheus-on-ubuntu-14-04-part-1
- https://www.digitalocean.com/community/tutorials/how-to-query-prometheus-on-ubuntu-14-04-part-2
- https://www.digitalocean.com/community/tutorials/how-to-use-prometheus-to-monitor-your-centos-7-server
- https://www.percona.com/blog/2016/02/29/graphing-mysql-performance-with-prometheus-and-grafana/
- https://prometheus.io/docs/instrumenting/exporters/
- https://www.percona.com/blog/2016/02/29/graphing-mysql-performance-with-prometheus-and-grafana/