在Kubernetes(k8s)中使用Prometheus监控Pod内的Java应用程序

createh52周前 (12-16)技术教程18

#文章首发挑战赛#

在Kubernetes(k8s)中监控Java应用程序的一种常见方法是使用JMX(Java Management Extensions)和Prometheus。

可以通过在Java应用程序的JVM中使用jmx_prometheus_javaagent来启用JMX指标的导出,然后由Prometheus进行收集。

以下是一些关于如何在Kubernetes中配置和使用jmx_prometheus_javaagent的步骤:

下载 jmx_prometheus_javaagent JAR 文件:

访问 jmx_prometheus_javaagent 的 GitHub 页面。

https://github.com/prometheus/jmx_exporter

下载最新版本的 jmx_prometheus_javaagent JAR 文件。

创建配置文件:

创建一个 Prometheus 的配置文件,该文件定义了要导出的 JMX 指标。

配置文件可以在 jmx_prometheus_javaagent 的 GitHub 页面上找到,例如 example_configs 目录。

# https://grafana.com/grafana/dashboards/8704-tomcat-dashboard/
---   
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem", "Catalina:*"]
blacklistObjectNames: []
rules:
  - pattern: 'Catalina<type=Server><>serverInfo: (.+)'
    name: tomcat_serverinfo
    value: 1
    labels:
      serverInfo: "$1"
    type: COUNTER
  - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+):'
    name: tomcat_$3_total
    labels:
      port: "$2"
      protocol: "$1"
    help: Tomcat global $3
    type: COUNTER
  - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|processingTime|errorCount):'
    name: tomcat_servlet_$3_total
    labels:
      module: "$1"
      servlet: "$2"
    help: Tomcat servlet $3 total
    type: COUNTER
  - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|connectionCount|acceptCount|acceptorThreadCount|pollerThreadCount|maxThreads|minSpareThreads):'
    name: tomcat_threadpool_$3
    labels:
      port: "$2"
      protocol: "$1"
    help: Tomcat threadpool $3
    type: GAUGE
  - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions):'
    name: tomcat_session_$3_total
    labels:
      context: "$2"
      host: "$1"
    help: Tomcat session $3 total
    type: COUNTER   

将 JMX 代理添加到 Java 应用程序中:

将下载的 jmx_prometheus_javaagent JAR 文件添加到你的 Java 应用程序的类路径中。

在启动 Java 应用程序的命令行中添加以下参数,以启用 JMX 代理并指定配置文件的位置:

-javaagent:/path/to/jmx_prometheus_javaagent.jar=port:port_number,config:/path/to/config.yml

port_number 是 JMX 代理的监听端口。

config.yml 是 Prometheus 配置文件的路径。

Kubernetes Pod 配置:

Kubernetes Pod 配置的部分,其中包括了 JMX 代理的设置:

containers:
- name: your-java-app
  image: your-java-app-image:tag
  ports:
  - containerPort: 8080  # Your application's port
  - containerPort: 9779  # JMX exporter port
  env:
  - name: JAVA_OPTS
    value: "-javaagent:/path/to/jmx_prometheus_javaagent.jar=9779:/path/to/config.yml"

Prometheus 配置:

在 Prometheus 的配置文件中,添加一个 scrape_configs 部分,以收集 Java 应用程序的 JMX 指标。

scrape_configs:
- job_name: 'java-app'
  static_configs:
  - targets: ['java-app-host:9779']  # Replace with your Java app's host and JMX exporter port

部署到 Kubernetes:

使用 kubectl apply 命令将你的 Pod 配置文件应用到 Kubernetes 集群中。

检查监控数据:

在 Prometheus 中查看是否成功收集了 Java 应用程序的 JMX 指标。

通过以上步骤,你应该能够在 Kubernetes 中成功配置和使用 jmx_prometheus_javaagent,以监控你的 Java 应用程序。

请注意替换示例配置中的路径、端口和应用程序名称,以符合你的实际环境。

相关文章

从Java转储分析来改进Java应用程序的性能(上)

1 引言垃圾回收(Garbage Collection,GC)在Java的内存管理中扮演着至关重要的角色。它负责自动回收不再被使用的内存资源,从而避免内存泄漏。垃圾回收器通过一组专门的线程来执行内存回...

Java:什么是Spring框架? java中的spring框架

  Spring框架是一个开源应用程序框架,通过提供基础设施支持来支持Java应用程序的开发。它是著名的Java企业版框架之一。Spring通过使用普通旧Java对象 (POJO) 帮助开发人员创建高...

深入探究hprof文件:如何分析Java应用程序性能瓶颈

Java应用程序的性能问题是开发人员面临的一个常见挑战。为了解决这些问题,开发人员需要了解应用程序的性能瓶颈所在,并采取相应的措施来优化它们。在此过程中,hprof文件是一种非常有用的工具,可以帮助开...

Java 应用程序的 CPU 使用率飙升原因分析

1、背景在服务器上执行某个任务时,系统突然运行缓慢,top 发现cpu飙升,一度接近100%,最终导致服务假死。2、CPU 使用率怎么计算?CPU% = 1 - idleTime / sysTime...