grafana 监控搭建
需要搭建业务监控,趁机学习一下 grafana 相关的知识。 本文基于实际应用,辅以简单理论。 参考资料: https://prometheus.wang/ https://www.au92.com/post/mac-install-prometheus-and-grafana/
Prometheus
云原生监控系统
优势
- 易于管理:核心只有一个二进制文件,无第三方依赖,只需要本地磁盘
- 客户端渗透到服务内部:Prometheus鼓励用户监控服务的内部状态,通过丰富的client库。
- 强大的数据模型
- 强大的查询语言PromQL
- 高效:百万监控指标,每秒处理十万数据点
- 可扩展
- 易于集成
- 可视化
- 开放性
安装
brew install prometheus
配置 & 启动
# prometheus.yml
global:
scrape_interval: 5s
scrape_timeout: 3s
scrape_configs:
- job_name: "prometheus"
scrape_interval: 3s
static_configs:
- targets: ["localhost:9090"]
labels:
instance: prometheus
- job_name: "local_server"
static_configs:
- targets: ["localhost:8080"]
labels:
instance: local_server
prometheus --config.file=prometheus.yml
在 localhost:9090
就能看到
随便找个指标看看效果
Metric 类型
Counter 计数器
- 特点:只增不减
- 场景:http_requests_total(接口请求数)
客户端方法:
- inc(): 将计数器加 1
- inc(double v): 计数器增加指定的值。必须检查 v>=0
实战举例:
- 通过 rate() 函数获取 http 请求增长率:
rate(http_requests_total[5m])
- 查询当前系统中,访问量前10的HTTP地址:
topk(10, http_requests_total)
- 监控接口QPS:
sum(rate(http_requests_total{path="/server"}))
Gauge 仪表盘
- 特点:可增可减,侧重于反应系统当前状态
- 场景:node_memory_MemFree(主机当前空闲的内容大小)、node_memory_MemAvailable(可用内存大小)
客户端方法:
- inc(): 将值增加 1
- inc(double v): 增加指定的值
- dec(): 将值减少 1
- dec(double v): 减少指定的值
- set(double v): 设置为指定的值
实战举例:
- 通过PromQL内置函数delta()可以获取样本在一段时间返回内的变化情况。例如,计算CPU温度在两个小时内的差异:
delta(cpu_temp_celsius{host="zeus"}[2h])
- 预测系统磁盘空间在4个小时之后的剩余情况:
predict_linear(node_filesystem_free{job="node"}[1h], 4 * 3600)
Histogram 直方图
- 特点:记录一系列值的分布情况的度量类型,通常用于跟踪事件持续时间和请求大小,适用于需要对数据分布有详细了解的场景。
客户端方法:
- observe(double v): 观察给定的数量。
指标
- _bucket: 表示某个时间范围内的请求数量。
http_request_duration_seconds_bucket{le="0.1"}
,表示记录响应时间小于等于 0.1 秒的请求数量。 - _count: 记录样本的总数
- _sum: 记录样本值的总和
- _gauge: 略
实战举例:
- 计算分位数:
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))
- 监控响应时间分布,这个适合用heatmap看:
sum(rate(http_request_duration_seconds_bucket{le="0.1"}[5m])) by (le)
Summary 摘要
- 特点:记录一系列值的分布情况的度量类型,侧重于计算分位数(中位数等)
客户端方法:
- observe(double v): 观察给定的数量。
指标
- _count: 记录样本的总数
- _sum: 记录样本值的总和
PromQL
PromQL是Prometheus自定义的一套强大的数据查询语言。
运算符
数学:
+
(加法)-
(减法)*
(乘法)/
(除法)%
(求余)^
(幂运算)
布尔
==
(相等)!=
(不相等)>
(大于)<
(小于)>=
(大于等于)<=
(小于等于)
集合
and
(并且)or
(或者)unless
(排除)
优先级
^
*, /, %
+, -
==, !=, <=, <, >=, >
and, unless
or
匹配模式
一对一
如:http_errors / http_request
如果两个指标的 labels 不一致,需要使用 on(labels)
或者 ignoring(labels)
来修改 labels 匹配行为。on 为限定,ignoring 为忽略。
多对一或一对多
必须用 group_left 或者 group_right 确定哪边是“多”。
多对一和一对多两种模式一定是出现在操作符两侧表达式返回的向量标签不一致的情况。因此需要使用ignoring和on修饰符来排除或者限定匹配的标签列表。
聚合函数
sum
(求和)min
(最小值)max
(最大值)avg
(平均值)stddev
(标准差)stdvar
(标准差异)count
(计数)count_values
(对value进行计数)bottomk
(后n条时序)topk
(前n条时序)quantile
(分布统计)without
(从结果移除对应labels)by
(只保留对应labels)
内置函数
Counter 指标
increase
: 获取区间向量中第一个最后一个样本,并返回其增长量。rate
: 计算区间向量在时间窗口内的增长速率。irate
: 通过区间向量中最后两个样本数据来计算区间向量的增长速度。可以避免increase
和irate
存在的“长尾问题”
Gauge 指标
predict_linear
: 基于线性预测一定时间后的值。
Histogram & Summary 指标
histogram_quantile
: 计算分位数。
Grafana
监控平台
(事后才发现,本地调试根本没必要安装 Grafana,一是量不够,画的图不能看,二是 Prometheus 本身就有简单的展示功能)
安装
brew install Grafana
启动
brew services start grafana
配置监控
量太少了,监控不够看,先忽略吧