使用golang生成prometheus格式数据

 更新时间:2025年02月06日 09:10:39   作者:景天科技苑  
Prometheus是一个开源的监控系统,拥有许多Advanced Feature,本文将介绍Primetheus client的使用,并基于golang生成prometheus格式数据,希望对大家有所帮助

Prometheus是一个开源的监控系统,拥有许多Advanced Feature,他会定期用HTTP协议来pull所监控系统状态进行数据收集,在加上timestamp等数据组织成time series data,用metric name和label来标识不同的time series,用户可以将数据用可视化工具显示出来,并设置报警阈值进行报警。

本文将介绍Primetheus client的使用,基于golang语言,golang client 是当pro收集所监控的系统的数据时,用于响应pro的请求,按照一定的格式给pro返回数据,说白了就是一个http server。

1. 何为exporter

Prometheus 监控基于一个很简单的模型: 主动抓取目标的指标接口(HTTP 协议)获取监控指标, 再存储到本地或远端的时序数据库. Prometheus 对于指标接口有一套固定的格式要求, 格式大致如下:

# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="post",code="200"} 1027
http_requests_total{method="post",code="400"} 3

对于自己写的代码, 我们当然可以使用 Prometheus 的 SDK 暴露出上述格式的指标. 但对于大量现有服务, 系统甚至硬件, 它们并不会暴露 Prometheus 格式的指标.

比如说:

  • Linux 的很多指标信息以文件形式记录在 proc 下的各个目录中, 如 /proc/meminfo 里记录内存信息, /proc/stat 里记录 CPU 信息;
  • Redis 的监控信息需要通过 INFO 命令获取;
  • 路由器等硬件的监控信息需要通过 `SNMP 协议获取;

要监控这些目标, 我们有两个办法, 一是改动目标系统的代码, 让它主动暴露 Prometheus 格式的指标, 当然, 对于上述几个场景这种办法完全是不现实的.
这时候就只能采用第二种办法:

编写一个代理服务, 将其它监控信息转化为 Prometheus 格式的指标——这个代理服务就是exporter

2. exporter简介

广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target。

从Exporter的来源上来讲,主要分为两类:

1.社区提供的

Prometheus社区提供了丰富的Exporter实现,涵盖了从基础设施,中间件以及网络等各个方面的监控功能。这些Exporter可以实现大部分通用的监控需求。

https://exporterhub.io/

2.用户自定义的

除了直接使用社区提供的Exporter程序以外,用户还可以基于Prometheus提供的Client Library创建自己的Exporter程序,目前Promthues社区官方提供了对以下编程语言的支持:Go、Java/Scala、Python、Ruby。同时还有第三方实现的如:Bash、C++、Common Lisp、Erlang,、Haskeel、Lua、Node.js、PHP、Rust等。

prometheus四种类型的指标Counter 计数,Gauge 观测类,Histogram 直方,Summary 摘要 用golang语言如何构造这4种类型对应的指标,二是搞清楚修改指标值的场景和方式。

在prometheus中如果要监控服务器和应用的各种指标,需要用各种各样的exporter服务,例如node_exportes、mysql_exportes、pgsql_exportes等。这些都是官方或者第三方已经提供好的。

但是如果自己想要监控一些其它exportes没有的指标,则就需要自己去构建一个属于自己的exportes,好在官方提供相关的库,目前支持以下语言:

官方支持语言:

  • Go
  • Java or Scala
  • Python
  • Ruby
  • Rust

3. exporter编写指导

Prometheus 官方文档中 Writing Exporter 这篇写得非常全面, 假如你要写 exporter 推荐先通读一遍, 限于篇幅, 这里只概括一下:

做到开箱即用(默认配置就可以直接开始用)

推荐使用 YAML 作为配置格式

指标使用下划线命名

为指标提供 HELP String (指标上的 # HELP 注释, 事实上这点大部分 exporter 都没做好)

为 Exporter 本身的运行状态提供指标

可以提供一个落地页

metric的类型

在开始之前需要了解下metric的类型划分

要在Golang中生成Prometheus数据,你可以使用Prometheus的官方客户端库 prometheus/client_golang。这个库允许你定义和暴露自定义的指标,并通过HTTP端点将这些指标暴露给Prometheus服务器。

以下是一个简单的示例,展示如何使用Golang生成Prometheus数据:

4. 安装依赖

首先,你需要安装Prometheus的Golang客户端库:

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

5. 编写代码

接下来,编写一个简单的Golang程序来生成和暴露Prometheus指标。

package main

import (
	"net/http"
	"time"

	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
	// 创建一个自定义的Gauge指标
	customMetric := prometheus.NewGauge(prometheus.GaugeOpts{
		Name: "my_custom_metric",
		Help: "This is a custom metric",
	})

	// 注册指标
	prometheus.MustRegister(customMetric)

	// 启动一个goroutine来更新指标值
	go func() {
		for {
			// 模拟一些业务逻辑,更新指标值
			customMetric.Set(float64(time.Now().Unix()))
			time.Sleep(10 * time.Second)
		}
	}()

	// 暴露指标端点
	http.Handle("/metrics", promhttp.Handler())
	http.ListenAndServe(":8080", nil)
}

6. 运行程序

运行这个Golang程序:

go run main.go

程序将在本地的8080端口上启动一个HTTP服务器,并暴露 /metrics 端点。

7. 访问指标

你可以通过浏览器或 curl 命令访问 http://localhost:8080/metrics,查看生成的Prometheus指标。

curl http://localhost:8080/metrics

你应该会看到类似以下的输出:

# HELP my_custom_metric This is a custom metric
# TYPE my_custom_metric gauge
my_custom_metric 1.623456789e+09

8. 配置Prometheus

最后,你需要在Prometheus的配置文件中添加这个目标,以便Prometheus服务器可以定期抓取这些指标。

在 prometheus.yml 中添加以下内容:

scrape_configs:
  - job_name: 'my_golang_app'
    static_configs:
      - targets: ['localhost:8080']

然后重启Prometheus服务器,它将会开始抓取你的Golang应用程序暴露的指标。

9. 总结

通过使用 prometheus/client_golang 库,你可以轻松地在Golang中生成和暴露Prometheus指标。这个示例展示了如何创建一个简单的Gauge指标,并通过HTTP端点暴露它。你可以根据需要扩展这个示例,添加更多的指标类型(如Counter、Histogram等)和更复杂的业务逻辑。

到此这篇关于使用golang生成prometheus格式数据的文章就介绍到这了,更多相关golang生成prometheus数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析Golang中调度器的关键机制与性能

    浅析Golang中调度器的关键机制与性能

    Golang的调度器是其并发模型的核心组件,负责管理Goroutine的调度和执行,本文将从理论和代码层面分析Golang调度器的关键机制,感兴趣的可以了解下
    2025-03-03
  • Go语言文件操作的方法

    Go语言文件操作的方法

    这篇文章主要介绍了Go语言文件操作的方法,涉及文件的读写及关闭等操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 如何使用工具自动监测SSL证书有效期并发送提醒邮件

    如何使用工具自动监测SSL证书有效期并发送提醒邮件

    本文介绍了如何开发一个工具,用于每日检测SSL证书剩余有效天数并通过邮件发送提醒,工具基于命令行,通过SMTP协议发送邮件,需配置SMTP连接信息,本文还提供了配置文件样例及代码实现,帮助用户轻松部署和使用该工具
    2024-10-10
  • golang 定时任务方面time.Sleep和time.Tick的优劣对比分析

    golang 定时任务方面time.Sleep和time.Tick的优劣对比分析

    这篇文章主要介绍了golang 定时任务方面time.Sleep和time.Tick的优劣对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-05-05
  • Golang中panic与recover的区别

    Golang中panic与recover的区别

    这篇文章主要介绍了Golang中panic与recover的区别,文章基于Golang的基础内容展开panic与recover的区别介绍,需要的小伙伴可以参考一下
    2022-06-06
  • 使用Go实现在命令行输出好看的表格

    使用Go实现在命令行输出好看的表格

    这篇文章主要介绍了使用Go实现在命令行输出好看的表格方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Golang基础常识性面试中常见的六大陷阱及应对技巧总结

    Golang基础常识性面试中常见的六大陷阱及应对技巧总结

    Go是一门简单有趣的语言,但与其他语言类似,它会有一些技巧,这篇文章主要给大家介绍了关于Golang基础常识性面试中常见的六大陷阱及应对技巧的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-08-08
  • GoLand编写 TCP 端口扫描器的详细过程

    GoLand编写 TCP 端口扫描器的详细过程

    TCP,也就是传输控制协议(Transmission Control Protocol),这篇文章主要介绍了Go语言(Golang)编写 TCP 端口扫描器,需要的朋友可以参考下
    2023-05-05
  • Go gin框架加载Html模板文件的方法

    Go gin框架加载Html模板文件的方法

    这篇文章主要介绍了Go gin框架加载Html模板文件的方法,Gin框架没有内置静态文件服务,但可以使用gin.Static或gin.StaticFS中间件来提供静态文件服务,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • Golang实现Redis事务深入探究

    Golang实现Redis事务深入探究

    这篇文章主要介绍了Golang实现Redis事务深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01

最新评论