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

createh54个月前 (12-16)技术教程43

#文章首发挑战赛#

在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 应用程序。

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