Go语言开发Prometheus Exporter示例
一、Prometheus中的基本概念
Prometheus将所有数据存储为时间序列,这里先来了解一下prometheus中的一些基本概念
指标名和标签
每个时间序列都由指标名和一组键值对(也称为标签)唯一标识。
metric的格式如下:
<metric name>{<label name>=<label value>, ...}
例如:
http_requests_total{host="192.10.0.1", method="POST", handler="/messages"}
http_requests_total是指标名;
host、method、handler是三个标签(label),也就是三个维度;
查询语句可以基于这些标签or维度进行过滤和聚合;
指标类型
Prometheus client库提供四种核心度量标准类型。注意是客户端。Prometheus服务端没有区分类型,将所有数据展平为无类型时间序列。
1、 Counter:只增不减的累加指标
Counter就是一个计数器,表示一种累积型指标,该指标只能单调递增或在重新启动时重置为零,例如,您可以使用计数器来表示所服务的请求数,已完成的任务或错误。
2、 Gauge:可增可减的测量指标
Gauge是最简单的度量类型,只有一个简单的返回值,可增可减,也可以set为指定的值。所以Gauge通常用于反映当前状态,比如当前温度或当前内存使用情况;当然也可以用于“可增加可减少”的计数指标。
3、Histogram:自带buckets区间用于统计分布的直方图
Histogram主要用于在设定的分布范围内(Buckets)记录大小或者次数。
例如http请求响应时间:0-100ms、100-200ms、200-300ms、>300ms 的分布情况,Histogram会自动创建3个指标,分别为:
事件发送的总次数<basename>_count:比如当前一共发生了2次http请求
所有事件产生值的大小的总和<basename>_sum:比如发生的2次http请求总的响应时间为150ms
事件产生的值分布在bucket中的次数<basename>_bucket{le="上限"}:比如响应时间0-100ms的请求1次,100-200ms的请求1次,其他的0次
4、Summary:数据分布统计图
Summary和Histogram类似,都可以统计事件发生的次数或者大小,以及其分布情况。
Summary和Histogram都提供了对于事件的计数_count以及值的汇总_sum,因此使用_count,和_sum时间序列可以计算出相同的内容。
同时Summary和Histogram都可以计算和统计样本的分布情况,比如中位数,n分位数等等。不同在于Histogram可以通过histogram_quantile函数在服务器端计算分位数。 而Sumamry的分位数则是直接在客户端进行定义。因此对于分位数的计算。 Summary在通过PromQL进行查询时有更好的性能表现,而Histogram则会消耗更多的资源。相对的对于客户端而言Histogram消耗的资源更少。
作业和实例
在Prometheus中,一个可以拉取数据的端点IP:Port叫做一个实例(instance),而具有多个相同类型实例的集合称作一个作业(job)
- job: api-server
- instance 1: 1.2.3.4:5670
- instance 2: 1.2.3.4:5671
- instance 3: 5.6.7.8:5670
- instance 4: 5.6.7.8:5671
当Prometheus拉取指标数据时,会自动生成一些标签(label)用于区别抓取的来源:
job:配置的作业名;
instance:配置的实例名,若没有实例名,则是抓取的IP:Port。
对于每一个实例(instance)的抓取,Prometheus会默认保存以下数据:
up{job="<job>", instance="<instance>"}:如果实例是健康的,即可达,值为1,否则为0;
scrape_duration_seconds{job="<job>", instance="<instance>"}:抓取耗时;
scrape_samples_post_metric_relabeling{job="<job>", instance="<instance>"}:指标重新标记后剩余的样本数。
scrape_samples_scraped{job="<job>", instance="<instance>"}:实例暴露的样本数
该up指标对于监控实例健康状态很有用。
二、最简单的Exporter
当你安装好go的开发环境,并下载好Prometheus依赖包到vendor以后,就可以编译个最简单的Exporter,代码如下:
package main import (
"log"
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
) func main() {
http.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(":8080", nil))
}
执行go build编译运行,然后访问http://127.0.0.1:8080/metrics就可以看到采集到的指标数据。
这段代码仅仅通过http模块指定了一个路径/metrics,并将client_golang库中的promhttp.Handler()作为处理函数传递进去后,就可以获取指标数据了。这个最简单的 Exporter 内部其实是使用了一个默认的收集器NewGoCollector采集当前Go运行时的相关信息,比如go堆栈使用、goroutine数据等等。
三、Demo Exporter的目录结构
项目的目录结构如下:
prometheus-exporter/
|-- collector
`-- vendor
`-- github.com
|-- beorn7
6 |-- golang
7 |-- matttproud
`-- prometheus
vendor是项目依赖的外部包
collector实现一个采集器,用于采集指标数据
四、代码实现
包括以下几个主要的步骤。
1、定义指标
定义指标就是创建指标的描述符,通常把要采集的指标描述符放在一个结构体里:
// 指标结构体
type Metrics struct {
metrics map[string]*prometheus.Desc
mutex sync.Mutex
} /**
* 函数:newGlobalMetric
* 功能:创建指标描述符
*/
func newGlobalMetric(namespace string, metricName string, docString string, labels []string) *prometheus.Desc {
return prometheus.NewDesc(namespace+"_"+metricName, docString, labels, nil)
} /**
* 工厂方法:NewMetrics
* 功能:初始化指标信息,即Metrics结构体
*/
func NewMetrics(namespace string) *Metrics {
return &Metrics{
metrics: map[string]*prometheus.Desc{
"my_counter_metric": newGlobalMetric(namespace, "my_counter_metric", "The description of my_counter_metric", []string{"host"}),
"my_gauge_metric": newGlobalMetric(namespace, "my_gauge_metric","The description of my_gauge_metric", []string{"host"}),
},
}
}
调用工厂方法即可创建一个结构体的实例
2、注册指标
metrics := collector.NewMetrics(*metricsNamespace) // 创建指标结构体实例
registry := prometheus.NewRegistry()
registry.MustRegister(metrics) // 注册指标
3、数据采集
数据采集需要实现collector的两个接口:
/**
* 接口:Describe
* 功能:传递结构体中的指标描述符到channel
*/
func (c *Metrics) Describe(ch chan<- *prometheus.Desc) {
for _, m := range c.metrics {
ch <- m
}
} /**
* 接口:Collect
* 功能:抓取最新的数据,传递给channel
*/
func (c *Metrics) Collect(ch chan<- prometheus.Metric) {
c.mutex.Lock() // 加锁
defer c.mutex.Unlock() mockCounterMetricData, mockGaugeMetricData := c.GenerateMockData()
for host, currentValue := range mockCounterMetricData {
ch <-prometheus.MustNewConstMetric(c.metrics["my_counter_metric"], prometheus.CounterValue, float64(currentValue), host)
}
for host, currentValue := range mockGaugeMetricData {
ch <-prometheus.MustNewConstMetric(c.metrics["my_gauge_metric"], prometheus.GaugeValue, float64(currentValue), host)
}
}
4、启动HTTP服务
http.Handle(*metricsPath, promhttp.HandlerFor(registry, promhttp.HandlerOpts{}))
http.ListenAndServe(":"+*listenAddr, nil)
这只是一个Demo,当实际需要开发一个exporter时,你需要重新定义要抓取的指标,并添加采集数据的具体逻辑。
Go语言开发Prometheus Exporter示例的更多相关文章
- 【Linux 操作系统】阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 博客总结 : 设置SecureCRT ...
- 用Hyperledger Fabric(超级账本)来构建Java语言开发区块链的环境
面向 Java 开发人员的链代码简介 您或许听说过区块链,但可能不确定它对 Java™ 开发人员有何用.本教程将帮助大家解惑.我将分步展示如何使用 Hyperledger Fabric v0.6 来构 ...
- 编写一个简单的基于jmespath 的prometheus exporter
目的很简单,因为系统好多监控指标是通过json 暴露的,并不是标准的prometheus metrics 格式,处理方法 实际上很简单,我们可以基于jsonpath 解析json数据,转换为prome ...
- 【Apache Pulsar】Apache Pulsar单机环境及Go语言开发环境搭建
0x01 简介 Apache Pulsar是一个开源的分布式发布-订阅消息系统,与Kafka类似,但比后者更加强大.Pulsar最初由Yahoo开发并维护,目前已经成为Apache软件组织的一个孵化子 ...
- 1.2Linux下C语言开发基础(学习过程)
===============第二节 Linux下C语言开发基础=========== ********************** 重要知识点总结梳理********************* 一 ...
- unity3D用什么语言开发好?
unity3D用什么语言开发好? 一.总结 一句话总结:选c# 同时U3D团队也会把支持的重心转移到C#,也就是说文档和示例以及社区支持的重心都在C#,C#的文档会是最完善的,C#的代码实例会是最详细 ...
- 阿里云服务器 操作实战 部署C语言开发环境(vim配置,gcc) 部署J2EE网站(jdk,tomcat)
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 博客总结 : 设置SecureCRT ...
- Mac OSX下Go语言开发环境的搭建与配置--使用InteliJ IDEA 13
折腾了一上午终于把go语言的ide配置好了. 其实GO语言的语法和特性早在去年的时候就学习了一遍.结果后来一直没机会进行开发,结果还是个GO小白.感叹一下,要学好一门编程语言唯一的途径就是多写代码.. ...
- C语言-- static 全局使用示例
C语言-- static 全局使用示例 前言:看到很多使用Objective-C开发IOS的大牛,有时候会使用static全局变量,相比之下,我却很少用这个,从而很少对其有着比较有实质意义的理解,甚 ...
随机推荐
- xargs实例
1. 当你使用rm命令去删除很多的文件时,你可能会得到错误信息:“/bin/rm Argument list too long – Linux”.这时可以用xargs来避免这个问题 find ~ -n ...
- GIT 身份验证失败问题解决方案,由于修改密码产生的问题
fatal: Authentication failed for 'http:xxxxxxxxxx.git/' 解决方案 1. git config --global user.name " ...
- python基础(10)-匿名函数&内置函数
匿名函数 例子 返回两个数的和 def add(x, y): return x + y # 等价于 add = lambda x, y: x + y 返回字典中值最大的key dic = {'a': ...
- 引入css的两种方式
摘自:https://www.cnblogs.com/gyjWEB/p/4831646.html 在HTML中引入css的其中的两个方法: 1.如果使用链接式,需要使用如下的语句引入外部css文件: ...
- Vue脚手架使用步骤 2.9.6版本
转载自:https://blog.csdn.net/sky_LQ/article/details/80729547 Vue脚手架使用步骤 2018年06月19日 12:10:35 sky_LQ 阅读数 ...
- mysql如何给字母数字混合的字段排序?
mysql> select * from t_SpiritInside; +------+ | col | +------+ | s1 | | s2 | | s11 | | s12 ...
- 一个ping大包不通问题的解决过程
1.问题描述 存在问题: 深圳的采集机MQ程序无法与应用服务器进行通讯,表现为:获取小数据时正常,获取大数据时超时 场景图如下 2.数据下载测试 使用SCP工具和FTP工具进行数据下载测试,主要是想排 ...
- SparkML之推荐引擎(二)---推荐模型评估
本文内容和代码是接着上篇文章来写的,推荐先看一下哈~ 我们上一篇文章是写了电影推荐的实现,但是推荐内容是否合理呢,这就需要我们对模型进行评估 针对推荐模型,这里根据 均方差 和 K值平均准确率 来对模 ...
- Docker:Windows7下使用docker toolbox(1)
一.安装 官方网址:https://docs.docker.com/docker-for-windows/install/ win10以下安装:https://www.docker.com/produ ...
- 关于UI适配的文档
第一部分:原理 (1)根据当前屏幕尺寸与开发预设屏幕尺寸尺寸得出以下参数. 1 XRatio:当前屏幕尺寸与开发尺寸的X轴比例 2 YRtaio:当前屏幕尺寸与开发尺寸的Y轴比例 3minRatio: ...