azure-aksjaegeropen-telemetry-collector

Jaeger v2 with OpenTelemetry on Kubernetes


I am trying to setup jaegerv2 with open telemetry on AKS following this

I have followed the exact steps but I am getting this error when the collector pod starts (I have attached the pod logs below)

Kubernetes version: 1.29.15

2025/04/14 14:00:48 application version: git-commit=, git-version=, build-date=
Error: failed to get config: cannot unmarshal the configuration: decoding failed due to the following error(s):
error decoding 'extensions': error reading configuration for "jaeger_query": decoding failed due to the following error(s):
'' has invalid keys: endpoint
2025/04/14 14:00:48 failed to get config: cannot unmarshal the configuration: decoding failed due to the following error(s):
error decoding 'extensions': error reading configuration for "jaeger_query": decoding failed due to the following error(s):
'' has invalid keys: endpoint

Solution

  • The error you're seeing

    error decoding 'extensions': error reading configuration for "jaeger_query": decoding failed...
    '' has invalid keys: endpoint
    

    happens when the Open Telemetry Collector configuration includes an invalid or deprecated extension block — especially for jaeger_query, which is not a supported extension in Open Telemetry Collector.

    Kindly check if the extensions section in your OpenTelemetry Collector config likely contains something like

    extensions:
      jaeger_query:
        endpoint: "http://jaeger-query:16687"
    

    If so, then that is causing issue as it is invalid. jaeger_query is not a valid extension type, and endpoint under extensions is not recognized by the Collector schema, hence the decode failure.

    What is the fix?

    Instead of trying to use jaeger_query as an extension, you should deploy Jaeger separately and then forward traces from the OpenTelemetry Collector to Jaeger's collector service using the exporters.jaeger block.

    Assuming you have a working AKS cluster, install Jaeger using Helm-

    helm repo add jaegertracing https://jaegertracing.github.io/helm-charts
    helm repo update
    
    helm install jaeger jaegertracing/jaeger \
      --namespace observability --create-namespace \
      --set query.enabled=true \
      --set collector.enabled=true \
      --set agent.enabled=true \
      --set collector.service.type=ClusterIP \
      --set query.service.type=LoadBalancer \
      --set storage.type=memory
    

    enter image description here

    Deploy OpenTelemetry Collector with correct config (no extensions.jaeger_query)

    vim otel-collector.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: otel-collector-config
      namespace: observability
    data:
      collector.yaml: |
        receivers:
          otlp:
            protocols:
              grpc:
              http:
        processors:
          batch:
        exporters:
          jaeger:
            endpoint: jaeger-collector.observability.svc.cluster.local:14250
            tls:
              insecure: true
        service:
          pipelines:
            traces:
              receivers: [otlp]
              processors: [batch]
              exporters: [jaeger]
    

    enter image description here

    After installing with query.service.type=LoadBalancer, you can access the UI via the external IP

    kubectl get svc -n observability jaeger-query

    enter image description here

    Pods are up as well

    enter image description here

    do a port forward to the port you set in a separate terminal before sending the trace. In my case

    kubectl port-forward svc/otel-collector -n observability 4318:4318
    

    verify the same http://<external-ip> in your browser.

    enter image description here

    Now you can try to send the traces.