1 基本原理
Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件target的状态,任意组件只要提供相应的HTTP接口就可以接入监控。不需任何SDK或者其他的集成过程。
输出监控信息的HTTP接口叫exporter,目前开源组件大都有exporter可以直接使用,比如Haproxy、Nginx、MySQL、redis、rabbitmq、Linux系统信息(包括磁盘、内存、CPU、网络等)。
Architecture
Server 主要负责数据采集和存储,提供PromQL查询语言的支持。
Alertmanager 警告管理器,用来进行报警。支持Prometheus的查询语句,提供灵活的报警方式(待完善)。
Push Gateway 支持临时性Job主动推送指标的中间网关。
Prometheus Federation联邦机制:一般分为Cross-service federation与Hierarchical federation。
Cross-service federation
Hierarchical federation
prometheus.yml
scrape_configs:
- job_name: 'federate'
scrape_interval: 15s
honor_labels: true #避免监控指标冲突
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
- '{job=~"prometheus.*"}'
- '{job="docker"}'
- '{job="node"}'
static_configs:
- targets:
- 'source-prometheus-1:9090'
- 'source-prometheus-2:9090'
grafana UI:http://127.0.0.1:3000
prometheus UI:http://127.0.0.1:9090
pushgateway UI:http://127.0.0.1:9091
2 特点
- 多维度时序数据模型,名称metric+key/value。
- PromQL灵活的查询语言。
- 不依赖分布式存储,单服务器节点是自主的。
- 基于HTTP的pull方式采集时序数据。
- 可以通过中间网关进行时序列数据推送。
- 通过服务发现或者静态配置来发现target目标服务对象。
- 支持多种图表和界面展示,比如Grafana等。
3 Metric类型:
- Counter: 累加metric,如请求的个数,错误数等
- Gauge: 常规metric,可任意加减。其为瞬时的,与时间没有关系,可以任意变化。
- Histogram: 柱状图,用于观察结果采样,分组及统计,如:请求持续时间,响应大小。
- Summary: 类似Histogram,用于表示一段时间内数据采样结果,其直接存储quantile数据,而不是根据统计区间计算出来的。不需要计算,直接存储结果。
4 PromQL (Prometheus Query Language)
Prometheus 自己开发的数据查询 DSL 语言。
查询结果类型:
- 瞬时数据 (Instant vector): 包含一组时序,每个时序只有一个点,例如:http_requests_total
- 区间数据 (Range vector): 包含一组时序,每个时序有多个点,例如:http_requests_total[5m]
- 纯量数据 (Scalar): 纯量只有一个数字,没有时序,例如:count(http_requests_total)
标签查询:logback_events_total{level=~"in.*"}
QPS计算:rate(http_requests_total[5m])
或irate(http_requests_total[5m])
,后者适用变化率大场景。
其他函数:count
,sum
,svg
等
5 配置
启动时,可以加载运行参数-config.file指定配置文件, 默认为程序根目录下prometheus.yml。
全局配置global主要有四个属性:
scrape_interval: 拉取 targets 的默认时间间隔。
scrape_timeout: 拉取一个 target 的超时时间。
evaluation_interval: 执行 rules 的时间间隔。
external_labels: 额外的属性,会添加到拉取的数据并存到数据库中。
prometheus.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).
# metrics collect
remote_write:
- url: "http://10.0.0.153:9201/write"
# 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"
- "myrule.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']
# 动态加载模式,新增target无需重启服务
- job_name: 'linux'
file_sd_configs:
# - refresh_interval: 1m
- files:
- ./conf/node-linux-*.json
- job_name: 'windows'
static_configs:
- targets: ['10.0.0..89:9182']
- targets: ['10.0.0.95:9182']
- job_name: 'mysql'
scrape_interval: 1m
file_sd_configs:
- files:
- ./conf-mysql/*.json
myrule.yml
groups:
- name: zt_custom
rules:
- record: mysql_csc_slowquery_irate_2m
expr: irate(mysql_csc_slowquery [2m])
./conf/node-linux-finance.json
[
{
"targets": ["10.0.0.80:9100"],
"labels":{
"env":"pro",
"region":"dbjf",
"instance":"finance-80"
}
},
{
"targets": ["10.0.0.90:9100"],
"labels":{
"env":"pro",
"region":"dbjf",
"instance":"finance-90"
}
}
]
6 exporter
详见https://prometheus.io/docs/instrumenting/exporters/#exporters-and-integrations
linux系统、mysql、redis等等都有相应的exporter,按照说明运行代理即可。
网友评论