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

# RUM Explorer Analytics

> Summarize RUM events in the Flashduty RUM Explorer analytics view with aggregations, groups and five chart types, then drill from an aggregate down to the raw events.

The RUM Explorer gives you two view modes: **List** and **Analytics**. The **Analytics** view aggregates the events of the current event type by the aggregation and group you pick, which is what answers questions like "which page loads slowest" or "which browsers do the errors come from". Switch back to the list when you need individual events.

## List and analytics

The top of the Explorer has two tabs: **List** shows events one by one, **Analytics** aggregates them into charts. Both share the same event type, query conditions and time range, so switching tabs never drops your current filters.

The mode is recorded in the `mode` URL parameter: `mode=analytics` opens analytics, and omitting `mode` opens the list, so existing Explorer links keep opening the list. Copy the URL of an analytics view to share the same chart with others.

| Tab | `mode` value | What it shows |
| - | - | - |
| **List** | omitted | Event trend graph and event table, drilling into individual event details |
| **Analytics** | `analytics` | Charts aggregated by the aggregation and group |

## Choosing the aggregation and fields

The **Measure** row at the top of the analytics view decides what is computed: pick an **Aggregation**, then a **Measured field** where one is needed, then a **Group-by field**.

### Aggregations

| Aggregation | `agg` value | Description |
| - | - | - |
| **Count** | `count` | Number of events; takes no field |
| **Unique count** | `count_distinct` | Number of distinct values of a field |
| **Average** | `avg` | Mean of a numeric field |
| **Sum** | `sum` | Total of a numeric field |
| **Min** | `min` | Smallest value of a numeric field |
| **Max** | `max` | Largest value of a numeric field |
| **P50 / P75 / P90 / P95 / P99** | `p50` / `p75` / `p90` / `p95` / `p99` | Approximate percentiles of a numeric field, for watching the long tail |

Every aggregation except **Count** needs a **Measured field**. With Average, Sum, Min, Max or any percentile, the field picker lists numeric fields only; timestamp fields (unit `unix_millisecond`) are excluded, since averaging them is meaningless. With **Unique count**, the field picker lists the scalar facets that can be grouped by. After you switch the event type, a field that does not exist on the new event type is reported as missing and you are asked to pick another one, rather than the question silently becoming a count.

The legend, the table columns and the CSV header all use the same naming: the measure of **Count** and of a **Distribution** reads "Events"; every other aggregation reads "Aggregation (field name)", for example "Average (view\_loading\_time)".

### Group-by field

The **Group-by field** decides what the measure is split by. Once one is chosen, the chart draws each group value separately and a **top** selector appears next to it, offering `5`, `10`, `20` and `50` groups, `10` by default. The group-by field can be cleared (the placeholder reads "No grouping"), and the result then collapses into a single number. Only scalar facets can be grouped by; an array field holds several values per event and therefore has no meaningful grouping.

A **Distribution** does not use a group-by field, and that selector is not shown.

## Chart types

The analytics view offers five chart types:

| Chart type | `viz` value | Description |
| - | - | - |
| **Timeseries** | `timeseries` | The measure over time buckets; the default chart type |
| **Top list** | `toplist` | Groups ranked by the measure, largest first |
| **Pie** | `pie` | Share of each group, subject to the constraints below |
| **Table** | `table` | Two columns: the group and the measure |
| **Distribution** | `distribution` | Histogram of events per value range of one numeric field |

A **Timeseries** also offers a **Draw style** selector that switches between **Line** (`line`) and **Bars** (`bar`), bars by default. When a group-by field is set, the draw style is bars and the aggregation is **Count** or **Sum**, the bars are stacked by group and the bar height is the total; the other aggregations (averages, percentiles, unique counts) cannot stack, because their per-group values do not add up.

Without a group-by field, **Top list** and **Table** print the measure itself instead of drawing a single bar; a **Timeseries** still plots one line over time.

## Drilling down

Clicking an element on a chart opens a drill-down menu that takes you from the aggregate back to individual events: a point in time on a timeseries, a row in the top list or table, a slice of a pie, or a range of a distribution.

| Menu item | What it does |
| - | - |
| **View in list** | Switches to the list tab, showing only the events behind the clicked element |
| **Split "value"** | Keeps only the clicked group value and opens the group-by picker so you can break it down by another field; a distribution range has no group, so the item reads **Filter to "range"** and keeps only the events in that range |
| **Exclude "value"** | Drops the clicked group value from the result |

A drill-down writes the same filters the facet list on the left writes, so they show up in the search box and can be undone the same way. Drilling down from a timeseries point narrows the list to that time bucket, and drilling down from a distribution range filters the list by that numeric range.

After **View in list**, a **Back to analytics** bar appears above the list with the note "The list is filtered by the drill-down; going back restores the previous query". Clicking it returns to the analytics view and restores the query you drilled from. Switching tabs by hand ends that drill-down, and the bar disappears with it.

<Note>
  The empty group, shown on charts as "(empty)", cannot be drilled into yet, so **Split** and **Exclude** are both unavailable for it.
</Note>

## Zooming a timeseries

Drag across a **Timeseries** to zoom into that window. The zoom applies to this chart only; the Explorer's own time range stays as it is. While zoomed, the **Zoomed** badge in the top-right corner of the chart shows the current window, and the close button on it (**Reset zoom**) restores the full time range. Changing the event type, the query conditions or the Explorer's time range resets the zoom.

## Downloading an image and exporting CSV

Two export buttons sit in the top-right corner of the chart:

| Button | Description |
| - | - |
| **Download image** | Exports the current chart as a PNG rendered at twice the pixel density. A Table, or a single number without a group-by, is not a chart, so the button is unavailable |
| **CSV** | Exports the current chart's data as CSV, named like `rum-<event type>-analytics-<timestamp>.csv`. A timeseries exports one row per time, group and measure (long format); the other charts export one row per group |

Both buttons are unavailable while the result is empty.

## Distribution

A **Distribution** buckets one numeric field by value range and shows the number of events in each range. It ignores the aggregation and the group-by.

* Buckets span from the field's minimum up to `P99`: RUM timings have a long tail (one 46s page load among thousands of 1s ones), and splitting up to the maximum would crush the whole body of values into the first bar.
* The bucket width is rounded to `1`, `2` or `5` times a power of ten, so bucket edges read as round numbers; the observed range is split into about 40 buckets.
* Everything above `P99` goes into one open-ended last bucket, shown on the chart and in the CSV as "≥ edge".
* Ranges are labelled in the field's own unit, for example `1s–1.5s` for a duration field.

## When a Pie applies

A Pie requires both of the following; otherwise the chart area shows "Pie charts need a group-by and only apply to count and sum":

* a **Group-by field** is set;
* the aggregation is **Count** or **Sum** — only these two add up to a whole, which is what a pie claims. Unique counts, averages and percentiles do not.

## Sampled estimates

When the data volume is large enough that the result is estimated from a sample, the **Sampled** badge appears in the top-right corner of the chart, with the tooltip "Large data volume: results are estimated from a sample".

## URL parameters

The analytics view keeps its state in the URL, so a copied link reproduces the same analysis. Values that are not allowed fall back to the default.

| Parameter | Meaning | Values | Default |
| - | - | - | - |
| `mode` | View mode | `analytics` | omitted, i.e. the list |
| `agg` | Aggregation | `count`, `count_distinct`, `avg`, `sum`, `min`, `max`, `p50`, `p75`, `p90`, `p95`, `p99` | `count` |
| `aggField` | Measured field | a field name | none |
| `groupBy` | Group-by field | a field name | none (no grouping) |
| `top` | Number of groups kept | `5`, `10`, `20`, `50` | `10` |
| `viz` | Chart type | `timeseries`, `toplist`, `pie`, `table`, `distribution` | `timeseries` |
| `style` | Timeseries draw style | `line`, `bar` | `bar` |

## Next steps

<CardGroup cols={2}>
  <Card title="RUM Explorer Overview" icon="compass" href="./overview">
    Learn about the Explorer's core features
  </Card>

  <Card title="Data Query Guide" icon="magnifying-glass" href="./data-query">
    Master query syntax for precise data location
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.