当前位置: 首页 > news >正文

Prometheus-2--什么是Exporter是什么?

Exporter是Prometheus监控体系中的核心组件,其本质是一个数据采集和格式转换工具。它的核心作用是将不同系统、服务或应用的监控数据(如硬件资源、数据库性能、业务指标等)转换为Prometheus可识别的格式,并通过HTTP接口暴露这些数据,供Prometheus Server拉取和存储。

1、Exporter的核心功能

1、数据采集

  • 从目标系统(如操作系统、数据库、中间件等)收集原始指标数据。

示例:

  • 从服务器采集CPU使用率、内存占用、磁盘I/O。
  • 从MySQL数据库采集查询延迟、连接数、慢查询次数。
  • 从Kubernetes集群采集Pod状态、节点资源分配。

2、数据转换

  • 将原始数据转换为Prometheus的标准格式(文本化的键值对,包含指标名称、标签和时间戳)。
    示例格式:
# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{device="cpu0",mode="idle"} 12345.67
node_cpu_seconds_total{device="cpu0",mode="user"} 890.12  

3、数据暴露

  • 启动一个HTTP服务(默认端口9100),通过/metrics接口提供标准化的监控数据。
  • Prometheus Server通过HTTP请求定期拉取这些数据(默认每1分钟一次)。

2、Exporter的工作原理

Exporter的工作流程可分为以下四个步骤。

1、数据收集,与被监控对象交互

Exporter通过以下方式获取原始数据:
(1)、直接调用系统接口

  • 例如,node_exporter通过Linux的/proc文件系统读取 CPU、内存等信息。
    (2)、连接数据库或中间件
  • 例如,mysql_exporter连接到MySQL数据库,执行SQL查询获取性能指标
    (3)、解析日志或网络协议
  • 例如,blackbox_exporter通过HTTP、TCP、ICMP协议探测服务可用性。

2、数据标准化

Exporter将原始数据转换为Prometheus的标准格式:

  • 指标名称(Metric Name):描述指标含义(如http_requests_total)。
  • 标签(Labels):用于区分维度(如method=“GET”, status=“200”)。
  • 值(Value):浮点数值(如0.85)。
  • 时间戳(Timestamp):隐式由Prometheus添加(默认当前时间)。

3、暴露HTTP接口

Exporter启动一个内嵌的HTTP服务,监听指定端口(如9100),并提供/metrics端点:

访问示例:

curl http://localhost:9100/metrics

返回示例:

# HELP node_memory_MemFree_bytes Free memory in bytes.
# TYPE node_memory_MemFree_bytes gauge
node_memory_MemFree_bytes 123456789

4、Prometheus拉取数据

Prometheus Server根据配置文件(prometheus.yml)定期拉取Exporter的/metrics接口数据:

yaml示例:

scrape_configs:- job_name: "node-exporter"static_configs:- targets: ["localhost:9100"]

拉取过程:
Prometheus通过HTTP请求访问http://localhost:9100/metrics,解析返回的文本数据,并存储为时间序列。

3、Exporter的类型

适用于不同场景,Exporter可分为两类。

1、直接Exporter

  • 定义:目标系统或服务本身支持Prometheus标准的监控接口(无需额外部署)。
  • 示例:
    • cAdvisor:监控Docker容器的资源使用情况。
    • Kubernetes API Server:暴露集群节点、Pod的内置指标。
    • Etcd:分布式键值存储的健康状态和性能指标。

2、独立Exporter

需要单独部署的程序,负责采集特定系统的指标并转换格式。

常见类型:
(1)、基础设施监控

  • node_exporter:监控操作系统(CPU、内存、磁盘等)。
  • blackbox_exporter:探测HTTP、TCP、ICMP服务的可用性。
    (2)、数据库监控
  • mysql_exporter:监控MySQL性能(查询延迟、连接数)。
  • postgres_exporter:监控PostgreSQL的表空间、索引效率。
    (3)、中间件监控
  • redis_exporter:监控Redis缓存命中率、内存占用。
  • rabbitmq_exporter:监控消息队列的生产/消费速率。

4、Exporter的技术实现

1、数据采集方式

  • 主动拉取:Exporter定期主动查询被监控对象的接口或日志。
  • 被动监听:部分Exporter通过监听日志文件或网络流量获取数据(如elasticsearch_exporter)。

2、数据格式规范

Exporter输出的数据需遵循Prometheus的以下规范:

  • 指标类型:
    • Counter(计数器):单调递增的值(如HTTP请求总数)。
    • Gauge(仪表盘):可增可减的值(如温度、内存使用量)。
    • Histogram(直方图):统计分布(如请求延迟的分位数)。
    • Summary(摘要):类似Histogram,但侧重于分位数计算。
  • 元数据注释:
    • HELP <metric_name> :描述指标含义。
    • TYPE <metric_name> :定义指标类型。

3、自定义Exporter

开发者可以通过Prometheus官方提供的客户端库(如prometheus/client_golang)创建自定义Exporter。

步骤:
(1)、定义指标(如http_requests_total)。
(2)、实现数据采集逻辑(如调用HTTP接口获取响应时间)。
(3)、注册指标并启动HTTP服务。

示例代码(Go语言):

  package mainimport ("github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp""net/http")var (httpRequests = prometheus.NewCounterVec(prometheus.CounterOpts{Name: "http_requests_total",Help: "Total number of HTTP requests.",},[]string{"method", "status"},))func init() {prometheus.MustRegister(httpRequests)}func main() {http.Handle("/metrics", promhttp.Handler())http.ListenAndServe(":9100", nil)}

5、Exporter的典型应用场景

1、监控服务器资源

  • 使用node_exporter监控CPU、内存、磁盘I/O,帮助识别硬件瓶颈。
    2、数据库性能调优
  • 通过mysql_exporter分析慢查询、连接数,优化数据库配置。
    3、微服务健康检查
  • 部署blackbox_exporter探测HTTP接口可用性,确保服务SLA。
    4、容器化环境监控
  • 使用cAdvisor和Kubernetes内置指标监控容器资源使用情况。

6、Exporter的优势与挑战

优势:

  • 灵活性:支持数百种系统和应用的监控,覆盖基础设施、中间件、业务逻辑。
  • 标准化:统一数据格式,简化Prometheus的集成和分析。
  • 社区支持:官方和第三方提供了丰富的Exporter库,开箱即用。

挑战:

  • 性能开销:高频采集可能导致系统资源消耗(需合理配置采集间隔)。
  • 数据延迟:拉取模式可能导致监控数据存在分钟级延迟。
  • 高基数问题:过多标签组合可能导致Prometheus存储压力(需控制标签数量)。

7、总结

Exporter 是 Prometheus 监控体系的“翻译器”和“适配器”,它解决了不同系统数据格式不兼容的问题,使得 Prometheus 能够统一收集、存储和分析各类监控数据。通过 Exporter,用户可以轻松实现从硬件资源到业务逻辑的全栈监控,为故障排查、性能优化和容量规划提供数据支持。

向阳前行,Dare To Be!!!

http://www.dtcms.com/a/305456.html

相关文章:

  • STM32F1 Flash的操作
  • 【学习过程记录】【czsc】1、安装
  • 【Qt开发】信号与槽(三)-> 自定义信号和槽
  • QT---》文件MD5码的获取与验证
  • 关于vue __VUE_HMR_RUNTIME__ is not defined报错处理
  • Baumer工业相机堡盟工业相机如何通过YoloV8的深度学习模型实现汽车牌照的位置识别(C#代码,UI界面版)
  • Web前端实战:Vue工程化+ElementPlus
  • 前端兼容性问题全面解决方案
  • 重生之我在暑假学习微服务第五天《Docker部署项目篇》
  • JavaWeb 进阶:Vue.js 与 Spring Boot 全栈开发实战(Java 开发者视角)
  • Linux常用基础命令
  • 【MySQL基础01】:如何创建删除修改表和数据库
  • 【大语言模型入门】—— Transformer 如何工作:Transformer 架构的详细探索
  • [mcp: JSON-RPC 2.0 规范]
  • sqLite 数据库 (2):如何复制一张表,事务,聚合函数,分组加过滤,列约束,多表查询,视图,触发器与日志管理,创建索引
  • Python的魔术方法
  • 在 Cloudflare 平台上完整部署 GitHub 项目 MoonTV 实现免费追剧流程
  • 计算机网络基础(一) --- (网络通信三要素)
  • Deep Learning_ Foundations and Concepts-Springer (2024)【拜读】20章3节
  • Linux C:构造数据类型
  • python基础:request请求Cookie保持登录状态
  • Python高效历史记录管理:保存最后N个元素的完整指南
  • 机械学习--线性回归
  • 项目如何进行阶段性评估?核心要点
  • Java07--面向对象
  • 【收银系统开发】收银系统之数字键盘,人机交互中重复判断——仙盟创梦IDE
  • thingsboard 自定义动作JS编程
  • 1768. 交替合并字符串
  • 2025年06月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 【C#学习Day13笔记】静态成员、接口、运算符重载和索引器