Prometheus 和 Grafana 监控系统指南

标签: 架构研究 Docker Grafana Kubernetes Monitoring | 发表时间:2016-11-22 02:28 | 作者:Bruce Dou
出处:https://blog.eood.cn

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/

相关 [prometheus grafana 监控] 推荐:

Prometheus 和 Grafana 监控系统指南

- - 互联网技术和架构
Prometheus 是源于 Google Borgmon 的一个开源监控系统,用 Golang 开发. Prometheus 基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,这样做的好处是任意组件只要提供 HTTP 接口就可以接入监控系统,不需要任何 SDK 或者其他的集成过程. 这样做非常适合虚拟化环境比如 VM 或者 Docker.

Prometheus 与 Grafana:监控报警系统中的银弹

- - IT瘾-dev
监控报警是服务稳定的基础,是性能优化的重要依据,是可以未雨绸缪的重大利器. 现代系统赋予了监控报警重要地位,近年来随着微服务设计理念不断成熟与广泛使用,做为系统方案的设计者,监控的选择和使用将是搭建系统不可或缺的一个环节. Prometheus和Grafana像一组黄金搭档一样出现在了历史的洪流中,就像当年PHP和MYSQL一样.

Spring Boot 2.x监控数据可视化(Actuator + Prometheus + Grafana手把手)

- - 周立的博客 - 关注Spring Cloud、Docker
本文基于Spring Boot 2.1.4,理论支持Spring Boot 2.x所有版本. 众所周知,Spring Boot有个子项目Spring Boot Actuator,它为应用提供了强大的监控能力. 从Spring Boot 2.0开始,Actuator将底层改为Micrometer,提供了更强、更灵活的监控能力.

Docker 监控- Prometheus VS Cloud Insight

- - SegmentFault 最新的文章
如今,越来越多的公司开始使用 Docker 了,2 / 3 的公司在尝试了 Docker 后最终使用了它. 为了能够更精确的分配每个容器能使用的资源,我们想要实时获取容器运行时使用资源的情况,怎样对 Docker 上的应用进行监控呢. Docker 的结构会不会加大监控难度. 可是在没有专业运维团队来监控 Docker 的情况下,并且还想加快 Docker 监控的日程,怎么办呢.

使用 Grafana+collectd+InfluxDB 打造现代监控系统

- - vpsee.com
想打造 New Relic 那样漂亮的实时监控系统我们只需要 InfluxDB/collectd/Grafana 这三个工具,这三个工具的关系是这样的:. 采集数据(collectd)-> 存储数据(InfluxDB) -> 显示数据(Grafana). InfluxDB 是 Go 语言开发的一个开源分布式时序数据库,非常适合存储指标、事件、分析等数据,看版本号(v0.8.8)就知道这个项目还很年轻;.

我的 Prometheus 到底啥时候报警?

- - DockOne.io
最近又被问到了 Prometheus 为啥不报警,恰好回忆起之前经常解答相关问题,不妨写一篇文章来解决下面两个问题:. 我的 Prometheus 为啥报警. 我的 Prometheus 为啥不报警. 我们首先需要一些背景知识:Prometheus 是如何计算并产生警报的. 这条警报的 大致含义是,假如 kube-apiserver 的 P99 响应时间大于 4 秒,并持续 10 分钟以上,就产生报警.

ZooKeeper监控

- - 淘宝网通用产品团队博客
        在公司内部,有不少应用已经强依赖zookeeper,比如meta和精卫系统,zookeeper的工作状态直接影响它们的正常工作. 目前开源世界中暂没有一个比较成熟的zk-monitor,公司内部的各个zookeeper运行也都是无监控,无报表状态. 目前zookeeper-monitor能做哪些事情,讲到这个,首先来看看哪些因素对zookeeper正常工作比较大的影响:.

性能监控

- - 互联网 - ITeye博客
一旦你的服务器是在控制台模式下运行,你就可以开始我们接下来的内容. iostat  iostat 命令用来显示存储子系统的详细信息,通常用它来监控磁盘 I/O 的情况. 要特别注意 iostat 统计结果中的 %iowait 值,太大了表明你的系统存储子系统性能低下. meminfo 和 free  Meminfo 可让你获取内存的详细信息,你可以使用 cat 和 grep 命令来显示 meminfo 信息: 1 cat /proc/meminfo  另外你可以使用 free 命令来显示动态的内存使用信息,free 只是给你大概的内存信息,而 meminfo 提供的信息更加详细.

DB2监控

- - CSDN博客数据库推荐文章
     收集的一些DB2监控方法.. -- 是到数据库快照,并存入文件.  -- 查找并重新绑定无效包 .  -- 查出 myuser 模式下的所有无效包.  -- 利用查出的 pkgname ,使用 Rebind 重新绑定. -- 查看所有用户定义(tabschema not like 'SYS%' )表的状态.

nagios 监控redis

- - C1G军火库
下载check_redis.pl. OK: REDIS 2.6.12 on 192.168.0.130:6379 has 1 databases (db0) with 49801 keys, up 3 days 14 hours - connected_clients is 1, blocked_clients is 0 | connected_clients=1 blocked_clients=0.