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

Golang 开发Prometheus 自定义 Exporter

目录

    • Exporter 定义
    • Exporter 运行方式
    • Exporter 数据规范
      • 常见指标类型说明
      • 核心数据格式规则
    • Golang语言开发自定义exporter
      • 详细步骤
        • 开发环境准备
        • 定义和注册指标
        • 运行和测试

平时运维工作中,遇到官方exporter不包含的指标,比如企业内部服务等,如何监控这些指标呢。
我们可以考虑编写自己的exporter将这些指标监控起来。下面讲解下Golang语言编写Exporter的步骤。后续我们将继续完善这部分内容。

Exporter 定义

Exporter 的核心功能是数据采集、格式转换、指标暴露,这三个功能构成其核心工作流。

  1. 数据采集
    从目标对象(如服务器、数据库、应用程序)获取原始监控数据。支持多种采集方式,比如主动拉取(Polling)或被动接收(Push)。
  2. 格式转换
    将采集到的异构原始数据,统一转换为标准化的指标格式。最常见的标准是 Prometheus 的指标格式,确保数据可被监控系统识别。
  3. 指标暴露
    通过 HTTP 接口(通常是 /metrics 端点)将标准化指标对外暴露。供监控系统(如 Prometheus)定期抓取,完成数据的后续存储和分析。

Exporter 运行方式

从Exporter的运行方式上来讲,又可以分为:

  • 独立使用的
    以我们已经使用过的Node Exporter为例,由于操作系统本身并不直接支持Prometheus,同时用户也无法通过直接从操作系统层面上提供对Prometheus的支持。因此,用户只能通过独立运行一个程序的方式,通过操作系统提供的相关接口,将系统的运行状态数据转换为可供Prometheus读取的监控数据。 除了Node Exporter以外,比如MySQL Exporter、Redis Exporter等都是通过这种方式实现的。 这些Exporter程序扮演了一个中间代理人的角色。

  • 集成到应用中的
    为了能够更好的监控系统的内部运行状态,有些开源项目如Kubernetes,ETCD等直接在代码中使用了Prometheus的Client Library,提供了对Prometheus的直接支持。这种方式打破的监控的界限,让应用程序可以直接将内部的运行状态暴露给Prometheus,适合于一些需要更多自定义监控指标需求的项目。

Exporter 数据规范

Prometheus Exporter 的核心数据格式是文本格式,遵循 Prometheus 的指标规范,结构简洁且易解析。

常见指标类型说明

  • Counter:累计型指标(只增不减,如请求总数、错误数)。
  • Gauge:瞬时值指标(可增可减,如内存使用率、当前连接数)。
  • Histogram:直方图指标(统计数值分布,如请求延迟分布)。
  • Summary:摘要指标(统计分位数,如 P95/P99 延迟)。

核心数据格式规则

  1. 注释行(可选):以 # 开头,分两种类型
    • 帮助注释:# HELP 指标名 指标描述,说明指标含义。
    • 类型注释:# TYPE 指标名 指标类型,指定指标类型(counter/gauge/histogram/summary)。
  2. 指标行(核心):格式为 指标名{标签键=“标签值”,…} 指标值 时间戳(可选)
    • 指标名:符合正则 [a-zA-Z_:][a-zA-Z0-9_:]*,推荐小写 + 下划线命名。
    • 标签:键值对格式,用于区分指标维度(如实例、模块)。
    • 指标值:支持整数、浮点数(如 10、0.5)。
    • 时间戳:Unix 时间戳(毫秒级),省略时默认取采集时间。

实际示例(以 HTTP 请求数指标为例)

# HELP http_requests_total 已处理的HTTP请求总数
# TYPE http_requests_total counter
http_requests_total{method="GET",status="200"} 156 1699999999000
http_requests_total{method="POST",status="200"} 89
http_requests_total{method="GET",status="404"} 23

Golang语言开发自定义exporter

详细步骤

开发环境准备

首先,确保你安装了Go语言环境。然后,创建一个新的Go项目文件夹,初始化Go模块:

mkdir diy_exporter
cd diy_exporter
go mod init diy_exporter

安装依赖:

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp
定义和注册指标

创建一个main.go文件

package mainimport ("net/http""github.com/prometheus/client_golang/prometheus""github.com/prometheus/client_golang/prometheus/promhttp"
)func main() {// 1. 创建一个最简单的计数器(无标签)visitCounter := prometheus.NewCounter(prometheus.CounterOpts{Name: "page_visit_total", // 指标名:页面访问总数Help: "Total number of page visits",})// 2. 注册指标prometheus.MustRegister(visitCounter)// 3. 简单接口:每次访问就计数+1http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {visitCounter.Inc() // 计数器+1w.Write([]byte("Hello, Counter!"))})// 4. 暴露指标端点http.Handle("/metrics", promhttp.Handler())// 5. 启动服务http.ListenAndServe(":8182", nil)
}

这个例子简化到了极致,只做 4 件事:

  1. 定义一个名为page_visit_total的计数器(无任何标签)
  2. 注册指标
  3. 每次访问根路径/时,计数器 + 1
  4. 通过/metrics端点暴露这个计数器的值
运行和测试

运行程序:

go run main.go

访问 http://192.168.37.100:8182/ (根据自己运行exporter地址填)
访问 http://192.168.37.100:8182/metrics

# HELP page_visit_total Total number of page visits
# TYPE page_visit_total counter
page_visit_total 5  # 数字会随访问次数增加

在这里插入图片描述

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

相关文章:

  • 找效果图的网站哪个好ps做网站框架搭建
  • 做平面设计的网站有哪些深圳市福田区公司
  • 2026年新疆职业院校技能大赛GZ073网络系统管理赛项模块A:网络构建真题
  • JavaScript基础入门
  • 软考中级软件设计师(上午题)/ 上
  • 京东淘宝网站是怎么做的历史街区和历史建筑信息平台
  • 泉州市住房和乡村建设网站网页设计个人
  • 【Linux】网络层与数据链路层中重点介绍
  • 一站式营销型网站建设服务泉州市华泰建设工程有限公司网站
  • 异地共享音乐、观影、手机、电脑文件方案(待续)
  • 口碑好的建筑设备监控管理系统厂家
  • Rust 练习册 :Luhn与校验算法
  • 远程调用基本实现
  • 上海微网站制作建设网页设计心得300
  • 网站视频与服务器的关系html网页制作颜色代码
  • 北京亦庄信创产业链闭环初成,下一站是“生态质量”
  • 【uniapp】小程序体积优化,分包异步化
  • 如何做出好的产品:黑客马拉松产品核心逻辑[特殊字符]
  • 网站注入木马crm管理系统登录
  • Vue 2 和 Vue 3 的区别
  • 【FPGA】使用移位实现LED流水灯
  • Arbess零基础学习 - 使用Arbess+GitLab+Hadess实现Java项目自动化构建/主机部署/上传制品
  • S12 简单排序算法--冒泡 选择 直接插入 希尔排序
  • 【RabbitMQ】工作模式实现
  • 自己做淘宝优惠券网站旅游网站模板html免费下载
  • 进一步强化网站建设wordpress用户权限在哪改
  • 【Android Studio】Android Studio的安装过程以及初步使用
  • [人工智能-大模型-138]:如何把文本语言转化成词向量,然后作为模型的输入?给出中间每个步骤的输入和输出的实例值。
  • [Linux]学习笔记系列 -- [kernel]cpu
  • 河南建设工程信息网站怎么自己做游戏软件的app