Skip to content

Test

In this section, you will try to deploy the following to the cluster.

  • OpenTelemetry Instrumentation Resource (To auto instrument the application code without the need to make any code changes)
  • A sample application as a workload

We will then verify the traces and metrics on the Jaeger UI.


Step 1: Create Namespace

In this step, you will create a namespace for a sample workload that will be published to the cluster.

apiVersion: infra.k8smgmt.io/v3
kind: Namespace
metadata:
  name: otel-demo
  project: defaultproject
spec:
  placement:
    labels:
    - key: rafay.dev/clusterName
      value: demo-cluster1
  • Update the project name and cluster name based on your environment
  • Apply the namespace using RCTL as shown below
rctl apply -f otel-demo-ns.yaml

Step 2: Create Workload for OpenTelemetry Instrumentation Resource

In this step, you will create a workload for OpenTelemetry Instrumentation Resource

apiVersion: apps.k8smgmt.io/v3
kind: Workload
metadata:
  name: otel-instrumentation
  project: defaultproject
spec:
  artifact:
    artifact:
      paths:
      - name: file://artifacts/otel-instrumentation/otel-instrumentation.yaml
    type: Yaml
  namespace: otel-demo
  placement:
    selector: rafay.dev/clusterName=demo-cluster1
  version: v1
  • In the above spec, update the project and cluster name based on your environment

OpenTelemetry Instrumentation Resource

# should be deployed in the app namespace
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: java-instrumentation
spec:
  exporter:
    endpoint: http://simplest-collector.opentelemetry-operator-system.svc.cluster.local:4317
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_traceidratio
    argument: "0.25"
  java:
    image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
  • Apply the workload spec using RCTL as shown below
rctl apply -f opentelemetry-instrumentation-workload.yaml

Note

OpenTelemetry Instrumentation resource should be applied to the namespace where you will be deploying the application. In this case, I am using otel-demo as the namespace.


Step 3: Create Workload for a Sample application

apiVersion: apps.k8smgmt.io/v3
kind: Workload
metadata:
  name: otel-demo
  project: defaultproject
spec:
  artifact:
    artifact:
      paths:
      - name: file://artifacts/otel-demo/otel-demo.yaml
    type: Yaml
  namespace: otel-demo
  placement:
    selector: rafay.dev/clusterName=demo-cluster1
  version: v1
  • In the above spec, update the project and cluster name based on your environment

Application Deployment spec

apiVersion: apps/v1
kind: Deployment
metadata:
 name: otel-demo
spec:
 replicas: 1
 selector:
   matchLabels:
     app: otel-demo
 template:
   metadata:
     labels:
       app: otel-demo
     annotations:
       instrumentation.opentelemetry.io/inject-java: "true"
   spec:
     containers:
     - name: spring
       image: rafaysystems/petclinic:v1
       ports:
       - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: otel-demo
  name: otel-demo
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    name: web
  selector:
    app: otel-demo
- Apply the workload spec using RCTL as shown below

rctl apply -f opentelemetry-demo-workload.yaml

Once the workload is deployed, you should see an init container that is injected by OpenTelemetry for instrumentation purpose.

Init Containers:
  opentelemetry-auto-instrumentation:
    Container ID:  containerd://dac69e7131121fbd9bc4a1dfb618384ad70e524de65188f6fc15c4b4ffbad4f2
    Image:         ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
    Image ID:      ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java@sha256:fb4d8cf6f984ed80ccc3865ceb65e94c4c565003b550d08010e13d8fe1e82c3e
    Port:          <none>
    Host Port:     <none>
    Command:
      cp
      /javaagent.jar
      /otel-auto-instrumentation/javaagent.jar
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Sat, 01 Jul 2023 04:24:59 +0000
      Finished:     Sat, 01 Jul 2023 04:24:59 +0000
    Ready:          True
    Restart Count:  0
    Limits:
      cpu:     500m
      memory:  64Mi
    Requests:
      cpu:        50m
      memory:     64Mi
    Environment:  <none>
    Mounts:
      /otel-auto-instrumentation from opentelemetry-auto-instrumentation (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-dtszz (ro)
Containers:
  spring:
    Container ID:   containerd://1c732cbbe891a8c05998066e82cb6ccb94e295f9867090cd79dfde0b27489703
    Image:          rafaysystems/petclinic:v1
    Image ID:       docker.io/rafaysystems/petclinic@sha256:83954b8b893bc010071ffc82db60262dd4b8d1b410f29174abf0926e7c27de4e
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sat, 01 Jul 2023 04:25:07 +0000
    Ready:          True
    Restart Count:  0
    Environment:
      JAVA_TOOL_OPTIONS:                    -javaagent:/otel-auto-instrumentation/javaagent.jar
      OTEL_SERVICE_NAME:                   otel-demo
      OTEL_EXPORTER_OTLP_ENDPOINT:         http://simplest-collector.opentelemetry-operator-system.svc.cluster.local:4317
      OTEL_RESOURCE_ATTRIBUTES_POD_NAME:   otel-demo-b898b9cc9-67fwp (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:             0.25
      OTEL_RESOURCE_ATTRIBUTES:            k8s.container.name=spring,k8s.deployment.name=otel-demo,k8s.namespace.name=otel-demo,k8s.node.name=$(OTEL_RESOURCE_ATTRIBUTES_NODE_NAME),k8s.pod.name=$(OTEL_RESOURCE_ATTRIBUTES_POD_NAME),k8s.replicaset.name=otel-demo-b898b9cc9

Step 4: Access the Application

Since we did not expose the application, we will do port-forward and use curl to access the app.

kubectl port-forward service/otel-demo -n otel-demo 8080:8080

Below bash script will be used to access the application which will generate traces and metrics.

while true;
do
  curl http://localhost:8080/
  curl http://localhost:8080/owners/find
  curl http://localhost:8080/owners?lastName=
  curl http://localhost:8080/vets.html
  curl http://localhost:8080/oups
  curl http://localhost:8080/oups
  sleep 0.01
done

Step 5: Accessing Jaeger UI

Open your browser and type the hostname that you used as ingress for Jaeger.

Traces

OpenTelemetry Traces

Metrics

OpenTelemetry Metrics


Recap

Congratulations! You have successfully deployed OpenTelemetry components on your managed Kubernetes cluster as custom add-ons in a custom cluster blueprint.