> ## Documentation Index
> Fetch the complete documentation index at: https://arize-ax.mintlify.site/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Set Up Dashboards

> Build dashboards to track your app's health, token usage, eval scores, and experiment results at a glance

export const AskAlyx = ({children}) => {
  const gradientId = `askAlyxGradient-${Math.random().toString(36).slice(2)}`;
  return <div style={{
    display: "flex",
    alignItems: "flex-start",
    gap: "0.625rem",
    margin: "1rem 0",
    padding: "0.75rem 1rem",
    borderRadius: "10px",
    border: "1px solid rgba(120, 115, 245, 0.25)",
    background: "linear-gradient(135deg, rgba(255, 110, 196, 0.08), rgba(120, 115, 245, 0.08))"
  }}>
      <svg width="18" height="18" viewBox="0 0 21 17" xmlns="http://www.w3.org/2000/svg" style={{
    flexShrink: 0,
    marginTop: "0.2rem"
  }}>
        <defs>
          <linearGradient id={gradientId} x1="0%" y1="100%" x2="100%" y2="0%">
            <stop offset="0%" stopColor="#FF3CA8" />
            <stop offset="100%" stopColor="#4827C1" />
          </linearGradient>
        </defs>
        <path d="M6.28906 12.7223C6.28889 11.3831 5.24007 10.3385 3.98926 10.3385C2.73859 10.3387 1.68963 11.3832 1.68945 12.7223C1.68945 14.0616 2.73849 15.1059 3.98926 15.1061C5.24018 15.1061 6.28906 14.0617 6.28906 12.7223ZM7.81152 0.557254C9.70554 -0.563135 12.1081 0.0645388 13.2607 1.91468L13.3691 2.09827V2.09925L20.7266 15.402C20.8713 15.6637 20.8667 15.9823 20.7148 16.2399C20.5629 16.4975 20.2864 16.6559 19.9873 16.6559H14.5459C13.0953 16.6474 11.7648 15.848 11.0469 14.5748V14.5739L6.33301 6.19104C5.22656 4.2273 5.87813 1.706 7.80957 0.558231L7.81152 0.557254ZM11.8906 2.91761C11.2374 1.74047 9.78961 1.34962 8.67188 2.01038L8.67285 2.01136C7.61521 2.64 7.19477 3.99924 7.69336 5.13733L7.80566 5.36194V5.36292L12.5186 13.7448C12.9466 14.5038 13.7274 14.9616 14.5557 14.9664H18.5547L11.8906 2.91663V2.91761ZM7.97949 12.7223C7.97949 14.9527 6.21527 16.7965 3.98926 16.7965C1.7634 16.7963 0 14.9526 0 12.7223C0.000173728 10.4921 1.76351 8.64923 3.98926 8.64905C6.21516 8.64905 7.97932 10.492 7.97949 12.7223Z" fill={`url(#${gradientId})`} />
      </svg>
      <span>{children}</span>
    </div>;
};

You've defined [custom metrics](/docs/ax/observe/projects/custom-metrics-api) to measure what matters. Dashboards put those metrics — plus token counts, latency, error rates, and eval trends — on one page you can check daily.

Two ways to get started: pick a pre-configured template or start with a blank dashboard. Either way, you shape the dashboard by adding widgets.

## Start from a template or build a custom dashboard

Go to **Dashboards** in the sidebar and click **+ New Dashboard**. Pick a **template** for a pre-configured layout, or **Blank Dashboard** to start from scratch.

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/dashboard_template.png" alt="Dashboard Templates selection showing available starter dashboards" />
</Frame>

For LLM tracing projects, two templates cover most needs:

### Tracing Project Overview

A comprehensive view of project health:

* **Trace Volume and Errors**: total requests and error counts
* **Latency**: average span latency and distribution
* **Model Performance**: token count and cost per model
* **Token Usage**: prompt, completion, and total tokens over time
* **Average Cost**: cost over time (if cost tracking is set up)
* **Average Eval Scores**: eval score trends over time

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/tracing_project_overview.png" alt="Tracing Project Overview dashboard showing traces over time, latency, distribution, and token usage widgets" />
</Frame>

### Token Tracking and Latency

Focused on usage and performance:

* **Total and Average Token Counts**: prompt and completion tokens over time
* **Number of Requests**: request volume
* **Average Latency**: response time trends

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/token_tracking.png" alt="Token Tracking and Latency dashboard showing token counts, request volume, and latency" />
</Frame>

## Add a widget

Every dashboard, template or blank, is shaped by the widgets you add. Open a dashboard and click **+ Add Widget** in the top right. You'll see a list of widget types: Time Series, Distribution, Statistic, Pivot Table, Scatter Plot, Text, Experiment, and more. Pick one to open the widget config.

<AskAlyx>**Ask Alyx** to build a time series widget for you — try *"Add a time series widget for p95 latency on LLM spans."*</AskAlyx>

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/custom_dashboard.png" alt="Creating a dashboard widget with configuration panel" />
</Frame>

Inside the widget config, the **Metric** dropdown lets you pick a specific span metric under **Span Metrics**, or a roll-up like **Trace Average** or **Session Average**. Pick the level you actually want to measure.

<Tip>
  **Span-level vs. trace-level.** Metrics under **Span Metrics** count every span. A count of 1,000 error spans could be 1,000 failing requests, or 10 failing traces with 100 errors each. Pick **Trace Average** or **Session Average** from the Metric dropdown to roll up to trace-level or session-level numbers.
</Tip>

The widget types below are the ones customers reach for most. Pick a tab to see configuration and a real example.

<Tabs>
  <Tab title="Time Series">
    Time Series widgets show how a metric changes over time. A good first widget: p95 latency for LLM spans, so you can see slow responses at a glance.

    * **Widget type:** Time Series
    * **Metric:** p95 latency (add a [custom metric](/docs/ax/observe/projects/custom-metrics-api) using `APPROX_QUANTILE`)
    * **Filter:** `attributes.openinference.span.kind = 'LLM'`

    <Frame>
      <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/count.png" alt="Time Series widget showing p95 latency trending over time" />
    </Frame>
  </Tab>

  <Tab title="Eval score">
    Most production dashboards track an eval score over time — hallucination, relevance, or QA correctness. A Time Series of the Hallucination Eval Score tells you whether response quality is trending up or down.

    * **Widget type:** Time Series
    * **Metric:** Hallucination Eval Score — add a [custom metric](/docs/ax/observe/projects/custom-metrics-api):

    ```sql theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
    -- Hallucination rate percentage
    SELECT COUNT(*) FILTER (WHERE "eval.Hallucination.label" = 'hallucinated') /
           COUNT(*) FILTER (WHERE "eval.Hallucination.label" IS NOT NULL) * 100
    FROM MODEL
    ```

    <Frame>
      <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/dashboard_eval.png" alt="Time Series widget showing Hallucination Eval Score trending over time" />
    </Frame>
  </Tab>

  <Tab title="Statistic">
    Statistic widgets show a single aggregate value — the current state of things. Pair them with a Time Series for a "right-now" reading alongside the trend.

    * **Widget type:** Statistic
    * **Metric:** error rate as a percentage ([custom metric](/docs/ax/observe/projects/custom-metrics-api) using `COUNT(*) FILTER (WHERE "status_code" = 'ERROR') / COUNT(*)`)

    <Frame>
      <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/total_token_count.png" alt="Statistic widget showing current error rate" />
    </Frame>
  </Tab>

  <Tab title="Distribution">
    Distribution widgets show the spread of values across a dimension. Group errors by `graph.node.id` to see which part of your agent is failing most.

    * **Widget type:** Distribution
    * **Metric:** count of error spans
    * **Group by:** `attributes.graph.node.id`

    <Frame>
      <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/distribution.png" alt="Distribution widget showing error counts by agent node" />
    </Frame>
  </Tab>

  <Tab title="Pivot Table">
    Pivot Table widgets compare a metric across categories in a table. Group by span kind to see how latency breaks down across LLM, Retriever, Tool, and Agent spans at a glance.

    * **Widget type:** Pivot Table
    * **Group By Dimension:** `attributes.openinference.span.kind`
    * **Value:** `latency_ms` with Metric **Avg**, labeled "Average Latency"

    <Frame>
      <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/pivot_overview.png" alt="Pivot Table widget showing average latency by span kind (Agent, LLM, Retriever, Tool)" />
    </Frame>
  </Tab>

  <Tab title="Scatter Plot">
    Scatter Plot widgets show how two attributes correlate. Plot token count against latency for LLM spans to see whether longer prompts actually take longer to respond.

    * **Widget type:** Scatter Plot
    * **X-Axis:** `latency_ms`
    * **Y-Axis:** `attributes.llm.token_count.total`
    * **Filter:** `attributes.openinference.span.kind = 'LLM'`

    <Frame>
      <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/scatter_plot.png" alt="Scatter Plot widget showing token count vs. latency for LLM spans" />
    </Frame>
  </Tab>

  <Tab title="Text">
    Text widgets add context, section headers, or notes alongside your charts. Use them to explain what a dashboard tracks, link to runbooks, or separate dashboard sections.

    * **Widget type:** Text
    * **Content:** Markdown — headings, bold, lists, and inline code all render

    <Frame>
      <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/text.png" alt="Text widget rendered on a dashboard showing a heading and description next to other chart widgets" />
    </Frame>
  </Tab>
</Tabs>

Save the dashboard. The rest of this page is about refining it — filters, exports, and gotchas.

## Using your dashboards

### Global filters and time range

The selectors at the top apply to every widget on the dashboard.

* **Time range** — presets (Last 15 Min to Last 6 Months), custom range, or typed value. Timezone persists across sessions.
* **Metadata filters** — scope by attributes like model name, environment, or custom metadata.

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/using_dashboard.png" alt="Dashboard with global filters and time range selector at top" />
</Frame>

### Per-widget filters

Each widget can override the global filter. Open the widget's config panel and add a filter there — useful when one widget needs a narrower or different scope than the rest of the dashboard.

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/filter.png" alt="Widget config panel with a per-widget filter on attributes.openinference.span.kind equal to LLM" />
</Frame>

### View traces behind a widget

The most common dashboard workflow: click a data point on a chart to jump straight to the traces behind it. When you notice an anomaly — a latency spike, an error surge — one click takes you to the filtered trace list, where you can open any trace or span.

<Frame>
  <video controls className="w-full aspect-video rounded-xl" src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/view_traces_from_dashboard.mp4" />
</Frame>

### Interact with widgets

Click a legend entry to isolate that series. Click the widget itself to open its config panel (metric, filter, visualization, title). Use the widget's **`...`** menu to duplicate, resize, or delete; drag to reorder.

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/export_data.png" alt="Widget context menu on a dashboard widget showing Edit Widget, Duplicate Widget, Export Data, Export as PDF, View In Fullscreen, and Delete Widget" />
</Frame>

### Export and share

| Option                             | How                                                                                                     |
| ---------------------------------- | ------------------------------------------------------------------------------------------------------- |
| **Export as PDF (full dashboard)** | Dashboard **`...`** menu → **Export as PDF**                                                            |
| **Export as PDF (single widget)**  | Widget **`...`** menu → **Export as PDF**                                                               |
| **Export widget data as CSV**      | Widget **`...`** menu → **Export Data**. Per-widget only — no dashboard-wide CSV                        |
| **Share a link**                   | Copy the URL. Anyone with access to the space can open it; permissions follow the space's role settings |
| **Programmatic access**            | Dashboard and widget data are accessible via the [GraphQL API](/docs/ax/graphql-reference)                   |

### Copy a dashboard

Duplicate a dashboard using the dashboard's **`...`** menu → **Copy Dashboard**. To recreate a dashboard in a different project, start from the same template there.

<Frame>
  <img src="https://storage.googleapis.com/arize-phoenix-assets/assets/images/arize-docs-images/observe/copy_dashboard.png" alt="Dashboard context menu showing Edit Dashboard Title, Copy Dashboard, Export Dashboard as PDF, and Delete Dashboard options" />
</Frame>

***

## Next step

You've put your metrics on a dashboard. Now set monitors on the same ones so regressions page you instead of waiting to be noticed:

<Card title="Next: Continuously Monitor" icon="arrow-right" href="/docs/ax/observe/production-monitoring" />
