{"id":505,"date":"2024-11-11T10:29:17","date_gmt":"2024-11-11T09:29:17","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=505"},"modified":"2024-12-03T10:36:52","modified_gmt":"2024-12-03T09:36:52","slug":"opentelemetry-in-spring-boot-automatische-instrumentierung-mit-dem-jvm-agent","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=505","title":{"rendered":"OpenTelemetry in Spring Boot: Automatische Instrumentierung mit dem JVM-Agent"},"content":{"rendered":"\n<p>Mit der wachsenden Bedeutung verteilter Systeme und Microservices in der modernen Softwareentwicklung wird die Observierbarkeit von Anwendungen immer wichtiger. Entwickler m\u00f6chten nicht nur Fehler schneller finden, sondern auch die Performance von Anwendungen \u00fcberwachen und verbessern. OpenTelemetry, ein Open-Source-Framework f\u00fcr Observability, bietet hierf\u00fcr eine umfassende L\u00f6sung. In Kombination mit Spring Boot erm\u00f6glicht es eine leistungsstarke \u00dcberwachung und Nachverfolgung (Tracing) von Anfragen in Microservices-Architekturen. In diesem Artikel erl\u00e4utern wir die Grundlagen von OpenTelemetry, den Einsatz in Spring Boot und die automatische Instrumentierung mittels des JVM-Agents.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Was ist OpenTelemetry?<\/h3>\n\n\n\n<p>OpenTelemetry ist ein CNCF-Projekt (Cloud Native Computing Foundation), das standardisierte APIs, SDKs und Tools f\u00fcr Tracing, Metriken und Logs bereitstellt. Ziel ist es, die Observierbarkeit von Anwendungen zu erleichtern, indem Entwickler eine einheitliche und technologie\u00fcbergreifende Plattform nutzen k\u00f6nnen. OpenTelemetry unterst\u00fctzt zahlreiche Sprachen und Frameworks, darunter Java und Spring Boot.<\/p>\n\n\n\n<p>Mit OpenTelemetry k\u00f6nnen Entwickler:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Traces<\/strong>: Die Ausf\u00fchrung von Anfragen \u00fcber mehrere Dienste hinweg nachverfolgen.<\/li>\n\n\n\n<li><strong>Metriken<\/strong>: Leistungsdaten wie Latenzzeiten und Durchsatz sammeln.<\/li>\n\n\n\n<li><strong>Logs<\/strong>: Relevante Ereignisse und Fehler dokumentieren.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Spring Boot und Observierbarkeit<\/h3>\n\n\n\n<p>Spring Boot ist eines der am h\u00e4ufigsten verwendeten Frameworks f\u00fcr die Entwicklung von Microservices. Die Observierbarkeit solcher Anwendungen ist entscheidend, da ein Fehler in einem Service zu einem Kaskadeneffekt f\u00fchren kann, der die gesamte Anwendung beeintr\u00e4chtigt. Mit Spring Boot lassen sich Observability-Tools wie OpenTelemetry nahtlos integrieren.<\/p>\n\n\n\n<p>W\u00e4hrend die manuelle Instrumentierung (d.h. das Hinzuf\u00fcgen von Tracing-Logik im Code) m\u00f6glich ist, ist sie oft zeitaufw\u00e4ndig und fehleranf\u00e4llig. Hier kommt die automatische Instrumentierung ins Spiel, die durch den OpenTelemetry JVM-Agent realisiert wird.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Automatische Instrumentierung mit dem JVM-Agent<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Was ist der OpenTelemetry JVM-Agent?<\/h4>\n\n\n\n<p>Der JVM-Agent ist ein Java-Agent, der zur Laufzeit an die JVM (Java Virtual Machine) angeh\u00e4ngt wird. Er modifiziert die Bytecode-Ausf\u00fchrung und f\u00fcgt automatisch Tracing- und Metrik-Funktionalit\u00e4ten hinzu, ohne dass \u00c4nderungen am Anwendungscode erforderlich sind. Dies ist besonders n\u00fctzlich in Szenarien, in denen manuelle Instrumentierung unpraktisch ist.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteile des JVM-Agents:<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Keine Code\u00e4nderungen<\/strong>: Entwickler m\u00fcssen keine spezifischen OpenTelemetry-Bibliotheken in ihre Anwendung einbinden.<\/li>\n\n\n\n<li><strong>Zeitersparnis<\/strong>: Automatische Instrumentierung reduziert den Entwicklungsaufwand erheblich.<\/li>\n\n\n\n<li><strong>Konsistenz<\/strong>: Der Agent verwendet bew\u00e4hrte Instrumentierungsbibliotheken und sorgt f\u00fcr konsistente Traces und Metriken.<\/li>\n\n\n\n<li><strong>Flexibilit\u00e4t<\/strong>: Der Agent unterst\u00fctzt verschiedene Backends f\u00fcr Traces und Metriken, z. B. Jaeger, Zipkin oder Prometheus.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Schritt-f\u00fcr-Schritt-Anleitung: OpenTelemetry in Spring Boot mit JVM-Agent<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Voraussetzungen<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine Spring-Boot-Anwendung (Version 2.5 oder h\u00f6her wird empfohlen).<\/li>\n\n\n\n<li>Java 8 oder h\u00f6her.<\/li>\n\n\n\n<li>Zugriff auf ein Observability-Backend wie Jaeger oder Zipkin (optional f\u00fcr Tracing-Visualisierung).<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">1. JVM-Agent herunterladen<\/h4>\n\n\n\n<p>Der OpenTelemetry JVM-Agent kann von der offiziellen OpenTelemetry-Website heruntergeladen werden. Die Agent-Datei hat \u00fcblicherweise den Namen <code>opentelemetry-javaagent.jar<\/code>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Agent zur JVM hinzuf\u00fcgen<\/h4>\n\n\n\n<p>Der JVM-Agent wird der Anwendung \u00fcber die JVM-Option <code>-javaagent<\/code> hinzugef\u00fcgt. Die grundlegende Syntax zum Starten einer Spring-Boot-Anwendung mit dem Agent sieht folgenderma\u00dfen aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">java -javaagent:<span class=\"hljs-regexp\">\/pfad\/<\/span>zum\/opentelemetry-javaagent.jar \\\n     -Dotel.service.name=mein-spring-boot-service \\\n     -Dotel.traces.exporter=jaeger \\\n     -Dotel.metrics.exporter=none \\\n     -Dotel.exporter.jaeger.endpoint=http:<span class=\"hljs-comment\">\/\/localhost:14250 \\<\/span>\n     -jar target\/meine-anwendung.jar\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Parameter erkl\u00e4rt:<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>-Dotel.service.name<\/code><\/strong>: Der Name des Dienstes, der im Tracing-Backend angezeigt wird.<\/li>\n\n\n\n<li><strong><code>-Dotel.traces.exporter<\/code><\/strong>: Gibt den Exporter f\u00fcr Traces an (z. B. <code>jaeger<\/code>, <code>zipkin<\/code> oder <code>otlp<\/code>).<\/li>\n\n\n\n<li><strong><code>-Dotel.metrics.exporter<\/code><\/strong>: Gibt den Exporter f\u00fcr Metriken an. Standardm\u00e4\u00dfig wird dieser deaktiviert.<\/li>\n\n\n\n<li><strong><code>-Dotel.exporter.jaeger.endpoint<\/code><\/strong>: Der Endpoint des Jaeger-Backends (optional).<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">3. Backend konfigurieren<\/h4>\n\n\n\n<p>F\u00fcr die Visualisierung von Traces kann ein Observability-Backend wie Jaeger, Zipkin oder ein OpenTelemetry-Kollektor verwendet werden. Beispielsweise kann Jaeger mit Docker schnell gestartet werden:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker run -d --name jaeger \\\n  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \\\n  -p 5775:5775\/udp \\\n  -p 6831:6831\/udp \\\n  -p 6832:6832\/udp \\\n  -p 5778:5778 \\\n  -p 16686:16686 \\\n  -p 14268:14268 \\\n  -p 14250:14250 \\\n  -p 9411:9411 \\\n  jaegertracing\/all-in-one:1.46\n<\/code><\/span><\/pre>\n\n\n<p>Jaeger ist dann \u00fcber <code>http:\/\/localhost:16686<\/code> erreichbar.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4. Anwendung starten und Traces \u00fcberpr\u00fcfen<\/h4>\n\n\n\n<p>Nach dem Start der Spring-Boot-Anwendung sollten automatisch Traces generiert und an das Backend gesendet werden. Diese Traces zeigen Details zur Ausf\u00fchrung der Anfragen, z. B.:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dauer einzelner Operationen<\/li>\n\n\n\n<li>Abh\u00e4ngigkeiten zwischen Microservices<\/li>\n\n\n\n<li>Fehler oder Ausnahmen<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Anpassungen und erweiterte Konfiguration<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Sampling<\/h4>\n\n\n\n<p>Sampling steuert, wie viele Anfragen tats\u00e4chlich getraced werden, um die Systemlast zu reduzieren. Standardm\u00e4\u00dfig ist das Sampling auf 1% gesetzt. Dies kann \u00fcber die JVM-Option angepasst werden:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">-Dotel.traces.sampler=parentbased_always_on\n<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Kontextpropagation<\/h4>\n\n\n\n<p>OpenTelemetry verwendet W3C-konforme Kontextpropagatoren, um Tracing-Informationen \u00fcber HTTP-Header wie <code>traceparent<\/code> zwischen Diensten weiterzugeben. Der JVM-Agent sorgt automatisch daf\u00fcr, dass Spring Boot diese Header korrekt verarbeitet.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Unterst\u00fctzung weiterer Frameworks<\/h4>\n\n\n\n<p>Der Agent unterst\u00fctzt automatisch zahlreiche Java-Frameworks wie Spring, Hibernate, JDBC und gRPC. Entwickler k\u00f6nnen jedoch auch benutzerdefinierte Instrumentierung hinzuf\u00fcgen, falls erforderlich.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>OpenTelemetry in Kombination mit Spring Boot bietet eine robuste Grundlage f\u00fcr die Observierbarkeit moderner Anwendungen. Die automatische Instrumentierung mit dem JVM-Agent macht den Einstieg besonders einfach und reduziert den Aufwand erheblich. Entwickler k\u00f6nnen sich so auf die eigentliche Entwicklung konzentrieren, w\u00e4hrend sie gleichzeitig von einer besseren \u00dcberwachung und Fehlersuche profitieren.<\/p>\n\n\n\n<p>Durch die Kombination aus automatischer Instrumentierung, flexibler Konfiguration und Unterst\u00fctzung f\u00fcr g\u00e4ngige Observability-Backends wird OpenTelemetry zu einem unverzichtbaren Werkzeug f\u00fcr die Entwicklung moderner Microservices. Mit der zunehmenden Verbreitung verteilter Systeme wird der Einsatz von OpenTelemetry und \u00e4hnlichen Tools weiter an Bedeutung gewinnen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mit der wachsenden Bedeutung verteilter Systeme und Microservices in der modernen Softwareentwicklung wird die Observierbarkeit von Anwendungen immer wichtiger. Entwickler m\u00f6chten nicht nur Fehler schneller finden, sondern auch die Performance von Anwendungen \u00fcberwachen und verbessern. OpenTelemetry, ein Open-Source-Framework f\u00fcr Observability, bietet hierf\u00fcr eine umfassende L\u00f6sung. In Kombination mit Spring Boot erm\u00f6glicht es eine leistungsstarke \u00dcberwachung [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-505","post","type-post","status-publish","format-standard","hentry","category-spring"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/505","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=505"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/505\/revisions"}],"predecessor-version":[{"id":506,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/505\/revisions\/506"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=505"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=505"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=505"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}