Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。
作为新一代的监控框架,Prometheus 具有以下特点:
Prometheus 生态圈中包含了多个组件,其中许多组件是可选的:
下图为 Prometheus 官方文档中的架构图:
从上图可以看出,Prometheus 的主要模块包括:Prometheus server, exporters, Pushgateway, PromQL, Alertmanager 以及图形界面。
其大概的工作流程是:
下面将对 Prometheus 中的数据模型(时间序列),metric 类型,instance 和 jobs等概念进行介绍。
Prometheus 中存储的数据为时间序列,是由 metric 的名字和一系列的标签(键值对)唯一标识的,不同的标签则代表不同的时间序列。
Prometheus客户端库提供了四种核心Metrics类型。
在Prometheus术语中,你可以scrape(刮擦)的端点称为 实例,通常对应于单个进程。一组同种类型的 instances(主要用于保证可扩展性和可靠性),例如:具有四个复制instances(实例)的API服务器job:
当Prometheus scrape(刮擦)目标时,它会自动在scrape的时间序列上附加一些标签,用来识别scrape的目标。
对于每次实例 scrape(刮取,Prometheus都会在以下时间序列中存储样本:
up时间序列对于实例可用性监视非常有用。
你可以在官网 https://prometheus.io/download/ 下载 安装包,解压后使用。为了方便,我使用docker 镜像的方式 运行Prometheus。
docker run --name prometheus -d -p 9090:9090 prom/prometheus
浏览器输入http://localhost:9090 ,访问 Prometheus 的 Web UI:
点击菜单栏 “Status” 下的 Targets ,界面如下:
Prometheus 自身 metrics 处于UP状态 ,说明 安装成功。
Prometheus 的配置文件 prometheus.yml 内容如下:
# 全局设置,可以被覆盖
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
该 global
块控制 Prometheus 的全局配置。我们有两种选择。第一个, scrape_interval
控制Prometheus 刮擦目标的频率。你可以为单个目标覆盖此值。在这种情况下,全局设置是每15秒刮一次。该 evaluation_interval
选项控制普罗米修斯评估规则的频率。Prometheus 使用规则创建新的时间序列并生成警报。
该 rule_files
块指定我们希望 Prometheus 加载的任何规则的位置。现在我们没有规则。
最后一个块 scrape_configs
控制 Prometheus 监视的资源。由于 Prometheus 还将自己的数据公开为HTTP端点,因此它可以抓取并监控自身的健康状况。在默认配置中有一个名为 prometheus 的job,它抓取 prometheus 服务器 公开的时间序列数据。该作业包含一个静态配置的目标,即端口9090上的本地主机。返回的时间序列数据将详细说明Prometheus服务器的状态和性能。
为了演示 Prometheus 的简单使用,这里运行一个 Prometheus HTTP 度量模拟器。模拟一个简单的HTTP微服务,生成Prometheus Metrics,通过 docker 运行。
docker run -p 8080:8080 pierrevincent/prom-http-simulator:0.1
它在/metrics端点下公开以下Prometheus指标:
可以开启流量高峰模式,更改流量高峰模式可以通过以下方式完成:
# ON
curl -X POST http://127.0.0.1:8080/spike/on
# OFF
curl -X POST http://127.0.0.1:8080/spike/off
# RANDOM
curl -X POST http://127.0.0.1:8080/spike/random
错误率默认为1%。它可以更改为0到100之间的数字:
# 例如将错误率设置为50%
curl -H 'Content-Type: application/json' -X PUT -d '{"error_rate": 50}' http://127.0.0.1:8080/error_rate
需要将 HTTP 度量模拟器 的 metrics端点 配置到 Prometheus的配置文件 prometheus.yml 中。
创建一个 prometheus.yml 文件 内容如下:
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_timeout: 5s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'http-simulator'
metrics_path: /metrics
static_configs:
- targets: ['192.168.31.143:8080']
通过 docker up
命令替换 容器中的配置文件:
docker cp prometheus.yml prometheus:/etc/prometheus/
重启容器:
docker restart prometheus
访问 http://localhost:9090/targets ,发现已经出现了 target “http-simulator” ,并且为UP状态。
查询http请求数
http_requests_total{job="http-simulator"}
查询成功login请求数
http_requests_total{job="http-simulator", status="200", endpoint="/login"}
查询成功请求数,以endpoint区分
http_requests_total{job="http-simulator", status="200"}
查询总成功请求数
sum(http_requests_total{job="http-simulator", status="200"})
查询成功请求率,以endpoint区分
rate(http_requests_total{job="http-simulator", status="200"}[5m])
查询总成功请求率
sum(rate(http_requests_total{job="http-simulator", status="200"}[5m]))
查询http-simulator延迟分布
http_request_duration_milliseconds_bucket{job="http-simulator"}
查询成功login延迟分布
http_request_duration_milliseconds_bucket{job="http-simulator", status="200", endpoint="/login"}
不超过200ms延迟的成功login请求占比
sum(http_request_duration_milliseconds_bucket{job="http-simulator", status="200", endpoint="/login", le="200"}) / sum(http_request_duration_milliseconds_count{job="http-simulator", status="200", endpoint="/login"})
成功login请求延迟的99百分位
histogram_quantile(0.99, rate(http_request_duration_milliseconds_bucket{job="http-simulator", status="200", endpoint="/login"}[5m]))
上面给出的这些查询表达式,在 prometheus 的 查询界面上自行测试下 ,这里就不一一测试了,
本篇对 Prometheus 的组成,架构和基本概念进行了介绍,并实例演示了 Prometheus 的查询表达式的应用。本篇是 Prometheus 系列的第一篇, 后续还会有Prometheus与其他图形界面的集成,与 springboot 应用的集成等 。
https://prometheus.io/docs/introduction/overview/ https://www.ibm.com/developerworks/cn/cloud/library/cl-lo-prometheus-getting-started-and-practice/index.html
-- END --