一、prometheus
普罗米修斯 Prometheus
一、监控系统
要同时支持白盒监控和黑盒监控。
通过白盒能够了解其内部的实际运行状态,通过对监控指标的观察能够预判可能出现的问题,从而对潜在的不确定因素进行优化。
而黑盒监控,常见的如HTTP探针,TCP探针等,可以在系统或者服务在发生故障时能够快速通知相关的人员进行处理。
二、优势
易于管理
监控服务的内部运行状态
强大的数据模型
强大的查询语言PromQL
高效
可扩展
易于集成
可视化
开放性
三、构成
node Exporter:用于暴露监控目标的信息
prometheus server:用于收集数据,提供数据查询,是一个时序列数据库
Grafana:(第三方工具)用于创建可视化dashboard(仪表板),配置prometheus作为数据源后就能查看
四、监控目标的方式
在prometheus.yml中对监控目标进行配置,例如:
scrape_configs:
# 监控prometheus服务
-
job_name: ‘prometheus’
static_configs:- targets: [‘localhost:9090’]
监控node exporter服务
-
job_name: ‘node’
static_configs:- targets: [‘localhost:9100’]
四、PromQL
1.样本数据:prometheus server采集到的数据成为样本数据。
prometheus会将样本数据已时间序列的形式保存在内存中,并定时保存到硬盘。
2.时间序列(time_series) = 指标+时间戳+样本值
指标(metric): 指标名称 {标签(指标的特征维度,可用来聚合、过滤等)}
时间戳(timestamp): 精确到毫秒
样本值(value):浮点数
3.指标类型
Counter(计数器): 只增不减的计数器
Gauge(仪表盘): 可增可减,侧重于反应系统的当前状态
Histogram(直方图):主用用于统计和分析样本的分布情况
Summary(摘要):主用用于统计和分析样本的分布情况
4.初识PromQL
定义:通过指标名称(metrics name)以及对应的一组标签(labelset)唯一定义一条时间序列
五、查询
合法的PromQL表达式:必须至少包含一个指标名称(例如http_request_total),或者一个不会匹配到空字符串的标签过滤器(例如{code=”200”})
1.瞬时向量 、 区间向量
instant_vertor : http_request_total{}
range_vector : http_request_total{}[5m]
2.偏移
http_request_total{} offset 1d
http_request_total{}[5m] offset 1d
3.完全匹配、正则匹配
http_request_total{instance=“xxx”,id!=“mmm”}
http_request_total{instance=“xxx|aaa|ccc”,id!“mmm”}
4.标量
标量只有数字,没有时间序列,使用内置函数scalar(),可以将向量转为标量
六、运算符
1.数学运算符
-
-
- / % ^
-
2.布尔运算符 (不加bool修饰符就是筛选,加了就是判断)
< == != >= <=
使用布尔修饰符(bool)可以改变返回值
http_request_total{} > bool 1000 (返回1、0)
标量的布尔运算必须要用布尔修饰符
2 == bool 1
3.集合运算符
and or unless
4.优先级
数学 > 布尔 > 集合
5.匹配模式
一对一:
忽略某标签 method_code:http_errors:rate5m{code=“500”} / ignoring(code) method:http_requests:rate5m
指定某标签 xxx > on(标签名) yyy
一对多、多对一:
method:http_requests:rate5m / ignoring(code) group_right method_code:http_errors:rate5m
method_code:http_errors:rate5m / ignoring(code) group_left method:http_requests:rate5m
七、聚合函数
([parameter,] ) [without|by (
5.stddev (标准差)
6.stdvar (标准差异)
7.count (计数)
count(http_requests_total)
8.count_values (对value进行计数)
count_values(“count”, http_requests_total)
对所有的http_requests_total进行统计,每个唯一的样本值都会输出一个时间序列,且多一个“count”标签,用来计数
9.bottomk (后n条时序)
bottomk(5, http_requests_total)
10.topk (前n条时序)
topk(5, http_requests_total)
11.quantile (分布统计)
quantile(0.5, http_requests_total) 参数值在(0,1)之间,为0.5就是二分位数,也就是中位数
分位数:对一个随机变量,将其概率分布范围分成几等份
八、内置函数
计算Counter指标增长率
预测Gauge指标变化趋势
统计Histogram指标的分位数
动态标签替换
其他内置函数
九、最佳实践:4个黄金指标和USE方法
1.延迟:服务请求所需时间。
记录用户所有请求所需的时间,重点是要区分成功请求的延迟时间和失败请求的延迟时间。 例如在数据库或者其他关键祸端服务异常触发HTTP 500的情况下,用户也可能会很快得到请求失败的响应内容,如果不加区分计算这些请求的延迟,可能导致计算结果与实际结果产生巨大的差异。除此以外,在微服务中通常提倡“快速失败”,开发人员需要特别注意这些延迟较大的错误,因为这些缓慢的错误会明显影响系统的性能,因此追踪这些错误的延迟也是非常重要的。
2.通讯量:监控当前系统的流量,用于衡量服务的容量需求。
流量对于不同类型的系统而言可能代表不同的含义。例如,在HTTP REST API中, 流量通常是每秒HTTP请求数;
3.错误:监控当前系统所有发生的错误请求,衡量当前系统错误发生的速率。
对于失败而言有些是显式的(比如, HTTP 500错误),而有些是隐式(比如,HTTP响应200,单实际业务流程依然是失败的)。
对于一些显式的错误如HTTP 500可以通过在负载均衡器(如Nginx)上进行捕获,而对于一些系统内部的异常,则可能需要直接从服务中添加钩子统计并进行获取。
4.饱和度:衡量当前服务的饱和度。
主要强调最能影响服务状态的受限制的资源。 例如,如果系统主要受内存影响,那就主要关注系统的内存状态,如果系统主要受限与磁盘I/O,那就主要观测磁盘I/O的状态。因为通常情况下,当这些资源达到饱和后,服务的性能会明显下降。同时还可以利用饱和度对系统做出预测,比如,“磁盘是否可能在4个小时候就满了”。
二、告警
一、基础
在promethe server中定义告警规则,并根据规则产生告警,之后由AlterManager对告警进行处理,支持包含webHook等多种通知方式。
二、告警规则
groups:
- name: example
rules:- alert: HighErrorRate
expr: job:request_latency_seconds:mean5m{job=“myjob”} > 0.5
for: 10m
labels:
severity: page
annotations:
summary: High request latency
description: description info
- alert: HighErrorRate
在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)。一条告警规则主要由以下几部分组成:
alert:告警规则的名称。
expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。
三、可视化工具
一、基础
首先Grafana是一个通用的可视化工具。‘通用’意味着Grafana不仅仅适用于展示Prometheus下的监控数据,也同样适用于一些其他的数据可视化需求。在开始使用Grafana之前,我们首先需要明确一些Grafana下的基本概念,以帮助用户能够快速理解Grafana。
二、数据源(Data Source)
对于Grafana而言,Prometheus这类为其提供数据的对象均称为数据源(Data Source)。目前,Grafana官方提供了对:Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch的支持。对于Grafana管理员而言,只需要将这些对象以数据源的形式添加到Grafana中,Grafana便可以轻松的实现对这些数据的可视化工作。
三、仪表盘(Dashboard)
通过数据源定义好可视化的数据来源之后,对于用户而言最重要的事情就是实现数据的可视化。在Grafana中,我们通过Dashboard来组织和管理我们的数据可视化图表
四、组织和用户
作为一个通用可视化工具,Grafana除了提供灵活的可视化定制能力以外,还提供了面向企业的组织级管理能力。在Grafana中Dashboard是属于一个Organization(组织),通过Organization,可以在更大规模上使用Grafana,例如对于一个企业而言,我们可以创建多个Organization,其中User(用户)可以属于一个或多个不同的Organization。 并且在不同的Organization下,可以为User赋予不同的权限。 从而可以有效的根据企业的组织架构定义整个管理模型。