监控利器之 Prometheus

一直以来,我们会在项目中,使用 APM 去监控应用的状况,分析性能等,这些工具很有效,而且不侵入业务,不需要埋点。

然而,有些需求,是 APM 的监控满足不了的,比如 *应用业务指标 *。

监控模式

目前,采集指标有两种方式,一种是『推』,另一种就是『拉』:

推的代表有 ElasticSearch,InfluxDB,OpenTSDB 等,需要你从程序中将指标使用 TCP,UDP 等方式推送至相关监控应用,只是使用 TCP 的话,一旦监控应用挂掉或存在瓶颈,容易对应用本身产生影响,而使用 UDP 的话,虽然不用担心监控应用,但是容易丢数据。

拉的代表,主要代表就是 Prometheus,让我们不用担心监控应用本身的状态。而且,可以利用 DNS-SRV 或者 Consul 等服务发现功能就可以自动添加监控。

当然,InfluxDB 加上 collector,或者 ES 加上 metricbeat 也可以变为 『拉』,而 Prometheus 加上 Push Gateway 也可以变为 『推』。

接下来,我们主要介绍下 Prometheus。

Prometheus

『普罗米修斯』,也是希腊之神,取义『先见之明』,应该就是监控的意义所在吧。

它跟 k8s 一样,也是依据 Google 内部的应用原理设计来的,可以看作是 Google 内部监控系统 Borgmon 的一个实现。

架构图如下(来自 Prometheus 官方文档):

Prometheus 可以从配置或者用服务发现,去调用各个应用的 metrics 接口,来采集数据,然后存储在硬盘中,而如果是基础应用比如数据库,负载均衡器等,可以在相关的服务中安装 Exporters 来提供 metrics 接口供 Prometheus 拉取。

采集到的数据有两个去向,一个是报警,另一个是可视化。

下面将一一介绍。

Metrics 格式

<metric name>{<label name>=<label value>, ...}

各个部分需符合相关的正则表达式

  • metric name: [a-zA-Z:][a-zA-Z0-9:]*
  • label name: [a-zA-Z0-9_]*
  • label value: .* (即不限制)

需要注意的是,label value 最好使用枚举值,而不要使用无限制的值,比如用户 ID,Email 等,不然会消耗大量内存,也不符合指标采集的意义。

Metrics 接口的实现

大部分语言都有提供客户端,比如 Node.js 的客户端 prom-client:

npm install prom-client --save

目前,这个客户端提供了完整功能,可以在应用中埋点采集数据,比如

  • 今天注册了多少用户,收入了多少钱,可以使用 Counter;
  • Node 内存以及 CPU 的变化,可以使用 Gause
  • API 接口响应时间的统计,可以使用 Histogram 或者 Summary,前者可以按照具体数值,而后者可以按照百分比去统计响应时长;

对了,这个包内部提供了采集默认数据的功能,比如 Node 相关的指标:

const promClient = require('prom-client');

promClient.collectDefaultMetrics({
  timeout: 5000,
});

报警

你可以根据业务需求,来定制相关的规则去报警,然后关键就来了,你是否在传统的短信或者邮件报警中感到厌烦呢?

一方面,当线上问题出现的时候,我们会收到大量的报警消息,而其中很大一部分是重复的;另一方面,收到没用的报警,或者报警级别不高,导致这时候如果有重要的报警,会被我们忽略。

Prometheus 的 AlertManager 提供了解决这些问题的各种高级报警功能。

  1. const promClient = require('prom-client');
  2. promClient.collectDefaultMetrics({
  3. timeout: 5000,
  4. });

  • 报警分组 :将报警分组,当报警大量出现的时候,只会发一条消息告诉你数据库挂了的情况出现了 100 次,而不是用 100 条推送轰炸你;
  • 报警抑制:显然,当数据库出问题的时候,其它的应用可肯定会出问题,这时候你可能不会需要其它的不相干的报警短信,这个功能将真正有用的信息及时通知你;
  • 报警静默:一些不重要的报警,可以完全忽略,因此也就没有必要通知;

报警通知的方式,目前可以通过 webhook, email 等方式,估计微信或者钉钉也可以,我目前使用的是 slack。

可视化

首选当然是 Grafana,Prometheus 自己放弃了 PromDash 的可视化工具,而专注于监控数据采集与分析。在 Grafana 中配置 Prometheus 也很简单,在配置好数据源之后,可以直接创建图表。

需要注意的是,你会需要用到 Prometheus 专用的 查询语言 去配置数据,其中如果涉及到的图表内容太多,你可能会需要用到 Grafana 的模板:

  • label_values(label):全局中 label 值的集合;
  • label_values(metric, label):某个 metric 的 label 值的集合;
  • metrics(metric):metric 的正则表达集合,返回全部匹配的 metric;
  • query_result(query):返回查询集合;

Ref

  • https://prometheus.io/docs/operating/configuration/
  • https://prometheus.io/blog/2015/06/01/advanced-service-discovery/
  • http://docs.grafana.org/features/datasources/prometheus/

原文发布于微信公众号 - 程序猿DD(didispace)

原文发表时间:2017-09-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏FreeBuf

看我如何利用开发人员所犯的小错误来盗取各种tokens

实际上,在日常的开发过程中,开发人员很有可能会犯各种各样貌似“无伤大雅”的小错误,单独一个这样的小错误可能并不能搞什么事情,但如果将这些错误串起来形成一个漏洞链...

2685
来自专栏黑白安全

Memsniff:一款开源的Memcached流量分析工具

在<span "="">知名在线资源存储网站Box上,我们看到云服务已经经历了从一小撮应用服务器和数据库到高规格、高性能协作平台的转变。像大多数大型网络公司一样...

1113
来自专栏魏艾斯博客www.vpsss.net

lnmp1.4 环境升级 php5.5 到 php7 的过程

1.8K3
来自专栏张戈的专栏

WordPress发布文章自动同步到新浪微博(带特色图片)

WordPress 发博客后自动同步到新浪微博,这是我从无主题博客看到的方法,一直沿用至今。感觉对博客宣传和提升“逼格”都有显著的作用: ? 一、老版代码 先来...

5157
来自专栏hotqin888的专栏

ONLYOFFICE历史版本开发技术之三

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1742
来自专栏云计算教程系列

如何在CVM上监控CPU的使用情况

内存量,缓存大小,读取和写入磁盘的速度以及处理能力的速度和可用性都是影响基础架构性能的关键因素。在本教程中,我们将重点介绍CPU监控概念以及警报策略。我们将介绍...

1763
来自专栏后端技术探索

高并发高性能分布式框架从无到有微服务架构设计分享

微服务架构模式(Microservice Architect Pattern)。近两年在服务的疯狂增长与云计算技术的进步,让微服务架构受到重点关注。

1361
来自专栏抠抠空间

SSO详解(转)

1984
来自专栏java思维导图

缓存在高并发场景下的常见问题

当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,而且需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。这就比较依赖缓存的过期和更新策...

1223
来自专栏IT技术精选文摘

聊聊C10K问题及解决方案

1 C10K问题 大家都知道互联网的基础就是网络通信,早期的互联网可以说是一个小群体的集合。互联网还不够普及,用户也不多。一台服务器同时在线100个用户估计在当...

5669

扫码关注云+社区

领取腾讯云代金券