最近项目组在做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服务的更多相关文章

  1. prometheus服务发现机制

    一. Prometheus与服务发现 1.1 目前支持的服务发现方式 二. 案例 2.1 基于文件的服务发现 2.2 基于Consul的服务发现 三.本地测试 3.1 基于文件的服务发现 1.测试环境 ...

  2. WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务

    原文:WCF技术剖析之五:利用ASP.NET兼容模式创建支持会话(Session)的WCF服务 在<基于IIS的WCF服务寄宿(Hosting)实现揭秘>中,我们谈到在采用基于IIS(或者 ...

  3. django 简易博客开发 5 markdown支持、代码高亮、gravatar头像服务

    上一篇博客介绍了comments库使用及ajax支持,现在blog已经具备了基本的功能,但是只能发表文字,不支持富文本编辑.今天我们利用markdown添加富文本支持. markdown语法说明: h ...

  4. 一个尖括号能干什么,画一个笑脸开始(为了支持交互,它又增添了JavaScript。HTML页面也越来越臃肿。于是CSS便诞生了。API和核心代码的出现使HTML能够访问更复杂的软件功能--支持更高级的交互和云服务集成。这就是今天的HTML5)

    一个尖括号 < 一个尖括号能干什么 < ? 你可以编出一顶帽子 <(:-p 或一张笑脸 :-> 再或者更直接一些 20世纪90年代初,html作为一种简单标记语言面世,用于在互 ...

  5. linux(centos8):安装prometheus服务端/node_exporter客户端(prometheus 2.18.1)

    一,prometheus的用途 Prometheus是一个开源的系统监控和警报工具包 相比其他监控系统,它更适用于微服务的体系架构 它使用各种专用exporter,用来实现对硬件/存储/数据库/web ...

  6. 轻松搞定Win8 IIS支持SVC 从而实现IIS寄宿WCF服务

    写在前面 为了尝试在IIS中寄宿WCF服务,需要配置IIS支持SVC命令,于是便有了在DOS命令中用到ServiceModelReg.exe注册svc命令. 坑爹的是注册成功后就开始报错.无奈之下两次 ...

  7. 【源码下载】分享一个支持自安装自卸载的Windows服务

    NetworkComms网络通信框架序言 这个程序来自  www.codeproject.com 具体的出处就忘了 服务器端的程序,我一般采用在windows服务中调用打开的方式,这样既能看到界面,又 ...

  8. 修改QGIS来支持DPI为96的WMTS/WMS服务

    缘由 因为各种各种wmts地图客户端产品的标准的支持不一定是一致的,就像ArcGIS不同版本加载WMTS图层的时候计算的规则就有差别(米和经纬度之间转换系数的区别),导致会出现适应各个客户端而出的WM ...

  9. Eureka【支持Remote Region】

    工程公共pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncod ...

随机推荐

  1. Json 文件 : 出现 Expected value at 1:0 问题的解决

    只要找一个json在线解析,验证你的json文件格式的正确性,错误可以忽略. 如要消除红叉,关闭Json Validation即可,如下操作:

  2. 微信小程序学习笔记三 路由的基本使用

    小程序中路由的使用 1.1 页面路由 在小程序中, 所有页面的路由全部由框架进行管理 1.2 页面栈 框架以栈的形式维护了当前的所有页面, 当发生路由切换的时候, 页面栈的表现如下: 1.3 获取当前 ...

  3. Jmeter的默认字体和窗口的设置方法(一次改动,永久生效!!!)

    因为每次打开jmeter看到的界面不如意,而且会影响工作发挥和效率,为了给大家带来良好的工作体验,为此给出最完美的设置方法,如下: 第一步: 找到jmeter所在目录--->bin---> ...

  4. docker安装与配置nginx详细过程

    注:大鸟飞过,此方式只用于快速搭建使用 第一步 pull nginx 命令:docker pull nginx 第二步 启动nginx 命令:docker run --name nginx -p 80 ...

  5. 刷题-力扣-337. 打家劫舍 III

    337. 打家劫舍 III 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber-iii 著作权归领扣网络所有.商 ...

  6. SpringMVC IO 文件上传

    1 public class FileUtil { 2 3 4 /** 5 * 读取文件内容,作为字符串返回 6 */ 7 public static String readFileAsString( ...

  7. MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解

    锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...

  8. Python - 面向对象编程 - 使用 super() 的一些注意事项

    super() 详解 https://www.cnblogs.com/poloyy/p/15223443.html 多继承中使用 super() class A: def test(self): pr ...

  9. Appium自动化(12) - 详解 HardwareActions 类里的方法和源码分析

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 HardwareAction ...

  10. 10分钟学会VS NuGet包私有化部署

    前言 我们之前实现了打包发布NuGet,但是发布后的引用是公有的,谁都可以访问,显然这种方式是不可取的. 命令版本:10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(ne ...