监控利器之 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 提供了解决这些问题的各种高级报警功能。

  • 报警分组:将报警分组,当报警大量出现的时候,只会发一条消息告诉你数据库挂了的情况出现了 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://xizhibei.github.io/2017/08/06/monitoring-with-prometheus

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容