|
| 1 | +--- |
| 2 | +navigation_title: No app-level telemetry in Kibana |
| 3 | +description: Diagnose lack of telemetry flow due to issues with EDOT SDKs. |
| 4 | +applies_to: |
| 5 | + stack: |
| 6 | + serverless: |
| 7 | + observability: |
| 8 | + product: |
| 9 | + edot_sdk: ga |
| 10 | +products: |
| 11 | + - id: cloud-serverless |
| 12 | + - id: observability |
| 13 | + - id: edot-sdk |
| 14 | +--- |
| 15 | + |
| 16 | +# No application-level telemetry visible in Kibana |
| 17 | + |
| 18 | +This page helps you diagnose why application-level telemetry doesn’t appear when using {{edot}} (EDOT) SDKs: |
| 19 | + |
| 20 | +* [The SDK is turned off (`OTEL_SDK_DISABLED`)](#sdk-disabled) |
| 21 | +* [Auto-instrumentation or SDK initialization runs at the wrong time](#auto-instrumentation-not-attached) |
| 22 | +* [The runtime or framework isn’t supported, or is only partially supported](#framework-not-supported) |
| 23 | + |
| 24 | + |
| 25 | +## Quick triage checklist |
| 26 | + |
| 27 | +Use this table to quickly spot the usual causes and fixes. |
| 28 | + |
| 29 | +| What you see | Check | Likely fix | |
| 30 | +|----------------------------------|-----------------------------------------------|------------| |
| 31 | +| No telemetry at all | `OTEL_SDK_DISABLED`, exporters = `none`, sampler `always_off` | Unset `OTEL_SDK_DISABLED`, pick an exporter, use a non-zero sampler | |
| 32 | +| No/partial data from web requests | Loader order (preload/agent flags early) | Move loader earlier and restart the process | |
| 33 | +| Only custom code shows spans | Framework not supported/recognized | Align versions or add manual instrumentation | |
| 34 | +| Works locally, not on prod | Different environment/flags in container or service | Match prod environment settings and restart | |
| 35 | +| Still unsure | Enable debug logging | Inspect logs for disabled/unsupported/delayed initialization hints | |
| 36 | + |
| 37 | +### EDOT central configuration toggles at a glance |
| 38 | + |
| 39 | +If you use central configuration using OpAMP, these options can mute or change signals even when local `OTEL_*` looks correct. |
| 40 | + |
| 41 | +| Toggle | Effect | Typical symptom | |
| 42 | +|-----------------------------------------------|---------------------------------------------------------|-----------------| |
| 43 | +| `deactivate_all_instrumentations` | Disables all auto-instrumentations | No spans/metrics/logs from instrumented libraries | |
| 44 | +| `deactivate_instrumentations` | Disables selected instrumentation packages | Missing spans from specific frameworks/libraries | |
| 45 | +| `send_traces` / `send_metrics` / `send_logs` | Per-signal send switch | Only some signals arrive | |
| 46 | +| `elastic_otel_context_propagation_only` (Node.js) | Propagates context, doesn’t send it to the Collector | Cross-service context but nothing in Elastic | |
| 47 | +| `sampling_rate` | Adjusts trace sampling ratio | Fewer/more spans than expected | |
| 48 | +| `logging_level` | Changes SDK log verbosity | Affects debugging output only | |
| 49 | + |
| 50 | + |
| 51 | +## No telemetry and logs mention `SDK disabled` [sdk-disabled] |
| 52 | + |
| 53 | +If the logs mention `SDK disabled` or nothing at all, the SDK is likely deactivated in the configuration. |
| 54 | + |
| 55 | +Check the following: |
| 56 | + |
| 57 | +* **Environment variable** |
| 58 | + |
| 59 | + Many SDKs honor `OTEL_SDK_DISABLED=true`, or the equivalent in configuration files or flags. You can print the current value of the variable, for example: `printenv OTEL_SDK_DISABLED`. |
| 60 | + |
| 61 | + For SDK-specific details, see: |
| 62 | + * [Java](opentelemetry://reference/edot-sdks/java/setup/index.md) |
| 63 | + * [.NET](opentelemetry://reference/edot-sdks/dotnet/setup/index.md) |
| 64 | + * [Node.js](opentelemetry://reference/edot-sdks/nodejs/setup/index.md) |
| 65 | + * [Python](opentelemetry://reference/edot-sdks/python/setup/index.md) |
| 66 | + * [PHP](opentelemetry://reference/edot-sdks/php/setup/index.md) |
| 67 | + |
| 68 | +* **Exporter settings that effectively turn off signals** |
| 69 | + |
| 70 | + * `OTEL_TRACES_EXPORTER=none`, `OTEL_METRICS_EXPORTER=none`, or `OTEL_LOGS_EXPORTER=none` |
| 71 | + * Sampler turned off: `OTEL_TRACES_SAMPLER=always_off` or sampling probability set to `0.0` |
| 72 | + |
| 73 | +* **Multiple configuration sources** |
| 74 | + |
| 75 | + CI/CD pipelines or container manifests, such as Kubernetes `env:` blocks, might override local settings. These environments often require setting variables at deployment time. |
| 76 | + |
| 77 | +### Resolution [res-sdk-disabled] |
| 78 | + |
| 79 | +To fix the issue, try the following: |
| 80 | + |
| 81 | +* **Enable the SDK** |
| 82 | + |
| 83 | + Unset `OTEL_SDK_DISABLED` or set it to `false`. |
| 84 | + |
| 85 | +* **Enable exporters/sampler** |
| 86 | + |
| 87 | + Choose a valid exporter (for example `otlp`) and a sampling strategy with a non-zero probability (for example, `parentbased_traceidratio` with a ratio > 0). |
| 88 | + |
| 89 | +* **Restart the process** |
| 90 | + |
| 91 | + Restart after changing any configuration. Some SDKs only read environment variables at startup. |
| 92 | + |
| 93 | +If telemetry is still missing, you can enable debug logging. Refer to [Enable debug logging for EDOT SDKs](enable-debug-logging.md) for guidance. Make sure to [verify that you're looking at the right logs](enable-debug-logging.md#verify-youre-looking-at-the-right-logs). |
| 94 | + |
| 95 | +## Auto-instrumentation isn’t attaching [auto-instrumentation-not-attached] |
| 96 | + |
| 97 | +If auto-instrumentation isn’t attaching, or only partial data appears, the SDK or loader might be initializing too late, after the app or framework has already started. |
| 98 | + |
| 99 | +Check the following: |
| 100 | + |
| 101 | +* **What runs first** |
| 102 | + |
| 103 | + Ensure the SDK or auto-instrumentation loader runs before your app code, web server, or worker framework. |
| 104 | + |
| 105 | + **Using the OpenTelemetry Operator?** |
| 106 | + |
| 107 | + If you deploy using the OpenTelemetry Operator, verify that auto-instrumentation is injected correctly: |
| 108 | + |
| 109 | + 1. **Instrumentation resource**: Confirm the `Instrumentation` CR matches your runtime (Java/.NET/Node/Python/PHP) and sets the intended options (for example `java.javaAgent`, `dotnet.env`, or `node.env`). |
| 110 | + 2. **Pod injection**: Check that your workload has the expected annotations (or namespace injection enabled) and that new Pods were rolled to pick up injection. |
| 111 | + 3. **Environment variables and startup flags present**: Run `kubectl describe pod/<pod>`. In the output, under Containers, the Environment section should list the expected loader flags (for example `JAVA_TOOL_OPTIONS`, `DOTNET_*`, or `NODE_OPTIONS`) and volume mounts for agents. |
| 112 | + 4. **Webhook and injector logs**: Inspect the Operator and injector webhook logs for errors or skipped injections. |
| 113 | + 5. **Restart and rollout**: After changing the `Instrumentation` or annotations, perform a rollout so containers start with the updated environment variables and startup flags. |
| 114 | + |
| 115 | + If you use EDOT-specific images or settings, align the Instrumentation configuration with EDOT’s SDK guidance for that language (see links below). |
| 116 | + |
| 117 | + |
| 118 | +* **Start-up mechanism by language** |
| 119 | + |
| 120 | + * **Java:** Use the `-javaagent:` flag as early as possible so it loads before `main()`. Refer to [Java SDK setup](opentelemetry://reference/edot-sdks/java/setup/index.md). |
| 121 | + |
| 122 | + * **.NET:** Set the profiler/auto-instrumentation environment variables before starting the process. Refer to [.NET SDK setup](opentelemetry://reference/edot-sdks/dotnet/setup/index.md). |
| 123 | + |
| 124 | + * **Node.js:** Use a preloader (for example `NODE_OPTIONS=--require <entry>`) or import the SDK before bootstrapping the app. Refer to [Node.js SDK setup](opentelemetry://reference/edot-sdks/nodejs/setup/index.md). |
| 125 | + |
| 126 | + * **Python:** Use the launcher (for example `opentelemetry-instrument …`) or import/initialize the SDK before the framework starts. Refer to [Python SDK setup](opentelemetry://reference/edot-sdks/python/setup/index.md). |
| 127 | + |
| 128 | + * **PHP:** Ensure the extension is loaded and restart PHP-FPM/Apache so bootstrap hooks are active. Refer to [PHP SDK setup](opentelemetry://reference/edot-sdks/php/setup/index.md). |
| 129 | + |
| 130 | + If using Docker or Kubernetes confirm preloading flags or environment variables are placed where the actual process starts. |
| 131 | + |
| 132 | +### Resolution [res-instrumentation] |
| 133 | + |
| 134 | +To fix the issue, try the following steps: |
| 135 | + |
| 136 | +1. Move agent/loader flags to the earliest possible point in your startup chain. |
| 137 | +2. Confirm the loader runs. Debug logs should show detected instrumentations or patched modules. |
| 138 | +3. Fully restart the service, as reloads are often insufficient for preloaders/agents. |
| 139 | + |
| 140 | +:::{tip} |
| 141 | +In debug logs, look for lines that mention `installing instrumentation for …` or `detected framework … version …`. Lack of these hints usually means the loader didn’t run early enough. |
| 142 | +::: |
| 143 | + |
| 144 | +## App starts, SDK loads, but no telemetry for your framework [framework-not-supported] |
| 145 | + |
| 146 | +If the app and SDK load correctly but no spans, metrics, or logs appear for your framework, the runtime, framework, or library may not be supported or are only partially instrumented. |
| 147 | + |
| 148 | +Check the following: |
| 149 | + |
| 150 | +* **Compatibility tables** |
| 151 | + |
| 152 | + Verify that your runtime and frameworks are supported by the SDK. Refer to the [EDOT SDK compatibility reference](opentelemetry://reference/compatibility/sdks.md) for more information. |
| 153 | + |
| 154 | +* **Major version mismatches** |
| 155 | + |
| 156 | + New major versions of frameworks may not yet be supported and can break auto-instrumentation. |
| 157 | + |
| 158 | +* **Partial coverage** |
| 159 | + |
| 160 | + Some scenarios may require manual instrumentation. |
| 161 | + |
| 162 | +### Resolution [res-framework] |
| 163 | + |
| 164 | +To fix the issue, try the following: |
| 165 | + |
| 166 | +* **Align versions** |
| 167 | + |
| 168 | + Upgrade or downgrade the SDK or framework to a supported combination. |
| 169 | + |
| 170 | +* **Add manual instrumentation** |
| 171 | + |
| 172 | + Instrument code paths not covered by the agent. |
| 173 | + |
| 174 | +* **Retest with a minimal app** |
| 175 | + |
| 176 | + Strip down to core dependencies to rule out issues introduced by third-party libraries. |
0 commit comments