User dashboard

View all traces, sessions, and metrics per end user in one place so you can debug, analyze behavior, and optimize at the user level.

What it is

The user dashboard in Observe is a per-user view of activity: every trace and session that belongs to an identified end user is grouped under that user, with aggregates for cost, tokens, latency, error count, evaluation pass rate, and guardrail triggers. End users are identified by a stable user.id (and optional type and metadata) that you send on spans; the backend resolves them to an EndUser and links spans to that user. The dashboard lists these users for a project so you can open one and see their traces, sessions, and metrics in one place instead of searching by hand. It exists so you can debug a specific user’s issues, spot high-cost or problematic users, and analyze engagement and quality at the individual level.

Use cases

  • Debugging — When a user reports a problem, open their row in the user dashboard to see all their traces and sessions and reproduce the issue.
  • User-level metrics — See total cost, tokens, latency, error count, eval pass rate, and guardrail triggers per user to spot outliers.
  • Behavior and engagement — Use activation date, last active, active days, and session/trace counts to understand how often users interact and where they drop off.
  • Resource and quality — Identify power users, high-cost accounts, or users with low eval pass rates to tune limits or improve prompts.
  • Search and filter — Search by user ID and filter the user list or their traces/sessions by date, metrics, or custom attributes.

How to

Associate spans with an end user

For a span to count under a user in the dashboard, it must carry a user identifier. In the OTLP path this comes from the span attribute user.id. When a span is ingested with this attribute (for an Observe project), the backend gets or creates an EndUser for that project and organization with that user_id (and optional user_id_type) and links the observation span to that end user. All spans with the same user.id in the same project contribute to that user’s metrics and appear in their detail view.

Set user attributes on a span

Set user.id (required). You can also set user.id.type (email, phone, uuid, custom), user.id.hash, and user.metadata (JSON) for display or filtering.

from fi_instrumentation import register, FITracer
from opentelemetry.trace import Status, StatusCode

trace_provider = register(
    project_type=ProjectType.OBSERVE,
    project_name="PROJECT_NAME",
)
tracer = FITracer(trace_provider.get_tracer(__name__))

with tracer.start_as_current_span("SPAN_NAME") as span:
    span.set_status(Status(StatusCode.OK))
    span.set_attribute("user.id", "vivek.gupta")
    span.set_attribute("user.id.type", "email")  # email | phone | uuid | custom
    span.set_attribute("user.id.hash", "<hash_for_the_user.id>")  # optional
    span.set_attribute("user.metadata", {})  # optional
    span.set_attribute("input.value", "input")
    span.set_attribute("output.value", "output")
const { register, ProjectType } = require("@traceai/fi-core");

const traceProvider = register({
    project_type: ProjectType.OBSERVE,
    project_name: "FUTURE_AGI"
});
const tracer = traceProvider.getTracer("manual-instrumentation-example");

tracer.startActiveSpan("SPAN_NAME", {}, (span) => {
    span.setAttribute("user.id", "vivek.gupta");
    span.setAttribute("user.id.type", "email");
    span.end();
});

Use context for many spans

To tag all spans in a block with the same user, use a context that sets user.id (and optional type/metadata) so every span in that block is linked to that end user. With the Python SDK you can use using_attributes and pass user_id (and optionally session_id).

from fi_instrumentation import using_attributes

with using_attributes(user_id="newuser@example.com", session_id="new-session"):
    response = client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": "Write a haiku."}],
        max_tokens=20,
    )

Use the user dashboard in Observe

  • Open the project and go to the Users (user dashboard) view.
  • Table columns: user_id, activation date, last active, trace count, error count, session count, avg latency, LLM calls, eval pass rate, guardrail triggers, tokens, cost.
  • Search by user ID; apply filters as needed.
  • Click a user for detail: Summary metrics, Traces tab (trace ID, session, latency, input/output, evals, cost, annotations), Sessions tab (session ID, time range, trace count, evals, cost). Dashboard

Note

End users are unique per project and organization by (user_id, user_id_type). Sending the same user.id (and type) on spans in the same Observe project ties those spans to one end user in the dashboard.


What you can do next

Was this page helpful?

Questions & Discussion