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.
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 |
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
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
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.
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.
Screenshot des Ergebnisses des ordnungsgemäßen Betriebs des Bildschirms der Tierklinik
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.
Ab der für jeden Prozess erforderlichen Zeit können Sie Details wie den Status der Abfrageausgabe und Anforderungsparameter überprüfen.
Es gibt zwei Arten von Überwachungskonfigurationen mit Metricbeat.
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.
terminal
curl -O https://artifacts.elastic.co/downloads/beats/metricbeat/metricbeat-6.5.1-linux-x86_64.tar.gz
Legen Sie die URL für die elastische Suche fest.
metricbeat.yml
output.elasticsearch:
# Array of hosts to connect to.
hosts: ["localhost:9200"]
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
terminal
java -javaagent:jolokia-jvm-1.6.0-agent.jar -jar target/spring-petclinic-2.1.0.BUILD-SNAPSHOT.jar
Wenn Sie / am Ende vergessen, wird die JSON-Antwort nicht zurückgegeben.
terminal
curl http://localhost:8778/jolokia/ | jq
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
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
terminal
./metricbeat test modules
Ich werde den Service von Metricbeat und die Verwendung von Kibana weglassen.
terminal
./metricbeat
Da es viele Einstellungen gibt, führen Sie diese in der folgenden Reihenfolge durch.
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.
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).
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>
Wenn Sie / am Ende vergessen, wird die JSON-Antwort nicht zurückgegeben.
tarminal
curl -O http://localhost:8081/jolokia/ | jq
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.
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
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'
terminal
./metricbeat test modules
Von hier an ist die obige Funktionsprüfung dieselbe, daher wird sie weggelassen.
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