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 监控的日程,怎么办呢.

使用Prometheus、Thanos监控Kubernetes集群

- - DockOne.io
当你阅读这篇文章的时候,我相信你一定已经说服了你的经理,或者是公司CTO,选择容器和Kubernetes作为微服务治理平台,去转型升级你们公司的软件产品. 你非常非常的happy,一切都貌似按照计划进行,你创建了你的第一个Kubernetes集群(三大主流云服务提供商,微软云Azure,亚马逊云AWS和谷歌云GCP都提供了非常方便的方式部署Kubernetes平台),你开发了你的第一个容器化应用,然后把它部署到了你的Kubernetes集群上.

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

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

爱奇艺号基于Prometheus的微服务应用监控实践

- - DockOne.io
微服务架构是目前各大互联网公司普遍采用的软件架构方式. 在微服务架构中,系统被拆分为多个小的、相互独立的服务,这些服务运行在自己的进程中,可以独立的开发和部署. 在业务快速变化时,微服务单一职责、自治的特点,使系统的边界更加清晰,提升了系统的可维护性;同时,简化了系统部署的复杂度,可以针对某个微服务单独升级和发布;在业务增长时,也可以方便的进行独立扩展.

我的 Prometheus 到底啥时候报警?

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

详解Prometheus的四种指标

- - DockOne.io
指标是用来衡量性能、消耗、效率和许多其他软件属性随时间的变化趋势. 它们允许工程师通过警报和仪表盘来监控一系列测量值的演变(如CPU或内存使用量、请求持续时间、延迟等). 指标在IT监控领域有着悠久的历史,并被工程师广泛使用,与日志和链路追踪一起被用来检测系统是否有不符合预期的表现. 在其最基本的形式中,一个指标数据点是由以下三个部分构成:.

为了解决 Prometheus 大内存问题,我竟然强行将 Prometheus Operator 给肢解了

- - DockOne.io
Promtheus 本身只支持单机部署,没有自带支持集群部署,也不支持高可用以及水平扩容,它的存储空间受限于本地磁盘的容量. 同时随着数据采集量的增加,单台 Prometheus 实例能够处理的时间序列数会达到瓶颈,这时 CPU 和内存都会升高,一般内存先达到瓶颈,主要原因有:. Prometheus 的内存消耗主要是因为每隔 2 小时做一个 Block 数据落盘,落盘之前所有数据都在内存里面,因此和采集量有关.