论如何通过java adapter获取prometheus remote write数据
1.如何实现prometheus remote write adapter java版本
prometheus 的remote write 与remote read 功能很强大,根据这两个功能,可以完全脱离对本地文件存储的依赖,并把数据存储变为可自定义的,现在来调研一下这个功能。
prometheus 官方提供各种remote write 的适配器,但唯独没有java语言的。
prometheus 官方remote write 版本
所以现在想解析prometheus 指标数据。
1.remote write
根据prometheus 的配置文件可以得知,remote_write 后面跟一个url路径,prometheus 会把每次刮取到的数据推到这个url上,于是我实现了一个简单的http接口:
1 | @PostMapping("/xx") |
但是发现报了一堆提示无法解析的错误,百度了一下发现是prometheus 的remote write格式比较特殊。
于是:
- 翻到prometheus github 源码,找到remote write 的文件格式:
https://github.com/prometheus/prometheus/blob/master/prompb/remote.proto
,并下载下来
同时需要下载同路径文件type.proto
,这两个文件互为依赖,最后把其他的依赖删掉
remote.proto
的头部1
2
3
4
5syntax = "proto3";
package prometheus;
option go_package = "prompb";
import "types.proto";
import "gogoproto/gogo.proto"; // 删掉types.proto
的头部1
2
3
4syntax = "proto3";
package prometheus;
option go_package = "prompb";
import "gogoproto/gogo.proto"; // 删掉至于为什么删掉,因为该依赖对于java来说没什么用处: 相关issue
1.1 引入依赖
- a.引入protobuf
1 | <properties> |
1.2 引入maven插件,用于把.proto
文件转化为.java
文件
1 | <build> |
1.3 重新编译项目,生成.java
文件
** 注意:**
- 新生成的文件路径参照
.proto
文件内package
的具体值。 - 文件不是源码形式,而是编译后的.class文件,在target目录下
1.4 重写rest api
1 | @PostMapping(value = "write") |
1.5 最后
至此,得出的writerequest 就是prometheus remote write 经处理后的数据。
2. prometheus 向influxdb存储数据
prometheus 大多与时序数据库一起结合使用,比较好的时序数据库有
influxdb
,OpenTSDB
,Druid
等等。
这里使用influxdb
进行调研
可以看到:influxdb 1.7+ 天然支持prometheus的remote read,以及remote write功能,也就是说,上文的java adapter是没有什么卵用的。。
不过至少了解了prometheus api的通信格式,也可以在以后进行脱离influxdb 的定制自开发。
Author: dadonggua