美文网首页监控与优化
深入探索Prometheus Exporter

深入探索Prometheus Exporter

作者: 老陕西 | 来源:发表于2019-12-15 21:03 被阅读0次

    前言

    当下开源发展超乎想象,连腾讯,阿里这种大厂都在不断追赶各种开源,享受开源的红利。 开源时代的到来颠覆了传统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,还有好多其它语言需要加入支持。

    相关文章

      网友评论

        本文标题:深入探索Prometheus Exporter

        本文链接:https://www.haomeiwen.com/subject/qyulnctx.html