From 44c0f9e494715eec86ba92b96f8f775e39671b11 Mon Sep 17 00:00:00 2001 From: Pavol Loffay Date: Wed, 28 Feb 2024 10:43:51 +0100 Subject: [PATCH] Finish auto-instrumentation content Signed-off-by: Pavol Loffay --- 03-auto-instrumentation.md | 74 +++++++++++++++++-- app/backend2/build.gradle | 1 + .../io/opentelemetry/dice/RollController.java | 4 + app/k8s.yaml | 50 +++++++------ 4 files changed, 99 insertions(+), 30 deletions(-) diff --git a/03-auto-instrumentation.md b/03-auto-instrumentation.md index 7cb41fb..2f1fa82 100644 --- a/03-auto-instrumentation.md +++ b/03-auto-instrumentation.md @@ -105,6 +105,13 @@ See the [Instrumentation CR](./app/instrumentation.yaml). ```bash kubectl apply -f https://raw.githubusercontent.com/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial/main/app/instrumentation.yaml +kubectl get pods -n tutorial-application -w +... +NAME READY STATUS RESTARTS AGE +backend1-deployment-577cf945b4-tz5kv 1/1 Running 0 8m59s +backend2-deployment-59d4b47774-xbq84 1/1 Running 0 8m59s +frontend-deployment-678795956d-zwg4q 1/1 Running 0 8m59s +loadgen-deployment-5c7d6896f8-2fz6h 1/1 Running 0 8m59s ``` The `Instrumentation` CR does not instrument the workloads. The instrumentation needs to be enabled by annotating a pod: @@ -113,6 +120,45 @@ The `Instrumentation` CR does not instrument the workloads. The instrumentation kubectl patch deployment frontend-deployment -n tutorial-application -p '{"spec": {"template":{"metadata":{"annotations":{"instrumentation.opentelemetry.io/inject-sdk":"true"}}}} }' kubectl patch deployment backend1-deployment -n tutorial-application -p '{"spec": {"template":{"metadata":{"annotations":{"instrumentation.opentelemetry.io/inject-python":"true"}}}} }' kubectl patch deployment backend2-deployment -n tutorial-application -p '{"spec": {"template":{"metadata":{"annotations":{"instrumentation.opentelemetry.io/inject-java":"true"}}}} }' +kubectl get pods -n tutorial-application -w +... +NAME READY STATUS RESTARTS AGE +backend1-deployment-559946d88-c6zq7 0/1 Init:0/1 0 1s +backend2-deployment-5658ddfd6d-gz6ql 0/1 Init:0/1 0 1s +frontend-deployment-79b9c46d76-n74gr 0/1 ContainerCreating 0 1s +``` + +See the `backend2` pod spec: + +```bash +kubectl describe pod backend2-deployment-5658ddfd6d-gz6ql -n tutorial-application +... +Init Containers: + opentelemetry-auto-instrumentation-java: + Image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.32.1 + Command: + cp + /javaagent.jar + /otel-auto-instrumentation-java/javaagent.jar + Mounts: + /otel-auto-instrumentation-java from opentelemetry-auto-instrumentation-java (rw) + /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-48z6x (ro) +Containers: + backend2: + Image: ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-backend2:latest + Environment: + OTEL_LOGS_EXPORTER: otlp + JAVA_TOOL_OPTIONS: -javaagent:/otel-auto-instrumentation-java/javaagent.jar + OTEL_SERVICE_NAME: backend2-deployment + OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector.observability-backend.svc.cluster.local:4317 + OTEL_RESOURCE_ATTRIBUTES_POD_NAME: backend2-deployment-5658ddfd6d-gz6ql (v1:metadata.name) + OTEL_RESOURCE_ATTRIBUTES_NODE_NAME: (v1:spec.nodeName) + OTEL_PROPAGATORS: tracecontext,baggage,b3 + OTEL_TRACES_SAMPLER: parentbased_traceidratio + OTEL_TRACES_SAMPLER_ARG: 1 + OTEL_RESOURCE_ATTRIBUTES: k8s.container.name=backend2,k8s.deployment.name=backend2-deployment,k8s.namespace.name=tutorial-application,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),k8s.replicaset.name=backend2-deployment-5658ddfd6d,service.version=latest + Mounts: + /otel-auto-instrumentation-java from opentelemetry-auto-instrumentation-java (rw) ``` Now let's execute some requests on the app [http://localhost:4000/](http://localhost:4000/) and see traces in the Jaeger console [http://localhost:16686/](http://localhost:16686/). @@ -128,26 +174,38 @@ The OpenTelemetry Java auto-instrumentation supports `@WithSpan`, `@SpanAttribut Open the [RollController.java](./app/backend2/src/main/java/io/opentelemetry/dice/RollController.java) and use the annotations: ```java +# app/backend2/build.gradle +# implementation 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:2.1.0' +# implementation 'io.opentelemetry:opentelemetry-api:1.35.0' + + import io.opentelemetry.api.trace.Span; + import io.opentelemetry.instrumentation.annotations.WithSpan; + import io.opentelemetry.instrumentation.annotations.SpanAttribute; + import io.opentelemetry.instrumentation.annotations.AddingSpanAttributes; + @AddingSpanAttributes @GetMapping("/rolldice") public String index(@SpanAttribute("player") @RequestParam("player") Optional player) { - + @WithSpan public int getRandomNumber(@SpanAttribute("min") int min, @SpanAttribute("max") int max) { - return (int) ((Math.random() * (max - min)) + min); + int result = (int) ((Math.random() * (max - min)) + min); + Span span = Span.current(); + span.setAttribute("result", result); + return result; } ``` Compile it and deploy: ```bash -cd /app/backend2 +cd app/backend2 # Use minikube's docker registry -eval $(minikube -p minikube docker-env) -docker build -t pavolloffay/tutorial-backend2:withspan . -# docker push pavolloffay/tutorial-backend2:withspan +# eval $(minikube -p minikube docker-env) +docker build -t ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-backend2:withspan . +# docker push ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-backend2:withspan -kubectl set image deployment.apps/backend2-deployment backend2=pavolloffay/tutorial-backend2:withspan -n tutorial-application +kubectl set image deployment.apps/backend2-deployment backend2=ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-backend2:withspan -n tutorial-application kubectl get pods -w -n tutorial-application ``` @@ -159,6 +217,8 @@ In this section we will configure the Java auto-instrumentation by modifying `In * create custom spans - for the main method of the application * capture server response HTTP headers +See the [Instrumentation CR](./app/instrumentation-java-custom-config.yaml). + ```bash kubectl apply -f https://raw.githubusercontent.com/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial/main/app/instrumentation-java-custom-config.yaml kubectl rollout restart deployment.apps/backend2-deployment -n tutorial-application diff --git a/app/backend2/build.gradle b/app/backend2/build.gradle index c77e798..a95d903 100644 --- a/app/backend2/build.gradle +++ b/app/backend2/build.gradle @@ -16,6 +16,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.apache.logging.log4j:log4j-core:2.17.2' // implementation 'io.opentelemetry.instrumentation:opentelemetry-instrumentation-annotations:2.1.0' +// implementation 'io.opentelemetry:opentelemetry-api:1.35.0' } tasks.named('test') { diff --git a/app/backend2/src/main/java/io/opentelemetry/dice/RollController.java b/app/backend2/src/main/java/io/opentelemetry/dice/RollController.java index c4fe6f2..4d85fb3 100644 --- a/app/backend2/src/main/java/io/opentelemetry/dice/RollController.java +++ b/app/backend2/src/main/java/io/opentelemetry/dice/RollController.java @@ -9,6 +9,10 @@ import java.util.Optional; +// import io.opentelemetry.api.trace.Span; +// import io.opentelemetry.instrumentation.annotations.WithSpan; +// import io.opentelemetry.instrumentation.annotations.SpanAttribute; +// import io.opentelemetry.instrumentation.annotations.AddingSpanAttributes; @RestController public class RollController { diff --git a/app/k8s.yaml b/app/k8s.yaml index 21fc0e1..b52d54b 100644 --- a/app/k8s.yaml +++ b/app/k8s.yaml @@ -27,6 +27,7 @@ spec: containers: - name: backend1 image: ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-backend1:latest + imagePullPolicy: IfNotPresent ports: - containerPort: 5000 name: service @@ -70,6 +71,7 @@ spec: containers: - name: backend2 image: ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-backend2:latest + imagePullPolicy: IfNotPresent ports: - containerPort: 5165 --- @@ -112,6 +114,7 @@ spec: containers: - name: frontend image: ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-frontend:latest + imagePullPolicy: IfNotPresent env: - name: OTEL_INSTRUMENTATION_ENABLED value: "true" @@ -139,26 +142,27 @@ spec: selector: app: frontend --- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: loadgen-deployment - namespace: tutorial-application - labels: - app: loadgen -spec: - replicas: 1 - selector: - matchLabels: - app: loadgen - template: - metadata: - labels: - app: loadgen - spec: - containers: - - name: frontend - image: ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-loadgen:latest - env: - - name: URL - value: "http://frontend-service:4000/" +#apiVersion: apps/v1 +#kind: Deployment +#metadata: +# name: loadgen-deployment +# namespace: tutorial-application +# labels: +# app: loadgen +#spec: +# replicas: 1 +# selector: +# matchLabels: +# app: loadgen +# template: +# metadata: +# labels: +# app: loadgen +# spec: +# containers: +# - name: frontend +# image: ghcr.io/pavolloffay/kubecon-eu-2024-opentelemetry-kubernetes-tracing-tutorial-loadgen:latest +# imagePullPolicy: IfNotPresent +# env: +# - name: URL +# value: "http://frontend-service:4000/"