{"id":17568758,"url":"https://github.com/andreasgerner/distributed-tracing","last_synced_at":"2026-04-18T07:32:42.190Z","repository":{"id":258555467,"uuid":"865277255","full_name":"andreasgerner/distributed-tracing","owner":"andreasgerner","description":"Distributed Tracing verteilter Anwendungen","archived":false,"fork":false,"pushed_at":"2025-02-17T16:22:24.000Z","size":802,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-10T11:42:04.114Z","etag":null,"topics":["kubernetes","openshift","opentelemetry","tracing"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/andreasgerner.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-30T09:16:59.000Z","updated_at":"2025-02-17T16:22:27.000Z","dependencies_parsed_at":null,"dependency_job_id":"a9e330c7-82b0-4b15-be0f-f4bcfb8e17d5","html_url":"https://github.com/andreasgerner/distributed-tracing","commit_stats":{"total_commits":14,"total_committers":1,"mean_commits":14.0,"dds":0.0,"last_synced_commit":"eb2e025a33c3dceb0dcb73c8e470793102a50bdd"},"previous_names":["andreasgerner/distributed-tracing"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/andreasgerner/distributed-tracing","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreasgerner%2Fdistributed-tracing","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreasgerner%2Fdistributed-tracing/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreasgerner%2Fdistributed-tracing/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreasgerner%2Fdistributed-tracing/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andreasgerner","download_url":"https://codeload.github.com/andreasgerner/distributed-tracing/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andreasgerner%2Fdistributed-tracing/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31961197,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["kubernetes","openshift","opentelemetry","tracing"],"created_at":"2024-10-21T17:05:55.859Z","updated_at":"2026-04-18T07:32:42.175Z","avatar_url":"https://github.com/andreasgerner.png","language":"TypeScript","readme":"# 🔍 Distributed Tracing verteilter Anwendungen im OpenShift-Umfeld\n\nDieses Repository enthält alle Informationen über meine Bachelorarbeit zu Distributed Tracing, die zusammen mit der\nNÜRNBERGER Versicherung entsteht.\n\n## 📚 Kapitel\n\n* [🧪 Proof of Concept in einem lokalen k8s-Cluster](#-proof-of-concept-in-einem-lokalen-k8s-cluster)\n* [🎪 Aufbau der Beispielanwendung](#-aufbau-der-beispielanwendung)\n* [🐧 Änderungen zur Verwendung in einem OpenShift-Cluster](#-änderungen-zur-verwendung-in-einem-openshift-cluster)\n\n## 🧪 Proof of Concept in einem lokalen k8s-Cluster\n\n### Voraussetzungen:\n\n- lokales kubernetes-Cluster (ich verwende Docker Desktop)\n- kubectl und helm installiert\n\n### Implementierung:\n\n🛑 Traefik wurde nach einer ersten Testphase wieder aus der Anwendung entfernt (siehe ältere Commits), da kein Mehrwert\nvon dessen Nutzung festgestellt werden konnte.\n\n#### 1. Operatoren\n\nIm Gegensatz zum zukünftigen OpenShift-Cluster müssen der OpenTelemetry-Operator und ein Ingress-Router (ingress-nginx)\nim lokalen Cluster selbst installiert werden.\nDafür werden Berechtigungen zur Installation von CRDs und Operator, etwa die *cluster-admin*-Rolle, benötigt!\n\n```shell\nhelm install operators charts/operators\n```\n\n#### 2. Tracing-Anwendungen\n\nDer folgende Helm-Chart stellt alle Management-Anwendungen bereit. Dazu gehört:\n\n- eine Network-Policy, die erforderlichen Traffic im Cluster erlaubt\n- ein OpenTelemetry Collector\n- ein CORS-kompatibles Proxy für den Collector\n- eine OpenTelemetry Auto-Instrumentation\n- eine Jaeger-Instanz\n\n```shell\nhelm install tracing charts/tracing -f charts/tracing/values-local.yaml\n```\n\n#### 3. Test-Anwendung\n\nZu Demonstrationszwecken wurde eine Testanwendung mit Angular-/NextJS-Weboberfläche und zwei Java-Microservices als\nBackend entwickelt.\nDer folgende Helm-Chart stellt diese bereit.\n\n\u003e ❗ **Achtung**\n\u003e\n\u003e Die Beispiel-Anwendung kommuniziert mit zwei Microsoft SQL Server Datenbanken, die im Voraus bereitgestellt werden\n\u003e müssen.\n\u003e Folgender Befehl startet zwei Container, die mit der im Deployment hinterlegten Connection URL übereinstimmt.\n\u003e ```shell\n\u003e docker run -e \"ACCEPT_EULA=Y\" -e \"MSSQL_SA_PASSWORD=yourStrongPassword1!\" -p 10001:1433 --name sample-company-mssql -d mcr.microsoft.com/mssql/server:latest \u0026\u0026 \\\n\u003e docker run -e \"ACCEPT_EULA=Y\" -e \"MSSQL_SA_PASSWORD=yourStrongPassword1!\" -p 10002:1433 --name sample-payment-mssql -d mcr.microsoft.com/mssql/server:latest\n\u003e ```\n\n```shell\nhelm install sample-app charts/sample-app -f charts/sample-app/values-local.yaml\n```\n\n### Darauf resultierende Architektur:\n\n![Diagramm der lokalen Architektur](assets/local-architecture.drawio.svg)\n\n## 🎪 Aufbau der Beispielanwendung\n\nDie Beispielanwendung besteht aus drei einzelnen Deployments:\n\n- Web-Oberfläche (Nginx + Angular CSR)\n- Web-Oberfläche (Nginx + NextJS ISR/SSR)\n- Microservice company (Spring)\n- Microservice payment (Spring)\n\nJaeger kann nach einigen erzeugten Traces automatisch einem Graph über die Systemarchitektur erstellen.\nDafür muss folgender Container ausgeführt werden (einmalig, beendet sich nach Berechnung selbst):\n\n```shell\nkubectl port-forward -n elastic service/elasticsearch 9200:9200 \u0026 \\\ndocker run --name jaeger-deps --env STORAGE=\"elasticsearch\" --env ES_NODES=\"http://host.docker.internal:9200\" ghcr.io/jaegertracing/spark-dependencies/spark-dependencies\n```\n\n\u003e ❗ **Achtung**\n\u003e\n\u003e kubectl läuft im Hintergrund weiter, wobei die Prozess-ID in der Konsole ausgegeben wird. Der Prozess kann\n\u003e `kill -9 [PID]` terminiert werden.\n\n### Schaubild über Zusammenspiel der Komponenten\n\n![Diagramm der Anwendung](assets/sample-app.drawio.svg)\n\n### Instrumentalisierung der einzelnen Komponenten\n\n#### Web-Anwendung mit Angular\n\nKeine automatische Instrumentalisierung von Nginx oder Angular, stattdessen wurde OpenTelemetry vor dem Build der\nAnwendung händisch eingebunden.\n\nUm die Traceparent-Informationen, die von Traefik bereitgestellt werden, zu verwenden und anzubinden, wird dieser Header\nvon Nginx in die Meta-Tags der Anwendung gespeichert.\n\nDie Anwendung nutzt alle Instrumentalisierungen, die von `@opentelemetry/auto-instrumentations-web` bereitgestellt\nwerden.\n\n#### Web-Anwendung mit NextJS\n\nVollständige, automatische Instrumentalisierung der\nAnwendung. [Manuelle Einbindung der Dependencies](https://nextjs.org/docs/app/building-your-application/optimizing/open-telemetry)\nentfällt komplett, wird von Instrumentation übernommen.\n\n#### Microservice company\n\nVerwendung von automatischer Instrumentalisierung und zusätzlich eigene Spans per Annotation.\n\nDie Anwendung wird bei Deployment automatisch instrumentalisiert, allerdings wurde zusätzlich noch ein Span über eine\nMethode gelegt und ein zusätzliches Attribut hinzugefügt.\n\n#### Microservice payment\n\nReine Verwendung der automatischen Instrumentalisierung.\n\nHier wurden keine OpenTelemetry-Dependencies eingebunden. Die Instrumentalisierung erfolgt vollständig beim Deployment.\n\n### Ergebnisse des Proof of Concept\n\n- Instrumentalisierung von Angular bzw. CSR-Apps im Allgemeinen gestaltet sich als kompliziert. Zum einen keine\n  automatische Instrumentalisierung möglich, zum anderen müssen die Traces vom Client aus an eine öffentliche\n  OpenTelemetry-Schnittstelle gesendet werden.\n- Wenig Mehrwert bei der Nutzung von Traefik. Liefert zwar Traces zu den einzelnen Ingress-Routen, kann diese aber nicht\n  verbinden, falls Anwendung selbst Trace-Header nicht weiterreicht. Ist die Anwendung so weit instrumentalisiert, dass\n  sie Header annimmt und weitergibt, ist der zusätzliche Ingress-Trace redundant.\n\n## 🐧 Änderungen zur Verwendung in einem OpenShift-Cluster\n\nOpenShift stellt einen eigenen, angepassten Build des OpenTelemetry Operators bereit. Dieser kann\nanhand [dieser Anleitung](https://docs.openshift.com/container-platform/4.12/observability/otel/otel-installing.html)\nverfügbar gemacht werden.\nDadurch entfällt außerdem die Installation von Cert-Manager, da dieser Build die Zertifikate selbst bereitstellt.\n\nNachdem Traefik keinen Mehrwert bietet, wird auf die Installation davon ebenfalls verzichtet.\n\n### Installation\n\n```shell\nhelm install tracing charts/tracing -f charts/tracing/values-openshift.yaml\n```\n\nZur Verwendung einer richtigen Datenbank kann unter [values-openshift](charts/sample-app/values-openshift.yaml) für den\nCompany- und Payment-Service eine richtige, JDBC-kompatible Connection-URL angegeben werden.\nDie Verwaltung von Credentials mittels Secrets wurde nicht weiter implementiert, da dies außerhalb des Scopes dieser\nArbeit liegt.\n\nWird keine Datenbank-URL angegeben, verwendet der entsprechende Service eine In-Memory-Datenbank (H2).\n\n```shell\nhelm install sample-app charts/sample-app -f charts/sample-app/values-openshift.yaml\n```\n\n### Darauf resultierende Architektur:\n\n![Diagramm der OpenShift-Architektur](assets/openshift-architecture.drawio.svg)\n\n## 💾 Images\n\n| Komponente  | Lokales Cluster                                                    | OpenShift Cluster                                                            |\n|-------------|--------------------------------------------------------------------|------------------------------------------------------------------------------|\n| Company     | ghcr.io/andreasgerner/distributed-tracing/sample-company:latest    | artifactory:5000/andreasgerner/distributed-tracing/sample-company:latest     |\n| Payment     | ghcr.io/andreasgerner/distributed-tracing/sample-payment:latest    | artifactory:5000/andreasgerner/distributed-tracing/sample-payment:latest     |\n| Web Next    | ghcr.io/andreasgerner/distributed-tracing/sample-web-next:latest   | artifactory:5000/andreasgerner/distributed-tracing/sample-web-next:latest    |\n| Web Angular | ghcr.io/andreasgerner/distributed-tracing/sample-web-angular:local | artifactory:5000/andreasgerner/distributed-tracing/sample-web-next:openshift |\n\n**Artifactory fungiert als Mirror von ghcr, Images sind die selben!**\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreasgerner%2Fdistributed-tracing","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandreasgerner%2Fdistributed-tracing","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandreasgerner%2Fdistributed-tracing/lists"}