Prometheus的功能、架构、组件、配置
1 介绍
1.1 简介
Promethues是一套开源系统监控及报警框架,启发于Google的borgmon, 由SoundCoud员工于2012年创建,并于2015年正式发布,2016年正式加入Cloud Native Computing Fundation
1.2 监控目的
趋势分析:对监控指标进行持续收集和统计,进行趋势分析。
利用磁盘空间增长率判断何时进行磁盘扩容。
对照分析:对不同版本系统运行资源使用情况或性能数据进行跟踪和对比。
告警:即使发现故障,快速响应问题,避免对业务产生较大影响。
故障分析与定位:分析和排查问题,找到问题根源。
数据可视化:通过仪表盘等对系统运行状态,资源使用,服务状态等进行直观显示。
1.3 特点
多维数据模型:使用metric名和键值对来区分的时间序列数据。
灵活强大的查询语言支持:PromQL。可对metrics进行数学运算、逻辑运算等操作。
单节点部署,不依赖于分布式存储。
数据采集其于HTTP协议,使用Pull模式获取数据。
扫描目标与告警管理支持静态配置与动态服务发现。
可使用使用PushGateway推送时间序列数据至Prometheus Server。
内置Dashboard用于基本功能查看和管理。
1.4 组件
Prometheus Server:数据采集和存储时序数据
对数据进行告警分析
client libaries:提供应用程序数据收集功能
push gateway:支持短期jobs,由jobs推送数据到push gateway,再由gateway暴露给Prometheus Server
Exporters:暴露第三方服务采集数据,非侵入式
Alertmanger:对Prometheus server产生告警进行去重、分组、发送等功能
1.5 架构
流程:Prometheus通过Service discovery发现采集目标
使用HTTP请求获取采集目标指标数据,并进行持久化存储
定时运行本地规则进行数据聚合产生新的时序数据或告警
将告警发送于alarmmanager,由alarmmanager进行分组、去重等功能后发送告警通知或恢复通知
可调用Prometheus Server提供的HTTP API获取采集数据用于可视化
1.6 使用场景:
Prometheus可以记录任何纯数据的时序数据
常用于以机器为中心的监控、面向高度动态的服务体系架构监控
不适合100%准确性的要求,如请求计费
Prometheus的环境搭建与使用
2 部署安装
搭建组件Prometheus Server、Alertmanger、node_exporter、mysqld_exporter
安装 进程监控 systemd supervisord
Prometheus的环境搭建与使用
3 基本概念
3.1 数据模型:
Prometheus也会为查询结果生成临时的时间序列
每个时间序列由度量指标名称和他的标签键值对集合唯一确定
格式: <metric name>{label name> = <lable value>, ...} samples [millisecond]
指标名称: 格式[a-zA-Z_:][a-zA-Z0-9_:] *
标签名: [a-zA-Z_][a-zA-Z0-9_] *
标签值: 任意格式的Unicode值
采样数据: float64格式
3.2 指标类型
Prometheus client库提供4种核心的度是类型,Prometheus Server并不使用类型信息
Counter:计数类
使用在累计指标单调递增或单调递减情况下,只能在目标重启后自动归零
例如--服务请求处理数量
已完成任务数量
错误数量
Guage: 测量类
使用可增可减的数据情况下
例如--当前内存便用情况
并发请求数量
Histogram:直方图类
使用统计指标信息在不同区间内(桶)的统计数量
例如--延迟时间、响应大小
包含各桶的统计数量,总的统计信息以及总的统计数量:<basename> _bucket{le=""}
<basename>_sum
<basename>_count
Summary:摘要类
类似于直方图,在客户端对百分位进行统计
例如--延迟时间、响应大小
包含各桶的百分位信息,总的统计信息以及总的统计数量:<basename>{quantile=""}
<basename>_sum
<basename>_count
3.3 作业与实例
实例: instance
指数据采集的端点
作业: job
指具有相同目的的实例集合
Prometheus在采集数据时自动在时序数据中添加作业和实例标签名及值: job
instance
针对每个实例Prometheus生成采集指标:up--是否在线
scrape_ duration_seconds--采集持续事件
scrape_samples_post_metric_relabeling--重置label样本数量
scrape_samples_scraped--暴露的样本数量
scrape_series_added--近似的新增时间序列数量
4 配置
命令行参数--启动后不可修改
配置文件: 通过命令行参数--config.file指定,默认就是prometheus.yml
可修改并通过信号或API进行重新加载: kill -s SIGHUP $PID
api /-/reload 需要通过命令行参数--web.enable-lifecycle开启
全局配置
规则文件: 公共配置
说明
groups 配置规则组
name 规则组名称
interval 规则运行时间间隔
rules 规则列表
记录:用于对时序数据进行计算生成新的时序数据进行存储
说明 record 新时序数据库指标名
expr
promql表达式
用于查询时序数据
labels 标签
告警 用于产生告警
示例
采集列表
规则文件检查
重新加载配置
告警指标
5 PromQL
Prometheus提供PromQL功能用于时序数据的查询和统计
表达式数据类型:
及时向量--针对每个查询结果集单项中只包含一组时序数据和样本值
范围向量--针对每个查询结果集单项中包含多组时序数据和样本值
标量--浮点型数据
字符串--字符里数据
及时向量查询
范围向量查询
偏移量
子查询
运算
函数
6 HTTPAPI
查询:
及时向量查询
范围向量查询
指标查询
查询标签
查询标签值
查询采集目标
查询规则
查询告警
查询深集目标元数据
查询元数据
查询告警管理器
查询配置信息
查询命今行配置
查询运行时信息
查询编译信息
查询TSDB状态
管理员:命令行参数通过--web.enable-admin-api启动
快照 路径 /api/v1/admin/tsdb/snapshot
请求方式 POST PUT
查询参数 skip head 跳过头数据
删除时序 路径 /api/v1/admin/tsdb/delete series
请求方式 Post PUT
查询参数 match[]
start
end
说明 数据并未真正从硬盘删除,后续在压缩时进行清理
清理磁盘数据
生命周期管理: 命令行参数通过--web.enable-lifecycle启动
健康状态 路径 /-/healthy
请求方式 GET
准备状态 路径 /-/ready
请求方式 GET
重新加戟配置 路径 /-/reload
请求方式 PUT Post
退出 路径 /-/quit
请求方式 PUT POST
7 联合模式
8 告警管理
Prometheus的主要代码解读和服务发现与控制
go-demo/cmdb at main · yunixiangfeng/go-demo · GitHub
服务端开发
prometheus模型管理
prometheus node查删
prometheus job增删改查
prometheus target增删改查
prometheus终端注册
prometheus配置获取
promagent框架搭建
promagent注册
prometheus配置文件更新
prometheus client介绍
mysql_exporter开发
告警通知
告警问题处理
CMDB管理Prometheus Target
prometheus target增删改查
prometheus终端注册
http://localhost:8080/v1/prometheus/register
prometheus配置获取
http://localhost:8080/v1/prometheus/config?uuid=xyz
promagent框架搭建
promagent注册
prometheus exporter开发
mysql_exporter开发
针对服务发现的功能
告警的功能
exporter采集数据
day16
自述
exported_instance
push gateway
prometheus级联
规则
产生告警
生成新的时间序列的
运算 => 即时(瞬时)向量
on(url)
request {url=abc, code=200}
request {url=abc, code=400}
request {url=abc1, code=200}
request {url=abc1, code=400}
request {url=abc} 1
request {url=abc} 2
request {url=abc1} 3
request {url=abc1} 4
+
request_total {url=abc} 10
request_total {url=abc1} 11
on()
left + right group_left()
group_right()
left join
right join
inner join
集合运算
count
sum
min
max
avg
topk
bottomk
开发
1. 基于Prometheus开发应用 API,配置, PromQL
服务发现 => CMDB Prometheus Target 配置
图形化管理 => 可视化
告警规则管理
告警 alertmanager => CMDB
email
短信
多个Prometheus
配置文件操作 yml, json
API => http client
file_sd_configs:
1. 服务发现
a. prometheus 增删改查
id, name, ip
b. job管理 job 增删改查
id, prometheus, jobname, scheme, metrics, basic_auth, tls
c. target
target
DB
prometheus => config
Agent
systemctl reload exec
http client api
2. api 获取数据
展示数据,图形化,js (js + 主机资源监控)
3. Exporter
Agent => prometheus client => 统计
采集目标进行通信(socket)
4. 告警 => Db存储
通知 短信 => 腾讯云
2. Prometheus
服务发现
数据采集方式
prometheus组件图
服务端开发
prometheus模型管理
prometheus job增删改查
prometheus target增删改查
prometheus终端注册
prometheus配置获取
promagent框架搭建
promagent注册
prometheus配置文件更新
prometheus client介绍
mysql_exporter开发
告警通知
告警问题处理
go-demo/client at main · yunixiangfeng/go-demo · GitHub
prometheus client-go
https://github.com/prometheus/client_golang
prometheus package - github.com/prometheus/client_golang/prometheus - Go Packages
prometheus exporter开发
https://github.com/yunixiangfeng/go-demo/tree/main/mysql_exporter
day17
网络请求
自述
1. prometheus
Node
=> 查询, 删除
Agent => API register => 不存在 添加
存在 更新
=> 属性
uuid
hostname
addr https://host:port/
#username
#password
created_at
updated_at
deleted_at
Job
=> 增 删 改 查
=> 属性
任务标识 [a-zA-Z][0-9a-zA-Z_]
备注
Node node_id
created_at
updated_at
deleted_at
Target
=> 增 删 改 查
名称
备注
Addr
Job
created_at
updated_at
deleted_at
问题:
1. prometheus.yaml => 修改 => prometheus reload
=> api => 开启lifecycle nginx => req
Authorization: Basic base64(name:password)
=> systemctl reload =>
需要有系统命令 systemctl
2. job: 其他配置, target其他配置 根据自己业务需求添加
3. 每间隔 每次重新写问题 每次重新加载 当内容变化后才加载
prometheus:
job: job1 job2 无变化不需要reload
target:
无变化不许写入文件
jobs targets 排序 sort json.Marshal => []byte => 写入
day18
1. prometheus client_golang
client
a. prometheus client(java, go, php, python)
b. http暴露 => 处理器
2. mysqld_exporter
3. web basic auth
a. 服务端响应告知浏览器需要认证 => 弹出用户名密码输入框
401
www-authenticate: basic realm="my site"
b. Authorization: Basic xx => 读取消息并进行验证
Basic => xxx => Base64解码 用:分割,验证用户名:密码(明文)
用户名:密码 => 配置文件
hash => bcrypt/md5
md5
cmdb 用户登录
form
user/password(明文)
db: 用户/密码(bcrypt=>hash)
4. 应用监控
http 请求的总数 Counter
http url 响应时间的统计 histogram/summary
http 每个响应状态码出现次数 Counter+labels
Filter:
5. alertmanager
6. 告警管理
a. 告警接收&存储
认证:
Authorization: Token xxxxxx
basic auth: Basic xxxx
bearer auth: Bearer xxxxx
webhook
API => alertmanager => json => db
id => labels 生成 (相同labels生成的id相同)
1点 => instance 1.1.1.1:9999 离线
已恢复
10点 => instance 1.1.1.1:9999 离线 id
a => a
a,b => a,b
通知:groupkey 分组为单位通知
b. 告警查询
c. 分页
7. 通知
a. email
b. 腾讯sms
开发功能 => 满足业务需求的 + 技术(go, beego)
业务逻辑 + 技术
1. 重复手动的工作(设计) => 自动化(开发)
2. 需求 => 需求分析 => 设计 =>开发
监控:
1. 可用性
2. 延迟
请求消耗时间
操作使用时间
3. 错误次数
4. 容量
当前请求多少/总请求多少
当前连接数量/总的连接数量
mysql_exporter监控哪些东西?
mysql => exporter =>
监控对象api => 获取指标信息(计算)
sql查询 =>
show global status
mysql 可用性
操作失败
select 1;
ping
慢查询次数 show global status where variable_name='Slow_queries';
容量
qps:
counter
show global status where variable_name='Queries';
tqs:
insert, delete,update *
com_insert
com_delete
com_update
com_select
com_replace
连接:
show global status where variable_name='Thread_running';
show global status where variable_name='max_connections';
告警 => Prometheus 关联(Node)
promagent => prometheus.yaml labels => uuid => xx
流量:
show global status where variable_name='Bytes_received'
show global status where variable_name='Bytes_send'
json
form => controller => parseForm/unmarshal => object => server.insert/
unmarshal => ALertForm
groupby
alertname
a => a
labels =>
b => a,b
a => labels =>
b =>
分页
pageSize => 5
pageNum
查询条件
Offset Limit
pageNum => 1,2,3
(pageNum) - 1 * pageSize
limit PageSize
1 = 0 limit 5
2 => 5 limit 5
querytable.SetCond(cond).Offset().limit()
querytable.SetCond(conf).Count()
Page
datas
分页相关数据 页面 URL参数
prometheus流程
day19
1. Alartmanager告警通知
a. 短信 腾讯
b. 邮件 smtp 告警通知以分组为单位
告警处理以告警为单位
邮件和短信发送
邮件:
smtp服务器 smtp协议发送邮件
邮件网关 http api 邮件参数+url+认证
From:
To:
cc:
主题:
内容:
附件:
腾讯授权码:
smtp.qq.com
SecretId: AKID44qsOsP1g5GB9qxu1ndW8CzuZIYYfr3y
SecretKey:5qYz4uSnrUrJUe5GDvLUheZEcsQYQKyZ
API url/request/response
认证
请求结构体
结构体名称 => url
结构体的属性 => request 参数
http request => http response
响应结构体
告警发送:
1. api接收告警信息
2. json反序列化 => 告警组 告警信息
3. 告警组 => 发送告警
发送邮件
告警内容生成 => html/template
主题 => 告警名称
通知者 => 配置
发送:
smtp服务器,端口,用户名,密码
发送短信
短信内容 => 腾讯云 短信模板 只能传递参数
通知者 => 配置
发送:
SDK调用方式
地址,结构体/对象, 函数调用
通知者
必须通知者 => 配置(运维)
业务通知者 => 具体业务所属人相关 => 通知管理
告警中的labels筛选通知者
4. 告警信息 => 告警处理
template 函数调用 =》