【监控】prometheus自定义指标 exporter

2024-05-31 22:52

本文主要是介绍【监控】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 Counterc = Counter('requests_total', 'Total number of requests')
c.inc()  # 增加1
c.inc(5)  # 增加5

2. Gauge(仪表)

特点

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

使用场景

  • 表示瞬时值,如当前温度、内存使用量、并发请求数等。
from prometheus_client import Gaugeg = 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 Summarys = Summary('request_latency_seconds', 'Request latency in seconds')
s.observe(0.5)  # 记录一个0.5秒的请求延迟

4. Histogram(直方图)

特点

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

使用场景

  • 记录请求的响应时间,并分析其分布情况;记录数据包的大小分布。
from prometheus_client import Histogramh = Histogram('request_latency_seconds', 'Request latency in seconds')
h.observe(0.5)  # 记录一个0.5秒的请求延迟

5. Info

特点

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

使用场景

  • 记录应用的版本号、配置参数等。
from prometheus_client import Infoi = Info('app_version', 'Application version')
i.info({'version': '1.0.0', 'build': 'abc123'})

6. Enum

特点

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

使用场景

  • 记录应用的运行状态(如启动、运行、停止);记录服务器的健康状态。
from prometheus_client import Enume = Enum('app_state', 'Application state', states=['starting', 'running', 'stopping', 'stopped'])
e.state('running')

7. Labels(标签)

特点

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

使用场景

  • 记录每个API端点的请求次数;记录不同状态的任务数。
from prometheus_client import Counterc = 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 Histogramh = 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中通过指标名获取数据了 

这篇关于【监控】prometheus自定义指标 exporter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1019270

相关文章

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

Prometheus+cpolar如何在手机上也能监控服务器状态?

《Prometheus+cpolar如何在手机上也能监控服务器状态?》本文强调了通过Cpolar这一内网穿透工具,轻松突破Prometheus仅限于局域网访问的限制,实现外网随时随地访问监控数据,教你... 目录前言1.安装prometheus2.安装cpolar实现随时随地开发3.配置公网地址4.保留固定

kafka自定义分区器使用详解

《kafka自定义分区器使用详解》本文介绍了如何根据企业需求自定义Kafka分区器,只需实现Partitioner接口并重写partition()方法,示例中,包含cuihaida的数据发送到0号分区... 目录kafka自定义分区器假设现在有一个需求使用分区器的方法总结kafka自定义分区器根据企业需求

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

SpringBoot AspectJ切面配合自定义注解实现权限校验的示例详解

《SpringBootAspectJ切面配合自定义注解实现权限校验的示例详解》本文章介绍了如何通过创建自定义的权限校验注解,配合AspectJ切面拦截注解实现权限校验,本文结合实例代码给大家介绍的非... 目录1. 创建权限校验注解2. 创建ASPectJ切面拦截注解校验权限3. 用法示例A. 参考文章本文

Vite 打包目录结构自定义配置小结

《Vite打包目录结构自定义配置小结》在Vite工程开发中,默认打包后的dist目录资源常集中在asset目录下,不利于资源管理,本文基于Rollup配置原理,本文就来介绍一下通过Vite配置自定义... 目录一、实现原理二、具体配置步骤1. 基础配置文件2. 配置说明(1)js 资源分离(2)非 JS 资

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

聊聊springboot中如何自定义消息转换器

《聊聊springboot中如何自定义消息转换器》SpringBoot通过HttpMessageConverter处理HTTP数据转换,支持多种媒体类型,接下来通过本文给大家介绍springboot中... 目录核心接口springboot默认提供的转换器如何自定义消息转换器Spring Boot 中的消息

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp