You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Create Cloudflare-native custom spans around hosted Worker MCP activity.
Preserve the existing 10-character HMAC user pseudonym and add it to the activity span.
Read only the validated three-letter request.cf.colo; omit it for local/non-Cloudflare traffic.
Add privacy regression tests, TraceQL guidance, and privacy/data-dictionary documentation.
Reviewer walkthrough
Derive the existing deterministic user pseudonym with Web Crypto and extract only Cloudflare's colo metadata.
Enrich Worker MCP activity spans with user.hash and optional cloudflare.colo, keeping trace enrichment best effort.
Cover Cloudflare and non-Cloudflare paths, ensure raw IPs/keys are never exported, and document the regional-proxy limitation/query.
Run the Worker, unit, type, boundary, build, package, and performance validation lanes.
Correctness and invariants
Hosted Worker activity spans are enriched on a best-effort basis; tracing failures never affect MCP request handling.
user.hash remains the existing 10-character lowercase HMAC pseudonym derived from the API key; raw API keys, client IPs, and workout data are not exported.
cloudflare.colo is emitted only for a validated three-letter request.cf.colo; local and non-Cloudflare requests omit it.
Documentation treats the colo as a regional edge proxy rather than exact user geography and provides scoped TraceQL guidance.
Testing and QA
npm run check
npm run check:types
npm run check:boundaries
npm run test:unit
npm run test:worker
npm run test:worker-http
npm run test:pr
npm run test:performance
npm run worker:dry-run
npm run check:changeset
Summary by Sourcery
Correlate hosted Worker MCP activity spans with a pseudonymous user identifier and Cloudflare edge colo while preserving privacy guarantees.
New Features:
Attach a deterministic HMAC-based pseudonymous user hash and optional Cloudflare colo to hosted Worker MCP activity spans via Cloudflare tracing.
Enhancements:
Introduce worker telemetry helpers to derive the existing user hash and extract a validated Cloudflare colo from request metadata.
Wire the Worker handler and observer to pass telemetry context into span creation without affecting MCP behavior on failures.
Build:
Relax dependency-cruiser configuration to allow the workerd runtime module cloudflare:workers while still flagging unresolved package imports.
Documentation:
Update telemetry dashboard, privacy policy, and data dictionary documentation with guidance on user-hash and Cloudflare colo usage and privacy constraints.
Tests:
Add unit tests covering user-hash derivation, Cloudflare colo extraction, and span attribute behavior for Cloudflare and non-Cloudflare requests.
✨ PR Description
Purpose: Correlate Worker MCP activity spans with user pseudonyms and Cloudflare edge colos for regional telemetry analysis while maintaining privacy safeguards.
Main changes:
Implemented createWorkerUserHash and getCloudflareColo utilities to derive HMAC user pseudonyms and extract validated Cloudflare colo metadata from requests
Enhanced createWorkerToolObserver with tracing span creation via Cloudflare's startActiveSpan API, setting user/colo attributes with error isolation
Updated WorkerToolObserverOptions interface to accept injectable userHash, cloudflareColo, and tracing parameters for dependency injection and testing
Generated by LinearB AI and added by gitStream. AI-generated content may contain inaccuracies. Please verify before using.
💡 Tip: You can customize your AI Description using GuidelinesLearn how
Summary by CodeRabbit
New Features
Added privacy-safe telemetry to hosted Worker activity, including pseudonymous user identifiers and Cloudflare edge location data.
Added tracing for worker operations with completion outcomes, while preserving normal behavior if tracing is unavailable.
Documentation
Updated privacy, telemetry dictionary, and dashboard guidance to clarify data usage, regional reporting, and restrictions on raw IP addresses and exact location data.
Bug Fixes
Improved handling of missing or invalid telemetry metadata without affecting request processing.
Adds Cloudflare Workers tracing integration to hosted Worker MCP activity spans, deriving a deterministic pseudonymous user hash and optional Cloudflare colo from requests, wiring them into span attributes in a privacy-safe, best-effort way, and documenting the new telemetry semantics and constraints.
Sequence diagram for Cloudflare tracing with user hash and colo on Worker MCP spans
sequenceDiagram
actor Client
participant CloudflareWorker as CloudflareWorker
participant WorkerTelemetry as WorkerTelemetry
participant WorkerObserver as WorkerObserver
participant CloudflareTracing as CloudflareTracing
Client->>CloudflareWorker: HTTP MCP request
CloudflareWorker->>WorkerTelemetry: createWorkerUserHash(apiKey)
WorkerTelemetry-->>CloudflareWorker: userHash
CloudflareWorker->>WorkerTelemetry: getCloudflareColo(request)
WorkerTelemetry-->>CloudflareWorker: cloudflareColo?
CloudflareWorker->>WorkerObserver: createWorkerToolObserver({ userHash, cloudflareColo, tracing })
CloudflareWorker->>WorkerObserver: start(invocation)
WorkerObserver->>CloudflareTracing: startActiveSpan(spanName, callback)
CloudflareTracing->>WorkerObserver: span
WorkerObserver->>CloudflareTracing: span.setAttribute(mcp.span.category, kind)
WorkerObserver->>CloudflareTracing: span.setAttribute(user.hash, userHash)
WorkerObserver->>CloudflareTracing: span.setAttribute(cloudflare.colo, cloudflareColo)
CloudflareWorker->>WorkerObserver: scope.run(operation)
WorkerObserver->>CloudflareTracing: span.end() when finish(outcome)
Loading
File-Level Changes
Change
Details
Files
Enrich Worker MCP activity spans with Cloudflare tracing, pseudonymous user hashes, and optional colo metadata in a best-effort, privacy-safe manner.
Introduce WorkerTraceSpan/WorkerTracing interfaces and integrate Cloudflare tracing API into createWorkerToolObserver with safe span lifecycle handling.
Validate and forward userHash and cloudflareColo options into span attributes, guarding with strict regex patterns and ensuring tracing failures never affect MCP behavior.
Add tests to verify span creation, attribute setting for user hash and colo, and omission of colo for non-Cloudflare requests.
Derive telemetry-safe user hash and Cloudflare colo from incoming Worker requests and plumb them into observer construction.
Add worker-telemetry utilities to compute a deterministic HMAC-based user hash with Web Crypto and extract a validated three-letter Cloudflare colo from request.cf.colo, ignoring invalid or missing metadata.
Wire createWorkerUserHash and getCloudflareColo into serveMcpRequest so each request constructs a Worker observer with userHash and cloudflareColo options.
Extend Worker dependency contracts to allow createObserver to receive WorkerToolObserverOptions and update tests to assert the propagated options.
Document and enforce telemetry and privacy guarantees around the new spans and Cloudflare integration.
Update telemetry dashboards, privacy policy, and telemetry data dictionary docs to describe user.hash and cloudflare.colo semantics, guidance for TraceQL queries, and explicit privacy constraints (no raw IPs, no identity reconstruction).
Tighten dependency-cruiser configuration to allow unresolved cloudflare:workers imports as runtime-provided, and add TypeScript declarations/shims for Cloudflare tracing in test and worker code.
Add a changeset entry describing the new Worker patch release behavior.
Propagate Cloudflare colo and the existing pseudonymous user hash onto the same hosted Worker MCP activity spans, only when Cloudflare metadata is present, without affecting MCP behavior.
Add tests ensuring Cloudflare-enriched requests include the colo and user hash on activity spans, non-Cloudflare requests omit the colo, and no raw IP addresses or sensitive data are persisted.
Document that the Cloudflare colo is a regional edge location (not user geography), and provide TraceQL guidance to count distinct users by colo.
✅
Possibly linked issues
#[telemetry] Propagate Cloudflare colo onto user-associated spans: PR implements Cloudflare colo and user hash propagation onto MCP activity spans, with tests and TraceQL docs, matching issue.
Tips and commands
Interacting with Sourcery
Trigger a new review: Comment @sourcery-ai review on the pull request.
Continue discussions: Reply directly to Sourcery's review comments.
Generate a GitHub issue from a review comment: Ask Sourcery to create an
issue from a review comment by replying to it. You can also reply to a
review comment with @sourcery-ai issue to create an issue from it.
Generate a pull request title: Write @sourcery-ai anywhere in the pull
request title to generate a title at any time. You can also comment @sourcery-ai title on the pull request to (re-)generate the title at any time.
Generate a pull request summary: Write @sourcery-ai summary anywhere in
the pull request body to generate a PR summary at any time exactly where you
want it. You can also comment @sourcery-ai summary on the pull request to
(re-)generate the summary at any time.
Generate reviewer's guide: Comment @sourcery-ai guide on the pull
request to (re-)generate the reviewer's guide at any time.
Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
pull request to resolve all Sourcery comments. Useful if you've already
addressed all the comments and don't want to see them anymore.
Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
request to dismiss all existing Sourcery reviews. Especially useful if you
want to start fresh with a new review - don't forget to comment @sourcery-ai review to trigger a new review!
• Add Cloudflare-native activity spans enriched with user hash and optional colo.
• Derive deterministic 10-char HMAC pseudonym and validate request.cf.colo when present.
• Add privacy regression tests plus TraceQL and privacy/data-dictionary documentation.
The following are alternative approaches to this PR:
1. Use OpenTelemetry JS API / baggage instead of Cloudflare tracing
➕ Vendor-neutral attributes and better portability across runtimes
➕ Potentially richer semantic conventions and tooling support
➖ Not always available/supported in Workers runtime without additional wiring
➖ More complexity and higher risk of affecting request execution if misconfigured
2. Emit only privacy-safe structured events (no spans)
➕ Simpler runtime behavior; no dependency on Cloudflare tracing API
➕ Avoids any span-enrichment failure modes entirely
➖ Harder to correlate in distributed traces; weaker integration with tracing UI/TraceQL workflows
➖ Less discoverable for operations teams relying on spans
Recommendation: The chosen approach (Cloudflare-native spans with best-effort enrichment + strict validation) fits the Worker runtime constraints and keeps telemetry failure-isolated. The added input validation ([0-9a-f]{10} for user.hash, [A-Z]{3} for cloudflare.colo) plus explicit privacy tests/doc updates make this a reasonable and low-risk way to enable regional correlation.
Files changed (14) +388 / -10
Enhancement (3) +171 / -5
worker-observer.tsCreate Cloudflare-native activity spans with safe attributes+98/-1
Create Cloudflare-native activity spans with safe attributes
• Integrates Cloudflare 'tracing.startActiveSpan' into the Worker tool observer to wrap MCP tool/prompt execution in an activity span. Adds strict validation for 'userHash' and 'cloudflareColo', best-effort attribute setting, and guaranteed span finishing without impacting MCP behavior on tracing failures.
worker-telemetry.tsAdd Worker telemetry helpers for user hash and Cloudflare colo+58/-0
Add Worker telemetry helpers for user hash and Cloudflare colo
• Implements WebCrypto-based HMAC derivation of the existing short pseudonymous user hash and safe extraction of the Cloudflare colo from request metadata. Both enrichments are explicitly best-effort and return 'undefined' on invalid/missing inputs or runtime errors.
worker.tsWire per-request telemetry context into observer creation+15/-4
Wire per-request telemetry context into observer creation
• Changes the Worker dependency injection shape so 'createObserver' receives per-request options. Computes 'userHash' from the validated API key and optionally includes 'cloudflareColo' from request metadata when constructing the tool observer.
worker-observer.test.tsTest span attributes for user hash and optional colo+66/-1
Test span attributes for user hash and optional colo
• Introduces unit tests that inject a tracing double to verify span creation and attribute setting. Adds coverage to ensure colo is omitted for non-Cloudflare requests and that secrets like raw API keys are not leaked via attributes.
worker-telemetry.test.tsAdd privacy regression tests for hash derivation and colo parsing+42/-0
Add privacy regression tests for hash derivation and colo parsing
• Verifies deterministic 10-character HMAC pseudonym generation matches existing expectations and is not derived for empty credentials. Ensures only valid 'request.cf.colo' values are returned and sensitive metadata like client IP is not surfaced.
worker.test.tsAssert handler passes user hash and colo into observer creation+30/-0
Assert handler passes user hash and colo into observer creation
• Extends Worker integration tests to confirm the handler computes 'userHash' and reads 'request.cf.colo', then passes both into the observer factory per request.
cloudflare-workers.d.tsExtend test Cloudflare module typings with tracing API+12/-0
Extend test Cloudflare module typings with tracing API
• Updates the test-only 'cloudflare:workers' declaration to include 'tracing.startActiveSpan' and span attribute methods so Worker tests typecheck consistently.
cloudflare-workers.tsAdd tracing shim for non-workerd test environments+12/-0
Add tracing shim for non-workerd test environments
• Implements a no-op 'tracing.startActiveSpan' shim that returns a span with 'setAttribute' and 'end', allowing unit/integration tests to run outside the Cloudflare runtime without conditional logic in production code.
privacy-policy.mdDocument pseudonymous user hash + colo in hosted telemetry+6/-2
Document pseudonymous user hash + colo in hosted telemetry
• Expands the privacy policy to describe the HMAC-based pseudonym and Cloudflare colo usage in hosted MCP activity spans. Explicitly reiterates that raw IP addresses and API keys are not collected in operational telemetry.
telemetry-dashboards.mdAdd TraceQL guidance for per-user/per-colo analysis+18/-0
Add TraceQL guidance for per-user/per-colo analysis
• Adds a hosted Worker regional activity section describing 'span.user.hash' and 'span.cloudflare.colo' semantics and limitations. Provides a scoped TraceQL metrics query and guidance to avoid storing per-user behavioral history.
telemetry-data-dictionary.mdAdd 'user.hash' and 'cloudflare.colo' to telemetry dictionary+7/-1
Add 'user.hash' and 'cloudflare.colo' to telemetry dictionary
• Documents the new span attributes, their validation constraints, and privacy intent. Extends the "never send" list to include raw client IP addresses and exact location data.
bright-colos-trace.mdAdd patch changeset for Worker span enrichment+5/-0
Add patch changeset for Worker span enrichment
• Introduces a changeset documenting the patch release for propagating 'user.hash' and 'cloudflare.colo' onto hosted Worker activity spans, including privacy-safe tests and dashboard guidance.
cloudflare-workers.d.tsDeclare Cloudflare tracing types for Worker runtime+13/-0
Declare Cloudflare tracing types for Worker runtime
• Adds TypeScript declarations for 'cloudflare:workers' tracing ('tracing.startActiveSpan' and span attribute APIs) so Worker code can compile with typed access to the runtime module.
We reviewed changes in ac18809...5807ade on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
♻️ This comment has been updated with latest results.
charliecreatesBot
changed the title
feat(worker): correlate activity spans with Cloudflare colos
feat(worker): correlate activity spans with Cloudflare colos #981
Aug 10, 2026
❌ Patch coverage is 90.38462% with 5 lines in your changes missing coverage. Please review.
✅ Project coverage is 73.84%. Comparing base (ac18809) to head (5807ade).
✅ All tests successful. No failed tests found.
The reason will be displayed to describe this comment to others. Learn more.
void is only valid as a return type or generic type argument
Disallows usage of void type outside of return types or generic type arguments. If void is used as return type, it shouldn’t be a part of intersection/union type with most other types.
@chrisdoc, you've reached your PR review limit, so we couldn't start this review.
Next review available in:12 minutes
You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.
How can I continue?
After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.
To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.
How do review limits work?
CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.
For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.
Reviewing files that changed from the base of the PR and between 3ed66c2 and 5807ade.
📒 Files selected for processing (5)
docs/privacy-policy.md
docs/telemetry-dashboards.md
docs/telemetry-data-dictionary.md
packages/worker/src/worker-observer.test.ts
packages/worker/src/worker-observer.ts
📝 Walkthrough
Walkthrough
Hosted Worker requests now derive pseudonymous user hashes and Cloudflare colo values, pass them to MCP observers, and record them on activity spans. Tests, Cloudflare type shims, privacy documentation, dashboard guidance, and release metadata support the change.
Changes
Hosted Worker telemetry
Layer / File(s)
Summary
Telemetry derivation and validation packages/worker/src/worker-telemetry.ts, packages/worker/src/worker-telemetry.test.ts
Adds deterministic HMAC user hashes and validated Cloudflare colo extraction. Tests cover valid, missing, invalid, and failure cases.
Passes the derived user hash and Cloudflare colo into the observer before MCP server construction.
Telemetry documentation and release support docs/privacy-policy.md, docs/telemetry-data-dictionary.md, docs/telemetry-dashboards.md, .dependency-cruiser.cjs, .changeset/bright-colos-trace.md
Documents pseudonymous hashes, edge colos, TraceQL analysis, and exclusions for raw IP and exact location data. Adds dependency validation and a worker patch Changeset.
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/privacy-policy.md`:
- Around line 20-23: Update the privacy-policy section describing hosted MCP
activity spans to state that traces containing sanitized client metadata,
including span.user.hash and span.cloudflare.colo, are retained for 30 days and
accessible only to repository maintainers and the on-call operator, matching the
rule in telemetry-dashboards.md.
In `@docs/telemetry-dashboards.md`:
- Around line 33-38: Update the TraceQL filter in the documented scoped metrics
query to use nil-presence checks for both span.cloudflare.colo and
span.user.hash instead of empty-string comparisons, while preserving the
existing count_over_time grouping by colo and user hash.
In `@docs/telemetry-data-dictionary.md`:
- Around line 65-68: Clarify the metrics prohibition in the telemetry data
dictionary text around the API-key-derived identity statement so it explicitly
applies to emitted metric attributes or dimensions, not TraceQL metrics derived
from trace data. Preserve the existing allowance for span.user.hash in
hosted-worker traces and keep the wording consistent with the dashboard
guidance.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
Push a commit to this branch (recommended)
Create a new PR with the fixes
ℹ️ Review info⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 3acb9b25-f587-4450-988b-a4d4b1b0e141
📥 Commits
Reviewing files that changed from the base of the PR and between ac18809 and fc7843a.
1. Hard tracing named import✓ Resolved🐞 Bug☼ Reliability
Description
worker-observer.ts uses a named ESM import for { tracing } from cloudflare:workers, making the
tracing export mandatory at module-link time. If cloudflare:workers exists but does not export
tracing in some environments, the Worker will fail to initialize before any best-effort fallback
logic can run.
The code explicitly treats tracing as best-effort (swallowing errors when setting attributes and
ending spans), and even supports injecting a tracing implementation via options. However, the new
named import makes tracing a required export before any runtime checks can run.
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution
## Issue description
`packages/worker/src/worker-observer.ts` imports `tracing` as a named export from `cloudflare:workers`. Named ESM imports are validated during module linking; if the module doesn’t export `tracing`, the Worker can fail to load, which contradicts the intent that tracing enrichment should be best-effort.
### Issue Context
The rest of the observer is carefully written to ensure trace enrichment failures never impact MCP behavior (try/catch around attribute setting and span ending, and injectable tracing for tests). The top-level named import is the one remaining “hard” dependency.
### Fix Focus Areas
- packages/worker/src/worker-observer.ts[1-2]
- packages/worker/src/worker-observer.ts[520-572]
### Suggested change
- Replace `import { tracing } from "cloudflare:workers";` with a namespace import, e.g.:
- `import * as cloudflareWorkers from "cloudflare:workers";`
- Resolve tracing as optional:
- `const workerTracing = options.tracing ?? cloudflareWorkers.tracing;`
- In `run()`, guard that `workerTracing?.startActiveSpan` exists; otherwise just `return operation()`.
This preserves the current behavior when tracing is available, while ensuring the Worker can still start when tracing isn’t provided by the runtime module.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Tip of the day
💡 Did you know, you can reply 'qodo' on any finding to push back, ask questions, or dig deeper
Enriches hosted Worker MCP activity spans with pseudonymous user identifiers and validated Cloudflare edge colos, recording outcomes under mcp.tool.outcome while preserving privacy guarantees. No issues found.
Auto-approved: No blocking issues found.
Please see Auto-approve Docs for details on setting custom approval criteria.
✅ 1 resolved✅ Quality: Prompt spans record outcome under mcp.tool.outcome key
📄 packages/worker/src/worker-observer.ts:508-509📄 packages/worker/src/worker-observer.ts:554-556
In setSpanAttributes the span name attribute correctly branches on kind (mcp.prompt.name vs mcp.tool.name), but finishSpan always writes the outcome to the hardcoded mcp.tool.outcome key even when safe.kind === "prompt". This makes prompt-kind activity spans carry a tool-namespaced attribute, which is inconsistent with the name convention and can complicate TraceQL filtering by operation kind. Consider branching the outcome key the same way, e.g. span.setAttribute(outcomeKind === "prompt" ? "mcp.prompt.outcome" : "mcp.tool.outcome", outcome).
Options
Auto-apply is off → Gitar will not commit updates to this branch. Display: compact → Showing less information.
Comment with these commands to change the behavior for this request:
Auto-apply
Compact
gitar auto-apply:on
gitar display:verbose
Was this helpful? React with 👍 / 👎 | Powered by Gitar — free for open source
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Primary changes
request.cf.colo; omit it for local/non-Cloudflare traffic.Reviewer walkthrough
user.hashand optionalcloudflare.colo, keeping trace enrichment best effort.Correctness and invariants
user.hashremains the existing 10-character lowercase HMAC pseudonym derived from the API key; raw API keys, client IPs, and workout data are not exported.cloudflare.colois emitted only for a validated three-letterrequest.cf.colo; local and non-Cloudflare requests omit it.Testing and QA
npm run checknpm run check:typesnpm run check:boundariesnpm run test:unitnpm run test:workernpm run test:worker-httpnpm run test:prnpm run test:performancenpm run worker:dry-runnpm run check:changesetSummary by Sourcery
Correlate hosted Worker MCP activity spans with a pseudonymous user identifier and Cloudflare edge colo while preserving privacy guarantees.
New Features:
Enhancements:
Build:
cloudflare:workerswhile still flagging unresolved package imports.Documentation:
Tests:
✨ PR Description
Purpose: Correlate Worker MCP activity spans with user pseudonyms and Cloudflare edge colos for regional telemetry analysis while maintaining privacy safeguards.
Main changes:
createWorkerUserHashandgetCloudflareColoutilities to derive HMAC user pseudonyms and extract validated Cloudflare colo metadata from requestscreateWorkerToolObserverwith tracing span creation via Cloudflare'sstartActiveSpanAPI, setting user/colo attributes with error isolationWorkerToolObserverOptionsinterface to accept injectableuserHash,cloudflareColo, andtracingparameters for dependency injection and testingGenerated by LinearB AI and added by gitStream.
AI-generated content may contain inaccuracies. Please verify before using.
💡 Tip: You can customize your AI Description using Guidelines Learn how
Summary by CodeRabbit
Resolves #981