Go-Zero-Prometheus

597 阅读5分钟

什么是Prometheus

Prometheus是一款最受欢迎的开源监控系统之一,它由SoundCloud开发,目的是收集各种应用程序的度量数据并将其存储在时间序列数据库中,从而可以进行数据可视化和警报

Prometheus的设计

1.1 数据模型

Prometheus数据模型的关键组件是时间序列。时间序列是一个由指标名称和一组键值对标识的样本流,每个样本都包含一个时间戳和一个值。例如,一个HTTP请求计数指标可能是以http_requests_total为名称,以HTTP方法(GET,POST,等)和HTTP状态码作为标签的键值对的组合来标识。对于每个组合,Prometheus都可以收集样本数据并存储在时间序列数据库中。

1.2 收集度量

Prometheus通过不同的机制来收集指标数据。一个基本的方法是通过客户端库来公开应用程序的度量接口。这些库包括API接口,用于离线批处理和其他用途的exporter,以及其他与监视相关的库。在客户端库中,度量数据被公开为Prometheus的格式,可以提供与时间序列相同的标识符和样本数据。

1.3 存储数据

Prometheus使用一种自定义的时间序列数据存储格式,称为TSDB(时间序列数据库)。TSDB存储格式包括一些有用的特性,例如可压缩的编码格式,支持多值查询和原子增量并发修改。它还包括对内存和磁盘的动态分配,以提高性能,并允许实施长期数据保留策略

Prometheus的存储

Prometheus存储数据的方式是以一定间隔时间(称之为采样间隔)拉取所监控的系统或服务的数据(metrics),并将这些数据存储到磁盘上。这个过程称之为scraping。Prometheus默认的采样间隔是15秒,此间隔可以根据实际需要进行调整。

在存储数据时,Prometheus会将数据进行压缩,以节省磁盘空间。压缩后的数据被存储在本地磁盘上,称之为Chunk。Chunk的大小通常为两个小时到一天不等,这取决于时间序列的数量以及采样间隔的设置。

除了数据的压缩存储,Prometheus还使用了一种称为WAL(Write Ahead Log)的技术,在数据被压缩前将它们写入WAL文件中。这种技术可以保证数据的可靠性,即便在Prometheus崩溃或终止运行时也可以进行数据恢复

Promethues 的 核心组件

Prometheus的架构由四个核心组件组成:Server,Pushgateway,Alertmanager和Client Libraries。

  1. Server(服务端)
    Prometheus Server 是整个架构的核心组件,负责拉取监控数据,存储数据、查询数据以及聚合数据。Prometheus 会定期抓取 Exporter 提供的 metrics,并将它们保存到本地的 Time-Series 数据库中。用户可以通过 PromQL(Prometheus Query Language)语言,基于存储在本地的 Time-Series 数据做聚合查询,生成 Dashboard、报表等视图。

  2. Pushgateway
    Pushgateway 是数据的主动推送组件,它允许非直接的采集客户端(就是 Exporter)将 metrics 主动推送到 Pushgateway 中,然后 Prometheus Server 再通过对 Pushgateway 的访问,定期拉取 metric 信息。这个组件主要是用于那些不能使用 Exporter 方式直接暴露监控指标的场景,例如批处理作业或者定时任务,或者为了实时监控一些计算导致的指标。

  3. Alertmanager
    Alertmanager 负责管理 Prometheus Service 产生的告警,并将告警消息发送给相关的接收者。当 Prometheus 在进行查询时,如果检测到某些 metrics 已经触发的告警条件,就会将告警信息发送到 Alertmanager。同时,Alertmanager 也支持聚合多个告警信息到一个通知中,当然,告警广播支持多个接收者,包括电子邮件、PagerDuty、Webhook 和 Slack 等平台。

  4. Client Libraries
    Prometheus Client Libraries 是一组用于采集监控数据的库,支持多种编程语言,包括 Go, Java, Python, Ruby 等等。这些客户端库封装了采集指标的操作,使得代码编写更加简单易用,提高了采集指标的准确率,同时保证了服务端和 Exporter 任意时刻可插拔性

图源自Go-zero社区

监控指标类型

Prometheus的监控指标类型包括:

  1. Counter:计数器,用于累计数量,只能增长不能为负数。

  2. Gauge:仪表,用于衡量任何可以增减的数字,比如CPU利用率、内存使用率等。

  3. Histogram:直方图,用于衡量观测值的分布情况,比如服务请求响应时间的分布情况等。

  4. Summary:摘要,与直方图类似,用于衡量观测值的分布情况,但涵盖了更多的统计信息,如均值、标准差等。

Counter适用于记录累计请求数等计数需求;Gauge适用于记录系统负载等度量数据;Histogram和Summary适用于对服务性能进行度量和分析。

Go-zero 关于 Prometheus 的使用

go-zero 框架中集成了基于prometheus的服务指标监控,默认不开启prometheus监控

开启 prometheus

/etc/{your-service}.yaml 中增加 Prometheus 的配置,指标的路径默认为/metrics

Prometheus:
  Host: 127.0.0.1
  Port: 9091
  Path: /metrics

参考

go-zero.dev/cn/docs/dep…

github.com/zeromicro/g…