{"id":200,"date":"2024-02-08T23:46:31","date_gmt":"2024-02-08T22:46:31","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=200"},"modified":"2024-02-19T23:47:08","modified_gmt":"2024-02-19T22:47:08","slug":"tracing-und-observability-mit-opentelemetry-in-spring-boot-anwendungen","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=200","title":{"rendered":"Tracing und Observability mit Opentelemetry in Spring-Boot-Anwendungen"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einleitung<\/h2>\n\n\n\n<p>Die Entwicklung von Microservices-basierten Anwendungen hat in den letzten Jahren stark zugenommen, und mit dieser Entwicklung sind auch die Anforderungen an die Observability und das Tracing von Anwendungen gestiegen. Opentelemetry ist eine Initiative, die dazu beitr\u00e4gt, diese Anforderungen zu erf\u00fcllen, indem sie eine einheitliche M\u00f6glichkeit zur Instrumentierung von Anwendungen f\u00fcr das Tracing und die Observability bereitstellt. In diesem Artikel werden wir uns darauf konzentrieren, wie Opentelemetry in Spring-Boot-Anwendungen integriert werden kann, um umfassende Einblicke in das Anwendungsverhalten zu erhalten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Opentelemetry im \u00dcberblick<\/h2>\n\n\n\n<p>Opentelemetry ist ein quelloffenes Projekt, das darauf abzielt, die Observability in Cloud-native Umgebungen zu verbessern. Es kombiniert die Bem\u00fchungen der Projekte OpenTracing und OpenCensus, um eine einheitliche L\u00f6sung f\u00fcr das Tracing, die Metriken und das Logging bereitzustellen. Durch die Unterst\u00fctzung von verschiedenen Programmiersprachen und Frameworks, einschlie\u00dflich Java und Spring, erm\u00f6glicht Opentelemetry Entwicklern die Instrumentierung ihrer Anwendungen, um detaillierte Einblicke in die Anwendungsleistung zu erhalten.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Integration von Opentelemetry in Spring-Boot<\/h2>\n\n\n\n<p>Die Integration von Opentelemetry in Spring-Boot-Anwendungen ist ein relativ einfacher Prozess, der in mehreren Schritten durchgef\u00fchrt werden kann. Hier ist eine schrittweise Anleitung:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">a. Abh\u00e4ngigkeiten hinzuf\u00fcgen<\/h3>\n\n\n\n<p>Beginnen Sie damit, die erforderlichen Opentelemetry-Abh\u00e4ngigkeiten zu Ihrer Spring-Boot-Anwendung hinzuzuf\u00fcgen. Dies umfasst normalerweise die Kernbibliotheken, Instrumentierungsbibliotheken f\u00fcr verschiedene Technologien sowie Exporter f\u00fcr die Weiterleitung von Tracing-Daten an Backend-Systeme.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.opentelemetry<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>opentelemetry-api<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.35.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.opentelemetry<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>opentelemetry-sdk<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.35.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.opentelemetry<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>opentelemetry-instrumentation-api<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.35.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n\n<span class=\"hljs-comment\">&lt;!-- Instrumentation for Spring Boot --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.opentelemetry.instrumentation<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>opentelemetry-instrumentation-spring-boot<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.5.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n\n<span class=\"hljs-comment\">&lt;!-- Exporter for Jaeger --&gt;<\/span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">dependency<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>io.opentelemetry.exporters<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">groupId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>opentelemetry-exporters-jaeger<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">artifactId<\/span>&gt;<\/span>\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">version<\/span>&gt;<\/span>1.35.0<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">version<\/span>&gt;<\/span>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">dependency<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">b. Konfiguration vornehmen<\/h3>\n\n\n\n<p>Konfigurieren Sie Opentelemetry in Ihrer Spring-Boot-Anwendung. Dies umfasst die Initialisierung des Tracer-Providers und die Festlegung von Exporter-Optionen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter;\n<span class=\"hljs-keyword\">import<\/span> io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporterBuilder;\n<span class=\"hljs-keyword\">import<\/span> io.opentelemetry.sdk.OpenTelemetrySdk;\n<span class=\"hljs-keyword\">import<\/span> io.opentelemetry.sdk.trace.SdkTracerProvider;\n<span class=\"hljs-keyword\">import<\/span> io.opentelemetry.sdk.trace.export.BatchSpanProcessor;\n\n@Configuration\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">OpentelemetryConfig<\/span> <\/span>{\n\n    @Value(<span class=\"hljs-string\">\"${opentelemetry.jaeger.endpoint}\"<\/span>)\n    private <span class=\"hljs-built_in\">String<\/span> jaegerEndpoint;\n\n    @Bean\n    public OpenTelemetry configureOpenTelemetry() {\n        JaegerGrpcSpanExporter exporter = JaegerGrpcSpanExporter.builder()\n            .setEndpoint(jaegerEndpoint)\n            .build();\n\n        SdkTracerProvider tracerProvider = SdkTracerProvider.builder()\n            .addSpanProcessor(BatchSpanProcessor.builder(exporter).build())\n            .build();\n\n        <span class=\"hljs-keyword\">return<\/span> OpenTelemetrySdk.builder()\n            .setTracerProvider(tracerProvider)\n            .build();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><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<h3 class=\"wp-block-heading\">c. Tracing in Ihrer Anwendung verwenden<\/h3>\n\n\n\n<p>Sobald Opentelemetry konfiguriert ist, k\u00f6nnen Sie Tracing in Ihrer Anwendung verwenden, indem Sie Spans erstellen und damit Messungen durchf\u00fchren.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import io.opentelemetry.api.trace.Span;\nimport io.opentelemetry.api.trace.Tracer;\n\n@RestController\n@RequestMapping(<span class=\"hljs-string\">\"\/api\"<\/span>)\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyController<\/span> <\/span>{\n\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> Tracer tracer = OpenTelemetry.getGlobalTracer(<span class=\"hljs-string\">\"my-instrumentation\"<\/span>);\n\n    @GetMapping(<span class=\"hljs-string\">\"\/example\"<\/span>)\n    <span class=\"hljs-keyword\">public<\/span> String exampleEndpoint() {\n        Span span = tracer.spanBuilder(<span class=\"hljs-string\">\"example-operation\"<\/span>).startSpan();\n        <span class=\"hljs-keyword\">try<\/span> (Scope scope = span.makeCurrent()) {\n            <span class=\"hljs-comment\">\/\/ Your business logic here<\/span>\n            <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"Hello, Opentelemetry!\"<\/span>;\n        } <span class=\"hljs-keyword\">finally<\/span> {\n            span.end();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">3. Tracing-Daten visualisieren<\/h2>\n\n\n\n<p>Nachdem Sie Opentelemetry in Ihre Spring-Boot-Anwendung integriert haben, ist es wichtig, die erfassten Tracing-Daten zu visualisieren. Opentelemetry bietet Unterst\u00fctzung f\u00fcr verschiedene Backend-Systeme wie Jaeger und Zipkin. In diesem Beispiel verwenden wir Jaeger als Tracing-Backend.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">a. Jaeger konfigurieren<\/h3>\n\n\n\n<p>Stellen Sie sicher, dass Ihr Jaeger-Backend bereit ist und erreichbar ist. Konfigurieren Sie dann die Jaeger-Verbindungsdaten in Ihrer Anwendungs-Properties-Datei.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">opentelemetry.jaeger.endpoint=http:<span class=\"hljs-comment\">\/\/jaeger-collector:14250<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><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<h3 class=\"wp-block-heading\">b. Tracing visualisieren<\/h3>\n\n\n\n<p>\u00d6ffnen Sie das Jaeger-UI im Browser, indem Sie die entsprechende URL aufrufen (z.B., http:\/\/jaeger-ui:16686). Hier k\u00f6nnen Sie Traces, Spans und andere Tracing-Daten visualisieren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Fehlerbehandlung und Best Practices<\/h2>\n\n\n\n<p>Die Integration von Opentelemetry in Spring-Boot-Anwendungen erfordert sorgf\u00e4ltige Planung und Beachtung einiger bew\u00e4hrter Praktiken. Hier sind einige wichtige Aspekte:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">a. Ressourcen schonen<\/h3>\n\n\n\n<p>Opentelemetry bietet verschiedene Konfigurationsoptionen, mit denen Sie die Auswirkungen auf die Anwendungsleistung minimieren k\u00f6nnen. Stellen Sie sicher, dass Sie die Instrumentierung nur dort durchf\u00fchren, wo sie wirklich ben\u00f6tigt wird.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">b. Logging<\/h3>\n\n\n\n<p>Integrieren Sie Logging auf angemessene Weise, um Informationen \u00fcber Tracing-Ereignisse zu erhalten. Dies kann helfen, potenzielle Probleme zu diagnostizieren und die Leistung Ihrer Anwendung zu optimieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einleitung Die Entwicklung von Microservices-basierten Anwendungen hat in den letzten Jahren stark zugenommen, und mit dieser Entwicklung sind auch die Anforderungen an die Observability und das Tracing von Anwendungen gestiegen. Opentelemetry ist eine Initiative, die dazu beitr\u00e4gt, diese Anforderungen zu erf\u00fcllen, indem sie eine einheitliche M\u00f6glichkeit zur Instrumentierung von Anwendungen f\u00fcr das Tracing und die [&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-200","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\/200","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=200"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/200\/revisions"}],"predecessor-version":[{"id":201,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/200\/revisions\/201"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=200"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=200"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}