Exporter简单入门
Contents
各个采集端(Exporter)是 Prometheus 的数据来源,在看了多个官方的 exporter 后,总结了一下。
如何编写 Exporter
编写 Exporter,有许多种语言的实现,下面以 Go 框架为基础。
总体概括,Exporter 编写主要有下面三个步骤:
「1」创建采集项 Collector。Collector 核心为 Collect 方法,指标项结果处理后,通过 ch 管道传出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
type Collector struct {} func (c *Collector) Describe(ch chan<- *prometheus.Desc) {} func (c *Collector) Collect(ch chan<- prometheus.Metric) { desc := prometheus.NewDesc( prometheus.BuildFQName("node", "cpu", "info"), "Show CPU information.", []string{"label_1", "label_2", "label_3"}, prometheus.Labels{"Hello": "World"}, ) ch <- prometheus.MustNewConstMetric( desc, prometheus.CounterValue, 1.0, "1.0", "2.0", "3.0", ) }
「2」注册采集项对象。通过框架标准方法注册采集项 Collector
1 2 3
// Create a non-global registry. reg := prometheus.NewRegistry() _ = reg.Register(c)
「3」绑定HttpHandler,并启动web服务
1 2 3 4
// Expose metrics and custom registry via an HTTP server // using the HandleFor function. "/metrics" is the usual endpoint for that. http.Handle("/node_metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{Registry: reg})) log.Fatal(http.ListenAndServe(":8080", nil))
Exporter 本质上只是一个web服务。Prometheus 会通过配置中的 API,对 Exporter 发起请求,Exporter 对应的借口进行响应。最终通过触发 Collector.Collect
函数进行采集。
在 Collector.Collect
函数中,传入的参数是:ch chan<- prometheus.Metric
。采集指标通过这个管道往调用层传输,最终输出到API结果中。
采集指标 prometheus.Metric
也是有一定的结构、类型的。
采集指标主要使用到的类型包括:Gauge、Counter。另外两个 Histogram、Summary,一般不会使用到,这里不讲。
采集指标主要由 描述信息、值、label、固定label 组成
初始化指标实例的方法有很多,目前比较主流的方式是:先初始化描述信息、在执行 Collector.Collect
动作时,填充其他信息。
|
|
prometheus.NewDesc
具体参数如下:
|
|
- fqName - 采集指标名称,通过
prometheus.BuildFQName
函数生成,也可以自定义 - help - 采集指标的 help 信息
- variableLabels - 采集指标的 label
- constLabels - 固定的采集指标 label
prometheus.MustNewConstMetric
具体参数如下:
|
|
- desc - 描述信息
- valueType - 指标值的类型
- value - 指标值
- labelValues - label 的值
如上面的例子,将输出:
|
|
完整事例代码如下:
|
|
总结
- Prometheus 的 Exporter 就是一个 Web 服务端,Prometheus 通过定时访问对应的 API 进行指标项的采集
- Exporter 的编写按照上述的 “三板斧” 进行
- 最终采集指标的值,通过管道传输到调用层