Prometheus 学习之——远端存储
前言
Prometheus 是 CNCF 收录的第二个项目,已经成为了云原生时代监控的标准。
一、总体架构
面对更多历史数据的持久化,Prometheus 单纯依靠本地存储远不足以应对,为此引入了远端存储。为了适应不同的远端存储,Prometheus 并没有选择对接各种存储,而是定义了一套读写存储接口,并引入了 Adapter 适配器,将 Prometheus 的读写请求转化为第三方远端存储接口,从而完成数据读写,整体架构如下:
目前已经实现 Adapter 的远程存储主要包括 InfuxDB、OpenTSDB、CreateDB、TiKV、Cortex、M3DB 等。
二、远端接口规范
Prometheus 通过 『HTTP POST 请求+protobuf 编码』方式调用 Adapter 的读接口和写接口,未来应该会将采用效率更高的『gRPC(HTTP2)+ Protobuf』方式。接口被定义在 remote.proto 文件中,内容如下:
//写请求参数
message WriteRequest {
repeated Prometheus.TimeSeries timeseries = 1;
}
//读请求参数
message ReadRequest {
repeated Query queries = 1;
}
//读返回参数
message ReadResponse {
repeated QueryResult results = 1;
}
//请求参数
message Query {
int64 start_timestamp_ms = 1;
int64 end_timestamp_ms = 2;
repeated Prometheus.LabelMatcher matchers = 3;
Prometheus.ReadHints hints = 4;
}
//查询结果
message QueryResult {
repeated Prometheus.TimeSeries timeseries = 1;
}
在上面的 proto 文件中定义了请求参数和返回结果,其中,请求参数 Query 主要包括监控数据查询的开始时间、结束时间和匹配的标签,这里 repeated 表示可以添加多个标签的条件筛选;返回参数 QueryResult 主要包括时间序列 TimeSeries,时间序列主要包含这个序列的标签和样本数据,样本数据以『时间戳:样本值』格式传输。
每种存储的 Adapter 都通过实现读接口和写接口对接到 Prometheus,当然,Adapter 也可以只实现其中一个接口。若通过 Adapter 实现 OpenTSDB 的一个写接口,那么 Prometheus 会将数据写入 OpenTSDB 中,对监控数据的查询可以借助 OpenTSDB 原生的查询接口实现。
下面通过官方提供的一个 InfluxDB Adapter 说明 Prometheus 远端存储接口的实现(代码路径为 Prometheus/documentation/examples/remote_storage/remote_storage_Adapter)。
- 首先启动写请求监听:
http.HandleFunc("/write", func(w http.ResponseWriter, r *http.Request))
- 接着,解析写请求的参数,并将其转化为指标格式:
compressed, err := ioutil.