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数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论