监控系统-prometheus

本文最后更新于:9 个月前

1. Prometheus介绍

Prometheus是一个开源的系统监控和警报工具包。自2012年启动以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立于任何公司进行维护。Prometheus于2016年加入云原生计算基金会,成为继Kubernetes之后的第二个托管项目。

2. Prometheus 特点

Prometheus是一个开源的完整的监控解决方案,基于的是中央化的规则计算、统一分析和告警的新模型。相对于传统监控系统,Prometheus有以下优点。

2.1 主要功能

  • 多维 数据模型(时序由 metric 名字和 k/v 的 labels 构成)。
  • 灵活的查询语句(PromQL)。
  • 无依赖存储,支持 local 和 remote 不同模型。
  • 采用 http 协议,使用 pull 模式,拉取数据,简单易懂。
  • 监控目标,可以采用服务发现或静态配置的方式。
  • 支持多种统计数据模型,图形化友好。
  • 复杂环境,支持手动push模式,通过pushgateway组件收集,server拉取pushgateway

2.2 主要组件

  • Prometheus Server:主服务器,负责收集和存储时间序列数据

  • Client libraries:应用程序代码插桩,将监控指标嵌入到被监控应用程序中

  • Pushgateway:推送网关,为支持short-lived作业提供一个推送网关

  • Exporter:专门为一些应用开发的数据摄取组件-exporter,例如:HAProxy、StatsD、Graphite等等 exporter

  • Altermanager:专门用于处理alert的组件 altermanager

2.3 原理图

从这个架构图,也可以看出 Prometheus 的主要模块包含, Server, Exporters, Pushgateway, PromQL, Alertmanager, WebUI 等

image-20220408170507337

它大致使用逻辑是这样:

  1. Prometheus server 定期从静态配置的 targets 或者服务发现的 targets 拉取数据。 (pull 模式 + pushgateway)
  2. 当新拉取的数据大于配置内存缓存区的时候,Prometheus 会将数据持久化到磁盘(如果使用 remote storage 将持久化到云端)。
  3. Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert 推送到配置的 Alertmanager。
  4. Alertmanager 收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
  5. 可以使用 API, Prometheus Console 或者 Grafana 查询和聚合数据。

注意事项

  • Prometheus 的数据是基于时序的 float64 的值,如果你的数据值有更多类型,无法满足。
  • Prometheus 不适合做审计计费,因为它的数据是按一定时间采集的,关注的更多是系统的运行瞬时状态以及趋势,即使有少量数据没有采集也能容忍,但是审计计费需要记录每个请求,并且数据长期存储,这个 Prometheus 无法满足,可能需要采用专门的审计系统。

静态配置和动态配置

静态配置

Prometheus通过static_configs来设定静态方式的监控对象,比如如下Node Exporter的监控数据抓取的配置,其特点是Node Exporter提供的监控数据的/metrics的HTTP服务的IP和端口号都是固定的,在这种情况下可以使用静态配置

1
2
3
4
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['192.168.31.242:9100']

动态配置-服务自发现

动态配置是相较于静态配置的说法,在Prometheus中则是结合服务发现来实现的,将服务发现的这个功能和机制分离出去,直接利用现有的服务发现的功能框架比如consul来确认可能会动态变化的监控对象,这样就做到了所谓的动态配置。

image-20220411100501507

常见的动态配置的使用方式如上图所示:

  1. 各种服务直接在SD(服务发现能力提供者:比如consule)上进行服务注册
  2. Prometheus不直接管理哪些对象需要监控,它直接向SD去获取需要监控的对象的列表
  3. SD会返回给Prometheus需要监控的对象列表
  4. Prometheus根据返回的监控对象列表使用Pull的方式进行监控数据的收集

基于consul服务发现

Consul提供了服务发现和注册的功能,而Prometheus也支持通过Consul的方式来进行动态配置

1
2
3
4
consul_sd_configs:
- server: Consul服务的IP:Consul服务的端口号
services:
- node_exporter

基本etcd+confd

根据服务注册metrics到etcd,confd 拉取etcd的配置,自动生成配置文件到promethoues,然后热加载来提供自动的指标监控。 github

  1. 启动confd

设置 confd 读取的配置和模版的文件夹,并监听 etcd 的变化。

1
confd -confdir ./confd/ -config-file ./confd/conf.d/prometheus.json.toml -backend etcdv3  -watch -node http://127.0.0.1:2379  &
  1. 启动 prometheus

    覆盖 /etc/prometheus/prometheus.yml 的文件, 并在 prometheus 的 bin 下面启动:

    1
    2
    3
    4
    >> mkdir /prometheus
    >> prometheus --web.enable-lifecycle \
    --config.file=/etc/prometheus/prometheus.yml \
    --storage.tsdb.path=/prometheus
  2. Prometheus 配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    global:
    scrape_interval: 15s
    scrape_timeout: 10s
    evaluation_interval: 15s

    scrape_configs:
    - job_name: 'test'
    file_sd_configs:
    - files:
    - /tmp/prometheus/targets/target_*.json

    其他配置

    更多有效配置示例

    1
    2
    3
    4
    5
    6
    #Prometheus数据源的配置主要分为静态配置和动态发现, 常用的为以下几类
    1)static_configs: #静态服务发现
    2)file_sd_configs: #文件服务发现
    3)dns_sd_configs: DNS #服务发现
    4)kubernetes_sd_configs: #Kubernetes 服务发现
    5)consul_sd_configs: Consul #服务发现