深入探索Prometheus Exporter

前言

当下开源发展超乎想象,连腾讯,阿里这种大厂都在不断追赶各种开源,享受开源的红利。 开源时代的到来颠覆了传统IT生命周期发展的步伐,自研时代的“重开发”,到开源时代的“重集成”,这种“重集成”的就需要强有力的集成运维支撑。开源软件不像企业开发的商业闭源软件,商业软件一般是自完备的,从功能到安全到性能到监控都能自我掌控,开源软件往往在核心功能外的领域不够完备,往往需要企业自己增强。尤其在监控领域比较缺失,而Prometheus正好弥补这个空间,提供一种灵活方便的监控告警解决方案。

Prometheus vs Zabbix

说到监控,几乎没人没听过Zabbix,Zabbix的成熟度自然非常高,而且配置UI相当强大, 但是Prometheus产生于容器时代,具有云原生和时序数据库的特点, 直接弯道超车,渐有取代Zabbix之势。

看下面网上整理的两者的区别:

图片.png

Zabbix

Zabbix核心组件主要是Agent和Server,其中Agent主要负责采集数据并通过主动或者被动的方式采集数据发送到Server/Proxy,Zabbix由于使用了关系型数据存储时序数据,所以在监控大规模集群时常常在数据存储方面捉襟见肘。所以从Zabbix 4.2版本后开始支持TimescaleDB时序数据库,不过目前成熟度还不高。

图片.png

Prometheus

Prometheus的基本原理是通过HTTP周期性抓取被监控组件的状态,任意组件只要提供对应的HTTP接口并且符合Prometheus定义的数据格式,就可以接入Prometheus监控。

图片.png

Prometheus Server负责定时在目标上抓取metrics(指标)数据并保存到本地存储里面。Prometheus采用了一种Pull(拉)的方式获取数据,不仅降低客户端的复杂度,客户端只需要采集数据,无需了解服务端情况,而且服务端可以更加方便的水平扩展。Prometheus自研一套高性能的tsdb时序数据库,在V3版本可以达到每秒千万级别的数据存储,通过对接第三方时序数据库扩展历史数据的存储。

图片.png

Prometheus的本地存储为官方自研高性能时序数据库。

Prometheus的远端存储可以对接OpenTSDB、InfluxDB、Elasticsearch、M3db、Kafka等,其中M3db是目前非常受欢迎的后端存储,适用于大量历史监控数据的存储和查询,。

Exporter接口

Prometheus通过exporter机制将监控metric数据收集到服务端,exporter是一个http(不支持https)服务端口,由Prometheus server定时拉取,如下示意:

图片.png

对http返回格式的要求见官方文档

Exporter格式

metric_name ["{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"] value [ timestamp ]

metric_name:指标的名称

label:指标维度的标签,可以由多个

value:指标具体的值

Exporter示例

# HELP http_requests_total The total number of HTTP requests.

# TYPE http_requests_total counter

http_requests_total{method="post",code="200"} 1027 1395066363000

http_requests_total{method="post",code="400"} 3 1395066363000

# Escaping in label values:

msdos_file_access_time_seconds{path="C:\\DIR\\FILE.TXT",error="Cannot find file:\n\"FILE.TXT\""} 1.458255915e9

# Minimalistic line:

metric_without_timestamp_and_labels 12.47

# A weird metric from before the epoch:

something_weird{problem="division by zero"} +Inf -3982045

# A histogram, which has a pretty complex representation in the text format:

# HELP http_request_duration_seconds A histogram of the request duration.

# TYPE http_request_duration_seconds histogram

http_request_duration_seconds_bucket{le="0.05"} 24054

http_request_duration_seconds_bucket{le="0.1"} 33444

http_request_duration_seconds_bucket{le="0.2"} 100392

http_request_duration_seconds_bucket{le="0.5"} 129389

http_request_duration_seconds_bucket{le="1"} 133988

http_request_duration_seconds_bucket{le="+Inf"} 144320

http_request_duration_seconds_sum 53423

http_request_duration_seconds_count 144320

# Finally a summary, which has a complex representation, too:

# HELP rpc_duration_seconds A summary of the RPC duration in seconds.

# TYPE rpc_duration_seconds summary

rpc_duration_seconds{quantile="0.01"} 3102

rpc_duration_seconds{quantile="0.05"} 3272

rpc_duration_seconds{quantile="0.5"} 4773

rpc_duration_seconds{quantile="0.9"} 9001

rpc_duration_seconds{quantile="0.99"} 76656

rpc_duration_seconds_sum 1.7560473e+07

rpc_duration_seconds_count 2693

value:指标具体的值

四种指标

Counter:只增不减的累加指标

Counter就是一个计数器,表示一种累积型指标,该指标只能单调递增或在重新启动时重置为零,例如,您可以使用计数器来表示所服务的请求数,已完成的任务或错误。

Gauge:可增可减的测量指标

Gauge是最简单的度量类型,只有一个简单的返回值,可增可减,也可以set为指定的值。所以Gauge通常用于反映当前状态,比如当前温度或当前内存使用情况;当然也可以用于“可增加可减少”的计数指标。

Histogram:自带buckets区间用于统计分布的直方图

Histogram主要用于在设定的分布范围内(Buckets)记录大小或者次数。

例如http请求响应时间:0-100ms、100-200ms、200-300ms、>300ms 的分布情况,Histogram会自动创建3个指标,分别为:

事件发送的总次数<basename>_count:比如当前一共发生了2次http请求

所有事件产生值的大小的总和<basename>_sum:比如发生的2次http请求总的响应时间为150ms

事件产生的值分布在bucket中的次数<basename>_bucket{le="上限"}:比如响应时间0-100ms的请求1次,100-200ms的请求1次,其他的0次

Summary:数据分布统计图

Summary和Histogram类似,都可以统计事件发生的次数或者大小,以及其分布情况。

Summary和Histogram都提供了对于事件的计数_count以及值的汇总_sum,因此使用_count,和_sum时间序列可以计算出相同的内容。

同时Summary和Histogram都可以计算和统计样本的分布情况,比如中位数,n分位数等等。不同在于Histogram可以通过histogram_quantile函数在服务器端计算分位数。 而Sumamry的分位数则是直接在客户端进行定义。因此对于分位数的计算。 Summary在通过PromQL进行查询时有更好的性能表现,而Histogram则会消耗更多的资源。相对的对于客户端而言Histogram消耗的资源更少。

Exporter选型

Prometheus官方本身提供了很多专业的Exporter,同时各个厂家为Prometheus开发的Exporter也非常多,选择这些现成的Exporter自然是首选。可以打开官方网站看大概由150多种Exporter,包含如下领域:

数据库

操作系统

持续集成平台

消息中间件

分布式存储系统

Http服务器

日志系统

几乎涵盖了目前流行的大部分系统,足以见得Prometheus在监控界的地位。每一个Exporter启动侯都是一个http服务,可以已进程的形式启动,也可以以Docker容器的方式启动。

Exporter开发

Exporter SDK

对于开源的平台,我们一般能从官方列表中找到对应的Exporter,继续我们的拿来主义就行,稍加集成就可以顺利接入。对于闭源或者自研的系统,提供一个Prometheus Exporter形式监控接口则会提升软件本身的监控能力。官方提供了四种语言(Go/Java/Python/Rubby)的正式客户端库用来开发一个集成http server的Exporter库。非正式的也有一些其它语言的库。

图片.png

Exporter库基本实现了上图的功能,提供了一个HttpServer,实现GET /metrics接口,这个接口关联到一个Handle访问CollectorRegistry获取所有的指标信息,序列化为Text文本格式返回。其中ColloecorRetistry需要提前注册需要获取的各种指标对象。

由于Exporter本身提供了一个REST服务器,所以不会特别轻量,会带来一些线程的消耗,如果在一个机器上启动过多Exporter实例则需要注意,想办法减少Exporter实例的数量。

自研的Exporter的优势是可以在代码中埋点,精确代码中的监控业务数据。同时写好一个Exporter还有一些原则,可以参考网页。比如要统计http请求的次数,某一种错误产生的次数,当前active连接的个数等等。

扩展Node Exporter

Node Exporter是Prometheus官方发布的用来监控主机资源信息的Exporter,这个Exporter本身提供了一个Textfile Collector对外接口,可以用来把一些可以脚本化的监控数据带上去,通过--collector.textfile.directory 参数指定本地文本收集路径:

/opt/exporter/node_exporter/node_exporter --collector.textfile.directory=/opt/exporter/node_exporter/key

自研Exporter

除了以上2种方式,也可以按照规范自己开发Exporter服务,实现一个返回文本指标格式的HTTP Server,

比如一个用Python Flask写的Exporter

Prometheus Roadmap

l 服务器端支持指标元数据 目前指标的数据类型和其它元数据只在客户端使用,没有在服务器端持久化和使用。后续计划在服务器端使用这些元数据,第一步是在内存中聚合这些数据并且通过API对外提供。

l 适配OpenMetrics****格式指标

l 回填时间序列 回填需要加载大批量的过期数据,并且从其它监控系统传输旧数据

l 服务端支持SSL****和认证 目前Prometheus服务端,AlertManager和官方Exporter都没有使用SSL加密,并且没有认证机制,需要加入SSL和认证来保证传输安全。

l 支持生态系统 目前Prometheus支持了一些客户端库和exporter,还有好多其它语言需要加入支持。

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

推荐阅读更多精彩内容