Skip to main content

Distributed Traces — Overview

In a distributed system, a single request may cross many services, databases, and third-party APIs before returning a response. Distributed tracing lets you see that entire path — and CodeXray turns the usual per-trace search into a service-scoped investigation workflow where you start with a visual summary, zoom into the anomalous region, and drill down to individual spans.

The workflow in one sentence

See the shape → select the anomaly → understand what's in it → open a single trace for the details.


Where to Find It​

Every application in CodeXray has a dedicated Traces tab. Open any service from the Applications list and switch to Traces — everything on the page is scoped to that one service.

Traces tab — service-scoped landing view

The page is laid out as a guided walkthrough — from a visual summary at the top, through selection-driven drill-down, to individual trace detail and attribute comparison at the bottom.


Anatomy of the Page​

1. The Scatter / HeatMap Chart​

At the top is a scatter chart plotting every trace in the selected time window. Each dot is one request:

  • X-axis — time
  • Y-axis — request duration (with a logarithmic scale, from a few milliseconds to 10+ seconds)
  • Dot colour — trace status (green = success, red = error)

At a glance you can spot:

  • Error spikes — vertical columns of red dots
  • Latency anomalies — dots drifting upward away from the normal band
  • Volume shifts — density changes across the time axis

Above the chart, a status badge (OK / WARNING / CRITICAL) summarises the service's current health.

2. Summary Stats​

The strip below the chart shows the key numbers for the selected time range:

StatWhat it tells you
ClientsHow many distinct callers are issuing traces to this service
Total TracesNumber of traces in the current window
Traces/SecCurrent rate
Error RatePercentage of traces that failed
Avg. DurationMean request duration
Most Frequent ClientThe caller that produced the largest share of traffic

3. Requests & Errors + Latency Charts​

Two charts sit side by side:

  • Requests & Errors — a stacked bar chart of request volume (blue) and errors (red) over time. Makes spikes and outages visually obvious.
  • Latency (ms) — percentile lines showing p50 / p75 / p95 / p99 over time.

Latency chart — p50 / p75 / p95 / p99 lines

The p99 line is usually where regressions show up first — a spike with p50 still flat means "most users are fine, but the slowest 1% have degraded".

4. Investigation Window — Select a Region to Drill In​

This is where CodeXray's tracing gets interesting. Instead of paging through thousands of traces, you click-and-drag a rectangle on the scatter chart to define a time + duration window. Everything below — the Requests & Errors chart, the Latency chart, and the trace list — narrows to exactly that region.

Selection-based investigation — region drawn on the scatter chart scopes every downstream view

The left filter panel now shows a Selected Window indicator with the exact time range (e.g., "23 Apr, 14:48 → 23 Apr, 14:51") and an × to clear it. The Investigation Window concept makes one thing easy:

I see an anomaly in the chart. Show me only the traces that caused it.

5. The Trace List​

Below the charts, the trace table lists individual traces from the current selection (or from the full window if no region is selected). Each row shows:

  • TRACE ID — clickable link to the detail view
  • CLIENT — the upstream service that made the call
  • STATUS — HTTP status code or protocol-specific status badge
  • DURATION — total request time
  • NAME — operation name
  • DETAIL — full URL / endpoint

The left filter panel offers three quick scopes:

  • All Traces — everything in the window
  • Error Traces — only failures
  • Slow Traces — only requests above the latency threshold

Filtering by error traces on a service in trouble instantly narrows the list:

Error-traces-only view with selected window — only failing requests remain

Paired with the selection window, this is the fastest path from "something went wrong" to "here are the 15 traces that match."

6. Trace Detail — Waterfall and Tree Views​

Click any trace ID to open the trace detail view — the full span tree for that request.

Waterfall View​

The default. Spans are stacked vertically by call depth, aligned against a shared timeline. The longer the bar, the longer the operation. Lower depth = deeper nested calls.

Waterfall view — span tree with latency bars aligned on a timeline

Use Waterfall when you want to see where time is spent. A single long bar at the top with many short children tells a different story from many long bars at the same level.

Tree View​

Toggle to Tree in the top-right corner. This renders the trace as a compact horizontal node-link graph — more useful when you have many shallow spans and want to see the request shape rather than per-span durations.

Tree view — compact node-link layout of the same trace

Both views show the same spans — use whichever maps better to the trace you're investigating.

7. Comparative Analysis — Latency Explorer and Compare Attributes​

Once you've used the chart + selection workflow to narrow down to an anomaly, CodeXray offers a deeper investigation mode: Comparative Analysis. Toggle it on from the filter panel and the page switches from "here are the traces" to "here's how these traces differ from the rest."

Comparative Analysis — Latency Explorer heatmap with Compare Attributes tab

Two sub-tabs sit at the top right:

Latency Explorer​

A high-resolution heatmap of request distribution across a long time window — every request plotted by duration and timestamp. Dense green bands show the "normal" latency profile; outliers stand out above them.

Drag to select any region on this heatmap and the rest of the page — including the Compare Attributes tab — scopes to just those traces. Use it when:

  • You want to characterise latency over a long window (days, not minutes) and spot recurring slow patterns
  • You want to isolate a specific latency band ("requests taking 1–3 seconds") and see what they have in common
Auxiliary request filter

A checkbox in the filter panel — Exclude auxiliary requests (from monitoring, control plane, etc.) — removes low-signal traffic like health checks, readiness probes, and internal heartbeats. On by default for clearer analysis; untick it if you specifically need to include them.

Compare Attributes​

Once a region is selected in the Latency Explorer, the Compare Attributes tab answers:

What makes these requests different from all the others?

It compares trace attributes between the selection and the baseline and surfaces statistically meaningful differences — for example, "93% of selected requests have feature_flag=new_checkout enabled, vs 12% baseline" or "all selected requests originate from the mumbai region."

Works with any attribute — OTel semantic conventions (http.method, db.system, etc.), resource attributes (service.version, deployment.environment), or custom attributes your app sets. No configuration required; CodeXray discovers and compares attributes automatically.

This is the feature that closes the "why is it slow?" question — especially for issues that only affect a specific customer, browser, version, or region.


How Traces Reach CodeXray​

CodeXray ingests spans from two complementary sources:

1. OpenTelemetry SDKs​

The rich path. Applications instrumented with OpenTelemetry emit OTLP traces directly to the CodeXray collector — with full span trees, custom attributes, and trace context propagated across every hop. Dedicated setup pages for the most common languages:

Any language with OpenTelemetry SDK support (Node.js, Ruby, PHP, Rust, .NET, C++) works too — just point the OTLP exporter at the CodeXray collector.

2. eBPF-based Tracing​

The zero-code path. The CodeXray Node Agent captures outbound requests at the kernel via eBPF and converts them into OTel spans automatically. Auto-instrumented protocols: HTTP, gRPC, PostgreSQL, MySQL, MongoDB, Redis, Memcached, RabbitMQ, Kafka.

Both sources land as OTel spans in the same store. You can mix them freely — eBPF traces for services you haven't instrumented yet, SDK traces for the ones you have.


Supported Languages​

CodeXray accepts OTLP from any OpenTelemetry-compliant language. Dedicated setup guides are available for the three most common:

LanguageInstrumentation styleDedicated guide
JavaAutomatic via opentelemetry-javaagent.jar — zero code changesOpenTelemetry for Java
PythonAutomatic via opentelemetry-instrumentOpenTelemetry for Python
GoManual SDK integration (no auto-instrumentation available in OTel Go)OpenTelemetry for Go
Node.jsAutomatic via --require @opentelemetry/auto-instrumentations-node/register— (use standard OTel docs)
.NETVia CodeXray .NET Agent (legacy + modern) or OpenTelemetry.AutoInstrumentation.NET Agent
Ruby / PHP / RustVia standard OpenTelemetry SDKs and OTLP exporters— (use standard OTel docs)

All roads lead to the same OTLP collector endpoint. Pick whichever matches your language and you're done.


Pairs Well With​

Tracing is most powerful when correlated with other signals:

  • Service Map / Topology — the Topology view visualises every service discovered from traces (and from eBPF)
  • Logs — see the Log Monitoring section to pivot from a log line to its trace
  • DB Insights — every trace's database calls surface in the Database Insights tab

Topology view — service map built from tracing and eBPF


Next Steps​