DEV Community

Adam Gardner
Adam Gardner

Posted on

Automatic OpenTelemetry for Kubernetes Jobs (Hands on)

Use the tracepusher Kubernetes Operator to automatically generate OpenTelemetry traces for Kubernetes Job and CronJob resources.

Step 0: Create a cluster & Start Jaeger

If you don't already have a cluster, create one now:

kind create cluster

# Or install jaeger on Kubernetes with the jaeger operator
# https://www.jaegertracing.io/docs/1.53/operator/
docker run --rm --name jaeger \
  -e COLLECTOR_ZIPKIN_HOST_PORT=:9411 \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 4317:4317 \
  -p 4318:4318 \
  -p 14250:14250 \
  -p 14268:14268 \
  -p 14269:14269 \
  -p 9411:9411 \
  jaegertracing/all-in-one:1.53
Enter fullscreen mode Exit fullscreen mode

Step 1: Install tracepusher Custom Resource Definitions on cluster

kubectl apply -f https://raw.githubusercontent.com/agardnerIT/tracepusher/main/operator/crds.yml
Enter fullscreen mode Exit fullscreen mode

Step 2: Create a JobTracer

Modify the OpenTelemetry collector URL as appropriate for your setup and then apply the file. One JobTracer per namespace please!

This file instructs tracepusher to monitor for all Job resources in the given namespace (you can ignore on a job-by-job basis with annotations that you'll see next):

cat <<EOF | kubectl create -f -
---
apiVersion: tracers.tracepusher.github.io/v1
kind: JobTracer
metadata:
  name: tracer
  namespace: default
spec:
  # Specify your OpenTelemetry collector endpoint
  # Here I've given the docker URI
  collectorEndpoint: "http://host.docker.internal:4318"
EOF
Enter fullscreen mode Exit fullscreen mode

Step 3: Create a Normal k8s Job / CronJob

Create a Job / CronJob as normal. The tracepusher annotations are optional and will override the behaviour of the above JobTracer

cat <<EOF | kubectl create -f -
---
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
  namespace: default
  #annotations:
  #  tracepusher/ignore: "true"
  #  tracepusher/collector: "http://example.com:4318"
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 0
EOF
Enter fullscreen mode Exit fullscreen mode

tracepusher job tracer result

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay