Integration · Java

Java APM und JVM-Monitoring

Binden Sie den OpenTelemetry Java Agent ein, und Obseria zeigt Request-Traces, Heap, Garbage Collection, Threads und CPU-Profile jedes Java-Service, korreliert mit Logs und Infrastruktur.
Obseria Apps und Funktionen: Observability, APM, Infrastruktur und Integrationen
Obseria Home-Dashboard mit Service-Zustand, offenen Problemen, SLO-Erfüllung und Ingestion
Obseria Trace-Explorer mit Span-Liste und Span-Attributen
Überblick

Warum Java mit Obseria überwachen

Instrumentierung ohne Code

Der OpenTelemetry Java Agent instrumentiert Spring, Servlet-Container, JDBC, Kafka, gRPC und HTTP-Clients beim Start, ohne Eingriff in Ihren Code.

JVM-Interna im Kontext

Heap-Pools, GC-Pausen und Thread-Zahlen stehen direkt neben den betroffenen Traces. So erkennen Sie, ob Latenz aus Code, JVM oder einer Abhängigkeit kommt.

Bis auf die Methode

Continuous Profiling mit unter 1 % Overhead zeigt, welche Methoden in Produktion CPU verbrauchen oder Speicher allokieren.

Abdeckung

Java-Frameworks und Runtimes, die Obseria überwacht

  • Spring Boot und Spring MVC/WebFlux. Controller, RestTemplate, WebClient und Spring-Data-Aufrufe erscheinen automatisch als Spans.
  • Jakarta EE und Servlet-Container. Tomcat, Jetty, Undertow, WildFly und weitere Container werden auf Request-Ebene getract.
  • Quarkus und Micronaut. Cloud-native Frameworks werden über den Agent oder ihre eingebauten OpenTelemetry-Erweiterungen erfasst.
  • JDBC, Hibernate und Connection Pools. Jedes SQL-Statement wird zum Client-Span, die Auslastung von HikariCP erscheint als Metrik.
  • Kafka-, JMS- und RabbitMQ-Clients. Producer- und Consumer-Spans tragen den Trace-Kontext über Queues hinweg.
  • HotSpot-, OpenJDK- und GraalVM-JVMs. Runtime-Metriken folgen den OpenTelemetry-Semantic-Conventions für die JVM ab Java 8.
Auf einen Blick

Die Java-Kennzahlen, auf die es ankommt

Obseria erfasst diese Werte automatisch und zeigt sie in fertigen Dashboards und Alerts.

Tempo für Nutzer

Zeigt, wie schnell Ihre Java-Dienste auf Anfragen antworten, die Kennzahl, die für Ihre Kunden am meisten zählt.

  • http.server.request.duration

Zustand des Speichers

Zeigt, wie viel Speicher Ihre Anwendung nutzt und ob sie sich mit der Zeit langsam ihrer Grenze nähert.

  • jvm.memory.used
  • jvm.memory.used_after_last_gc
  • jvm.memory.limit

Pausen beim Aufräumen

Macht sichtbar, wie lange die Anwendung pausiert, um Speicher freizugeben, was Nutzer als plötzliche Hänger erleben.

  • jvm.gc.duration

Last der Verarbeitung

Zeigt, wie ausgelastet Ihre Anwendung ist und wie viele Aufgaben und Komponenten sie gerade gleichzeitig ausführt.

  • jvm.thread.count
  • jvm.class.loaded
  • jvm.cpu.recent_utilization
Alle 8 Metriken im Detail anzeigen
MetrikEinheitAussage
jvm.memory.usedBySpeicher je Pool (Eden, Survivor, Old Gen, Metaspace), Grundlage zur Leak-Erkennung.
jvm.memory.used_after_last_gcByLebender Heap nach der Collection; stetiges Wachstum deutet auf ein Memory Leak.
jvm.memory.limitByMaximale Größe je Pool, um die Heap-Auslastung gegenüber -Xmx zu berechnen.
jvm.gc.durationsDauer der Garbage Collections je Collector; lange Pausen erhöhen die Latenz.
jvm.thread.count{thread}Aktive Threads je Zustand; viele blockierte Threads zeigen Contention.
jvm.class.loaded{class}Seit dem Start geladene Klassen; unerwartetes Wachstum weist auf Classloader-Leaks.
jvm.cpu.recent_utilization1Aktuelle CPU-Nutzung des JVM-Prozesses, um CPU-Sättigung von Wartezeiten zu trennen.
http.server.request.durationsLatenz-Histogramm eingehender HTTP-Requests je Route und Statuscode.
Einrichtung

Java-Monitoring in wenigen Minuten einrichten

  1. Schritt 1

    Java Agent herunterladen

    Laden Sie die offizielle opentelemetry-javaagent.jar oder installieren Sie den Obseria Agent, der sie auf Hosts und in Kubernetes-Pods einbinden kann.

  2. Schritt 2

    Auf Obseria zeigen

    Setzen Sie OTEL_SERVICE_NAME, den OTLP-Endpoint und Ihr Token als Umgebungsvariablen.

  3. Schritt 3

    Mit -javaagent starten

    Ergänzen Sie den Startbefehl der JVM um -javaagent; Traces und JVM-Metriken treffen nach wenigen Minuten ein.

Beispielkonfiguration · BASH
# Offiziellen OpenTelemetry Java Agent herunterladen
curl -L -o opentelemetry-javaagent.jar \
  https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar

export OTEL_SERVICE_NAME="checkout"
export OTEL_RESOURCE_ATTRIBUTES="deployment.environment.name=production,service.version=1.8.0"
export OTEL_EXPORTER_OTLP_ENDPOINT="${OBSERIA_OTLP_ENDPOINT}"
export OTEL_EXPORTER_OTLP_HEADERS="Authorization=Bearer%20${OBSERIA_TOKEN}"
export OTEL_EXPORTER_OTLP_PROTOCOL="http/protobuf"

java -javaagent:./opentelemetry-javaagent.jar -jar checkout.jar

Sofort einsatzbereit

Dashboards, Alerts und SLOs, die bereitstehen, sobald die ersten Daten ankommen.

  • JVM-Übersicht: Heap, GC, Threads, Klassen
  • Service-Health mit RED-Metriken je Endpoint
  • Alert bei zu langen GC-Pausen
  • Alert bei steigendem Heap nach GC
  • Langsamste SQL-Statements je Service
Leitfaden

Java-Monitoring: Darauf kommt es an

Warum Java APM wichtig ist

Java betreibt nach wie vor einen großen Teil geschäftskritischer Backends: Zahlungsverkehr, Auftragsabwicklung, Kernbankensysteme und unzählige Spring-Boot-Microservices. Gesunde Java-Services sind schnell, doch die JVM liegt als zusätzliche Schicht zwischen Code und Betriebssystem. Garbage Collection, JIT-Compiler, Thread-Pools und Connection Pools beeinflussen die Antwortzeit. Java APM verbindet Distributed Tracing mit JVM-Monitoring, damit Sie erkennen, ob ein langsamer Request am eigenen Code, an der Runtime oder an einer nachgelagerten Datenbank liegt.

Klassisches Java Performance Monitoring setzte auf proprietäre Bytecode-Agents. Heute bietet der OpenTelemetry Java Agent denselben Zero-Code-Ansatz als offenen Standard: Eine JAR-Datei, per -javaagent eingebunden, instrumentiert Hunderte Bibliotheken und sendet Traces, Metriken und Logs per OTLP.

Die wichtigsten JVM-Signale

Ein sinnvolles Java Performance Monitoring beobachtet neben den Golden Signals jedes Service eine überschaubare Zahl an Runtime-Signalen:

  • Heap und Memory Pools: jvm.memory.used je Pool sowie jvm.memory.used_after_last_gc. Letztere ist entscheidend, denn der lebende Heap nach der Collection zeigt den tatsächlichen Speicherbedarf.
  • Garbage Collection: jvm.gc.duration je Collector (G1, ZGC, Parallel). Häufige oder lange Pausen schlagen direkt auf die Tail-Latenz durch.
  • Threads: jvm.thread.count je Zustand. Viele blockierte Threads deuten auf Lock-Contention oder erschöpfte Pools.
  • CPU: jvm.cpu.recent_utilization zeigt, ob der Prozess CPU-gebunden ist oder auf I/O wartet.
  • Requests und Abhängigkeiten: http.server.request.duration plus Datenbank- und Messaging-Spans liefern Rate, Fehler und Dauer je Endpoint.

Typische Performance-Probleme in Java erkennen

Memory Leaks

Ein Leak zeigt sich, wenn der Heap nach GC über Stunden oder Tage schrittweise steigt, gefolgt von längeren Collections und schließlich einem OutOfMemoryError. Ein Alert auf den Trend statt auf einen festen Schwellwert greift, bevor Nutzer etwas merken.

GC-Druck

Hohe Allokationsraten erzwingen häufige Young-Generation-Collections. Traces mit Lücken, die zeitlich mit GC-Ereignissen zusammenfallen, machen die Auswirkung sichtbar; Allokationsprofile zeigen die verantwortlichen Codepfade.

Erschöpfte Pools

Ist ein JDBC- oder HTTP-Client-Pool zu klein, stauen sich Requests. Sie sehen steigende Latenz, viele wartende Threads und Spans, die Zeit vor der eigentlichen Abfrage verbringen.

Langsame Queries und N+1-Muster

ORM-Frameworks wie Hibernate setzen pro Request mitunter Dutzende Statements ab. Im Trace-Wasserfall sind N+1-Muster sofort erkennbar.

Lock-Contention und hängende Threads

Synchronized-Blöcke um gemeinsam genutzte Caches oder alte Singletons serialisieren Requests unter Last. Typisch ist eine wachsende Zahl von Threads im Zustand BLOCKED, während die CPU-Last flach bleibt und die Latenz steigt. Lock-Profile und Thread-Dumps aus genau diesem Zeitraum zeigen, auf welchen Monitor alle warten.

Langsamer Start und kalter JIT-Compiler

Direkt nach einem Deployment hat der JIT-Compiler die heißen Codepfade noch nicht optimiert, die ersten Requests sind langsamer. Wer die Latenz je service.version in den ersten Minuten nach dem Rollout vergleicht, trennt Aufwärmeffekte von echten Regressionen. Das verhindert unnötige Rollbacks ebenso wie übersehene Fehler.

Logs ohne Kontext

Stacktraces in Logdateien helfen wenig, wenn unklar ist, zu welchem Request sie gehören. Der Java Agent schreibt Trace- und Span-IDs automatisch in den MDC von Logback und Log4j, sodass Sie vom Fehler-Log direkt zum zugehörigen Trace springen.

Best Practices für JVM-Monitoring

  1. Setzen Sie service.name, service.version und deployment.environment.name für jeden Service, um Releases vergleichen zu können.
  2. Nutzen Sie den Agent für breite Abdeckung und ergänzen Sie manuelle Spans über die OpenTelemetry API nur für relevante Geschäftslogik.
  3. Betrachten Sie Heap nach GC und GC-Dauer immer gemeinsam; jeder Wert allein kann täuschen.
  4. Stimmen Sie Container-Memory-Limits und -Xmx aufeinander ab und überwachen Sie JVM und cgroup.
  5. Verwenden Sie Tail-based Sampling, um alle langsamen und fehlerhaften Traces zu behalten und Routineverkehr zu verwerfen.

So unterstützt Obseria Java APM

Obseria nimmt die Daten des standardmäßigen OpenTelemetry Java Agent per OTLP entgegen; ein proprietärer Agent ist nicht nötig. Auf Hosts und in Kubernetes kann der Obseria Agent den Java Agent automatisch einbinden und ergänzt Host-, Container- und Logdaten. TopoGraph ordnet jeden Java-Service seinen Datenbanken, Queues und Aufrufern zu. Continuous Profiling mit unter 1 % Overhead verknüpft Hotspot-Methoden mit den Traces, die sie bremsen. Steigt die Latenz, korreliert Obseria Intelligence GC-Spitzen, Deployments oder langsame Queries und präsentiert die Ursache mit nachvollziehbarer Beweiskette. Dashboards, Alerts und SLOs sind inklusive, und alle Daten bleiben per OTLP exportierbar.

Häufige Fragen zum Java-Monitoring

Nein. Der OpenTelemetry Java Agent instrumentiert gängige Frameworks und Bibliotheken beim Start. Sie ergänzen nur das Flag -javaagent und einige Umgebungsvariablen. Manuelle Spans sind optional.

Der OpenTelemetry Java Agent unterstützt Java 8 und neuer auf HotSpot, OpenJDK und weiteren gängigen JVMs. Obseria verarbeitet alles, was der Agent per OTLP sendet.

Der Overhead hängt von Traffic und Anzahl der instrumentierten Bibliotheken ab. Sampling und das Abschalten nicht benötigter Instrumentierungen halten ihn gering. Continuous Profiling in Obseria läuft mit unter 1 % Overhead.

Ja. Der Java Agent liefert standardmäßig JVM-Runtime-Metriken. Zusätzliche MBeans, etwa von Kafka oder Tomcat, erfassen Sie über die JMX-Unterstützung von OpenTelemetry oder den Collector.

Ja. Installieren Sie den Obseria Agent per Helm als DaemonSet oder nutzen Sie den OpenTelemetry Operator, um den Java Agent in Pods zu injizieren. Traces werden mit Pod-, Namespace- und Node-Metadaten angereichert.

Starten Sie heute mit dem Java-Monitoring

Binden Sie Java in Minuten per OpenTelemetry oder Obseria Agent an. 14 Tage kostenlos.