本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
設定適用於 Amazon EKS 和 Kubernetes 的 Java/JMX 範例工作負載
JMX Exporter 是官方的 Prometheus 匯出工具,可以湊集 JMX mBeans 並將其公開為 Prometheus 指標。如需詳細資訊,請參閱 prometheus/jmx_exporter
Container Insights 可以使用 JMX Exporter,從 Java 虛擬機器 (JVM)、Java 和 Tomcat (Catalina) 收集預先定義的 Prometheus 指標。
預設 Prometheus 湊集組態
根據預設,具有 Prometheus 支援的 CloudWatch 代理程式會從 Amazon EKS 或 Kubernetes 叢集中的每個 pod 上的 http://CLUSTER_IP:9404/metrics
湊集 Java/JMX Prometheus 指標。這是透過會由 Prometheus kubernetes_sd_config
的 role: pod
探索的。9404 是 Prometheus 為 JMX Exporter 配置的預設連接埠。如需 role: pod
探索的詳細資訊,請參閱 pod
kubectl describe cm prometheus-config -n amazon-cloudwatch
要變更的欄位為 /metrics
和 regex:
'.*:9404$'
欄位,如下列範例中反白所示。
job_name: 'kubernetes-jmx-pod' sample_limit: 10000 metrics_path:
/metrics
kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__address__] action: keepregex: '.*:9404$'
- action: replace regex: (.+) source_labels:
其他 Prometheus 湊集組態
如果您透過 Kubernetes Service 使用 Java/JMX Prometheus 匯出工具公開在一組 Pod 上執行的應用程式,則還可以切換到使用 role:
service
探索或 Prometheus kubernetes_sd_config
的 role: endpoint
探索。如需這些探索方法的詳細資訊,請參閱服務
這兩種服務探索模式提供了多個中繼標籤,而這可能對您建置 CloudWatch 指標維度非常有用。例如,您可以重新標記 __meta_kubernetes_service_name
至 Service
,並將其包含在您的指標維度中。如需自訂 CloudWatch 指標及其維度的詳細資訊,請參閱 Prometheus 的 CloudWatch 代理程式組態。
Docker 影像與 JMX Exporter
下一步:建置 Docker 影像 下列各節提供兩個範例 Dockerfile。
當您建置映像後,請將它載入 Amazon EKS 或 Kubernetes,然後執行下列命令,以確認 JMX_EXPORTER
是在連接埠 9404 上公開 Prometheus 指標。將 $JAR_SAMPLE_TRAFFIC_POD
取代為執行中的 pod 名稱,並將 $JAR_SAMPLE_TRAFFIC_NAMESPACE
取代為您的應用程式命名空間。
如果您在具有 Fargate 啟動類型的叢集上執行 JMX Exporter,則還需要在執行此程序中的步驟之前設定 Fargate 描述檔。若要設定描述檔,請輸入下列命令。將 MyCluster
取代為您的叢集名稱。
eksctl create fargateprofile --cluster
MyCluster
\ --namespace $JAR_SAMPLE_TRAFFIC_NAMESPACE\ --name $JAR_SAMPLE_TRAFFIC_NAMESPACE
kubectl exec $JAR_SAMPLE_TRAFFIC_POD -n $JARCAT_SAMPLE_TRAFFIC_NAMESPACE -- curl http://localhost:9404
範例:具有 Prometheus 指標的 Apache Tomcat Docker 影像
Apache Tomcat 伺服器預設會公開 JMX mBeans。您可以將 JMX Exporter 與 Tomcat 整合,以將 JMX mBeans 公開為 Prometheus 指標。下列範例 Dockerfile 顯示建置測試映像的步驟:
# From Tomcat 9.0 JDK8 OpenJDK FROM tomcat:9.0-jdk8-openjdk RUN mkdir -p /opt/jmx_exporter COPY ./jmx_prometheus_javaagent-0.12.0.jar /opt/jmx_exporter COPY ./config.yaml /opt/jmx_exporter COPY ./setenv.sh /usr/local/tomcat/bin COPY
your web application.war
/usr/local/tomcat/webapps/ RUN chmod o+x /usr/local/tomcat/bin/setenv.sh ENTRYPOINT ["catalina.sh", "run"]
下列清單解釋了這個 Dockerfile 的四個 COPY
行。
-
從 https://github.com/prometheus/jmx_exporter
下載最新的 JMX Exporter jar 檔案。 -
config.yaml
是 JMX Exporter 組態檔。如需詳細資訊,請參閱 https://github.com/prometheus/jmx_exporter#Configuration。 以下是 Java 和 Tomcat 的範例組態檔:
lowercaseOutputName: true lowercaseOutputLabelNames: true rules: - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)' name: java_lang_OperatingSystem_$1 type: GAUGE - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)' name: java_lang_threading_$1 type: GAUGE - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)' name: catalina_globalrequestprocessor_$3_total labels: port: "$2" protocol: "$1" help: Catalina 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|maxTime|processingTime|errorCount)' name: catalina_servlet_$3_total labels: module: "$1" servlet: "$2" help: Catalina servlet $3 total type: COUNTER - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)' name: catalina_threadpool_$3 labels: port: "$2" protocol: "$1" help: Catalina 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: catalina_session_$3_total labels: context: "$2" host: "$1" help: Catalina session $3 total type: COUNTER - pattern: ".*"
-
setenv.sh
是一個 Tomcat 啟動指令碼,用於啟動 JMX Exporter 和 Tomcat,並在 localhost 的連接埠 9404 上公開 Prometheus 指標。它還為 JMX Exporter 提供了config.yaml
檔案路徑。$ cat setenv.sh export JAVA_OPTS="-javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.12.0.jar=9404:/opt/jmx_exporter/config.yaml $JAVA_OPTS"
-
您的 Web 應用程式 .war 是您要由 Tomcat 載入的 Web 應用程式
war
檔案。
使用此組態建置一個 Docker 影像並將其上傳到映像儲存庫。
範例:具有 Prometheus 指標的 Java Jar 應用程式 Docker 影像
下列範例 Dockerfile 顯示建置測試映像的步驟:
# Alpine Linux with OpenJDK JRE FROM openjdk:8-jre-alpine RUN mkdir -p /opt/jmx_exporter COPY ./jmx_prometheus_javaagent-0.12.0.jar /opt/jmx_exporter COPY ./SampleJavaApplication-1.0-SNAPSHOT.jar /opt/jmx_exporter COPY ./start_exporter_example.sh /opt/jmx_exporter COPY ./config.yaml /opt/jmx_exporter RUN chmod -R o+x /opt/jmx_exporter RUN apk add curl ENTRYPOINT exec /opt/jmx_exporter/start_exporter_example.sh
下列清單解釋了這個 Dockerfile 的四個 COPY
行。
-
從 https://github.com/prometheus/jmx_exporter
下載最新的 JMX Exporter jar 檔案。 -
config.yaml
是 JMX Exporter 組態檔。如需詳細資訊,請參閱 https://github.com/prometheus/jmx_exporter#Configuration。 以下是 Java 和 Tomcat 的範例組態檔:
lowercaseOutputName: true lowercaseOutputLabelNames: true rules: - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)' name: java_lang_OperatingSystem_$1 type: GAUGE - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)' name: java_lang_threading_$1 type: GAUGE - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)' name: catalina_globalrequestprocessor_$3_total labels: port: "$2" protocol: "$1" help: Catalina 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|maxTime|processingTime|errorCount)' name: catalina_servlet_$3_total labels: module: "$1" servlet: "$2" help: Catalina servlet $3 total type: COUNTER - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)' name: catalina_threadpool_$3 labels: port: "$2" protocol: "$1" help: Catalina 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: catalina_session_$3_total labels: context: "$2" host: "$1" help: Catalina session $3 total type: COUNTER - pattern: ".*"
-
start_exporter_example.sh
是使用匯出的 Prometheus 指標來啟動 JAR 應用程式的指令碼。它還為 JMX Exporter 提供了config.yaml
檔案路徑。$ cat start_exporter_example.sh java -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.12.0.jar=9404:/opt/jmx_exporter/config.yaml -cp /opt/jmx_exporter/SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App
-
SampleJavaApplication-1.0-SNAPSHOT.jar 是範例 Java 應用程式 jar 檔案。將其取代為您要監控的 Java 應用程式。
使用此組態建置一個 Docker 影像並將其上傳到映像儲存庫。