Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/andreasgerner/distributed-tracing
Distributed Tracing verteilter Anwendungen
https://github.com/andreasgerner/distributed-tracing
kubernetes openshift opentelemetry tracing
Last synced: about 2 months ago
JSON representation
Distributed Tracing verteilter Anwendungen
- Host: GitHub
- URL: https://github.com/andreasgerner/distributed-tracing
- Owner: andreasgerner
- Created: 2024-09-30T09:16:59.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2024-11-26T09:55:18.000Z (about 2 months ago)
- Last Synced: 2024-11-26T10:56:54.777Z (about 2 months ago)
- Topics: kubernetes, openshift, opentelemetry, tracing
- Language: TypeScript
- Homepage:
- Size: 847 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# đ Distributed Tracing verteilter Anwendungen im OpenShift-Umfeld
Dieses Repository enthĂ€lt alle Informationen ĂŒber meine Bachelorarbeit zu Distributed Tracing, die zusammen mit der
NĂRNBERGER Versicherung entsteht.**đ§ Work in Progress:** Die Arbeit ist noch nicht abgeschlossen!
## đ Kapitel
* [đ§Ș Proof of Concept in einem lokalen k8s-Cluster](#-proof-of-concept-in-einem-lokalen-k8s-cluster)
* [đȘ Aufbau der Beispielanwendung](#-aufbau-der-beispielanwendung)
* [đ§ Ănderungen zur Verwendung in einem OpenShift-Cluster](#-Ă€nderungen-zur-verwendung-in-einem-openshift-cluster)## đ§Ș Proof of Concept in einem lokalen k8s-Cluster
### Voraussetzungen:
- lokales kubernetes-Cluster (ich verwende Docker Desktop)
- kubectl und helm installiert### Implementierung:
đ Traefik wurde nach einer ersten Testphase wieder aus der Anwendung entfernt (siehe Ă€ltere Commits), da kein Mehrwert
von dessen Nutzung festgestellt werden konnte.#### 1. Operatoren
Im Gegensatz zum zukĂŒnftigen OpenShift-Cluster mĂŒssen der OpenTelemetry-Operator und ein Ingress-Router (ingress-nginx)
im lokalen Cluster selbst installiert werden.
DafĂŒr werden Berechtigungen zur Installation von CRDs und Operator, etwa die *cluster-admin*-Rolle, benötigt!```shell
helm install operators charts/operators
```#### 2. Tracing-Anwendungen
Der folgende Helm-Chart stellt alle Management-Anwendungen bereit. Dazu gehört:
- eine Network-Policy, die erforderlichen Traffic im Cluster erlaubt
- ein OpenTelemetry Collector
- ein CORS-kompatibles Proxy fĂŒr den Collector
- eine OpenTelemetry Auto-Instrumentation
- eine Jaeger-Instanz```shell
helm install tracing charts/tracing -f charts/tracing/values-local.yaml
```#### 3. Test-Anwendung
Zu Demonstrationszwecken wurde eine Testanwendung mit Angular-/NextJS-WeboberflÀche und zwei Java-Microservices als
Backend entwickelt.
Der folgende Helm-Chart stellt diese bereit.> â **Achtung**
>
> Die Beispiel-Anwendung kommuniziert mit zwei Microsoft SQL Server Datenbanken, die im Voraus bereitgestellt werden
> mĂŒssen.
> Folgender Befehl startet zwei Container, die mit der im Deployment hinterlegten Connection URL ĂŒbereinstimmt.
> ```shell
> 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 && \
> 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
> ``````shell
helm install sample-app charts/sample-app -f charts/sample-app/values-local.yaml
```### Darauf resultierende Architektur:
![Diagramm der lokalen Architektur](assets/local-architecture.drawio.svg)
## đȘ Aufbau der Beispielanwendung
Die Beispielanwendung besteht aus drei einzelnen Deployments:
- Web-OberflÀche (Nginx + Angular CSR)
- Web-OberflÀche (Nginx + NextJS ISR/SSR)
- Microservice company (Spring)
- Microservice payment (Spring)Jaeger kann nach einigen erzeugten Traces automatisch einem Graph ĂŒber die Systemarchitektur erstellen.
DafĂŒr muss folgender Container ausgefĂŒhrt werden (einmalig, beendet sich nach Berechnung selbst):```shell
kubectl port-forward -n elastic service/elasticsearch 9200:9200 & \
docker run --name jaeger-deps --env STORAGE="elasticsearch" --env ES_NODES="http://host.docker.internal:9200" ghcr.io/jaegertracing/spark-dependencies/spark-dependencies
```> â **Achtung**
>
> kubectl lÀuft im Hintergrund weiter, wobei die Prozess-ID in der Konsole ausgegeben wird. Der Prozess kann
> `kill -9 [PID]` terminiert werden.### Schaubild ĂŒber Zusammenspiel der Komponenten
![Diagramm der Anwendung](assets/sample-app.drawio.svg)
### Instrumentalisierung der einzelnen Komponenten
#### Web-Anwendung mit Angular
Keine automatische Instrumentalisierung von Nginx oder Angular, stattdessen wurde OpenTelemetry vor dem Build der
Anwendung hÀndisch eingebunden.Um die Traceparent-Informationen, die von Traefik bereitgestellt werden, zu verwenden und anzubinden, wird dieser Header
von Nginx in die Meta-Tags der Anwendung gespeichert.Die Anwendung nutzt alle Instrumentalisierungen, die von `@opentelemetry/auto-instrumentations-web` bereitgestellt
werden.#### Web-Anwendung mit NextJS
VollstÀndige, automatische Instrumentalisierung der
Anwendung. [Manuelle Einbindung der Dependencies](https://nextjs.org/docs/app/building-your-application/optimizing/open-telemetry)
entfĂ€llt komplett, wird von Instrumentation ĂŒbernommen.#### Microservice company
Verwendung von automatischer Instrumentalisierung und zusÀtzlich eigene Spans per Annotation.
Die Anwendung wird bei Deployment automatisch instrumentalisiert, allerdings wurde zusĂ€tzlich noch ein Span ĂŒber eine
Methode gelegt und ein zusĂ€tzliches Attribut hinzugefĂŒgt.#### Microservice payment
Reine Verwendung der automatischen Instrumentalisierung.
Hier wurden keine OpenTelemetry-Dependencies eingebunden. Die Instrumentalisierung erfolgt vollstÀndig beim Deployment.
### Ergebnisse des Proof of Concept
- Instrumentalisierung von Angular bzw. CSR-Apps im Allgemeinen gestaltet sich als kompliziert. Zum einen keine
automatische Instrumentalisierung möglich, zum anderen mĂŒssen die Traces vom Client aus an eine öffentliche
OpenTelemetry-Schnittstelle gesendet werden.
- Wenig Mehrwert bei der Nutzung von Traefik. Liefert zwar Traces zu den einzelnen Ingress-Routen, kann diese aber nicht
verbinden, falls Anwendung selbst Trace-Header nicht weiterreicht. Ist die Anwendung so weit instrumentalisiert, dass
sie Header annimmt und weitergibt, ist der zusĂ€tzliche Ingress-Trace redundant.## đ§ Ănderungen zur Verwendung in einem OpenShift-Cluster
OpenShift stellt einen eigenen, angepassten Build des OpenTelemetry Operators bereit. Dieser kann
anhand [dieser Anleitung](https://docs.openshift.com/container-platform/4.12/observability/otel/otel-installing.html)
verfĂŒgbar gemacht werden.
Dadurch entfĂ€llt auĂerdem die Installation von Cert-Manager, da dieser Build die Zertifikate selbst bereitstellt.Nachdem Traefik keinen Mehrwert bietet, wird auf die Installation davon ebenfalls verzichtet.
### Installation
```shell
helm install tracing charts/tracing -f charts/tracing/values-openshift.yaml
```Zur Verwendung einer richtigen Datenbank kann unter [values-openshift](charts/sample-app/values-openshift.yaml) fĂŒr den
Company- und Payment-Service eine richtige, JDBC-kompatible Connection-URL angegeben werden.
Die Verwaltung von Credentials mittels Secrets wurde nicht weiter implementiert, da dies auĂerhalb des Scopes dieser
Arbeit liegt.Wird keine Datenbank-URL angegeben, verwendet der entsprechende Service eine In-Memory-Datenbank (H2).
```shell
helm install sample-app charts/sample-app -f charts/sample-app/values-openshift.yaml
```### Darauf resultierende Architektur:
![Diagramm der OpenShift-Architektur](assets/openshift-architecture.drawio.svg)
## đŸ Images
| Komponente | Lokales Cluster | OpenShift Cluster |
|-------------|--------------------------------------------------------------------|------------------------------------------------------------------------------|
| Company | ghcr.io/andreasgerner/distributed-tracing/sample-company:latest | artifactory:5000/andreasgerner/distributed-tracing/sample-company:latest |
| Payment | ghcr.io/andreasgerner/distributed-tracing/sample-payment:latest | artifactory:5000/andreasgerner/distributed-tracing/sample-payment:latest |
| Web Next | ghcr.io/andreasgerner/distributed-tracing/sample-web-next:latest | artifactory:5000/andreasgerner/distributed-tracing/sample-web-next:latest |
| Web Angular | ghcr.io/andreasgerner/distributed-tracing/sample-web-angular:local | artifactory:5000/andreasgerner/distributed-tracing/sample-web-next:openshift |**Artifactory fungiert als Mirror von ghcr, Images sind die selben!**