支持remote write和exemplar的prometheus服务
最近项目组在做Prometheus指标采集和告警,其中用到了Prometheus的exemplar特性,由于该特性比较新,当前支持该特性的存储有比较少。因此需要自行实现exemplar功能。
我在github上创建了一个代码库,内容如下:
功能支持列表
- 支持从kafka消费Prometheus指标数据,数据使用protobuf编码
- 支持Prometheus exemplar功能
- 支持exemplar的wal
- 支持remote write指标到存储
kafka消费端
本项目使用的是腾讯的cKafka
golang的kafka消费端需要用到github.com/confluentinc/confluent-kafka-go/kafka,使用该库之前需要安装librdkafka库,但不支持在Windows系统上安装librdkafka。安装步骤如下:
git clone https://github.com/edenhill/librdkafka.gitcd librdkafka./configuremakesudo make install
环境上运行时可以考虑将
librdkafka库编译到镜像中。如使用Alpine镜像时执行apk add librdkafka-dev pkgconf安装即可。官方文档中有提到,如果使用Alpine Linux ,编译方式为:go build -tags musl ./...
Metrics的写入
只需将metrics使用proto.Marshal编码到promWR即可:
func (c *client) WriteRaw( ctx context.Context, promWR []byte, opts WriteOptions,) (WriteResult, WriteError) { var result WriteResult encoded := snappy.Encode(nil, promWR) body := bytes.NewReader(encoded) req, err := http.NewRequest("POST", c.writeURL, body) if err != nil { return result, writeError{err: err} } req.Header.Set("Content-Type", "application/x-protobuf") req.Header.Set("Content-Encoding", "snappy") req.Header.Set("User-Agent", c.userAgent) req.Header.Set("X-Prometheus-Remote-Write-Version", "0.1.0") if opts.Headers != nil { for k, v := range opts.Headers { req.Header.Set(k, v) } } resp, err := c.httpClient.Do(req.WithContext(ctx)) if err != nil { return result, writeError{err: err} } result.StatusCode = resp.StatusCode defer resp.Body.Close() if result.StatusCode/100 != 2 { writeErr := writeError{ err: fmt.Errorf("expected HTTP 200 status code: actual=%d", resp.StatusCode), code: result.StatusCode, } body, err := ioutil.ReadAll(resp.Body) if err != nil { writeErr.err = fmt.Errorf("%v, body_read_error=%s", writeErr.err, err) return result, writeErr } writeErr.err = fmt.Errorf("%v, body=%s", writeErr.err, body) return result, writeErr } return result, nil}
metric的查询
使用victoriametrics时,强烈建议同时部署grafana,使用grafana中的Explore功能来查找metrics。victoriametrics的vmselect组件自带的UI很不方便。
镜像编译
如上所述,如果需要在需要Alpine Linux中进行编译,则需要在在Dockerfile中添加如下内容:
RUN apk add git && apk add librdkafka-dev pkgconf && apk add build-base && apk add alpine-sdk
由于上述lib的安装比较满,为了加快安装,可以将安装了这些lib的镜像作为基础镜像。
FROM golang:1.16.8-alpine3.14 as buildWORKDIR /appRUN apk add git && apk add librdkafka-dev pkgconf && apk add build-base && apk add alpine-sdkENV http_proxy= GO111MODULE=on GOPROXY=https://goproxy.cn,direct GOPRIVATE=*.weimob.comCOPY go.mod .COPY go.sum .COPY . .RUN cd cmd/ && GOOS=linux go build -tags musl -o ../prometheusWriter main.goCMD ["/app/prometheusWriter"]FROM alpine:latestWORKDIR /appRUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositoriesRUN apk add tzdataRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezoneCOPY --from=build /app/prometheusWriter /app/RUN chmod +x /app/prometheusWriterCOPY config.json /app/config.jsonCMD ["/app/prometheusWriter"]
支持Exemplar
Exemplar的数据结构比较简单,就是个ring buffer。
下面是使用curl命令进行查找的例子:
# curl '127.0.0.1:8000' --header 'Content-Type: application/json' -d '{"start":"1632980302","end":"1632980402","query":"{testlabel11=\"test\"}"}'
支持remote write和exemplar的prometheus服务的更多相关文章
- prometheus服务发现机制
一. Prometheus与服务发现 1.1 目前支持的服务发现方式 二. 案例 2.1 基于文件的服务发现 2.2 基于Consul的服务发现 三.本地测试 3.1 基于文件的服务发现 1.测试环境 ...
- WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务
原文:WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务 在<基于IIS的WCF服务寄宿(Hosting)实现揭秘>中,我们谈到在采用基于IIS(或者 ...
- django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务
上一篇博客介绍了comments库使用及ajax支持,现在blog已经具备了基本的功能,但是只能发表文字,不支持富文本编辑.今天我们利用markdown添加富文本支持. markdown语法说明: h ...
- 一个尖括号能干什么,画一个笑脸开始(为了支持交互,它又增添了JavaScript。HTML页面也越来越臃肿。于是CSS便诞生了。API和核心代码的出现使HTML能够访问更复杂的软件功能--支持更高级的交互和云服务集成。这就是今天的HTML5)
一个尖括号 < 一个尖括号能干什么 < ? 你可以编出一顶帽子 <(:-p 或一张笑脸 :-> 再或者更直接一些 20世纪90年代初,html作为一种简单标记语言面世,用于在互 ...
- linux(centos8):安装prometheus服务端/node_exporter客户端(prometheus 2.18.1)
一,prometheus的用途 Prometheus是一个开源的系统监控和警报工具包 相比其他监控系统,它更适用于微服务的体系架构 它使用各种专用exporter,用来实现对硬件/存储/数据库/web ...
- 轻松搞定Win8 IIS支持SVC 从而实现IIS寄宿WCF服务
写在前面 为了尝试在IIS中寄宿WCF服务,需要配置IIS支持SVC命令,于是便有了在DOS命令中用到ServiceModelReg.exe注册svc命令. 坑爹的是注册成功后就开始报错.无奈之下两次 ...
- 【源码下载】分享一个支持自安装自卸载的Windows服务
NetworkComms网络通信框架序言 这个程序来自 www.codeproject.com 具体的出处就忘了 服务器端的程序,我一般采用在windows服务中调用打开的方式,这样既能看到界面,又 ...
- 修改QGIS来支持DPI为96的WMTS/WMS服务
缘由 因为各种各种wmts地图客户端产品的标准的支持不一定是一致的,就像ArcGIS不同版本加载WMTS图层的时候计算的规则就有差别(米和经纬度之间转换系数的区别),导致会出现适应各个客户端而出的WM ...
- Eureka【支持Remote Region】
工程公共pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncod ...
随机推荐
- Semaphore 类 的使用理解C#
示例 下面的代码示例创建一个信号量,其最大计数为3,初始计数为零. 该示例启动五个线程,这会阻止等待信号量. 主线程使用 Release(Int32) 方法重载将信号量计数增加到其最大值,从而允许三个 ...
- 多线程编程<五>
1 /** 2 * 中断线程:当线程由于调用sleep(),join(),wait()而暂停时,如果中断它,则会收到一个InterruptedException异常. 3 * 调用Thread.isI ...
- vue3.0入门(二)
前言 最近在b站上学习了飞哥的vue教程 学习案例已上传,下载地址 指令 #id2{ // css部分 font-size: 24px; color: green; } v-bind:href=&qu ...
- golang map实现原理
这篇文章主要讲 map 的赋值.删除.查询.扩容的具体执行过程,仍然是从底层的角度展开.结合源码,看完本文一定会彻底明白 map 底层原理. 我要说明的是,这里对 map 的基本用法涉及比较少,我相信 ...
- 并发编程之:JUC并发控制工具
大家好,我是小黑,一个在互联网苟且偷生的农民工. 在上一期我们讲了Thread.join()方法和CountDownLatch,这两者都可以做到等待一个线程执行完毕之后当前线程继续执行,并且Count ...
- Python常见问题 - 写入数据到 excel 报 ValueError: invalid literal for int() with base 10 错误
背景 在上写入数据到excel中,报了以下错误 出现原因 对于写入excel场景下出现该错误的话,很大概率是写入数据的单元格原本的数据格式有问题 解决方法 清理掉单元格的旧数据,然后再写入就可以了
- Jenkins(7)- 解决Linux下忘记Jenkins密码
如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html admin密码未更改情况下 进入\ ...
- SQL Server Management Studio --- SSMS语言更换
问题描述 在安装了En版后,想更换为中文版,但换了中文安装源还是英文. 解决方法 运行 SQL Server Management Studio 通过菜单选择你想要使用的语言: 中文版:"工 ...
- 前端框架VUE——安装及初始化
本篇文章适合,想要学习 vue,但对 vue 又没有接触过的同学阅读,是非常基础的内容.告诉大家使用 vue 时的安装方式,及如何创建实例,展示内容. 一.安装方式 vue 是一种前端框架,所以使用前 ...
- EXCEL中给包含某个字段的单元格所在行标注颜色
条件格式->新建规则->使用公式确定要设置格式的单元格 公式: =COUNTIF($A1,"*字符串*") 注意:通配符的使用.