广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Prometheus监控Springboot程序的实现方法
  • 121
分享到

Prometheus监控Springboot程序的实现方法

2024-04-02 19:04:59 121人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 添加依赖2. 修改配置文件3. 启用prometheus监控4. 监控埋点4.1 新建拦截器4.2 注册拦截器5. 验证监控6. 指标类型6.1 Counter6.2 Ga

1. 添加依赖

我本次使用的SpringBoot版本为1.5.12.RELEASE,如果是springboot2.0+,那么监控的配置以及吐出的监控指标会有所不同。
添加Maven依赖,pom文件配置如下:


<dependency>
   <groupId>io.prometheus</groupId>
   <artifactId>simpleclient_spring_boot</artifactId>
   <version>${prometheus.client.version}</version>
  </dependency>
  <dependency>
   <groupId>io.prometheus</groupId>
   <artifactId>simpleclient</artifactId>
   <version>${prometheus.client.version}</version>
  </dependency>
  <dependency>
   <groupId>io.prometheus</groupId>
   <artifactId>simpleclient_hotspot</artifactId>
   <version>${prometheus.client.version}</version>
  </dependency>

其中Prometheus的版本号为:


<prometheus.client.version>0.5.0</prometheus.client.version>

2. 修改配置文件

修改application.properties配置文件,添加如下内容:


server.port=8080

# 启用基础认证
security.basic.enabled = false

# 安全路径列表,逗号分隔,此处只针对/admin路径进行认证
security.basic.path = /admin

# 认证使用的用户名
security.user.name = admin

# 认证使用的密码。 默认情况下,启动时会记录随机密码。
security.user.passWord = 123456

# 可以访问管理端点的用户角色列表,逗号分隔
management.security.roles = SUPERUSER

# actuator暴露接口使用的端口,为了和api接口使用的端口进行分离
management.port = 8099

# actuator暴露接口的前缀
management.context-path = /admin

# actuator是否需要安全保证
management.security.enabled = false

# actuator的metrics接口是否需要安全保证
endpoints.metrics.sensitive = false

# actuator的metrics接口是否开启
endpoints.metrics.enabled=true

# actuator的health接口是否需要安全保证
endpoints.health.sensitive=false

# actuator的health接口是否开启
endpoints.health.enabled=true

application.yml 配置如下:


# actuator是否需要安全保证
management.security.enabled: false
endpoints:
 metrics:
 # actuator的metrics接口是否需要安全保证
 sensitive: false
 # actuator的metrics接口是否开启
 enabled: true
 health:
 # actuator的health接口是否需要安全保证
 sensitive: false
 # actuator的health接口是否开启
 enabled: true

3. 启用Prometheus监控

在Springboot启动类上添加注解@EnablePrometheusEndpoint,同时使用simpleclient_hotspot中提供的DefaultExporter该Exporter会在metrics endpoint中放回当前应用JVM的相关信息


@SpringBootApplication
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector
public class CaseApplication implements CommandLineRunner {

 public static void main(String[] args) {
  SpringApplication.run(CaseApplication.class, args);
 }

 @Override
 public void run(String... strings) throws Exception {
  DefaultExports.initialize();
 }

}

4. 监控埋点

4.1 新建拦截器

建立一个拦截器,用来拦截URL。


public class PrometheusMetricsInterceptor implements HandlerInterceptor {

 private Histogram.Timer histogramRequestTimer;
 private Histogram.Timer NacosTimer;
 private Histogram.Child nacosChild;

 static final Histogram requestLatencyHistogram = Histogram.build().labelNames("path", "method", "code")
   .name("io_namespace_Http_requests_latency_seconds_histogram").help("Request latency in seconds.")
   .reGISter();

 @Override
 public boolean preHandle(httpservletRequest request, HttpServletResponse response, Object handler) throws Exception {
  System.out.println("-------Histogram--------");
  histogramRequestTimer = requestLatencyHistogram
    .labels(request.getRequestURI(), request.getMethod(), String.valueOf(response.getStatus()))
    .startTimer();
  nacosTimer = MetricsMonitor.getConfigRequestMonitor(request.getMethod(), request.getRequestURI(), String.valueOf(response.getStatus()));
  nacosChild = MetricsMonitor.getNamingRequestMonitor(request.getMethod(), request.getRequestURI(), String.valueOf(response.getStatus()));
  return true;
 }

 @Override
 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

 }

 @Override
 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  histogramRequestTimer.observeDuration();
  nacosTimer.observeDuration();
  nacosChild.startTimer();
 }
}

4.2 注册拦截器

新建拦截器后需要注册到服务中才可以拦截URL。


@Configuration
public class WEBServletContextConfiguration extends WebmvcConfigurationSupport {

 @Override
 public void addInterceptors(InterceptorRegistry registry) {

  registry.addInterceptor(getInterceptor()).addPathPatterns("/**");
  super.addInterceptors(registry);
 }

 @Bean
 public HandlerInterceptor getInterceptor() {
  return new PrometheusMetricsInterceptor();
 }

}

5. 验证监控

启动应用程序,访问地址
http://localhost:8099/admin/prometheus,验证是否存在监控指标。

监控结果

6. 指标类型

普罗米修斯客户端库提供了四种核心度量类型。目前,它们只在客户端库(为了使api能够根据特定类型的使用而定制)和wire协议中有所区别。Prometheus服务器还没有利用类型信息,并将所有数据压缩成无类型的时间序列。这种情况在未来可能会改变。

6.1 Counter

计数器是一个累积度量,它表示一个单调递增的计数器,其值在重新启动时只能递增或重置为零。例如,您可以使用计数器来表示服务的请求、完成的任务或错误的数量。
不要使用计数器来暴露可能降低的值。例如,不要为当前正在运行的进程的数量使用计数器;而是使用量规。
示例代码:


import io.prometheus.client.Counter;
class YourClass {
 static final Counter requests = Counter.build()
  .name("requests_total").help("Total requests.").register();

 void processRequest() {
 requests.inc();
 // Your code here.
 }
}

6.2 Gauge

量规是一个度量单位,它表示一个可以任意上下移动的数值。
压力表通常用于测量温度或当前内存使用情况等测量值,但也用于“计数”,比如并发请求的数量。
示例代码:


class YourClass {
 static final Gauge inprogressRequests = Gauge.build()
  .name("inprogress_requests").help("Inprogress requests.").register();

 void processRequest() {
 inprogressRequests.inc();
 // Your code here.
 inprogressRequests.dec();
 }
}

6.3 Histogram

直方图对观察结果(通常是请求持续时间或响应大小之类的东西)进行采样,并在可配置的桶中计数。它还提供所有观测值的和。
示例代码:


class YourClass {
 static final Histogram requestLatency = Histogram.build()
  .name("requests_latency_seconds").help("Request latency in seconds.").register();

 void processRequest(Request req) {
 Histogram.Timer requestTimer = requestLatency.startTimer();
 try {
  // Your code here.
 } finally {
  requestTimer.observeDuration();
 }
 }
}

6.4 Summary

与柱状图类似,摘要对观察结果进行采样(通常是请求持续时间和响应大小之类的内容)。虽然它还提供了观察值的总数和所有观察值的总和,但它计算了一个滑动时间窗口上的可配置分位数。


class YourClass {
 static final Summary receivedBytes = Summary.build()
  .name("requests_size_bytes").help("Request size in bytes.").register();
 static final Summary requestLatency = Summary.build()
  .name("requests_latency_seconds").help("Request latency in seconds.").register();

 void processRequest(Request req) {
 Summary.Timer requestTimer = requestLatency.startTimer();
 try {
  // Your code here.
 } finally {
  receivedBytes.observe(req.size());
  requestTimer.observeDuration();
 }
 }
}

6.5 自定义Collector

有时不可能直接测试代码,因为它不在您的控制范围内。这要求您代理来自其他系统的指标。
为此,您需要创建一个自定义收集器(需要将其注册为普通度量)。


class YourCustomCollector extends Collector {
 List<MetricFamilySamples> collect() {
 List<MetricFamilySamples> mfs = new ArrayList<MetricFamilySamples>();
 // With no labels.
 mfs.add(new GaugeMetricFamily("my_gauge", "help", 42));
 // With labels
 GaugeMetricFamily labeledGauge = new GaugeMetricFamily("my_other_gauge", "help", Arrays.asList("labelname"));
 labeledGauge.addMetric(Arrays.asList("foo"), 4);
 labeledGauge.addMetric(Arrays.asList("bar"), 5);
 mfs.add(labeledGauge);
 return mfs;
 }
}

// Registration
static final YourCustomCollector requests = new YourCustomCollector().register()

7. 安装配置Prometheus

7.1 安装配置

下载安装包


wget https://GitHub.com/prometheus/prometheus/releases/download/v2.12.0/prometheus-2.12.0.linux-amd64.tar.gz

解压文件


tar -zxvf prometheus-2.12.0.linux-amd64.tar.gz

修改配置文件prometheus.yml采集Nacos metrics数据。配置监控的job以及目标服务器,每一个目标服务器都是一个实例。


cd prometheus-*

Prometheus配置文件修改

后台启动Prometheus服务,并出到日志


./prometheus --config.file=prometheus.yml > prometheus.log 2>&1 &

通过访问http://{ip}:9090/graph可以看到prometheus的采集数据,在搜索栏搜索监控指标,例如:nacos_monitor可以搜索到Nacos数据说明采集数据成功

数据采集结果

在查询条件框中输入表达式,进行统计。例如:


sum(rate(nacos_client_request_seconds_count{url=~'/dialog/slu/NLP/parser', instance=~'39.97.161.102:30315|39.97.161.102:30316'}[1m])) by (method,url,instance)

结果如下图:

查询图表结果

8. 安装配置Grafana

 8.1 安装配置

安装grafana,下载安装包


wget https://dl.grafana.com/oss/release/grafana-6.5.2.linux-amd64.tar.gz
tar -zxvf grafana-6.5.2.linux-amd64.tar.gz

修改端口配置,复制一个配置文件,后续修改基于该自定义配置文件修改,不需要修改原始文件。


cd grafana-6.5.2/conf
cp sample.ini custom.ini
vi custom.ini

可以在该配置文件中修改端口号

在这里插入图片描述

访问grafana: http://{ip}:3000,用户名密码默认为:admin/admin。

在这里插入图片描述

登录时提示修改默认密码,如果不想修改可以跳过。

8.2 配置数据源

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.3 配置监控面板

监控面板可以自己配置,也可以通过导入JSON文件来进行修改,推荐使用配置好的json文件,修改起来会非常方便。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

修改后的展示效果如图所示:

在这里插入图片描述

注:此处grafana的模板文件是从别处下载的,可以根据需要导入自己的模板文件。

9. 参考文献

SpringBoot 应用监控踩坑集锦

prometheus docs

到此这篇关于Prometheus监控Springboot程序的实现方法的文章就介绍到这了,更多相关Prometheus监控Springboot内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Prometheus监控Springboot程序的实现方法

本文链接: https://www.lsjlt.com/news/121767.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Prometheus监控Springboot程序的实现方法
    目录1. 添加依赖2. 修改配置文件3. 启用Prometheus监控4. 监控埋点4.1 新建拦截器4.2 注册拦截器5. 验证监控6. 指标类型6.1 Counter6.2 Ga...
    99+
    2022-11-11
  • Prometheus如何监控Springboot程序
    这篇文章主要介绍Prometheus如何监控Springboot程序,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 添加依赖我本次使用的Springboot版本为1.5.12.RELEASE,如果是Springb...
    99+
    2023-06-14
  • prometheus监控nginx的实现
    目录简述1.下载nginx-module-vts模块2.安装nginx3.安装nginx-vts-exporter4.修改prometheus-cfg.yaml文件5.在grafan...
    99+
    2022-11-13
  • 解析prometheus+grafana监控nginx的方法
    目录1.下载2.安装nginx与nginx-vts-exporter3.安装nginx-vts-exporter-0.9.1.linux-amd64.tar4.配置Prometheu...
    99+
    2022-11-12
  • Prometheus和NodeExporter安装监控数据的方法
    这篇文章主要介绍了Prometheus和NodeExporter安装监控数据的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Prometheus和NodeExporter安装监控数据的方法文章都会有所收获,...
    99+
    2023-07-02
  • Jvisualvm监控远程SpringBoot项目的方法
    这篇文章主要介绍了Jvisualvm监控远程SpringBoot项目的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Jvisualvm监控远程SpringBoot项目的方法文章都会有所收获,下面我们一起来看...
    99+
    2023-06-30
  • prometheus监控节点程序的安装及卸载命令
    目录安装监控服务卸载监控程序本教程基于AlpineLinux,请注意将apk相关命令替换为对应系统的包命令,比如apt、yum等。 安装监控服务 apk add prometheus...
    99+
    2022-11-13
  • Android编程实现监控各个程序流量的方法
    本文实例讲述了Android编程实现监控各个程序流量的方法。分享给大家供大家参考,具体如下: public void getAppTrafficList(){ //获取...
    99+
    2022-06-06
    监控 程序 方法 流量 Android
  • SpringBoot整合Spring Boot Admin实现服务监控的方法
    目录1. Server端服务开发1.1. 引入核心依赖1.2. application.yml配置文件1.3. Security配置文件1.4. 主启动类2. Client端服务开发...
    99+
    2022-11-13
  • springboot线程池监控的简单实现
    目录背景代码代码类结构线程池扩展类线程工具类线程bean类线程池实现类线程池监控接口类运行结果背景 在我们实际项目开发中,常常会为不同的优先级的任务设置相对应的线程池。一般我们只关注...
    99+
    2022-11-13
  • 怎么在SpringBoot中利用Prometheus和Grafana实现实现应用监控和报警功能
    这篇文章将为大家详细讲解有关怎么在SpringBoot中利用Prometheus和Grafana实现实现应用监控和报警功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。SpringBoot的...
    99+
    2023-06-06
  • SpringBoot指标监控的实现
    目录一、SpringBoot——Actuator1.1 快速开始1.2 简单介绍最常用的几个端点1.3 开启或关闭某个端点1.4 定制端点1.5 SpringBoot——Admin ...
    99+
    2022-11-12
  • docker搭建基于prometheus的监控体系步骤实现
    目录1.启动prometheus容器服务2.启动成功后,公网访问该9090端口进入普罗米修斯主页3.部署mysqld-exporer监控mysql数据库(想监控什么就部署对应的exp...
    99+
    2022-11-13
  • Python实现Linux监控的方法
    工作原理:基于/proc 文件系统 linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的。/proc 文件虚拟系统是一种内核和内核模块...
    99+
    2022-06-04
    python实现linux监控 python 监控
  • 详解Linux监控重要进程的实现方法
    不管后台服务程序写的多么健壮,还是可能会出现core dump等程序异常退出的情况,但是一般情况下需要在无 人为干预情况下,能够自动重新启动,保证服务进程能够服务用户。这时就需要一个监控程序来实现能够让服务进程自动重新启...
    99+
    2022-06-04
    Linux监控重要进程 linux 进程监控
  • Python+drawpad实现CPU监控小程序
    目录CPU活动展示实现代码CPU活动展示 导入模块,创建画板,创建画笔进行绘画出cpu的数据,一定要用线程,负责会卡住哦 实现代码 import tkinter from tki...
    99+
    2022-11-11
  • Python实现用手机监控远程控制电脑的方法
    一、前言 很多时候,我们都有远程控制电脑的需求。比如正在下载某样东西,需要让电脑在下载完后关机。或者你需要监控一个程序的运行状况等。 今天我们就来用Python实现一个远程监控并控制电脑的小程序。 二、实现原理 ...
    99+
    2022-06-02
    Python 远程控制电脑 Python 手机远程控制电脑
  • python实现实时监控文件的方法
    在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和$up...
    99+
    2022-06-04
    实时监控 文件 方法
  • shell脚本实现服务器进程监控的方法
    写作背景:   项目是基于java、weblogic及timer的处理模式,每次服务部署之后timer的整体状态是一个盲区,因为100多个进程,是否有启动遗漏或者启动重复的,想做到一目了然是件困难的事情。所以我考...
    99+
    2022-06-04
    shell 监控进程 shell 监控进程脚本
  • zabbix监控mysql的实例方法
    1、监控规划 在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是提出监控的...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作