Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
title: Visualize data, share links, and create exports with the new Workers Observability dashboard
description: The new Workers Observability dashboard includes new features like data visualizations, shareable links, and exports (JSON/CSV).
products:
- workers
date: 2026-01-21
---

The [Workers Observability dashboard](https://dash.cloudflare.com/?to=/:account/workers-and-pages/observability/) has some major updates to make it easier to debug your application's issues and share findings with your team.

![Workers Observability dashboard showing events view with event details and share options](~/assets/images/changelog/workers/observability/2026-01-22-events_share_obs_wobs.png)

You can now:

- **Create visualizations** — Build charts from your Worker data directly in a Worker's Observability tab
- **Export data as JSON or CSV** — Download logs and traces for offline analysis or to share with teammates
- **Share events and traces** — Generate direct URLs to specific events, invocations, and traces that open standalone pages with full context
- **Customize table columns** — Improved field picker to add, remove, and reorder columns in the events table
- **Expandable event details** — Expand events inline to view full details without leaving the table
- **Keyboard shortcuts** — Navigate the dashboard with hotkey support

![Workers Observability dashboard showing a P99 CPU time visualization grouped by outcome](~/assets/images/changelog/workers/observability/2026-01-22-vis_qb_wobs.png)

These updates are now live in the Cloudflare dashboard, both in a Worker's Observability tab and in the account-level Observability dashboard for a unified experience. To get started, go to **Workers & Pages** > select your Worker > **Observability**.
13 changes: 10 additions & 3 deletions src/content/docs/workers/observability/logs/workers-logs.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,20 @@
order: 2
---

import { TabItem, Tabs, Steps, Render, WranglerConfig, DashButton } from "~/components";
import {
TabItem,
Tabs,
Steps,
Render,
WranglerConfig,
DashButton,
} from "~/components";

Workers Logs lets you automatically collect, store, filter, and analyze logging data emitted from Cloudflare Workers. Data is written to your Cloudflare Account, and you can query it in the dashboard for each of your Workers. All newly created Workers will come with the observability setting enabled by default.

Logs include [invocation logs](/workers/observability/logs/workers-logs/#invocation-logs), [custom logs](/workers/observability/logs/workers-logs/#custom-logs), errors, and uncaught exceptions.

![Example showing the Workers Logs Dashboard](~/assets/images/workers-observability/preview.png)
![Example showing the Workers Logs Dashboard](~/assets/images/workers-observability/wobs_workers_events_122.png)

To send logs to a third party, use [Workers Logpush](/workers/observability/logs/logpush/) or [Tail Workers](/workers/observability/logs/tail-workers/).

Expand Down Expand Up @@ -63,7 +70,7 @@
<DashButton url="/?to=/:account/workers-and-pages" />

2. In **Overview**, select your **Worker**.
3. Select **Logs**.
3. Select **Observability**.

## Best Practices

Expand Down Expand Up @@ -200,7 +207,7 @@
## Pricing

:::note[Billing start date]
Workers Logs billing will begin on April 21, 2025.

Check warning on line 210 in src/content/docs/workers/observability/logs/workers-logs.mdx

View workflow job for this annotation

GitHub Actions / Semgrep

semgrep.style-guide-potential-date-year

Potential year found. Documentation should strive to represent universal truth, not something time-bound. (add [skip style guide checks] to commit message to skip)

Check warning on line 210 in src/content/docs/workers/observability/logs/workers-logs.mdx

View workflow job for this annotation

GitHub Actions / Semgrep

semgrep.style-guide-potential-date-month

Potential month found. Documentation should strive to represent universal truth, not something time-bound. (add [skip style guide checks] to commit message to skip)
:::

<Render file="workers_logs_pricing" product="workers" />
Expand Down
93 changes: 51 additions & 42 deletions src/content/docs/workers/observability/query-builder.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,18 @@ head: []
description: Write structured queries to investigate and visualize your telemetry data.
sidebar:
order: 4

---

import { TabItem, Tabs, Render, WranglerConfig, YouTube, Markdown, DashButton, Steps } from "~/components"
import {
TabItem,
Tabs,
Render,
WranglerConfig,
YouTube,
Markdown,
DashButton,
Steps,
} from "~/components";

The Query Builder helps you write structured queries to investigate and visualize your telemetry data. The Query Builder searches the Workers Observability dataset, which currently includes all logs stored by [Workers Logs](/workers/observability/logs/workers-logs/).

Expand All @@ -27,10 +35,11 @@ The Query Builder is available to all developers and requires no enablement. Que
[observability]
enabled = true

[observability.logs]
invocation_logs = true
head_sampling_rate = 1 # optional. default = 1.
```
[observability.logs]
invocation_logs = true
head_sampling_rate = 1 # optional. default = 1.
```

</WranglerConfig>

## Write a query in the Cloudflare dashboard
Expand All @@ -40,7 +49,7 @@ The Query Builder is available to all developers and requires no enablement. Que
<DashButton url="/?to=/:account/workers-and-pages" />

2. Select your Worker.
3. Select **Observability** in the left-hand navigation panel, and then the **Investigate** tab.
3. Select **Observability** in the left-hand navigation panel, and then the **Overview** tab.
4. Select a **Visualization**.
5. Optional: Add fields to Filter, Group By, Order By, and Limit. For more information, see what [composes a query](/workers/observability/query-builder/#query-composition).
6. Optional: Select the appropriate time range.
Expand All @@ -52,31 +61,31 @@ The Query Builder is available to all developers and requires no enablement. Que

The Query Builder supports many visualization operators, including:

| Function | Arguments | Description |
| --- | --- | --- |
| **Count** | n/a | The total number of rows matching the query conditions |
| **Count Distinct** | any field | The number of occurrences of the unique values in the dataset |
| **Min** | numeric field | The smallest value for the field in the dataset |
| **Max** | numeric field | The largest value for the field in the dataset |
| **Sum** | numeric field | The total of all of the values for the field in the dataset |
| **Average** | numeric field | The average of the field in the dataset |
| **Standard Deviation** | numeric field | The standard deviation of the field in the dataset |
| **Variance** | numeric field | The variance of the field in the dataset |
| **P001** | numeric field | The value of the field below which 0.1% of the data falls |
| **P01** | numeric field | The value of the field below with 1% of the data falls |
| **P05** | numeric field | The value of the field below with 5% of the data falls |
| **P10** | numeric field | The value of the field below with 10% of the data falls |
| **P25** | numeric field | The value of the field below with 25% of the data falls |
| **Median (P50)** | numeric field | The value of the field below with 50% of the data falls |
| **P75** | numeric field | The value of the field below with 75% of the data falls |
| **P90** | numeric field | The value of the field below with 90% of the data falls |
| **P95** | numeric field | The value of the field below with 95% of the data falls |
| **P99** | numeric field | The value of the field below with 99% of the data falls |
| **P999** | numeric field | The value of the field below with 99.9% of the data falls |
| Function | Arguments | Description |
| ---------------------- | ------------- | ------------------------------------------------------------- |
| **Count** | n/a | The total number of rows matching the query conditions |
| **Count Distinct** | any field | The number of occurrences of the unique values in the dataset |
| **Min** | numeric field | The smallest value for the field in the dataset |
| **Max** | numeric field | The largest value for the field in the dataset |
| **Sum** | numeric field | The total of all of the values for the field in the dataset |
| **Average** | numeric field | The average of the field in the dataset |
| **Standard Deviation** | numeric field | The standard deviation of the field in the dataset |
| **Variance** | numeric field | The variance of the field in the dataset |
| **P001** | numeric field | The value of the field below which 0.1% of the data falls |
| **P01** | numeric field | The value of the field below with 1% of the data falls |
| **P05** | numeric field | The value of the field below with 5% of the data falls |
| **P10** | numeric field | The value of the field below with 10% of the data falls |
| **P25** | numeric field | The value of the field below with 25% of the data falls |
| **Median (P50)** | numeric field | The value of the field below with 50% of the data falls |
| **P75** | numeric field | The value of the field below with 75% of the data falls |
| **P90** | numeric field | The value of the field below with 90% of the data falls |
| **P95** | numeric field | The value of the field below with 95% of the data falls |
| **P99** | numeric field | The value of the field below with 99% of the data falls |
| **P999** | numeric field | The value of the field below with 99.9% of the data falls |

You can add multiple visualizations in a single query. Each visualization renders a graph. A single summary table is also returned, which shows the raw query results.

![Example of showing the Query Builder with multiple visualization](~/assets/images/workers-observability/query-builder-visualization.png)
![Example of showing the Query Builder with multiple visualization](~/assets/images/workers-observability/wobs_QB_visualization_122.png)

All methods are aggregate functions. Most methods operate on a specific field in the log event. `Count` is an exception, and is an aggregate function that returns the number of log events matching the filter conditions.

Expand All @@ -90,17 +99,17 @@ The operator is a logical condition that evaluates to true or false. See the tab
| Data Type | Valid Conditions (Operators) |
| --- | --- |
| Numeric | Equals, Does not equal, Greater, Greater or equals, Less, Less or equals, Exists, Does not exist |
| String | Equals, Does not equal, Includes, Does not include, Regex, Exists, Does not exist, Starts with |
| String | Equals, Does not equal, Includes, Does not include, Regex, Exists, Does not exist, Starts with |

The value for a numeric field is an integer. The value for a string field is any string.

To add a filter:

<Steps>
1. Select **+** in the **Filter** section.
2. Select **Select key...** and input a key name. For example, `$workers.cpuTimeMs`.
3. Select the operator and change it to the operator best suited. For example, `Greater than`.
4. Select **Select value...** and input a value. For example, `100`.
1. Select **+** in the **Filter** section. 2. Select **Select key...** and
input a key name. For example, `$workers.cpuTimeMs`. 3. Select the operator
and change it to the operator best suited. For example, `Greater than`. 4.
Select **Select value...** and input a value. For example, `100`.
</Steps>

When you run the query with the filter specified above, only log events where `$workers.cpuTimeMs > 100` will be returned.
Expand Down Expand Up @@ -135,19 +144,19 @@ There are three views for queries: Visualizations, Invocations, and Events.

The **Visualizations** tab shows graphs and a summary table for the query.

![Visualization Overview](~/assets/images/workers-observability/query-builder-visualization.png)
![Visualization Overview](~/assets/images/workers-observability/wobs_visualizations_tab_122.png)

### Invocations tab

The **Invocations** tab shows all logs, grouped by by the invocation, and ordered by timestamp. Only invocations matching the query criteria are returned.

![Invocations Overview](~/assets/images/workers-observability/query-builder-invocations-overview.png)
![Invocations Overview](~/assets/images/workers-observability/wobs_invocation_logs_full_list_122.png)

### Events tab

The **Events** tab shows all logs, ordered by timestamp. Only events matching the query criteria are returned. The Events tab can be customized to add additional fields in the view.

![Overview](~/assets/images/workers-observability/query-builder-events-overview.png)
![Overview](~/assets/images/workers-observability/wobs_events_dropdown_122.png)

## Save queries

Expand Down Expand Up @@ -180,16 +189,16 @@ the raw event count. We can add a filter for `$workers.event.response.status` th
Then, we group by `$workers.event.request.path` and `$workers.event.response.status` to identify the number of requests that were
affected by this behavior.

![Constructing a query](~/assets/images/workers-observability/query-builder-ex1-query.png)
![Constructing a query](~/assets/images/workers-observability/wobs_QB_visualization_122.png)

The results show that the `/actuator/env` path has been experiencing 500s. Now, we can apply a filter for this path and investigate.
The results show that the `/agents/chat/default` path has been experiencing 404s and 500s. Now, we can apply a filter for this path and investigate.

![Adding an additional field to the query](~/assets/images/workers-observability/query-builder-ex1-query-with-filter.png)
![Adding an additional field to the query](~/assets/images/workers-observability/wobs_QB_visualization_filter_122.png)

Now, we can investigate by selecting the **Invocations** tab. We can see that there were two logged invocations of this error.

![Examining the Invocations tab in the Query Builder](~/assets/images/workers-observability/query-builder-ex1-invocations.png)
![Examining the Invocations tab in the Query Builder](~/assets/images/workers-observability/wobs_invocation_logs_full_list_122.png)

We can expand a single invocation to view the relevant logs, and continue to debug.

![Viewing the logs for a single Invocation](~/assets/images/workers-observability/query-builder-ex1-invocation-logs.png)
![Viewing the logs for a single Invocation](~/assets/images/workers-observability/wobs_invocation_logs_122.png)
2 changes: 1 addition & 1 deletion src/content/docs/workers/observability/traces/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
- How long do subrequests from my Worker take?
- How long are my calls to my KV Namespace or R2 bucket taking?

![Example trace showing a POST request to a cake shop with multiple spans including fetch requests and durable object operations](~/assets/images/workers-observability/trace-waterfall-example.png)
![Example trace showing a POST request to a cake shop with multiple spans including fetch requests and durable object operations](~/assets/images/workers-observability/wobs_waterfall_trace_122.png)

### Automatic instrumentation

Expand Down Expand Up @@ -105,7 +105,7 @@

Workers tracing is currently **free** during the initial beta period. This includes all tracing functionality such as collecting traces, storing them, and viewing them in the Cloudflare dashboard.

Starting on March 1, 2026, tracing will be billed as part of your usage on the Workers Free Paid and Enterprise plans. Each span in a trace represents one observability event, sharing the same monthly quota and pricing as [Workers logs](/workers/platform/pricing/#workers-logs):

Check warning on line 108 in src/content/docs/workers/observability/traces/index.mdx

View workflow job for this annotation

GitHub Actions / Semgrep

semgrep.style-guide-potential-date-year

Potential year found. Documentation should strive to represent universal truth, not something time-bound. (add [skip style guide checks] to commit message to skip)

Check warning on line 108 in src/content/docs/workers/observability/traces/index.mdx

View workflow job for this annotation

GitHub Actions / Semgrep

semgrep.style-guide-potential-date-month

Potential month found. Documentation should strive to represent universal truth, not something time-bound. (add [skip style guide checks] to commit message to skip)

| | Events (trace spans or log events) | Retention |
| ---------------- | ------------------------------------------------------------------ | --------- |
Expand Down
Loading