支持remote write和exemplar的prometheus服务

本文涉及的产品
可观测监控 Prometheus 版,每月50GB免费额度
简介: 支持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 build
WORKDIR /app
RUN apk add git && apk add librdkafka-dev pkgconf && apk add build-base && apk add alpine-sdk
ENV http_proxy= GO111MODULE=on GOPROXY=https://goproxy.cn,direct GOPRIVATE=*.weimob.com
COPY go.mod .
COPY go.sum .
COPY . .
RUN cd cmd/ && GOOS=linux go build -tags musl -o ../prometheusWriter main.go
CMD ["/app/prometheusWriter"]
FROM alpine:latest
WORKDIR /app
RUN sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories
RUN apk add tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
COPY --from=build /app/prometheusWriter /app/
RUN chmod +x /app/prometheusWriter
COPY config.json /app/config.json
CMD ["/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\"}"}'
相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
目录
相关文章
|
6月前
|
Prometheus 监控 Kubernetes
如何用 Prometheus Operator 监控 K8s 集群外服务?
如何用 Prometheus Operator 监控 K8s 集群外服务?
|
1月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
123 60
|
1月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
215 62
|
数据采集 Prometheus 监控
监控利器之Prometheus基于Blackbox_exporter监控服务的端口
监控利器之Prometheus基于Blackbox_exporter监控服务的端口
441 0
|
4月前
|
弹性计算 Prometheus 监控
从自建开源 Prometheus 迁移到阿里云托管 Prometheus 服务
阿里云可观测监控 Prometheus 版提供高性能、高可用、全托管的监控服务,对接开源生态,支持 Kubernetes、ECS 等场景,解决了自建 Prometheus+Thanos 高成本、运维复杂的问题。本文讨论在各个典型场景下的迁移方案。
12035 71
|
存储 Prometheus 监控
服务搭建篇(一) 搭建基于prometheus + node_exporter + grafana + Alertmanager 的监控报警系统 , 保姆级教程
Alertmanager处理客户端应用程序(如Prometheus服务器)发送的警报。它负责重复数据删除、分组,并将它们路由到正确的接收器集成,如电子邮件、PagerDuty或OpsGenie。它还负责静音和抑制警报
332 0
|
6月前
|
存储 Prometheus Cloud Native
助力工业物联网,工业大数据之服务域:Prometheus的介绍【三十六】
助力工业物联网,工业大数据之服务域:Prometheus的介绍【三十六】
95 1
|
6月前
|
Prometheus 监控 Cloud Native
助力工业物联网,工业大数据之服务域:服务器性能监控Prometheus及项目总结【三十五】
助力工业物联网,工业大数据之服务域:服务器性能监控Prometheus及项目总结【三十五】
71 1
|
存储 Prometheus Kubernetes
对比开源丨Prometheus 服务多场景存储压测全解析
作为国内领先的云服务提供商,阿里云提供了优秀的可观测全套解决方案,阿里云 Prometheus 服务正是其中重要一环,相比于开源版本 Prometheus,阿里云的 Prometheus 服务无论是易用性、扩展性、性能均有大幅度提升。
对比开源丨Prometheus 服务多场景存储压测全解析
|
存储 数据采集 Prometheus
免费试用!容器集群监控利器 阿里云 Prometheus 服务正式商业化
阿里云Prometheus服务经过近半年的公测试用,终于在新年伊始开始提供商业化服务,感谢广大用户在这半年里和我们一起成才和蜕变。我们坚信阿里云Prometheus服务会在云原生时代提供给大家最佳的监控体验。欢迎开通免费试用,入群更能享受专属优惠。
1166 0
免费试用!容器集群监控利器 阿里云 Prometheus 服务正式商业化