Exporter是什么
为Prometheus提供监控数据源
的都被称为Exporter
,比如Node Exporter
用来提供节点相关的资源(cpu、内存、disk...)使用状况,而Prometheus从这些不同的Exporter中获取监控数据,然后可以在诸如Grafana这样的可视化工具中进行结果的显示。
Exporter的类型
Exporter来源可以分为2种:
- 社区提供的Exporter
- 自定义的Exporter
Exporter支持方式可以分为:
内嵌支持Prometheus
,比如kubernetes或者etcd,简单来说这种类型的软件中不需要单独的Exporter用于提供给Prometheus的监控数据的功能,这是其本身的功能特性之一。独立运行的Exporter
,比如NodeExporter
,操作系统本身由于不像kubernetes那样提供对于Prometheus的支持,所以需要单独运行Node Exporter用于提供节点自身的信息给Prometheus进行监控。
Exporter接口
Prometheus通过exporter机制将监控metric数据收集到服务端,exporter是一个http(不支持https)服务端口
,由Prometheus server定时拉取,如下示意:
http返回格式的要求,见官方文档
Exporter格式
metric_name ["{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"] value [ timestamp ]
metric_name
:指标的名称label
:指标维度的标签,可以有多个value
:指标具体的值
Exporter的四种指标
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开发
Exporter SDK
对于开源的平台,我们一般能从官方列表中找到对应的Exporter,稍加集成就可以顺利接入。对于闭源或者自研的系统,提供一个Prometheus Exporter形式监控接口则会提升软件本身的监控能力。官方提供了常用的客户端库用来开发一个集成http server
的Exporter
库。非正式的也有一些其它语言的库。
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
。
社区支持的Exporter
去官方查看吧,我就不贴过来了,非常齐全:https://prometheus.io/docs/instrumenting/exporters/