Statusüberwachung von Java-Apps mit Elasticsearch

Einführung

Da Elastic Stack 6.3 Java-Unterstützung für APM (Beta) bietet, habe ich ein wenig über die Überwachung der Anwendungsleistung recherchiert.

Es überwacht auch Spring Pet Clinic, eine Beispielanwendung von Spring Boot.

Vergleich der Methoden zur Leistungsüberwachung

Es gibt im Allgemeinen zwei Möglichkeiten, die Java-Leistung zu überwachen:

Bei Verwendung von Elastic Stack können die folgenden Methoden berücksichtigt werden, um Informationen zu Java zu erhalten.

Vergleich jeder Methode

Methode Aufnahmemethode Aufgezeichneter Inhalt Ergänzung zu Java-Optionen Bemerkungen
JMX PC mit jmc verbunden Der Benutzer legt die Elemente fest, die vom MBean-Server erfasst werden können JMX-Portöffnung und Berechtigungen Im JDK enthalten
JFR PC mit Flugschreiber vor Ort oder bei jmc gestartet Von JFR aufgenommene Artikel Startoption für JFR-Aufnahme. Fügen Sie die gleichen Einstellungen wie JMX hinzu, wenn Sie mit jmc aufnehmen
Elastic APM Holen Sie es sich mit APM Client und gehen Sie über den APM-Server zur elastischen Suche Informationen für Webanwendungen APM-JAR oder APM-Serveradresse APM-Client-API
Metricbeat Erhalten von Jolokia und von Metricbeat bis Elasticsearch Der Benutzer legt die Elemente fest, die vom MBean-Server erfasst werden können Fügen Sie Jolokia jar hinzu oder öffnen Sie den JMX-Port und die Berechtigungen Jolokia

Vorbereitung der Kibana + Elasticsearch + APM Server-Umgebung

Bereiten Sie die Mindestumgebung mit dem offiziellen Bild von Elastic vor.

https://www.docker.elastic.co/

docker-compose.yml


version: '3'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.5.1
    volumes:
      - ./esdata:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
  kibana:
    image: docker.elastic.co/kibana/kibana:6.5.1
    ports:
      - 5601:5601
  apm:
    image: docker.elastic.co/apm/apm-server:6.5.1
    ports:
     - 8200:8200

Baue eine Spring Pet Clinic

Dieses Mal werden wir mit OpenJDK 11 von Ubuntu Server 18.04 erstellen. Es kann jedoch nicht so gebaut werden, wie es ist, daher dauert es einige Zeit.

terminal


sudo apt install default-jdk
git clone https://github.com/spring-projects/spring-petclinic.git
cd spring-petclinic

Ein Ärger

pom.xml


<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <configuration>
        <useSystemClassLoader>false</useSystemClassLoader>
    </configuration>
</plugin>

Bauen

terminal


./mvnw package

Anlaufen

terminal


java -jar target/*.jar

OK, wenn Sie auf den Browser zugreifen und der Bildschirm angezeigt wird

SpringPetClinic.png

Überwachung mit APM

Laden Sie APM herunter

terminal


curl -O https://search.maven.org/remotecontent?filepath=co/elastic/apm/elastic-apm-agent/1.0.1/elastic-apm-agent-1.0.1.jar

Fügen Sie APM Client zu Java-Laufzeitargumenten hinzu. Ausführliche Informationen zur Einstellungsmethode finden Sie in Offiziell und in den Setup-Anweisungen von Kibana.

terminal(Zusätzliches Beispiel)


java -javaagent:elastic-apm-agent-1.0.1.jar -Delastic.apm.service_name=petclinic -Delastic.apm.application_packages=org.example -Delastic.apm.server_urls=http://localhost:8200 -jar target/*.jar

Wenn PetClinic gestartet wird, wird APM ordnungsgemäß ausgeführt. Wenn es nicht gestartet werden kann, sollte eine Fehlermeldung im Terminal angezeigt werden. Überprüfen Sie daher die Fehlermeldung.

Einstellungen nach dem Start

Wählen Sie APM Setup Instructions von Kibana aus und klicken Sie unten auf die Schaltfläche Kibana-Objekte laden. Bei Erfolg werden die überwachten Daten gelesen.

apm_check.png

Informationen, die erhalten werden können

Screenshot des Ergebnisses des ordnungsgemäßen Betriebs des Bildschirms der Tierklinik

APM-Dashboard

apm_dash_1.png

Verarbeitungsstatus anfordern

Sie können die Liste der durchschnittlichen Verarbeitungszeit von Anforderungen überprüfen. Bei Anfragen, für die Sie die Details überprüfen möchten, können Sie zum Detailbildschirm wechseln, indem Sie auf die URL in der Tabelle am unteren Bildschirmrand klicken.

apm_request.png

Anfragedetails

Ab der für jeden Prozess erforderlichen Zeit können Sie Details wie den Status der Abfrageausgabe und Anforderungsparameter überprüfen.

apm_transaction_1.png apm_transaction_2.png apm_transaction_3.png

Java-Anwendungsfehler

apm_error.png apm_error_detail.png

Überwachung mit Metricbeat

Es gibt zwei Arten von Überwachungskonfigurationen mit Metricbeat.

  1. Stellen Sie sicher, dass die Java-Anwendung mit dem JVM-Agentendienst und dem Krieg von Jolokia koexistiert
  2. Stellen Sie eine Verbindung zu JMX her und greifen Sie über den Proxy-Modus von Jolokia zu

Dieses Mal werde ich jeden von ihnen erklären. Da jede Installationsmethode anders ist, wählen Sie diese bitte entsprechend Ihrer Umgebung aus. Wenn Sie beispielsweise einen neuen Server erstellen, fügen Sie den Startparametern im Voraus das APM-Glas und das Jolokia-Glas hinzu. Stellen Sie beim Hinzufügen zu einem vorhandenen Dienst mithilfe des Jolokia-Proxy-Modus, der mit JMX eine Verbindung zum vorhandenen Anwendungsserver herstellt, eine Verbindung zum vorhandenen Anwendungsserver her, um den vorhandenen Dienst nicht wesentlich zu beeinträchtigen.

Der Umriss ist wie folgt. Verwenden Sie für erstere den JVM-Anget-Modus. War wird nur auf dem Anwendungsserver bereitgestellt, diesmal also in der Nähe des letzteren, sodass ich es weglassen werde. In Bezug auf Letzteres werden wir es verwenden, indem wir einen leichtgewichtigen Webanwendungsserver starten und dort Krieg bereitstellen. In beiden Fällen wird Metricbeat auf demselben Server ausgeführt.

Weitere Informationen zum Einstellen von Jolokia und zu Ihren Möglichkeiten finden Sie unter Offiziell.

Metricbeat-Grundeinstellungen

terminal


curl -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.5.1-linux-x86_64.tar.gz

metricbeat.yml Einstellungen

Legen Sie die URL für die elastische Suche fest.

metricbeat.yml


output.elasticsearch:
  # Array of hosts to connect to.
  hosts: ["localhost:9200"]

Jolokia-Einstellungen

1. Wenn Sie den JVM-Agent-Dienst von Jolokia in einer Java-Anwendung gleichzeitig verwenden

Laden Sie den JVM-Agenten von Jolokia herunter.

terminal


curl -O http://search.maven.org/remotecontent?filepath=org/jolokia/jolokia-jvm/1.6.0/jolokia-jvm-1.6.0-agent.jar

Java-Optionen

terminal


java -javaagent:jolokia-jvm-1.6.0-agent.jar -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar

Jolokia Startbestätigung

Wenn Sie / am Ende vergessen, wird die JSON-Antwort nicht zurückgegeben.

terminal


curl http://localhost:8778/jolokia/ | jq

Metricbeat-Einstellungen für Jolokia JVM Agent

Aktivieren Sie das Jolokia-Modul. Dieses Mal sind die Informationen zum Systemmodul zur Erläuterung nicht erforderlich und daher deaktiviert.

terminal


./metricbeat modules disable system
./metricbeat modules enable jolokia

Einstellungen für Jolokia.yml

Dieses Mal werden die Startzeit von JVM und die Nutzungsrate des Heap-Speichers erfasst. Wählen Sie die Informationen aus, die Sie erhalten möchten, indem Sie sich tatsächlich mit jmc usw. verbinden.

yml:module.d/jolokia.yml


- module: jolokia
  metricsets: ["jmx"]
  period: 10s
  hosts: ["localhost:8778"]
  path: "/jolokia/?ignoreErrors=true&canonicalNaming=false"
  namespace: "metrics"
  jmx.mappings:
    - mbean: 'java.lang:type=Runtime'
      attributes:
        - attr: Uptime
          field: uptime
    - mbean: 'java.lang:type=Memory'
      attributes:
        - attr: HeapMemoryUsage
          field: memory.heap_usage
        - attr: NonHeapMemoryUsage
          field: memory.non_heap_usage

Funktionsprüfung des Jolokia-Moduls

terminal


./metricbeat test modules

Starten Sie metricbeat und überprüfen Sie dessen Funktion

Ich werde den Service von Metricbeat und die Verwendung von Kibana weglassen.

terminal


./metricbeat

heap_usage.png

2. Stellen Sie eine Verbindung mit JMX her und greifen Sie über den Proxy-Modus von Jolokia zu

Da es viele Einstellungen gibt, führen Sie diese in der folgenden Reihenfolge durch.

Aktivieren Sie JMX für den Anwendungsserver

Dieses Mal wurden die Mindeststartparameter hinzugefügt, ohne Sicherheitseinstellungen wie die Authentifizierung vorzunehmen. Das Jolokia-Modul von metricbeat unterstützt die Authentifizierung anhand der Benutzer-ID und des Kennworts.

termainl


java -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar

Überprüfen Sie die Verbindung mit JMC.

jmc.png

Herstellen einer Verbindung zu einem Anwendungsserver über den Proxy-Modus von Jolokia

Herstellen einer Verbindung zur Java-Zielanwendung mit JMX im Jolokia-Proxy-Modus Klicken Sie hier für technische Details und detaillierte Einstellungen (https://jolokia.org/reference/html/proxy.html).

Anlegestellen-Servereinstellungen

Laden Sie den Anlegeserver herunter und ändern Sie die Portnummer usw. Dieses Mal verwendet PetClinic Port 8080. Ändern Sie ihn daher in Port 8081. Wählen Sie die Stegversion nach Bedarf unter Offiziell aus.

terminal


curl -O https://repo1.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.14.v20181114/jetty-distribution-9.4.14.v20181114.tar.gz
tar xf jetty-distribution-9.4.14.v20181114.tar.gz
cd jetty-distribution-9.4.14.v20181114/

start.ini


## Connector port to listen on
jetty.http.port=8081

Wenn Sie eine Verbindung über den Proxy-Modus von Jolokia herstellen möchten, müssen Sie eine Option hinzufügen. Fügen Sie diesmal die erforderlichen Einstellungen zu web.xml hinzu. Darüber hinaus kann die Authentifizierungsfunktion in dieser Konfiguration nicht aktiviert werden, sodass sie deaktiviert ist.

terminal


cd webapps/
curl -O http://search.maven.org/remotecontent?filepath=org/jolokia/jolokia-war/1.6.0/jolokia-war-1.6.0.war
mv jolokia-war-1.6.0.war jolokia.war
mkdir jolokia
cd jolokia
jar xf ../jolokia.war 

Fügen Sie dem Servlet-Tag die folgenden Einstellungen hinzu.

WEB-INF/web.xml


<servlet>
  <init-param>
    <param-name>dispatcherClasses</param-name>
    <param-value>org.jolokia.jsr160.Jsr160RequestDispatcher</param-value>
  </init-param>
  ...
</servlet>

Deaktivieren Sie den Teil, der sich auf die Authentifizierungsfunktion bezieht.

WEB-INF/web.xml


<web-app>
  ...
  <!--
  Security enabled by default. Please update to match you specific security setup (e.g. the auth-method)
  -->
  <!--
  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>jolokia</realm-name>
  </login-config>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Jolokia-Agent Access</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>jolokia</role-name>
    </auth-constraint>
  </security-constraint>

  <security-role>
    <role-name>jolokia</role-name>
  </security-role>
  -->
</web-app>

Bestätigung des Starts des Jolokia-Servers

Wenn Sie / am Ende vergessen, wird die JSON-Antwort nicht zurückgegeben.

tarminal


curl -O http://localhost:8081/jolokia/ | jq

Überprüfen der Verbindung im Proxy-Modus des Jolokia-Servers

tarminal(Anfrage)


curl -X POST -H 'Content-Type:application/json' -d '{"type":"read","mbean":"Tomcat:type=Server", "attribute" : "serverInfo", "target" : { "url": "service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi" } }' http://localhost:8081/jolokia/ | jq

terminal(Ergebnisbeispiel)


{
  "request": {
    "mbean": "Tomcat:type=Server",
    "attribute": "serverInfo",
    "type": "read",
    "target": {
      "url": "service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi"
    }
  },
  "value": "Apache Tomcat/9.0.12",
  "timestamp": 1543418665,
  "status": 200
}

Wenn die Einstellungen nicht ausreichen, wird eine Fehlermeldung ausgegeben. Überprüfen Sie den Inhalt und korrigieren Sie ihn.

Festlegen des Jolokia-Proxy-Modus für Metricbeat

Aktivieren Sie das Jolokia-Modul. Dieses Mal sind die Informationen zum Systemmodul zur Erläuterung nicht erforderlich und daher deaktiviert.

terminal


./metricbeat modules disable system
./metricbeat modules enable jolokia

Einstellungen für jolokia.yml

Dieses Mal werden die Startzeit von JVM und die Nutzungsrate des Heap-Speichers erfasst. Wählen Sie die Informationen aus, die Sie erhalten möchten, indem Sie sich tatsächlich mit jmc usw. verbinden. Wir haben auch eine MBean hinzugefügt, um die Tomcat-Version zum Testen zu erhalten, um festzustellen, ob sie wirklich remote abgerufen wird.

yml:module.d/jolokia.yml


- module: jolokia
  metricsets: ["jmx"]
  period: 10s
  hosts: ["localhost:8081"]
  path: "/jolokia/?ignoreErrors=true&canonicalNaming=false"
  namespace: "metrics"
  jmx.mappings:
    - mbean: 'java.lang:type=Runtime'
      attributes:
        - attr: Uptime
          field: uptime
      target:
        url: 'service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi'
    - mbean: 'java.lang:type=Memory'
      attributes:
        - attr: HeapMemoryUsage
          field: memory.heap_usage
        - attr: NonHeapMemoryUsage
          field: memory.non_heap_usage
      target:
        url: 'service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi'
    - mbean: 'Tomcat:type=Server'
      attributes:
        - attr: serverInfo
          field: tomcat.serverInfo
      target:
        url: 'service:jmx:rmi:///jndi/rmi://localhost:7091/jmxrmi'

Funktionsprüfung des Jolokia-Moduls

terminal


./metricbeat test modules

Von hier an ist die obige Funktionsprüfung dieselbe, daher wird sie weggelassen.

abschließend

Mit dem APM-Agenten konnte ich problemlos die Metriken der Webanwendung abrufen. Ich hatte das Gefühl, dass es sehr gut mit Mikrodiensten kompatibel ist. Sie sollten in Betracht ziehen, eine neu erstellte Webanwendung einzuführen.

Das Jolokia-Modul von metricbeat ist attraktiv für die flexible Datenerfassung mit MBeans. Es kann auf andere als Webanwendungen angewendet werden. Sie können auch Metriken für vorhandene Dienste abrufen, solange JMX bereit ist.

Recommended Posts

Statusüberwachung von Java-Apps mit Elasticsearch
Überprüfen Sie den Status der Java-Anwendung, ohne das Überwachungstool zu verwenden
Zusammenfassung der objektorientierten Programmierung mit Java
Ich habe versucht, Google HttpClient von Java zu verwenden
Ist die von Ihnen verwendete Version von Elasticsearch mit Java 11 kompatibel?
Versuchen Sie es mit dem Java Framework Nablarch [Web Application]
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
ERRORCODE = -4471 tritt in einer Java-Anwendung auf, die Db2 verwendet.
Speichermessung von Java-Apps unter Windows
Erfassung von Eingabeinhalten mit Scanner (Java)
Rolle von JSP in Webanwendungen [Java]
Überprüfung der Auswirkungen auf die Leistung bei Verwendung von Java Volatile
Versuchen Sie eine ähnliche Suche in der Bildsuche mit dem Java SDK [Suche]
Ein Beispiel, bei dem die Verwendung von Addition schneller ist als die Verwendung von StringBuilder (Java)
Geschichte der Testautomatisierung mit Appium [Android / Java]
[Java] Übersicht über Java
Überprüfen Sie den Status der Ratenbegrenzungsanwendung für Docker Pull
[Java10] Achten Sie darauf, var und generics nicht zusammen zu verwenden
Abgelaufene Java-Sammlung
Sortieren mit Java-Komparator
Voraussichtliche Funktionen von Java
[Java] Bedeutung der serialVersionUID
Verwenden der Elasticsearch Java-API (Aggregation)
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
Java - Vereinigung von Kommentaren
Schrottpraxis mit Java ②
Geschichte der Java-Annotationen
Schrottpraxis mit Java ①
NIO Bewertung von Java
[Java] Drei Funktionen von Java
Zusammenfassung der Verwendung von DBFlow
Zusammenfassung der Java-Unterstützung 2018
Die Geschichte der Erstellung einer Task-Management-Anwendung mit Swing, Java
[Java] Vergleichsmethode für Zeichenketten und Vergleichsmethode mit regulären Ausdrücken
Verwenden mehrerer Java-Versionen mit Brew auf Mac + jEnv
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
[Java] Versuchen Sie, die Elemente der Json-Zeichenfolge mithilfe der Bibliothek zu bearbeiten
Elasticsearch-Vorgang über die REST-API mit Apache HttpClient in Java
Die Geschichte, Java mithilfe der BitBucket-Pipeline nach Heroku zu bringen
Häufige Missverständnisse über die Begrenzung der Java-Anwendungsressourcen bei Verwendung von Kubernetes