prometheus启动参数 --enable-feature=remote-write-receiver

准备

  • remote.proto

  • types.proto

  • gogo.proto

  • protoc-3.11.2-PLATFORM.zip

  • ./protoc/bin/protoc --proto_path=./imports --java_out=./java_output/ imports/types.proto

  • ./protoc/bin/protoc --proto_path=./imports --java_out=./java_output/ imports/remote.proto

  • ./protoc/bin/protoc --proto_path=./imports --java_out=./java_output/ imports/gogoproto/gogo.prot

迁移到springboot,为了方便,不做修改直接迁移到 src/main/java 目录下

调用api/v1/write

  • 添加依赖 pom.xml

    <!-- prometheus remote write 依赖 -->
    <!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java</artifactId><version>3.11.1</version></dependency><!-- https://mvnrepository.com/artifact/com.google.protobuf/protobuf-java-util --><dependency><groupId>com.google.protobuf</groupId><artifactId>protobuf-java-util</artifactId><version>3.11.1</version></dependency><!-- https://mvnrepository.com/artifact/org.xerial.snappy/snappy-java --><dependency><groupId>org.xerial.snappy</groupId><artifactId>snappy-java</artifactId><version>1.1.8.4</version></dependency>
    
  • metrics.config.TasksConfig
    package ...import lombok.Data;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.stereotype.Component;import java.util.List;
    import java.util.Map;@Data
    @Component
    @ConfigurationProperties(prefix = "tasks")
    @Slf4j
    public class TasksConfig {List<Item> items;@Datapublic static class Item {private String metric;private Map<String, String> labels;// ... 其他apollo配置}
    }
    
  • metrics.bean.bo.MetricPoint
    package ...;import ...metrics.config.TasksConfig;
    import lombok.Data;
    import java.util.Map;@Data
    public class MetricPoint {
    //    private String metric; // 指标名称private Map<String, String> tags; // 数据标签private long time = 0; // 时间戳,单位是秒private double value;private TasksConfig.Item conf; // conf.getTags() 数据标签
    }
    
  • PrometheusService
    package ...;import ...metrics.bean.bo.MetricPoint;
    import com.google.common.collect.Lists;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.entity.ByteArrayEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Service;
    import org.springframework.util.CollectionUtils;
    import org.xerial.snappy.Snappy;
    import prometheus.Types;import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    import java.util.Objects;@Service
    @Slf4j
    public class PrometheusService {@Value("${prometheus.remoteWriteUrl:http://192.168.50.101:9090/}")private String remoteWriteUrl;private final CloseableHttpClient httpClient = HttpClients.createSystem();public void remoteWrite(MetricPoint metricPoint) {remoteWrite(Lists.newArrayList(metricPoint));}public void remoteWrite(List<MetricPoint> metricPointList) {if (CollectionUtils.isEmpty(metricPointList)) {return;}List<Types.TimeSeries> timeSeriesList = createTimeSeries(metricPointList);prometheus.Remote.WriteRequest.Builder writeRequestBuilder = prometheus.Remote.WriteRequest.newBuilder();
    //        prometheus.Remote.WriteRequest writeRequest= writeRequestBuilder.addMetadata(Types.MetricMetadata.newBuilder().setTypeValue(Types.MetricMetadata.MetricType.HISTOGRAM_VALUE)).addAllTimeseries(timeSeriesList).build();prometheus.Remote.WriteRequest writeRequest = writeRequestBuilder.addAllTimeseries(timeSeriesList).build();try {byte[] compressed = Snappy.compress(writeRequest.toByteArray());HttpPost httpPost = new HttpPost(remoteWriteUrl + "api/v1/write");httpPost.setHeader("Content-type", "application/x-www-form-urlencoded");httpPost.setHeader("Content-Encoding", "snappy");httpPost.setHeader("X-Prometheus-Remote-Write-Version", "0.1.0");ByteArrayEntity byteArrayEntity = new ByteArrayEntity(compressed);httpPost.getRequestLine();httpPost.setEntity(byteArrayEntity);CloseableHttpResponse response = httpClient.execute(httpPost);if (response.getStatusLine().getStatusCode() > 299) {log.error("prometheus remoteWrite response error, data: [{}], response: [{}]", metricPointList, response);}} catch (Exception e) {log.error("prometheus remoteWrite error, data: [{}]", metricPointList, e);}}private List<Types.TimeSeries> createTimeSeries(List<MetricPoint> metricPointList) {List<Types.TimeSeries> timeSeriesList = new ArrayList<>();for (MetricPoint point : metricPointList) {Types.TimeSeries.Builder timeSeriesBuilder = Types.TimeSeries.newBuilder();Types.Sample.Builder sampleBuilder = Types.Sample.newBuilder();Types.Label metricNameLabel = Types.Label.newBuilder().setName("__name__").setValue(point.getConf().getMetric()).build();timeSeriesBuilder.addLabels(metricNameLabel);if (Objects.nonNull(point.getConf().getLabels()) && point.getConf().getLabels().size() > 0) {for (Map.Entry<String, String> entry : point.getConf().getLabels().entrySet()) {Types.Label labelTmp = Types.Label.newBuilder().setName(entry.getKey()).setValue(entry.getValue()).build();timeSeriesBuilder.addLabels(labelTmp);}}if (Objects.nonNull(point.getTags()) && point.getTags().size() > 0) {for (Map.Entry<String, String> entry : point.getTags().entrySet()) {Types.Label labelTmp = Types.Label.newBuilder().setName(entry.getKey()).setValue(entry.getValue()).build();timeSeriesBuilder.addLabels(labelTmp);}}sampleBuilder.setValue(point.getValue());long timestamp = point.getTime() > 0 ? point.getTime() : System.currentTimeMillis();sampleBuilder.setTimestamp(timestamp);timeSeriesBuilder.addSamples(sampleBuilder.build());timeSeriesList.add(timeSeriesBuilder.build());}return timeSeriesList;}
    }
    
  • 测试
    package ...;import lombok.extern.slf4j.Slf4j;
    import ...metrics.bean.bo.MetricPoint;
    import ...metrics.config.TasksConfig;
    import ...metrics.service.PrometheusService;
    import org.assertj.core.util.Lists;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.ActiveProfiles;
    import org.springframework.test.context.ContextConfiguration;import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;@ActiveProfiles("dev")
    @SpringBootTest
    @ContextConfiguration(classes = BusinessMetricsApplication.class)
    @Slf4j
    public class PrometheusTest {@Autowiredprivate PrometheusService prometheusService;@Testpublic void reportTest() throws IOException {Map<String, String> tags = new HashMap<>();tags.put("a", "b1");tags.put("c", "d1");MetricPoint mp = new MetricPoint();TasksConfig.Item conf = new TasksConfig.Item();conf.setLabels(tags);conf.setMetric("metric_testAB");mp.setTime(System.currentTimeMillis() - 60*1000);mp.setValue(56);mp.setConf(conf);Map<String, String> tags2 = new HashMap<>();tags2.put("aa", "bb1");tags2.put("cc", "dd1");MetricPoint mp2 = new MetricPoint();TasksConfig.Item conf2 = new TasksConfig.Item();conf2.setLabels(tags2);conf2.setMetric("metric_testAB");mp2.setValue(150);mp2.setConf(conf2);prometheusService.remoteWrite(Lists.newArrayList(mp, mp2));}
    }
    
  • 结果

备注

  • 提一次提交时间戳为timestamp=1 第二次 timestamp=4 第三次timestamp=3 则prometheus会报错 out of order samples
  • 删除metric重新提交 timestamp=3 同样会报错 out of order samples

参考

  • prometheus-remote-write-in-java
  • github remotewrite
  • 如何远程写入prometheus存储 golang实现
  • Debugging out of order samples
  • remote-write-receiver promethues 配置
  • prometheus api
  • Prometheus 删除指定 Metric

prometheus remote write for springboot 远程写入<一>相关推荐

  1. VS Code Remote 发布!开启远程开发新时代

    今天( 北京时间 2019 年 5 月 3 日 ),在 PyCon 2019 大会上,微软发布了 VS Code Remote,开启了远程开发的新时代!这次发布包含了三款核心的全新插件,它们可以帮助开 ...

  2. springboot 远程调用shell脚本,环境为windows

    springboot 远程调用shell脚本,环境为windows pom.xml配置 yml配置文件 实体类 配置服务器SSH 具体业务 测试 由于需要调用shell脚本实现一些自动化控制操作,特记 ...

  3. xterm远程连服务器连不上_VS Code Remote 发布!开启远程开发新时代

    今天( 北京时间 2019 年 5 月 3 日 ),在 PyCon 2019 大会上,微软发布了 VS Code Remote,开启了远程开发的新时代!这次发布包含了三款核心的全新插件,它们可以帮助开 ...

  4. RDO(Remote Desktop Organizer)远程桌面工具分享

    推荐一款远程桌面管理工具: RDO(Remote Desktop Organizer)远程桌面工具,帮助你管理大量远程桌面的软件,可以在多个远程机器之间切换,可以保存用户的密码,可以分文件夹进行组织分 ...

  5. 线上Bug无法复现怎么办?老司机教你一招,SpringBoot远程调试不用愁!

    前言 在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈. 此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不? 今天陈某 ...

  6. RPC(Remote Procedure Calls)远程过程调用

    很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单 ...

  7. springboot设置默认值_线上Bug无法复现?老司机教你一招,SpringBoot远程调试不用愁!...

    前言 在部署线上项目时,相信大家都会遇到一个问题,线上的 Bug 但是在本地不会复现,多么无奈. 此时最常用的就是取到前端传递的数据用接口测试工具测试,比如 POSTMAN,复杂不,难受不? 今天陈某 ...

  8. springboot远程心电诊断系统毕业设计源码091759

    目  录 摘要 1 绪论 1.1研究背景及意义 1.2研究现状 1.3系统开发技术的特色 1.4论文结构与章节安排 2远程心电诊断系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据 ...

  9. SpringBoot 远程调试

    在配合 QA 进行代码测试,以及处理线上 BUG 时,代码往往已经被部署于服务器端,因此服务器端程序支持远程调试功能就尤为重要. Java 原生支持调试功能,由于实际开发中使用 SpringBoot, ...

最新文章

  1. python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)
  2. 做完小程序项目、老板给我加了6k薪资~
  3. [Oracle]为何Archivelog 没有马上被删除
  4. java中的深浅克隆
  5. C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构
  6. AIX 磁盘和文件系统
  7. 《Google官方SEO指南》十一:以恰当的方式推广你的网站
  8. 转:精通JS正则表达式
  9. Java方法中的参数太多,第6部分:方法返回
  10. php百度搜索框代码,基于jquery的仿百度搜索框效果代码_jquery
  11. 青苹果影视系统源码v1.3.20 多功能开源影视源码
  12. 容器编排技术 -- Kubernetes kubectl create clusterrolebinding 命令详解
  13. 转:SQL Server 2005安装过程图解
  14. JavaScript学习(五十八)—作用域链
  15. 精通Spring Boot——第三篇:详解WebMvcConfigurer接口
  16. 5、SpringBoot+MyBaits+Maven+Idea+pagehelper分页插件
  17. Observer (观察者) 模式
  18. 第十六章 python Pygame的使用
  19. r 对一列计数_根据另一列对项目进行计数
  20. growup怎么读_欧路词典|英汉-汉英词典 grow up是什么意思_grow up的中文解释和发音_grow up的翻译_grow up怎么读...

热门文章

  1. 计算企业发放的奖金根据利润提成
  2. 使用麦克风和Arduino测量以dB为单位的声音/噪声水平
  3. 获取员工其当前的薪水比其manager当前薪水还高的相关信息--2-5
  4. 神经网络阈值是什么意思,神经网络阈值怎么设置
  5. MySQL之函数和谓词
  6. 中蜂药花蜜记载于《神农本草经》
  7. 高性能 JavaScriptの五 -- 快响应用户界面
  8. 在线进行去除图片水印
  9. mt6762/mt6765平台i2c驱动能力修改与波形优化
  10. 树莓派人体感应警报(python)HC-SR501红外人体感应