Missing spans or fields
The trace appears but spans are missing or fields like input/output are blank. Usual causes: masking is on, the instrumentor isn't attached, or a custom key isn't indexed.
Symptom
The trace shows up, but it’s incomplete — a nested span is missing, or fields like input and output are blank, or a custom attribute you set isn’t there. The usual causes are redaction being switched on (in which case blank is expected), the framework’s instrumentor not being attached, or an attribute set on the wrong span or after it closed. Check redaction first, because a hidden field is working as designed, not a bug.
- A span’s input/output show as hidden or blank.
- A framework’s child spans (e.g. nested LangGraph nodes) don’t appear.
- A custom attribute you set isn’t on the span, or you can’t filter by it.
Quick checks
- Redaction is off for the fields you expect to see (
FI_HIDE_INPUTS/FI_HIDE_OUTPUTSandTraceConfigmasking). - The framework’s instrumentor is installed and
instrument()ran against the same tracer provider. - Custom attributes are set while the span is still active, before its
withblock closes. - Anything you filter on uses a semantic-convention key with a supported value type.
Causes and fixes
| Cause | What you see | Fix |
|---|---|---|
| Redaction is on (check first) | Input/output render as hidden or blank, but the span is otherwise complete | Confirm whether FI_HIDE_INPUTS / FI_HIDE_OUTPUTS or TraceConfig masking is set — if so, the blank is expected. See Mask span attributes. |
| Instrumentor not attached for that framework | A framework’s child spans (e.g. nested LangGraph nodes) never appear | Install and instrument() the instrumentor for the missing framework, attached to the provider. |
| Attribute set on the wrong span / after close | A custom attribute you set isn’t on the span | Set attributes while the span is active; a value set after the with block closes is dropped. |
| Custom key isn’t indexed for filtering | The attribute is on the span but you can’t filter by it | Use a semantic-convention key where one exists — the UI filters on standard keys. |
| Unsupported value type | The attribute is silently dropped | Attribute values must be string, bool, int, float, or an array of those. |
Diagnostic commands
Print one span’s attributes from a span exporter to confirm what actually reached the SDK, so you can tell a redacted field from a missing one:
from opentelemetry.sdk.trace.export import SimpleSpanProcessor, SpanExporter
class PrintAttributes(SpanExporter):
def export(self, spans):
for span in spans:
print(span.name, dict(span.attributes))
trace_provider.add_span_processor(SimpleSpanProcessor(PrintAttributes()))
If the attribute prints here but isn’t filterable in the UI, the key isn’t indexed; if it doesn’t print at all, it was set on the wrong span or after close.
Minimal smoke test
Re-run one request, then open the trace, click the span, and check the attributes list. The previously-missing span or attribute should now show in the span detail, and you should be able to filter by it for standard keys.
Escalate
If you’re still stuck, contact support@futureagi.com with your project_name, the trace ID, the framework + instrumentor versions, and the attribute you expected.
Prevent recurrence
- Decide masking deliberately and document it, so blank fields aren’t mistaken for bugs.
- Prefer semantic-convention keys for anything you’ll filter or evaluate on.
Next steps
Questions & Discussion