Apache Tomcat

In diesem Dokument wird gezeigt, wie Sie Ihr Google Kubernetes Engine-Deployment so konfigurieren, dass Sie mit Google Cloud Managed Service for Prometheus Messwerte von Apache Tomcat erfassen können. Dieses Dokument enthält Anleitungen für folgende Aufgaben:

  • Richten Sie den Exporter für Tomcat ein, um Messwerte zu erfassen.
  • Eine PodMonitoring-Ressource für Managed Service for Prometheus konfigurieren, um die exportierten Messwerte zu erfassen.
  • Auf ein Dashboard in Cloud Monitoring zugreifen, um die Messwerte zu prüfen.
  • Benachrichtigungsregeln konfigurieren, um die Messwerte zu beobachten.

Diese Anleitung gilt nur, wenn Sie die verwaltete Sammlung mit Managed Service for Prometheus verwenden. Wenn Sie eine selbst bereitgestellte Sammlung verwenden, finden Sie im Quell-Repository Installationsinformationen für den JMX-Exporter.

Diese Anleitung dient als Beispiel und sollte in den meisten Kubernetes-Umgebungen funktionieren. Wenn Sie aufgrund von restriktiven Sicherheits- oder Organisationsrichtlinien Probleme beim Installieren einer Anwendung oder eines Exporters haben, empfehlen wir Ihnen, die Open Source-Dokumentation für Support zu nutzen.

Informationen zu Tomcat finden Sie unter Apache Tomcat.

Vorbereitung

Zum Erfassen von Messwerten aus Tomcat mithilfe von Managed Service for Prometheus und einer verwalteten Erfassung muss Ihr Deployment die folgenden Anforderungen erfüllen:

  • Ihr Cluster muss Google Kubernetes Engine Version 1.21.4-gke.300 oder höher ausführen.
  • Sie müssen Managed Service for Prometheus mit aktivierter verwalteter Sammlung ausführen. Weitere Informationen finden Sie unter Erste Schritte mit verwalteter Sammlung.

  • Um die in Cloud Monitoring verfügbaren Dashboards für die Tomcat-Integration zu nutzen, müssen Sie jmx-exporter Version 0.17.0 oder höher verwenden.

    Weitere Informationen zu verfügbaren Dashboards finden Sie unter Dashboards ansehen.

Tomcat unterstützt JMX, das durch Konfigurieren der Umgebungsvariable CATALINA_OPTS aktiviert werden kann.

Tomcat-Exporter installieren

Wir empfehlen die Installation des Tomcat-Exporters jmx-exporter als Sidecar für Ihre Tomcat-Arbeitslast. Informationen zur Verwendung von Sidecars finden Sie unter Erweiterte Anwendung in Kubernetes mit Pods mit mehreren Containern.

Ändern Sie Ihre Tomcat-Konfiguration wie im folgenden Beispiel gezeigt, um jmx-exporter als Sidecar für Tomcat zu installieren:

# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
apiVersion: v1
kind: ConfigMap
metadata:
  name: tomcat-exporter
data:
  config.yml: |
    hostPort: 127.0.0.1:9010
    lowercaseOutputLabelNames: true
    lowercaseOutputName: true
    rules:
    - 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|maxTime|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|pollerThreadCount|connectionCount):'
      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
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat
spec:
  selector:
    matchLabels:
+     app.kubernetes.io/name: tomcat
  template:
    metadata:
      labels:
+       app.kubernetes.io/name: tomcat
    spec:
      containers:
        - name: tomcat
          image: tomcat:9.0.46-jdk11-openjdk-buster
          ports:
            - containerPort: 8080
              name: http
          env:
+           - name: CATALINA_OPTS
+             value: "-Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010"
+       - name: exporter
+         image: bitnami/jmx-exporter:0.17.0
+         ports:
+           - containerPort: 9113
+             name: prometheus
+         command:
+           - java
+           - -jar
+           - jmx_prometheus_httpserver.jar
+         args:
+           - "9113"
+           - /opt/jmx_exporter/config.yml
+         volumeMounts:
+           - mountPath: /opt/jmx_exporter/config.yml
+             subPath: config.yml
+             name: tomcat-exporter
+     volumes:
+       - name: tomcat-exporter
+         configMap:
+           name: tomcat-exporter
+           items:
+             - key: config.yml
+               path: config.yml

Sie müssen Ihrer Konfiguration alle Zeilen hinzufügen, denen das Symbol + vorangestellt ist.

Führen Sie den folgenden Befehl aus, um Konfigurationsänderungen aus einer lokalen Datei anzuwenden:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Sie können Ihre Konfigurationen auch mit Terraform verwalten.

PodMonitoring-Ressource definieren

Für die Zielerkennung benötigt der Managed Service for Prometheus-Operator eine PodMonitoring-Ressource, die dem Tomcat-Exporter im selben Namespace entspricht.

Sie können die folgende PodMonitoring-Konfiguration verwenden:

# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: tomcat
  labels:
    app.kubernetes.io/name: tomcat
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  endpoints:
  - port: prometheus
    scheme: http
    interval: 30s
    path: /metrics
  selector:
    matchLabels:
      app.kubernetes.io/name: tomcat

Achten Sie darauf, dass die Labelselektoren und der Port mit den Selektoren und dem Port übereinstimmen, die unter Tomcat-Exporter installieren verwendet werden.

Führen Sie den folgenden Befehl aus, um Konfigurationsänderungen aus einer lokalen Datei anzuwenden:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Sie können Ihre Konfigurationen auch mit Terraform verwalten.

Regeln und Benachrichtigungen definieren

Sie können die folgende Rules-Konfiguration verwenden, um Benachrichtigungen für Tomcat-Messwerte zu definieren:

# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: monitoring.googleapis.com/v1
kind: Rules
metadata:
  name: tomcat-rules
  labels:
    app.kubernetes.io/component: rules
    app.kubernetes.io/name: tomcat-rules
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  groups:
  - name: tomcat
    interval: 30s
    rules:
    - alert: TomcatHighRequestRate
      annotations:
        description: |-
          Tomcat high request rate
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Tomcat high request rate (instance {{ $labels.instance }})
      expr: rate(tomcat_requestcount_total[5m]) >= 100
      for: 5m
      labels:
        severity: warning
    - alert: TomcatLowRequestRate
      annotations:
        description: |-
          Tomcat low request rate
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Tomcat low request rate (instance {{ $labels.instance }})
      expr: rate(tomcat_requestcount_total[5m]) <= 10
      for: 5m
      labels:
        severity: warning
    - alert: TomcatHighErrorRate
      annotations:
        description: |-
          Tomcat high error rate
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Tomcat high error rate (instance {{ $labels.instance }})
      expr: rate(tomcat_errorcount_total[5m]) > 100
      for: 5m
      labels:
        severity: warning

Führen Sie den folgenden Befehl aus, um Konfigurationsänderungen aus einer lokalen Datei anzuwenden:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Sie können Ihre Konfigurationen auch mit Terraform verwalten.

Weitere Informationen zum Anwenden von Regeln auf Ihren Cluster finden Sie unter Verwaltete Regelauswertung und Benachrichtigungen.

Sie können die Schwellenwerte für Benachrichtigungen an Ihre Anwendung anpassen.

Konfiguration prüfen

Mit dem Metrics Explorer können Sie prüfen, ob der Tomcat-Exporter richtig konfiguriert ist. Es kann ein oder zwei Minuten dauern, bis Cloud Monitoring Ihre Messwerte aufgenommen hat.

So prüfen Sie, ob die Messwerte aufgenommen wurden:

  1. Wählen Sie im Navigationsbereich der Google Cloud Console Monitoring und anschließend  Metrics Explorer aus:

    Zum Metrics Explorer

  2. Klicken Sie in der Symbolleiste des Bereichs "Query Builder" auf die Schaltfläche  MQL oder  PromQL.
  3. Prüfen Sie, ob PromQL in der Ein-/Aus-Schaltfläche Sprache ausgewählt ist. Die Sprachschaltfläche befindet sich in derselben Symbolleiste, mit der Sie Ihre Abfrage formatieren können.
  4. Geben Sie die folgende Abfrage ein und führen Sie sie aus:
    up{job="tomcat", cluster="CLUSTER_NAME", namespace="NAMESPACE_NAME"}

Dashboards ansehen

Die Cloud Monitoring-Integration beinhaltet das Dashboard Tomcat Prometheus – Übersicht. Dashboards werden automatisch mitkonfiguriert, wenn Sie die Integration konfigurieren. Sie können auch eine statische Vorschau von Dashboards aufrufen, ohne die Integration zu installieren.

So rufen Sie ein installiertes Dashboard auf:

  1. Wählen Sie im Navigationsbereich der Google Cloud Console Monitoring und anschließend  Dashboards aus:

    Dashboards aufrufen

  2. Wählen Sie den Tab Dashboard-Liste aus.
  3. Wählen Sie die Kategorie Integrationen aus.
  4. Klicken Sie auf den Namen des Dashboards, z. B. Tomcat Prometheus – Übersicht.

So rufen Sie eine statische Vorschau des Dashboards auf:

  1. Wählen Sie im Navigationsbereich der Google Cloud Console Monitoring und anschließend  Integrationen aus:

    Zu „Integrationen“

  2. Klicken Sie auf den Filter für die Deployment-Plattform Kubernetes Engine.
  3. Suchen Sie die Apache Tomcat-Integration und klicken Sie auf Details ansehen.
  4. Wählen Sie den Tab Dashboards aus.

Fehlerbehebung

Informationen zur Fehlerbehebung bei Problemen mit der Messwertaufnahme finden Sie unter Probleme mit der Erfassung über Exporter unter Fehlerbehebung bei Problemen mit der Aufnahme.