Skip to content
saltwaterbrc
Go back

Three Ways to See What Your Workers Are Doing: Log Explorer, Workers Observability, and Local Explorer

The Problem Nobody Talks About

You deploy a Worker. It works. Then one day it doesn’t — or worse, it works but something is off. A tool call takes 8 seconds instead of 200ms. A WebSocket connection drops. An AI response comes back empty. Rate limiting fires on a legitimate user.

Without logs, you’re guessing. With the wrong logs tool, you’re drowning in data that doesn’t answer your question.

Cloudflare now has three separate tools for understanding what your Workers are doing, and they serve very different purposes. I enabled all of them on saltwaterbrc.com — here’s what each one does and when to reach for it.

Tool 1: Workers Observability — Your Daily Dashboard

What it is: A built-in observability dashboard for all your Workers and Pages Functions. Lives in the Cloudflare dashboard under Workers & Pages → Observability.

Who it’s for: Developers running Workers in production who need to monitor performance, debug errors, and understand traffic patterns.

How I enabled it: Two lines in wrangler.jsonc:

"observability": {
  "enabled": true,
  "head_sampling_rate": 1
}

That head_sampling_rate: 1 means 100% of requests get logged. For high-traffic Workers you might dial this down, but for my AI agent handling a few hundred requests a day, full sampling is fine.

What You Get

Workers Observability has two main views:

Overview shows logs from all your Workers in one place. You can toggle between Invocations (grouped by the fetch/WebSocket trigger that started the Worker) and Events (every log line in chronological order). This is where I go first when something looks wrong — I can see every request across my Agent V3, API demo, and counter Workers without switching between them.

Investigate is the Query Builder. This is the powerful part. You can write structured queries to slice your logs:

The query language supports comparison operators (=, !=, >, <), functions (contains(), startsWith(), regex(), exists()), and boolean logic (AND, OR, NOT). Queries sync with the visual Query Builder sidebar, so you can write raw queries or click through filters — they stay in sync.

What It Actually Looks Like

Over the last 7 days, my Agent V3 Worker logged 908 successful events and 4 exceptions. The events view shows the full lifecycle of each interaction — WebSocket connections opening and closing, chat responses completing, tool calls firing. Crawlers hitting /sitemap.xml and /robots.txt. Even scanners probing for /xmlrpc.php and /wp-login.php on a Worker that obviously isn’t WordPress.

The 4 exceptions? All websocket:close events with code 1006 — abnormal closure. Someone’s browser tab closed mid-conversation, or their connection dropped without a clean WebSocket handshake. I found this in seconds by typing $workers.outcome = "exception" in the query bar. Each error expands into a structured JSON payload showing the exact Durable Object instance, script version, wall time, CPU time, and the WebSocket close code. Without observability, these would have been invisible — the agent would just stop responding from the user’s perspective, and I’d have no idea why.

Dashboard URL: dash.cloudflare.com → Account → Workers & Pages → Observability

Tool 2: Log Explorer — Why You’re Buying This

Workers Observability tells you what your code is doing. Log Explorer tells you what’s happening to your traffic — the full Cloudflare request lifecycle including firewall blocks, WAF events, bot detection, cache behavior, and DDoS mitigation.

Within 12 hours of enabling Log Explorer on saltwaterbrc.com, I found this in the Firewall events dataset:

| IP             | Country | Path                            | Action |
|----------------|---------|--------------------------------|--------|
| 2.57.122.173   | RO      | /docker/.env                   | block  |
| 2.57.122.173   | RO      | /secrets/.env                  | block  |
| 2.57.122.173   | RO      | /.github/workflows/secrets.env | block  |
| 2.57.122.173   | RO      | /kubernetes/secrets.env        | block  |
| 85.11.167.155  |         | /.git/config                   | block  |
| 85.11.167.155  |         | /wp-config.php                 | block  |
| 107.175.136.30 | US      | /.env                          | block  |

Automated credential scanners probing for exposed environment files, Docker secrets, Kubernetes configs, WordPress files, and git repos. All blocked by the WAF. I didn’t know this was happening until I looked.

That’s the pitch: you can’t respond to what you can’t see.

What You’re Replacing

Most enterprises already have this visibility — they’re paying for it. They’re forwarding Cloudflare logs through Logpush to Datadog, Splunk, or Sumo Logic, then paying those vendors to store and search data that originated on Cloudflare’s network. The pipeline looks like:

Cloudflare edge → Logpush job → S3/GCS/Azure → SIEM ingestion → SIEM query

Every hop adds cost, latency, and failure points. Schema mappings break. Ingestion pipelines lag. And you’re paying per-GB ingestion fees on top of storage fees on top of query fees. For a mid-size enterprise, that’s $50k-$500k/year just to search your own Cloudflare logs.

Log Explorer collapses that entire pipeline:

Cloudflare edge → R2 (same network) → SQL query

No forwarding pipeline. No ingestion lag. No schema mapping. The logs stay on Cloudflare’s network with all the native context — Ray IDs, security verdicts, bot scores, cache status — intact and queryable. Billing is $0.10/GB/month for storage, and queries are free. No per-scan fees, no surprise bills for running too many searches during an incident.

What You Can Actually Do

Log Search — filter and explore historical logs in the dashboard or via Custom SQL. Query across HTTP requests, firewall events, DNS logs, and more. Save queries for repeated use and share them across your team.

Custom Dashboards — build persistent visual monitors. Track 5XX errors by country, firewall blocks by rule, bot traffic trends, API latency distributions. Enterprise accounts get up to 100 dashboards, with templates to get started fast.

SQL API — run queries programmatically from scripts, CI/CD pipelines, or your own monitoring tools. Standard SQL, no vendor-locked query language.

Security Analytics integration — pivot directly from Security Analytics into Log Explorer with filters preserved. See a suspicious pattern in analytics, click through to the raw logs.

Key Details

Dashboard URL: dash.cloudflare.com → Account → Log Explorer Availability: Paid add-on for any Application Services or Zero Trust purchase. $0.10/GB/month. No free tier.

Tool 3: Local Explorer — Debug Your Bindings in the Browser

What it is: A browser-based interface for viewing and editing the data in your local bindings during development. Available at /cdn-cgi/explorer on your local dev server.

Who it’s for: Anyone running wrangler dev who wants to inspect KV, D1, R2, or Durable Objects state without writing throwaway code or running CLI commands.

How I use it: This one showed up with the new cf CLI announced during Agents Week 2026. When I’m developing Agent V3 locally, I start wrangler dev and press e in the terminal — Local Explorer opens in my browser.

What You Can Do

Instead of running wrangler kv:key get or writing a one-off script to check what’s in your D1 database, you just look at it:

For my Agent V3, this means I can check what the guestbook table looks like in D1, verify that memory keys in KV have the right TTLs, and confirm that generated images actually landed in R2 — all without leaving the browser.

When It Matters

Local Explorer solves the “did my code actually write what I think it wrote?” problem. Before this existed, debugging a Durable Object meant adding console.log statements, restarting wrangler dev, making a request, reading the terminal output, and repeating. Now I just look.

Requirements: Wrangler 4.82.1+ or Cloudflare Vite plugin 1.32.0+ URL: localhost:{port}/cdn-cgi/explorer during wrangler dev

Which Tool When?

ScenarioToolWhy
”My Worker is throwing errors in production”Workers ObservabilityFilter by $workers.outcome = "exception", see stack traces, wall times
”Someone is attacking my site”Log ExplorerHistorical security events, firewall blocks, bot scores, DDoS patterns
”Did my D1 write actually work?”Local ExplorerInspect the local database during development
”What’s my p95 latency?”Workers ObservabilityQuery Builder with wall time grouping
”We need 90 days of HTTP logs for compliance”Log ExplorerLong-term storage on R2, SQL queryable
”I need to seed test data in KV”Local ExplorerAdd keys directly in the browser
”Which Cloudflare rules blocked this request?”Log ExplorerFull request lifecycle including WAF, bot, cache

Enabling Everything on saltwaterbrc.com

Here’s what’s live on my site right now:

Workers Observability — enabled on both my Agent V3 Worker and the API demo Worker. Full 100% sampling. Every console.log, console.warn, and console.error in my Worker code shows up in the dashboard. The structured logging I added during the security audit (session IDs, truncated IPs, event types) makes the logs actually useful to filter on.

// wrangler.jsonc — this is all it takes
"observability": {
  "enabled": true,
  "head_sampling_rate": 1
}

Local Explorer — available automatically when I run wrangler dev. No configuration needed. I use it when testing new tools for Agent V3 — write a guestbook entry via the chat, then check D1 in Local Explorer to confirm the row exists.

Log Explorer — enabled with HTTP requests, Firewall events, and DNS logs datasets, all with 90-day retention. One gotcha: Log Explorer only collects forward. When you enable a dataset, ingestion starts from that moment — no backfill. I enabled my datasets on April 17, ran my first query on April 20, and got zero results because the pipeline was still spinning up. By April 21, data was flowing — 213 HTTP requests and 23 firewall blocks in a 12-hour window, including the credential scanning attack I covered above.

The Bigger Picture

A year ago, debugging a Worker meant wrangler tail and console.log. That’s it. Now you have a production observability dashboard with a query language, an enterprise forensics tool with SQL access, and a local debugging UI that shows you your actual data.

If you’re building on Workers and haven’t enabled observability yet, start there. Two lines in your wrangler config. Once you’ve seen what your Workers are actually doing, you won’t go back to guessing.


Next up: I’m working on increasing saltwaterbrc.com’s Agent Readiness Score — Cloudflare’s new metric for how well your site supports AI agents. Currently at 38/100. More on that soon.


Share this post on:

Next Post
Agents Week 2026: What We Added to SaltWaterBRC