乐趣区

关于prometheus:Prometheus-监控系统的学习总结

APM

APM (Application Performance Management) 是利用性能治理的缩写,代表了服务的行为、可靠性、性能等的监控和治理。当利用产生故障,利用 APM 设施能够迅速检测并定位到产生故障的起因。

现在的后端服务大都是分布式、微服务化的,做好 APM 尤为重要。APM 包含许多方面工作,包含 链路追踪 (Tracing) 日志 (Logging) 指标 (Metrics) 监控与报警 等,对应的开源基础设施也有很多,如 Jaeger/Zipkin (链路跟踪)、ELK (日志)、Prometheus/Zabbix/InfluxDB (指标监控零碎)、Grafana (监控展现前端) 等。

明天来说说什么是指标监控,以及总结一下最近学习 Prometheus 的心得,梳理一下常识网络。

Metrics 指标和 Prometheus

咱们通常在应用程序中产生日志,日志往往代表的是一个利用或申请生命周期中的一个事件,它是离散的数据。而指标往往代表着应用程序中可量化可聚合剖析的数据,例如服务接管的申请量,申请量是一个一直减少的数据,咱们能够依据它和工夫的对应关系,计算出申请的增长率;再比方,服务的申请提早,咱们能够收集所有的提早时长,统计出不同的分位数,以掂量服务的整体提早体现;再比方音讯队列零碎的工作沉积状况、服务的内存占用、主机的 CPU 占用率等,这些是一个个高低浮动的数值,能够反馈一些实时情况,并且通过历史工夫的数据,反馈过来一段时间的数据稳定状况,以预测将来变动。

通过 Prometheus 咱们就能够进行这些指标数据的统计、收集、查问 / 聚合剖析、可视化展现、非正常指标的报警等工作。能够把 Prometheus 了解为一个指标收集器与时序数据库 (TSDB) 的汇合。

Prometheus 架构

Prometheus 采纳 PULL 的模式定期从应用程序中拉取指标数据。应用程序指标地址能够以动态配置的形式提供,也能够配置服务注册核心,动静的形式获取指标地址,见 文档。

组件

  • Exporter 采集指标数据,为 Prometheus server 提供采集接口。Exporter 能够集成在业务代码中,也能够是一个独自的过程服务,来采集其余的服务指标。
  • Pushgateway 是一个两头服务,短生命周期的 job 上传指标到 Pushgateway,server 从 Pushgateway 采集指标。
  • TSDB 是 Prometheus server 内置的时序数据库,用来存储采集的指标数据,并且内置了一套用以查问数据的语法 PromQL。
  • Alertmanager 是独立于 Prometheus server 的一个服务,用来解决报警。Prometheus server 只负责评估报警规定是否被触发,后续的报警告诉等工作交由 Alertmanager 解决。

部署

本地应用 Docker Compose 进行部署。

version: "3"  
  
volumes:  
    prometheus_config:  
    prometheus_data:  
    alertmanager_config:  
    grafana_config:  
    grafana_data:  
  
services:  
    prometheus:  
        image: prom/prometheus:v2.20.1  
        container_name: prometheus  
        hostname: prometheus-host  
        ports:  
            - 9090:9090  
        command:  
            - --config.file=/etc/prometheus/prometheus.yml # 指定配置文件  
            - --web.enable-lifecycle # 运行通过 HTTP 接口从新加载配置 (POST localhost:9090/-/reload)  
        volumes:  
            - prometheus_config:/etc/prometheus # 配置  
            - prometheus_data:/prometheus # TSDB、WAL 等数据  
        depends_on:  
            - alertmanager  
  
    alertmanager:  
        image: prom/alertmanager:v0.21.0  
        container_name: alertmanager  
        hostname: alertmanager-host  
        ports:  
            - 9093:9093  
        volumes:  
            - alertmanager_config:/etc/alertmanager # 配置  
  
    # user: admin, psw: admin 
    grafana:  
        image: grafana/grafana:7.1.5  
        container_name: grafana  
        hostname: grafana-host  
        ports:  
            - 3000:3000  
        depends_on:  
            - prometheus  
        volumes:  
            - grafana_config:/etc/grafana # 配置  
            - grafana_data:/var/lib/grafana # DB、Plugins 等数据

样本、工夫序列和指标类型

      ^
      │   . . . . . . . . . . . . . . . . . . .   
      │   . . . . . . . . . . . . . . . . . . .   
      │   . . . . . . . . . . . . . . . . . . .
      │   . . . . . . . . . . . . . . . . . . .  
      v
        <------------------ 工夫 ---------------->

样本

Prometheus TSDB 存储的根本单位是 样本,能够了解为下面坐标中的一个点,横轴代表样本工夫,数轴代表样本值。而样本自身又由一系列标签惟一标识,故样本由以下三局部组成:

  • 指标:蕴含指标名 (指标名称其实也是一个标签) 和形容以后样本特色的标签集 (labelsets)。
  • 工夫戳:一个准确到毫秒的工夫戳。
  • 样本值:一个 float64 的浮点型数据表示以后样本的值。

工夫序列

同一指标(指标名和标签集都雷同的所有样本)在下面坐标中所形成的一条间断的线,成为一条工夫序列。它代表了一个指标在工夫范畴内的数值稳定。

指标类型

为了辨别不同类型的指标,Prometheus 形象出四种类型的指标。

  • Counter 代表一个只增不减的计数器指标,例如,服务接管的申请总量。
  • Gauge 代表一个可增可减的计量器指标,例如,服务内存占用。

上述两种指标都是间断的指标,基于原来的数值进行增减,而上面两种指标属于统计类指标。

  • Histogram 意为直方图,它定义了不同的数值范畴(桶),而后将收集到的数据纳入桶内进行计数统计,可能失去不同数值范畴之间的比例。
  • Summary 定义了不同的分位点,而后将收集到的数据进行大小排序,最终失去不同分位点对应的数值 (分位数)。

Prometheus server 同时也蕴含一个 metrics 接口,供本身进行指标采集。在部署之后能够通过 http://your-prometheus-host:9090/metrics 查看到不同指标类型的样本。

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 2.86e-05
go_gc_duration_seconds{quantile="0.25"} 0.0001114
go_gc_duration_seconds{quantile="0.5"} 0.0001812
go_gc_duration_seconds{quantile="0.75"} 0.0003278
go_gc_duration_seconds{quantile="1"} 0.0038698
go_gc_duration_seconds_sum 0.0531145
go_gc_duration_seconds_count 210

下面这部分是 Go 垃圾回收进展工夫的 summary 类型样本,从数据中能够失去如下信息:

  • 总共进行了 210 次垃圾回收。
  • 垃圾回收总耗时 0.0531145。
  • 有一半次数的回收耗时是低于 0.0001812 的。

各种指标类型和样本含意不一一阐明了,能够细读 文档。

PromQL

PromQL 是 Prometheus 的查询语言,能够通过 PromQL 查问单条或多条工夫序列,也能够通过 PromQL 内置函数和操作符查问聚合后的数据。

可在 http://your-prometheus-host:9090/new/graph 中输出 PromQL 进行查问。

用法这里不再赘述,请参考 文档。

业务中集成 Exporter

咱们模仿一个工作队列零碎,应用 Go 来编写,用 Channel 来保留工作,利用生产者 - 消费者模型来进行工作的生产和生产。在生产者每次向队列 Push 工作时,收集队列的沉积的工作数,这是一个 Gauge 类型指标;在消费者解决工作时,统计实现的工作数,这是一个 Counter 指标,同时收集工作的实现工夫以统计工作耗时的 Histogram 和 Summary。而后再裸露一个 HTTP 接口提供最新的指标样本数据。

代码在:https://github.com/xvrzhao/examples/tree/master/prometheus

假若该程序是跑在宿主机的,然而咱们 Prometheus server 是跑在容器里的,server 要申请宿主机的端口,能够通过主机名 host.docker.internal 与宿主机通信。

能够批改容器里的配置文件 /etc/prometheus/prometheus.yml,减少如下配置:

scrape_configs: 
    - job_name: 'task_queue' 
      static_configs: 
        - targets: ['host.docker.internal:9000']

报警

报警须要 Prometheus server 和 Alertmanager 配合实现,Prometheus server 只负责评估报警规定条件,如果符合条件则将报警发送给 Alertmanager。

Prometheus server 每次评估时,处于 firing 状态的警报都会发送给 Alertmanager,只管同一条警报曾经发送过一次。所以在 Alertmanager 要做好警报的分组、提早合并、克制和静默。对于这些内容,这篇文章解说 得十分好,这里不再赘述。

参考链接

  • Prometheus 官网文档
  • Prometheus 中文手册
  • 从零搭建 Prometheus 监控报警零碎
  • Prometheus 的 Summary 和 Histogram 指标的简略了解
  • Prometheus 一条告警是怎么触发的
退出移动版