【监控】prometheus自定义指标 exporter

一、【写在前面】

prometheus自定义指标本质是用代码自己写一个网络访问的采集器,你可以在官网看到,Client libraries | Prometheus官方支持的语言有GO  JAVA PYTHON RUBY RUST, 第三方的库就支持的更多了,有BASH C CPP LUA C# JS PHP R PERL等,所以基本都可以找到自己需要的语言

 

因为考虑到prometheus官方提供的node exporter有限,社区的exporter需要找找找然后自己魔改,所以这篇文章写一个自定义指标的示例,小改一下就能自己用,但是当然您需要提前搭建一套prometheus才行,所以此文章作为以下的补充grafana + Prometheus + node-exporter + pushgateway + alertmanager的监控解决方案-CSDN博客

二、【基本介绍】

1. exporter是什么

exporter就是我们传统意义上说的agent。笔者到网上找了张架构图,你可以看到exporter部署在目标机器或者目标机器外,采集所需的指标,然后再由Prometheus定期拉取,也就是说,你可以看到,这个过程可能存在两个定时过程,一个是exporter处指标的定时更新,另一个是prometheus的定时拉取。

 

2. 支持哪些类型的指标

 这个库还是蛮清楚明了的,官网文档一页就能看完,它支持这么几种类型,根据需要选取就行,这是他的官网,Instrumenting | client_python, 下面是用GPT总结的几个常用类

1. Counter(计数器)

特点

  • 单调递增,只能增加或重置为零,不能减少。

使用场景

  • 统计事件发生的总次数,如请求数、错误数等。
from prometheus_client import Counter

c = Counter('requests_total', 'Total number of requests')
c.inc()  # 增加1
c.inc(5)  # 增加5

2. Gauge(仪表)

特点

  • 可以增加、减少或设置为任意值。

使用场景

  • 表示瞬时值,如当前温度、内存使用量、并发请求数等。
from prometheus_client import Gauge

g = Gauge('memory_usage_bytes', 'Memory usage in bytes')
g.set(12345)  # 设置为12345
g.inc()  # 增加1
g.dec(2)  # 减少2

3. Summary(摘要)

特点

  • 统计事件的持续时间或大小,提供总量、次数以及可配置的分位数信息。

使用场景

  • 记录请求的响应时间、数据包的大小等。
from prometheus_client import Summary

s = Summary('request_latency_seconds', 'Request latency in seconds')
s.observe(0.5)  # 记录一个0.5秒的请求延迟

4. Histogram(直方图)

特点

  • 类似于Summary,但提供详细的桶分布信息,统计每个桶内的值的个数。

使用场景

  • 记录请求的响应时间,并分析其分布情况;记录数据包的大小分布。
from prometheus_client import Histogram

h = Histogram('request_latency_seconds', 'Request latency in seconds')
h.observe(0.5)  # 记录一个0.5秒的请求延迟

5. Info

特点

  • 记录一些静态的信息,如版本号、配置信息等。

使用场景

  • 记录应用的版本号、配置参数等。
from prometheus_client import Info

i = Info('app_version', 'Application version')
i.info({'version': '1.0.0', 'build': 'abc123'})

6. Enum

特点

  • 表示一组离散的互斥状态。

使用场景

  • 记录应用的运行状态(如启动、运行、停止);记录服务器的健康状态。
from prometheus_client import Enum

e = Enum('app_state', 'Application state', states=['starting', 'running', 'stopping', 'stopped'])
e.state('running')

7. Labels(标签)

特点

  • 为指标附加维度,可以在同一指标名称下记录多个不同维度的数据。

使用场景

  • 记录每个API端点的请求次数;记录不同状态的任务数。
from prometheus_client import Counter

c = Counter('http_requests_total', 'Total number of HTTP requests', ['method', 'endpoint'])
c.labels(method='get', endpoint='/home').inc()
c.labels(method='post', endpoint='/submit').inc()

 这里我说一句,这个标签特别适合做多维表,prometheus这个东西它自定义生成的大都是键值对,如果要做多维,用这个会方便一些,但是只限于在label里(也就是[]中)写常量,因为他本质还是在键里写信息,如果键里内容变了,prometheus会认为是新的条目

8. Exemplars(示例)

特点

  • 关联指标数据和具体的事件样本,帮助在分析时追踪和关联具体的事件。

使用场景

  • 关联慢请求的具体trace;提供异常事件的上下文信息。
from prometheus_client import Histogram

h = Histogram('request_latency_seconds', 'Request latency in seconds')
h.observe(0.5, {'trace_id': '12345'})  # 记录一个0.5秒的请求延迟,并附加trace ID
# 本质上不是一个新类

 三、【代码实现】

1. 安装prometheus client 库

pip install prometheus_client

2. 复制代码

让GPT写了一个用线程精准定时的采集指标,你可以看到,本质就是创建一个 指标类型(这里是Counter和Gauge) 然后把数字用set塞进去就行。

from prometheus_client import start_http_server, Counter, Gauge
import threading
import random
import time

# 创建计数器
REQUEST_COUNTER = Counter('periodic_tasks_total', 'Total number of periodic tasks executed')
# 创建仪表
PERIODIC_GAUGE = Gauge('periodic_task_value', 'Value generated by periodic task')

def generate_metrics():
    """生成指标的函数,每30秒执行一次"""
    REQUEST_COUNTER.inc()  # 增加计数器
    value = random.uniform(0, 100)
    PERIODIC_GAUGE.set(value)  # 设置仪表值
    print(f"Generated metrics: {value}")

def schedule_periodic_metrics(interval):
    """调度定时任务的函数,确保每interval秒执行一次"""
    generate_metrics()
    # 使用threading.Timer确保精确的定时
    threading.Timer(interval, schedule_periodic_metrics, [interval]).start()

if __name__ == '__main__':
    # 启动一个Prometheus HTTP服务器,用于抓取指标数据
    start_http_server(8000)
    # 启动精确定时任务,每30秒生成一次指标
    schedule_periodic_metrics(30)

    # 保持主线程运行
    while True:
        time.sleep(1)

3. 确认连通情况

把上面的脚本跑起,然后另一边在Prometheus里的yml写上连接的ip和端口,并且重启prometheus,随后网页 “1.1.1.1:8000/targets” 查看情况

  - job_name: 'trading_observer'
    static_configs:
      - targets: ['1.1.1.1:8000']

看到这个up就是连接上了 

之后就可以在grafana中通过指标名获取数据了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/666206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ADuM1201可使用π121U31间接替换π122U31直接替换

ADuM1201可使用π121U31间接替换π122U31直接替换 一般低速隔离通信150Kbps电路可使用π121U31,价格优势较大。速度快的有其它型号可达10M,200M,600M。 本文主要介绍ADUM1201,替换芯片π121U31简单资料请访问下行链接 只要0.74元的双通道数字隔离器,1T1…

智和信通助力中国移动湖南某市分公司县级政府外网运维项目

中国移动湖南某市分公司承建市下属某县政务外网网络建设项目,且在网络建设完工后,承担起运维职责,随着工作的推进市移动公司发现仅靠人力难以高效开展运维工作。 设备类型:OLT、ONU等通信设备 设备品牌:华为、中兴等…

记一次安卓.apk加固,加固后安装失败,重新签名也安装失败问题

1、AndroidStudio打包生成.apk文件 2、使用360加固apk(或其他平台) 注意:加固后的apk必须进行重新签名才能安装,否则安装失败。apk签名可以使用jarsigner 和 apksigner,jarsigner 只能进行v1签名;apksigner…

【PostgreSQL17新特性之-冗余IS [NOT] NULL限定符的处理优化】

在执行一个带有IS NOT NULL或者NOT NULL的SQL的时候,通常会对表的每一行,都会进行检查以确保列为空/不为空,这是符合常理的。 但是如果本身这个列上有非空(NOT NULL)约束,再次检查就会浪费资源。甚至有时候…

Git使用规范及命令

文章目录 一、Git工作流二、分支管理三、Git命令操作规范1. 切到develop分支,更新develop最新代码2. 新建feature分支,开发新功能3. 完成feature分支,合并到develop分支4. 当某个版本所有的 feature 分支均合并到 develop 分支,就…

CSS--学习

CSS 1简介 1.1定义 层叠样式表 (Cascading Style Sheets,缩写为 CSS),是一种 样式表 语言,用来描述 HTML 文档的呈现(美化内容)。 1.2 特性 继承性 子级默认继承父级的文字控制属性。层叠性 相同的属性…

不借助三方平台自主搭建量化回测系统 ——以海龟交易策略为例

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学,点击下方链接报名: 量化投资速成营(入门课程) Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

Vue 2.0使用Vue-count-to给数字添加增长动画

在开发后台管理系统时,时常会遇到数据汇总,为了页面展示更生动,用户体验更好,通常会对汇总的数字加一个逐步递增动画。 实现这个效果一般是用的 Vue-count-to这个插件,这是一款简单好用的一个数字滚动插件,…

前端传String字符串 后端使用enun枚举类出现错误

情况 前端 String 后端 enum 前端 后端 报错 2024-05-31T21:47:40.61808:00 WARN 21360 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to con…

OSPF状态机+SPF算法

OSPF状态机 1.点到点网络类型 down-->init-->(前提为可以建立邻接)exstart——>exchange-->若查看邻接的DBD 目录后发现不用进行LSA 直接进入ful。若查看后需要进行查询、应答先进入loading,在查询应答完后再进入 fuIl: 2.MA网络类型 down --&g…

Linux下配置Pytorch

1.Anaconda 1.1虚拟环境创建 2.Nvidia驱动 3.CUDA驱动安装 4.Pytorch安装 具体的步骤如上:可参考另一位博主的博客非常详细: Linux服务器配置PythonPyTorchCUDA深度学习环境_linux cuda环境配置-CSDN博客https://blog.csdn.net/NSJim/article/detai…

民国漫画杂志《时代漫画》第35期.PDF

时代漫画35.PDF: https://url03.ctfile.com/f/1779803-1248636125-ee3a2b?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

微信小程序-页面导航-导航传参

1.声明式导航传参 navigator组件的url属性用来指定将要跳转到的页面的路径,同时,路径的后面还可以携带参数: (1)参数与路径之间使用 ? 分割 (2)参数键与参数值用 相连 (3&…

LeetCode503:下一个更大元素Ⅱ

题目描述 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这…

CSwin-PNet 新的医学图像分割网络

很长时间没有看到一些比较传统的医学图像分割网络了,2022年,来自哈尔滨工业大学的研究团队在Expert Systems With Applications. 期刊上发表了题为《CSwin-PNet: A CNN-Swin Transformer combined pyramid network for breast lesion segmentation in ul…

Web前端三大主流框:React、Vue 和 Angular

在当今快速发展的 Web 开发领域,选择合适的前端框架对于项目的成功至关重要。React、Vue 和 Angular 作为三大主流前端框架,凭借其强大的功能和灵活的特性,赢得了众多开发者的青睐。本文将对这三大框架进行解析,帮助开发者了解它们…

二叉树的前序遍历(oj题)

一、题目链接: https://leetcode-cn.com/problems/binary-tree-preorder-traversal/ 二、题目思路 先调用二叉树节点计算函数,得到二叉树的总结点数。然后申请该大小的数组空间。 再使用前序遍历,依次访问每个结点的数据,依次存…

Linux —— MySQL操作(1)

一、用户与权限管理 1.1 创建与赋予权限 create user peter% identified by 123465 # 创建用户 peter,# %:允许所有用户登录这个用户访问数据库 刚创建的新用户是什么权限都没有,需要赋予权限 grant select on mysql.* to peter%; # 赋予…

springboot编写日志环境搭建过程

AOP记录日志 AOP记录日志的主要优点包括: 1、低侵入性:AOP记录日志不需要修改原有的业务逻辑代码,只需要新增一个切面即可。 2、统一管理:通过AOP记录日志可以将各个模块中需要记录日志的部分进行统一管理,降低了代…

【设计模式】JAVA Design Patterns——Facade(外观模式)

🔍目的 为一个子系统中的一系列接口提供一个统一的接口。外观定义了一个更高级别的接口以便子系统更容易使用。 🔍解释 真实世界例子 一个金矿是怎么工作的?“嗯,矿工下去然后挖金子!”你说。这是你所相信的因为你在使…