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

注册 DigitalOcean 免费获得 $10 折扣

相关参考信息:

  • 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/

推荐这些相关文章

订阅这个博客:

关注我的微博:

关注我的推特: