前言

想要监控公司生产环境一些节点的运行状态,目前公司做的有监控平台,可以拿到各个节点的运行数据,但是是看不到趋势的,只能看到当前时间点的状态,为了能够看到数据的趋势,为服务器的扩缩容做更好的决策,需要写一个 Prometheus 的 Exporter 将监控平台的数据导出

监控平台需要登录,数据有 API 接口、json ,具体登录平台拿 json 数据的过程不表

实践

一般来说,用 Go 来写 Prometheus 的 Exporter 是用 Prometheus 官方的实现:https://github.com/prometheus/client_golang 来做,简单看了下网上的示例,如果要实现动态 label 则很麻烦,需要实现一个自己的 Controller ,如果只暴露一两个指标,就很方便,我们希望能够用服务器的主机名和服务器的 IP ,以及客户的名称作为 label ,方便后面做可视化的时候筛选指标。那么有没有什么简单一点的方式呢

哎,还真有,来介绍下今天的主角:https://github.com/VictoriaMetrics/metrics 用它的时候和写这篇文章的时候才刚刚过 400 star,和官方的 Exporter 差 4k 多 star ,知名度差不少

VictoriaMetrics 类似 Prometheus,也是一个开源的时序数据库,可以简单的认为是 Prometheus Plus,Victoria/Metrics 是 VictoriaMetrics 提供的 prometheus/client_golang 的轻量实现,用它,可以不用去实现自己的 Controller ,轻松的导出指标给 Prometheus

来看下 Victoria/Metrics 是怎么动态的导出数据的,来看核心方法

// 动态更新数据
func UpdateMetric(name string, labels map[string]string, value float64) {
// Construct `metric{labels}`
var labelValues []string
for k, v := range labels {
labelValues = append(labelValues, fmt.Sprintf("%s=%q", k, v))
}
sort.Strings(labelValues)
metricName := fmt.Sprintf("%s{%s}", name, strings.Join(labelValues, ","))

// Update the counter
metrics.GetOrCreateFloatCounter(metricName).Set(value)
}
// 导出示例,实际用的时候把里面的数据换成变量即可
UpdateMetric("test",map[string]string{"testIP": "127.0.0.1"},1)

是不是比官方的实现要简单太多了,接下来咱们看导出到 HTTP 的写法,来看下列伪代码

// 起 HTTP Server 略
http.HandleFunc("/metrics", func(w http.ResponseWriter, req *http.Request) {
// 获取数据……
// GetDataFunc
// 创建 or 更新指标
UpdateMetric()
// 发布指标
metrics.WritePrometheus(w, true)
}

强烈安利 Victoria/Metrics 这个包,用过的都说好~

补充

如果单纯做监控用上面这个就很好,如果你正好用了 Gin 框架,不妨试试 github.com/penglongli/gin-metrics 这个包,用法可以参考我写的 CocoaSyncerPrometheusExporter() 方法(传送门),可以在 Gin 框架的基础上方便的集成自己的一些业务数据