Prometheus原理与二次开发

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 函数调用 =》

猜你喜欢

转载自blog.csdn.net/niwoxiangyu/article/details/130607161
今日推荐