我目前正在为遥测网络应用程序编写一个 Prometheus 导出器。
我已阅读此处的文档“编写导出器”,虽然我了解实现自定义收集器以避免竞争条件的用例,但我不确定我的用例是否适合直接检测。
基本上,网络指标通过网络设备通过 gRPC 进行流式传输,因此我的导出器只需接收它们,而不必有效地抓取它们。
我使用以下代码直接检测:
我使用 promauto 包声明我的指标以保持代码紧凑:
package metrics
import (
"github.com/lucabrasi83/prom-high-obs/proto/telemetry"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
)
var (
cpu5Sec = promauto.NewGaugeVec(
prometheus.GaugeOpts{
Name: "cisco_iosxe_iosd_cpu_busy_5_sec_percentage",
Help: "The IOSd daemon CPU busy percentage over the last 5 seconds",
},
[]string{"node"},
)
下面是我如何简单地设置 gRPC 协议缓冲区解码消息的指标值:
cpu5Sec.WithLabelValues(msg.GetNodeIdStr()).Set(float64(val))
最后,这是我的主循环,它基本上处理我感兴趣的指标的遥测 gRPC 流:
for {
req, err := stream.Recv()
if err == io.EOF {
return nil
}
if err != nil {
logging.PeppaMonLog(
"error",
fmt.Sprintf("Error while reading client %v stream: %v", clientIPSocket, err))
return err
}
data := req.GetData()
msg := &telemetry.Telemetry{}
err = proto.Unmarshal(data, msg)
if err != nil {
log.Fatalln(err)
}
if !logFlag {
logging.PeppaMonLog(
"info",
fmt.Sprintf(
"Telemetry Subscription Request Received - Client %v - Node %v - YANG Model Path %v",
clientIPSocket, msg.GetNodeIdStr(), msg.GetEncodingPath(),
),
)
}
}
}
我使用 Grafana 作为前端,到目前为止,在关联 Prometheus 公开的指标与直接在设备上检查指标时,还没有看到任何特定的差异。
所以我想了解这是否遵循 Prometheus 最佳实践,或者我仍然应该采用自定义收集器路线。
凤凰求蛊
相关分类