从零开始学习Prometheus监控报警系统

Prometheus简介

Prometheus是一个开源的监控报警系统,它最初由SoundCloud开发。

2016年,Prometheus被纳入了由谷歌发起的Linux基金会旗下的云原生基金会( Cloud Native Computing Foundation),并成为仅次于Kubernetes的第二大开源项目。自此,它成为了一个独立的开源项目,独立于任何公司进行维护。

Prometheus拥有非常活跃的开发人员和用户社区,目前在GitHub上已拥有三万多的Star。

Prometheus特点

  • 提供多维度数据模型,使用指标名称和键值对标识的时间序列数据
  • 提供灵活的PromQL查询方式,还提供了HTTP查询接口,可以很方便地结合Grafana等组件展示数据。
  • 不依赖外部存储,支持单节点的本地存储。通过Prometheus自带的时序数据库,可以完成每秒百万及的数据存储,如果需要存储大量历史数据,还可以对接第三方的时序数据库。
  • 时间序列收集通过HTTP的拉取方式进行,并提供了开放的指标数据标准。
  • 支持向中间网关推送时序数据,可以更加灵活地适用于多种监控场景。
  • 支持通过动态服务发现和静态文件配置获取监控对象,目前已支持Kubernetes、Etcd、Consul等多种服务发现机制。
  • 支持多种模式的图形展示和仪表盘。
  • 大多数Prometheus的组件都是使用Go语言编写的,这使得它们很容易以二进制文件的形式构建和部署。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

Prometheus架构

Prometheus生态圈由多个组件构成,其中许多组件是可选的:

  • Prometheus Server:用于收集、存储和查询时间序列数据。通过静态配置文件管理监控目标,也可以配合使用动态服务发现的方式动态管理监控目标,并从这些监控目标中获取数据。它将采集到的数据按照时间序列的方式存储在本地磁盘当中或者外部的时序数据库中,可通过PromQL语言对数据的查询以及分析。
  • Client Library:为被监控的应用生成相应的指标(Metric)数据并暴露给Prometheus Server。当Prometheus Server 来拉取时,直接返回实时状态的指标数据。
  • Push Gateway:主要用于短期存在的Jobs。由于这类Jobs存在时间较短,可能在Prometheus Server来拉取数据之前就消失了。所以,Jobs可以直接向Push Gateway推送它们的指标数据,然后Prometheus Server再从Push Gateway拉取。
  • Exporters:用于暴露已有的第三方服务的指标数据通过HTTP服务的形式暴露给Prometheus Server,比如HAProxy、StatsD、Graphite等等。Prometheus Server通过访问该Exporter提供的Endpoint,即可获取到需要采集的监控数据。
  • Alertmanager:从Prometheus Server接收到告警后,会进行去除重复数据,分组,并路由到对收的接受方式,发出报警。Alertmanager的告警方式非常灵活,支持通过邮件、slack或钉钉等多种途径发出告警。
  • 一些其他的组件。

下面这张图展示了Prometheus的架构和各个组件是如何交互和协作的:

从零开始学习Prometheus监控报警系统

其大概的工作流程是:

  1. Prometheus Server直接从HTTP接口或者Push Gateway拉取指标(Metric)数据。
  2. Prometheus Server在本地存储所有采集的指标(Metric)数据,并在这些数据上运行规则,从现有数据中聚合和记录新的时间序列,或者生成告警。
  3. Alertmanager根据配置文件,对接收到的告警进行处理,发出报警。
  4. 在Grafana或其他API客户端中,可视化收集的数据。

Prometheus数据模型

Prometheus会将所有采集到的监控数据以时间序列的方式保存在内存数据库中,并且定时保存到硬盘上。每一条数据由以下三部分组成:

  • 指标(Metric):由指标名称和描述当前数据特征的标签组成。
  • 时间戳(Timestamp):一个精确到毫秒的时间戳。
  • 数据值(Value):一个float64的浮点型数据表示当前数据的值。

其中,指标(Metric)通过如下格式标识:

<指标名称>{<标签名称>=<标签值>, ...}

指标名称(Metric Name)可以反映被监控数据的含义。指标名称只能由ASCII字符、数字、下划线以及冒号组成并必须符合正则表达式[a-zA-Z_:][a-zA-Z0-9_:]*
标签(Label)反映了当前数据的特征维度,通过这些维度Prometheus可以对数据进行过滤,聚合等操作。标签的名称只能由ASCII字符、数字以及下划线组成并满足正则表达式[a-zA-Z_][a-zA-Z0-9_]*

比如:

prometheus_http_requests_total{code="200",handler="/metrics"}

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

指标类型

Prometheus定义了4种不同的指标类型(Metric Type):

  • Counter(计数器)
  • Gauge(仪表盘)
  • Histogram(直方图)
  • Summary(摘要)

Counter(计数器)

Counter类型和计数器一样,只增不减(除非系统发生重置),一般在定义Counter类型指标的名称时推荐使用_total作为后缀。

比如,Prometheus Server中prometheus_http_requests_total, 表示Prometheus处理的HTTP请求总数:

# HELP prometheus_http_requests_total Counter of HTTP requests.
# TYPE prometheus_http_requests_total counter
prometheus_http_requests_total{code="200",handler="/api/v1/label/:name/values"} 3
prometheus_http_requests_total{code="200",handler="/api/v1/query"} 5
prometheus_http_requests_total{code="200",handler="/api/v1/query_range"} 15
prometheus_http_requests_total{code="200",handler="/graph"} 3
prometheus_http_requests_total{code="200",handler="/metrics"} 23
prometheus_http_requests_total{code="200",handler="/static/*filepath"} 18
prometheus_http_requests_total{code="302",handler="/"} 1

Gauge(仪表盘)

Gauge类型侧重于反应系统的某一个瞬时的值,这类指标的数据可增可减。

比如,Prometheus Server中go_threads, 表示Prometheus当前go线程的数量:

# HELP go_threads Number of OS threads created.
# TYPE go_threads gauge
go_threads 13

Histogram(直方图)

Histogram类型由_bucket{le=""},_bucket{le="+Inf"}, _sum,_count 组成,主要用于表示一段时间范围内对数据进行采样,并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图。

比如,Prometheus Server中prometheus_http_response_size_bytes:

# HELP prometheus_http_response_size_bytes Histogram of response size for HTTP requests.
# TYPE prometheus_http_response_size_bytes histogram
prometheus_http_response_size_bytes_bucket{handler="/",le="100"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="10000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="100000"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+06"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+07"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+08"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="1e+09"} 1
prometheus_http_response_size_bytes_bucket{handler="/",le="+Inf"} 1
prometheus_http_response_size_bytes_sum{handler="/"} 29
prometheus_http_response_size_bytes_count{handler="/"} 1

Summary(摘要)

Summary类型由 {quantile="<φ>"},_sum,_count 组成,主要用于表示一段时间内数据采样结果,它直接存储了分位数据,而不是根据统计区间计算出来的。

比如,Prometheus Server中prometheus_target_interval_length_seconds:

# HELP prometheus_target_interval_length_seconds Actual intervals between scrapes.
# TYPE prometheus_target_interval_length_seconds summary
prometheus_target_interval_length_seconds{interval="15s",quantile="0.01"} 14.9986249
prometheus_target_interval_length_seconds{interval="15s",quantile="0.05"} 14.998999
prometheus_target_interval_length_seconds{interval="15s",quantile="0.5"} 15.0000428
prometheus_target_interval_length_seconds{interval="15s",quantile="0.9"} 15.0012009
prometheus_target_interval_length_seconds{interval="15s",quantile="0.99"} 15.0016468
prometheus_target_interval_length_seconds_sum{interval="15s"} 315.0013755
prometheus_target_interval_length_seconds_count{interval="15s"} 21

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

安装Prometheus Server

从官方网站(https://prometheus.io/download/)上找到最新版本的Prometheus Sevrer软件包,如下图:
从零开始学习Prometheus监控报警系统根据自己的系统下载对应的压缩包,这里以Windows为例,下载prometheus-2.19.0.windows-amd64.tar.gz。

解压后当前目录会包含默认的Prometheus配置文件promethes.yml:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']

暂且不做修改,双击prometheus.exe即可启动,如下图:

从零开始学习Prometheus监控报警系统访问http://localhost:9090/graph,就可以看到Prometheus自身的监控数据:

从零开始学习Prometheus监控报警系统

尾声

Prometheus的大致介绍已经告一段落了,但是只是万里长征的第一步,Prometheus的更多强大功能和使用方法还等待我们去挖掘。

微信公众号:万猫学社

微信扫描二维码

获得更多Java技术干货

从零开始学习Prometheus监控报警系统
上一篇:Kafka核心技术与实战——19 | CommitFailedException异常怎么处理?


下一篇:《Flutter 动画系列》组合动画