java结合prometheus如何实现自定义数据监控

 更新时间:2024年12月12日 11:07:44   作者:涅米涅米  
文章介绍了如何配置Prometheus监控系统,包括配置文件prometheus.yml、被监控应用的指标暴露配置以及自定义监控指标的实现,同时,还详细说明了监控应用如何通过Prometheus API获取数据、处理数据并返回结果

一、配置prometheus

  • prometheus.yml
...

- job_name: 'my-service'
  metrics_path: /metrics
  static_configs:
  - targets: ['xxx.xxx.xxx.xxx:yyyy'] //被监控应用的url

...

二、被监控应用

思路

  1. 引入相关依赖
  2. 配置监控指标暴露的endpoint
  3. 自定义监控指标

关键代码

1. 引入相关依赖

  • pom.xml
<!-- prometheus -->
<dependency>
		<groupId>io.prometheus</groupId>
		<artifactId>simpleclient</artifactId>
		<version>0.3.0</version>
</dependency>
<dependency>
		<groupId>io.prometheus</groupId>
		<artifactId>simpleclient_hotspot</artifactId>
		<version>0.3.0</version>
</dependency>
<dependency>
		<groupId>io.prometheus</groupId>
		<artifactId>simpleclient_servlet</artifactId>
		<version>0.3.0</version>
</dependency>

2. 将监控指标暴露到’/metrics’

  • PrometheusConfig.java
import io.prometheus.client.exporter.MetricsServlet;
import io.prometheus.client.hotspot.DefaultExports;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
...

@Configuration
public class PrometheusConfig {

		// ...

		@Bean
		public ServletRegistrationBean servletRegistrationBean(){
			DefaultExports.initialize();
			return new ServletRegistrationBean(new MetricsServlet(), "/metrics");
		}
}

3. 自定义监控指标

  • MyMetrics.java
import io.prometheus.client.Counter;
import io.prometheus.client.Gauge;
...

// counter只增不减
static final Counter customizeCounter = Counter.build()
        .name("customize_counter") //定义名称,名称可用于搜索
        .help("customize counter") //定义描述
        .register();
customizeCounter.inc(); //当前对象加1

// gauge可增可减
static final Gauge customizeGauge = Gauge.build()
        .name("customize_gauge")
        .help("customize gauge")
        .labelNames("label1", "label2", "label3") //定义标签名称,可定义多个
        .register();
customizeGauge.inc(); //当前对象加1
customizeGauge.dec(); //当前对象减1
customizeGauge.labels("value1","value2","value3").set(1100); //设置标签值,标签可用于条件筛选

// 此外还有histogram和summary两种指标

三、监控应用

思路

  1. 引入相关依赖
  2. 调用prometheus API获取数据
  3. 整理数据并返回

关键代码

1. 引入相关依赖

  • pom.xml
<!-- prometheus -->
<dependency>
		<groupId>io.prometheus</groupId>
		<artifactId>simpleclient</artifactId>
		<version>0.3.0</version>
</dependency>
<dependency>
		<groupId>io.prometheus</groupId>
		<artifactId>simpleclient_hotspot</artifactId>
		<version>0.3.0</version>
</dependency>
<dependency>
		<groupId>io.prometheus</groupId>
		<artifactId>simpleclient_servlet</artifactId>
		<version>0.3.0</version>
</dependency>

2. 调用prometheus API

  • 获取某个时间点的数据
String query = "customize_counter";
String url = "http://[ip]:[port]/api/v1/query?query=" + query + "&time=2019-05-01T20:10:51.781Z";
HttpGet get = new HttpGet(url);
CloseableHttpClient httpClient = HttpClients.custom().build();
CloseableHttpResponse response = httpClient.execute(get);
  • 获取某个时间段的数据
String query = "rate(customize_counter{label1 = value1}[30s])";
String url = "http://[ip]:[port]/api/v1/query_range?query=" + query + "&start=2019-05-01T20:10:51.781Z&end=2019-05-02T20:10:51.781Z";
HttpGet get = new HttpGet(url);
CloseableHttpClient httpClient = HttpClients.custom().build();
CloseableHttpResponse response = httpClient.execute(get);

更多使用方法请参考Prometheus - 查询

3. 处理数据

  • prometheus有时会返回乱序的结果,以下代码可以按时间戳排序
public class ComparatorPromData implements Comparator {

    @Override
    public int compare(Object o1, Object o2) {
        List list1 = (List)o1;
        List list2 = (List)o2;
        return ((Integer) list1.get(0)).compareTo(((Integer) list2.get(0)));
    }
}
public class SortUtil {

    public static List sortPromData(List<List> list) {
        ComparatorPromData comparator = new ComparatorPromData();
        Collections.sort(list, comparator);
        return list;
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • spring-session简介及实现原理源码分析

    spring-session简介及实现原理源码分析

    这篇文章主要介绍了spring-session简介及实现原理源码分析,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java文件批量重命名批量提取特定类型文件

    Java文件批量重命名批量提取特定类型文件

    这篇文章主要介绍了Java文件批量重命名批量提取特定类型文件的相关资料
    2016-08-08
  • Javaweb接收表单数据并处理中文乱码

    Javaweb接收表单数据并处理中文乱码

    这篇文章主要介绍了Javaweb接收表单数据并处理中文乱码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java枚举之EnumSet详解

    Java枚举之EnumSet详解

    这篇文章主要介绍了Java枚举之EnumSet详解,使用时进行与或运算,但是定义多了之后,会很乱、臃肿,编写容易出错,EnumSet可以实现类似的功能,且使用起来很简洁,需要的朋友可以参考下
    2023-12-12
  • Java并发编程总结——慎用CAS详解

    Java并发编程总结——慎用CAS详解

    下面小编就为大家带来一篇Java并发编程总结——慎用CAS详解。小编觉得挺不错的, 现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java的DelayQueue延迟队列简单使用代码实例

    Java的DelayQueue延迟队列简单使用代码实例

    这篇文章主要介绍了Java的DelayQueue延迟队列简单使用代码实例,DelayQueue是一个延迟队列,插入队列的数据只有达到设置的延迟时间时才能被取出,否则线程会被阻塞,插入队列的对象必须实现Delayed接口,需要的朋友可以参考下
    2023-12-12
  • Spring boot如何基于拦截器实现访问权限限制

    Spring boot如何基于拦截器实现访问权限限制

    这篇文章主要介绍了Spring boot如何基于拦截器实现访问权限限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Java基于socket实现简易聊天室实例

    Java基于socket实现简易聊天室实例

    这篇文章主要介绍了Java基于socket实现简易聊天室的方法,实例分析了java基于socket实现聊天室服务端与客户端的相关技巧,需要的朋友可以参考下
    2015-05-05
  • java实现随机生成验证码图片

    java实现随机生成验证码图片

    这篇文章主要为大家详细介绍了java实现随机生成验证码图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • Java利用for循环打印菱形的实例教程

    Java利用for循环打印菱形的实例教程

    这篇文章主要给大家介绍了关于Java利用for循环打印菱形的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03

最新评论