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
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
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]
After installing with query.service.type=LoadBalancer
, you can access the UI via the external IP
kubectl get svc -n observability jaeger-query
Pods are up as well
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.
Now you can try to send the traces.