@danieljvdm/dev-kit 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/package.json +1 -1
- package/skill-sources.jsonc +6 -29
- package/skill-sources.lock.json +23 -109
- package/skills/animate/LICENSE +21 -0
- package/skills/animate/NOTICE +10 -0
- package/skills/animate/SKILL.md +34 -0
- package/skills/animate/references/gestures.md +27 -0
- package/skills/animate/references/glossary.md +136 -0
- package/skills/animate/references/implementation.md +22 -0
- package/skills/animate/references/opportunities.md +18 -0
- package/skills/animate/references/principles.md +48 -0
- package/skills/animate/references/review.md +19 -0
- package/skills/cloudflare-workers/LICENSE +202 -0
- package/skills/cloudflare-workers/NOTICE +9 -0
- package/skills/cloudflare-workers/SKILL.md +26 -0
- package/skills/cloudflare-workers/references/durable-objects.md +68 -0
- package/skills/cloudflare-workers/references/sandbox.md +48 -0
- package/skills/cloudflare-workers/references/workers.md +63 -0
- package/skills/cloudflare-workers/references/wrangler.md +56 -0
- package/skills/design-ui/LICENSE +21 -0
- package/skills/design-ui/NOTICE +8 -0
- package/skills/design-ui/SKILL.md +29 -0
- package/skills/design-ui/references/appearance.md +22 -0
- package/skills/design-ui/references/components.md +33 -0
- package/skills/design-ui/references/exploration.md +50 -0
- package/skills/design-ui/references/libraries.md +39 -0
- package/skills/design-ui/references/themes.md +23 -0
- package/skills/dev-kit/SKILL.md +19 -38
- package/skills/dev-kit/references/cloudflare-worker-api.md +1 -1
- package/skills/dev-kit/references/skills.md +2 -2
- package/skills/effect-development/SKILL.md +27 -0
- package/skills/effect-development/agents/openai.yaml +4 -0
- package/skills/effect-development/references/api/index.md +32 -0
- package/skills/effect-development/references/api/schema-codecs.md +15 -0
- package/skills/{build-effect-apis/references → effect-development/references/api}/verification.md +10 -5
- package/skills/{effect-architecture-audit/SKILL.md → effect-development/references/architecture/index.md} +1 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-client.md +8 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-testing.md +7 -2
- package/skills/effect-development/references/atom/index.md +40 -0
- package/skills/{build-effect-clis/references → effect-development/references/cli}/entrypoints-and-testing.md +6 -2
- package/skills/effect-development/references/cli/index.md +39 -0
- package/skills/effect-development/references/setup.md +15 -0
- package/skills/open-pull-request/SKILL.md +11 -115
- package/skills/open-pull-request/agents/openai.yaml +3 -3
- package/skills/open-pull-request/references/evidence.md +22 -0
- package/skills/open-pull-request/references/explanation.md +21 -0
- package/skills/open-pull-request/references/publication.md +21 -0
- package/skills/sentry/LICENSE +202 -0
- package/skills/sentry/LICENSE-UPSTREAM +21 -0
- package/skills/sentry/NOTICE +14 -0
- package/skills/sentry/SKILL.md +33 -0
- package/skills/sentry/references/alert-payloads.md +105 -0
- package/skills/sentry/references/alerts.md +17 -0
- package/skills/sentry/references/artifacts.md +25 -0
- package/skills/sentry/references/auth-token.md +65 -0
- package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
- package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
- package/skills/sentry/references/concepts/crons.md +50 -0
- package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
- package/skills/sentry/references/concepts/errors.md +40 -0
- package/skills/sentry/references/concepts/logging.md +85 -0
- package/skills/sentry/references/concepts/metrics.md +49 -0
- package/skills/sentry/references/concepts/monitors.md +78 -0
- package/skills/sentry/references/concepts/profiling.md +38 -0
- package/skills/sentry/references/concepts/reduce-volume.md +49 -0
- package/skills/sentry/references/concepts/releases.md +43 -0
- package/skills/sentry/references/concepts/session-replay.md +35 -0
- package/skills/sentry/references/concepts/tracing.md +54 -0
- package/skills/sentry/references/concepts/user-feedback.md +36 -0
- package/skills/sentry/references/debug-artifacts/android.md +68 -0
- package/skills/sentry/references/debug-artifacts/apple.md +96 -0
- package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
- package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
- package/skills/sentry/references/debug-artifacts/index.md +75 -0
- package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
- package/skills/sentry/references/debug-artifacts/matching.md +73 -0
- package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
- package/skills/sentry/references/first-error-setup.md +25 -0
- package/skills/sentry/references/instrumentation.md +30 -0
- package/skills/sentry/references/issues.md +32 -0
- package/skills/sentry/references/new-project.md +17 -0
- package/skills/sentry/references/otel-exporter.md +30 -0
- package/skills/sentry/references/release-workflow.md +31 -0
- package/skills/sentry/references/releases/ci-pipeline.md +214 -0
- package/skills/sentry/references/releases/index.md +93 -0
- package/skills/sentry/references/releases/suspect-commits.md +155 -0
- package/skills/sentry/references/releases/tagging.md +131 -0
- package/skills/sentry/references/releases/troubleshooting.md +67 -0
- package/skills/sentry/references/sdks/android/crons.md +305 -0
- package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
- package/skills/sentry/references/sdks/android/index.md +748 -0
- package/skills/sentry/references/sdks/android/integrations.md +48 -0
- package/skills/sentry/references/sdks/android/logging.md +374 -0
- package/skills/sentry/references/sdks/android/metrics.md +288 -0
- package/skills/sentry/references/sdks/android/profiling.md +397 -0
- package/skills/sentry/references/sdks/android/session-replay.md +406 -0
- package/skills/sentry/references/sdks/android/tracing.md +861 -0
- package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
- package/skills/sentry/references/sdks/browser/index.md +714 -0
- package/skills/sentry/references/sdks/browser/logging.md +315 -0
- package/skills/sentry/references/sdks/browser/profiling.md +236 -0
- package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
- package/skills/sentry/references/sdks/browser/tracing.md +561 -0
- package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
- package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
- package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
- package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
- package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
- package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
- package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
- package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
- package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
- package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
- package/skills/sentry/references/sdks/cocoa/index.md +497 -0
- package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
- package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
- package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
- package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
- package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
- package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
- package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
- package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
- package/skills/sentry/references/sdks/dotnet/index.md +614 -0
- package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
- package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
- package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
- package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
- package/skills/sentry/references/sdks/elixir/crons.md +371 -0
- package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
- package/skills/sentry/references/sdks/elixir/index.md +383 -0
- package/skills/sentry/references/sdks/elixir/logging.md +239 -0
- package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
- package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
- package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
- package/skills/sentry/references/sdks/flutter/index.md +728 -0
- package/skills/sentry/references/sdks/flutter/logging.md +387 -0
- package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
- package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
- package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
- package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
- package/skills/sentry/references/sdks/go/crons.md +270 -0
- package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
- package/skills/sentry/references/sdks/go/index.md +324 -0
- package/skills/sentry/references/sdks/go/logging.md +354 -0
- package/skills/sentry/references/sdks/go/metrics.md +273 -0
- package/skills/sentry/references/sdks/go/profiling.md +46 -0
- package/skills/sentry/references/sdks/go/tracing.md +366 -0
- package/skills/sentry/references/sdks/index.md +41 -0
- package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
- package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
- package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
- package/skills/sentry/references/sdks/nestjs/index.md +699 -0
- package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
- package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
- package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
- package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
- package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
- package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
- package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
- package/skills/sentry/references/sdks/nextjs/index.md +491 -0
- package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
- package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
- package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
- package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
- package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
- package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
- package/skills/sentry/references/sdks/node/crons.md +432 -0
- package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
- package/skills/sentry/references/sdks/node/index.md +942 -0
- package/skills/sentry/references/sdks/node/logging.md +380 -0
- package/skills/sentry/references/sdks/node/metrics.md +278 -0
- package/skills/sentry/references/sdks/node/profiling.md +373 -0
- package/skills/sentry/references/sdks/node/tracing.md +878 -0
- package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
- package/skills/sentry/references/sdks/php/crons.md +265 -0
- package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
- package/skills/sentry/references/sdks/php/index.md +362 -0
- package/skills/sentry/references/sdks/php/laravel.md +542 -0
- package/skills/sentry/references/sdks/php/logging.md +242 -0
- package/skills/sentry/references/sdks/php/metrics.md +193 -0
- package/skills/sentry/references/sdks/php/profiling.md +115 -0
- package/skills/sentry/references/sdks/php/symfony.md +552 -0
- package/skills/sentry/references/sdks/php/tracing.md +516 -0
- package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
- package/skills/sentry/references/sdks/python/crons.md +218 -0
- package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
- package/skills/sentry/references/sdks/python/index.md +361 -0
- package/skills/sentry/references/sdks/python/logging.md +234 -0
- package/skills/sentry/references/sdks/python/metrics.md +154 -0
- package/skills/sentry/references/sdks/python/profiling.md +120 -0
- package/skills/sentry/references/sdks/python/tracing.md +364 -0
- package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
- package/skills/sentry/references/sdks/react/index.md +492 -0
- package/skills/sentry/references/sdks/react/logging.md +364 -0
- package/skills/sentry/references/sdks/react/profiling.md +322 -0
- package/skills/sentry/references/sdks/react/react-features.md +1272 -0
- package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
- package/skills/sentry/references/sdks/react/tracing.md +1415 -0
- package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
- package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
- package/skills/sentry/references/sdks/react-native/index.md +1030 -0
- package/skills/sentry/references/sdks/react-native/logging.md +444 -0
- package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
- package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
- package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
- package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
- package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
- package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
- package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
- package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
- package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
- package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
- package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
- package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
- package/skills/sentry/references/sdks/ruby/crons.md +184 -0
- package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
- package/skills/sentry/references/sdks/ruby/index.md +297 -0
- package/skills/sentry/references/sdks/ruby/logging.md +168 -0
- package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
- package/skills/sentry/references/sdks/ruby/migration.md +321 -0
- package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
- package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
- package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
- package/skills/sentry/references/sdks/svelte/index.md +467 -0
- package/skills/sentry/references/sdks/svelte/logging.md +344 -0
- package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
- package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
- package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
- package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
- package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
- package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
- package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
- package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
- package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
- package/skills/sentry/references/search-query-language.md +226 -0
- package/skills/sentry/references/semantics/angular.md +7 -0
- package/skills/sentry/references/semantics/app.md +28 -0
- package/skills/sentry/references/semantics/art.md +17 -0
- package/skills/sentry/references/semantics/aws.md +43 -0
- package/skills/sentry/references/semantics/browser.md +34 -0
- package/skills/sentry/references/semantics/cache.md +12 -0
- package/skills/sentry/references/semantics/client.md +8 -0
- package/skills/sentry/references/semantics/cloud.md +12 -0
- package/skills/sentry/references/semantics/cloudflare.md +23 -0
- package/skills/sentry/references/semantics/code.md +11 -0
- package/skills/sentry/references/semantics/culture.md +11 -0
- package/skills/sentry/references/semantics/db.md +21 -0
- package/skills/sentry/references/semantics/device.md +43 -0
- package/skills/sentry/references/semantics/error.md +7 -0
- package/skills/sentry/references/semantics/event.md +8 -0
- package/skills/sentry/references/semantics/exception.md +10 -0
- package/skills/sentry/references/semantics/faas.md +19 -0
- package/skills/sentry/references/semantics/file.md +8 -0
- package/skills/sentry/references/semantics/flag.md +7 -0
- package/skills/sentry/references/semantics/gcp.md +16 -0
- package/skills/sentry/references/semantics/gen_ai.md +53 -0
- package/skills/sentry/references/semantics/general.md +11 -0
- package/skills/sentry/references/semantics/graphql.md +9 -0
- package/skills/sentry/references/semantics/grpc.md +19 -0
- package/skills/sentry/references/semantics/http.md +34 -0
- package/skills/sentry/references/semantics/index.md +63 -0
- package/skills/sentry/references/semantics/jsonrpc.md +8 -0
- package/skills/sentry/references/semantics/jvm.md +12 -0
- package/skills/sentry/references/semantics/koa.md +7 -0
- package/skills/sentry/references/semantics/logger.md +7 -0
- package/skills/sentry/references/semantics/mcp.md +37 -0
- package/skills/sentry/references/semantics/mdc.md +7 -0
- package/skills/sentry/references/semantics/messaging.md +23 -0
- package/skills/sentry/references/semantics/middleware.md +7 -0
- package/skills/sentry/references/semantics/navigation.md +9 -0
- package/skills/sentry/references/semantics/nel.md +11 -0
- package/skills/sentry/references/semantics/network.md +17 -0
- package/skills/sentry/references/semantics/os.md +15 -0
- package/skills/sentry/references/semantics/otel.md +10 -0
- package/skills/sentry/references/semantics/params.md +7 -0
- package/skills/sentry/references/semantics/process.md +14 -0
- package/skills/sentry/references/semantics/react.md +7 -0
- package/skills/sentry/references/semantics/remix.md +7 -0
- package/skills/sentry/references/semantics/resource.md +7 -0
- package/skills/sentry/references/semantics/rpc.md +10 -0
- package/skills/sentry/references/semantics/score.md +10 -0
- package/skills/sentry/references/semantics/sentry.md +69 -0
- package/skills/sentry/references/semantics/server.md +8 -0
- package/skills/sentry/references/semantics/service.md +8 -0
- package/skills/sentry/references/semantics/session.md +7 -0
- package/skills/sentry/references/semantics/state.md +7 -0
- package/skills/sentry/references/semantics/thread.md +8 -0
- package/skills/sentry/references/semantics/timber.md +7 -0
- package/skills/sentry/references/semantics/trpc.md +8 -0
- package/skills/sentry/references/semantics/ui.md +18 -0
- package/skills/sentry/references/semantics/url.md +15 -0
- package/skills/sentry/references/semantics/user.md +17 -0
- package/skills/sentry/references/semantics/user_agent.md +7 -0
- package/skills/sentry/references/semantics/vercel.md +42 -0
- package/skills/sentry/references/setup-verification.md +39 -0
- package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
- package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
- package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
- package/skills/sentry/references/snapshots/index.md +19 -0
- package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
- package/skills/sentry/references/snapshots/snapshots.md +123 -0
- package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
- package/skills/testing/LICENSE +21 -0
- package/skills/testing/NOTICE +7 -0
- package/skills/testing/SKILL.md +13 -19
- package/skills/testing/agents/openai.yaml +1 -2
- package/skills/testing/references/selection.md +23 -0
- package/skills/testing/references/tdd.md +19 -0
- package/skills/testing/references/test-design.md +17 -0
- package/src/catalog.ts +1 -7
- package/skills/build-effect-apis/SKILL.md +0 -81
- package/skills/build-effect-apis/agents/openai.yaml +0 -4
- package/skills/build-effect-clis/SKILL.md +0 -92
- package/skills/build-effect-clis/agents/openai.yaml +0 -4
- package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
- package/skills/effect-atom-state/SKILL.md +0 -97
- package/skills/effect-atom-state/agents/openai.yaml +0 -4
- package/skills/effect-ts/SKILL.md +0 -35
- package/skills/effect-ts/agents/openai.yaml +0 -4
- /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
- /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/processes-and-platform.md +0 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Crons / Job Monitoring — Sentry Cloudflare SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `@sentry/cloudflare` v8.0.0+ (`captureCheckIn`, `withMonitor`)
|
|
4
|
+
> Auto-instrumented `scheduled` handler: v10.x+ Status: ✅ **Generally Available**
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
Sentry Crons tracks whether scheduled tasks run on time, succeed, and complete within
|
|
11
|
+
expected durations. Sentry alerts when a job:
|
|
12
|
+
|
|
13
|
+
- Misses its scheduled start time (checkin margin exceeded)
|
|
14
|
+
- Takes too long to complete (maxRuntime exceeded)
|
|
15
|
+
- Fails (status `"error"`)
|
|
16
|
+
|
|
17
|
+
Cloudflare Workers support cron triggers via the `scheduled` handler.
|
|
18
|
+
When wrapped with `withSentry`, the scheduled handler is automatically instrumented with
|
|
19
|
+
a `faas.cron` span that includes:
|
|
20
|
+
|
|
21
|
+
- `faas.cron` — the cron expression
|
|
22
|
+
- `faas.time` — the scheduled time (ISO 8601)
|
|
23
|
+
- `faas.trigger` — `"timer"`
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Automatic Scheduled Handler Instrumentation
|
|
28
|
+
|
|
29
|
+
When you use `withSentry`, the `scheduled` handler is automatically wrapped.
|
|
30
|
+
Errors are captured and the span records duration:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import * as Sentry from "@sentry/cloudflare";
|
|
34
|
+
|
|
35
|
+
export default Sentry.withSentry(
|
|
36
|
+
(env: Env) => ({
|
|
37
|
+
dsn: env.SENTRY_DSN,
|
|
38
|
+
tracesSampleRate: 1.0,
|
|
39
|
+
}),
|
|
40
|
+
{
|
|
41
|
+
async fetch(request, env, ctx) {
|
|
42
|
+
return new Response("OK");
|
|
43
|
+
},
|
|
44
|
+
|
|
45
|
+
async scheduled(controller, env, ctx) {
|
|
46
|
+
// Automatically instrumented — errors captured, spans created
|
|
47
|
+
await cleanupOldRecords(env.DB);
|
|
48
|
+
},
|
|
49
|
+
} satisfies ExportedHandler<Env>,
|
|
50
|
+
);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Configure the cron trigger in `wrangler.toml`:
|
|
54
|
+
|
|
55
|
+
```toml
|
|
56
|
+
[triggers]
|
|
57
|
+
crons = ["*/5 * * * *"] # Every 5 minutes
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## `Sentry.withMonitor` — Named Monitor Tracking
|
|
63
|
+
|
|
64
|
+
For fine-grained monitoring with named monitors (visible in the Sentry Crons dashboard):
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
async scheduled(controller, env, ctx) {
|
|
68
|
+
ctx.waitUntil(
|
|
69
|
+
Sentry.withMonitor("cleanup-old-records", async () => {
|
|
70
|
+
await cleanupOldRecords(env.DB);
|
|
71
|
+
}),
|
|
72
|
+
);
|
|
73
|
+
},
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### With Monitor Config (Upsert)
|
|
77
|
+
|
|
78
|
+
Supply a config to auto-create or update the monitor in Sentry:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
const monitorConfig = {
|
|
82
|
+
schedule: {
|
|
83
|
+
type: "crontab",
|
|
84
|
+
value: "*/5 * * * *",
|
|
85
|
+
},
|
|
86
|
+
checkinMargin: 2, // In minutes — how late is "missed"
|
|
87
|
+
maxRuntime: 10, // In minutes — when to alert for "timed out"
|
|
88
|
+
timezone: "America/Los_Angeles",
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
async scheduled(controller, env, ctx) {
|
|
92
|
+
ctx.waitUntil(
|
|
93
|
+
Sentry.withMonitor(
|
|
94
|
+
"cleanup-old-records",
|
|
95
|
+
async () => {
|
|
96
|
+
await cleanupOldRecords(env.DB);
|
|
97
|
+
},
|
|
98
|
+
monitorConfig,
|
|
99
|
+
),
|
|
100
|
+
);
|
|
101
|
+
},
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## `Sentry.captureCheckIn` — Manual Check-Ins
|
|
107
|
+
|
|
108
|
+
For more control over the check-in lifecycle:
|
|
109
|
+
|
|
110
|
+
### Heartbeat (Single-Shot)
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
// Report success
|
|
114
|
+
Sentry.captureCheckIn({ monitorSlug: "health-check", status: "ok" });
|
|
115
|
+
|
|
116
|
+
// Report failure
|
|
117
|
+
Sentry.captureCheckIn({ monitorSlug: "health-check", status: "error" });
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### In-Progress + Completion
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// Signal start
|
|
124
|
+
const checkInId = Sentry.captureCheckIn({
|
|
125
|
+
monitorSlug: "data-sync",
|
|
126
|
+
status: "in_progress",
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
try {
|
|
130
|
+
await syncData(env.DB);
|
|
131
|
+
|
|
132
|
+
// Signal success
|
|
133
|
+
Sentry.captureCheckIn({
|
|
134
|
+
checkInId,
|
|
135
|
+
monitorSlug: "data-sync",
|
|
136
|
+
status: "ok",
|
|
137
|
+
});
|
|
138
|
+
} catch (error) {
|
|
139
|
+
// Signal failure
|
|
140
|
+
Sentry.captureCheckIn({
|
|
141
|
+
checkInId,
|
|
142
|
+
monitorSlug: "data-sync",
|
|
143
|
+
status: "error",
|
|
144
|
+
});
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### With Upsert Config
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
const checkInId = Sentry.captureCheckIn(
|
|
153
|
+
{ monitorSlug: "data-sync", status: "in_progress" },
|
|
154
|
+
{
|
|
155
|
+
schedule: { type: "crontab", value: "0 * * * *" },
|
|
156
|
+
checkinMargin: 5,
|
|
157
|
+
maxRuntime: 30,
|
|
158
|
+
timezone: "UTC",
|
|
159
|
+
},
|
|
160
|
+
);
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Schedule Types
|
|
166
|
+
|
|
167
|
+
| Type | Format | Example |
|
|
168
|
+
| ---------- | ------------------------ | ------------------------------- |
|
|
169
|
+
| `crontab` | Standard cron expression | `"*/5 * * * *"` (every 5 min) |
|
|
170
|
+
| `interval` | Repeated interval | `{ value: 10, unit: "minute" }` |
|
|
171
|
+
|
|
172
|
+
### Interval Schedule
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
const monitorConfig = {
|
|
176
|
+
schedule: {
|
|
177
|
+
type: "interval",
|
|
178
|
+
value: 10,
|
|
179
|
+
unit: "minute", // "minute", "hour", "day", "week", "month", "year"
|
|
180
|
+
},
|
|
181
|
+
checkinMargin: 2,
|
|
182
|
+
maxRuntime: 10,
|
|
183
|
+
};
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## Monitor Config Options
|
|
189
|
+
|
|
190
|
+
| Option | Type | Default | Notes |
|
|
191
|
+
| ----------------------- | ------------------------- | ------- | --------------------------------------------------------- |
|
|
192
|
+
| `schedule.type` | `"crontab" \| "interval"` | — | Required |
|
|
193
|
+
| `schedule.value` | `string \| number` | — | Cron expression or interval value |
|
|
194
|
+
| `schedule.unit` | `string` | — | Required for `interval` type |
|
|
195
|
+
| `checkinMargin` | `number` | — | Minutes before a check-in is considered missed |
|
|
196
|
+
| `maxRuntime` | `number` | — | Minutes before a running job is considered timed out |
|
|
197
|
+
| `timezone` | `string` | `"UTC"` | IANA timezone for crontab schedules |
|
|
198
|
+
| `failureIssueThreshold` | `number` | — | Number of consecutive failures before creating an issue |
|
|
199
|
+
| `recoveryThreshold` | `number` | — | Number of consecutive successes before resolving an issue |
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Best Practices
|
|
204
|
+
|
|
205
|
+
1. **Use `withMonitor` for most cases** — it handles the check-in lifecycle
|
|
206
|
+
automatically and records duration.
|
|
207
|
+
|
|
208
|
+
2. **Use `ctx.waitUntil`** — wrap `withMonitor` in `ctx.waitUntil()` to ensure the
|
|
209
|
+
check-in is flushed before the worker terminates.
|
|
210
|
+
|
|
211
|
+
3. **Use upsert configs** — supply `monitorConfig` to auto-create monitors.
|
|
212
|
+
This avoids manual configuration in the Sentry UI.
|
|
213
|
+
|
|
214
|
+
4. **Name monitors clearly** — use descriptive slugs like `"daily-cleanup"` or
|
|
215
|
+
`"hourly-sync"`, not `"cron-1"`.
|
|
216
|
+
|
|
217
|
+
5. **Set reasonable thresholds** — `checkinMargin` should be slightly larger than
|
|
218
|
+
typical scheduling jitter.
|
|
219
|
+
`maxRuntime` should be longer than the 99th percentile duration.
|
|
220
|
+
|
|
221
|
+
---
|
|
222
|
+
|
|
223
|
+
## Troubleshooting
|
|
224
|
+
|
|
225
|
+
| Issue | Solution |
|
|
226
|
+
| ---------------------------------------- | ------------------------------------------------------------------------------------------- |
|
|
227
|
+
| Monitor not appearing in Crons dashboard | Ensure `captureCheckIn` or `withMonitor` is called at least once with a valid `monitorSlug` |
|
|
228
|
+
| Check-in always shows “missed” | Verify `checkinMargin` is large enough for scheduling jitter |
|
|
229
|
+
| Check-in shows “timed out” | Verify `maxRuntime` exceeds expected job duration |
|
|
230
|
+
| In-progress check-in never completes | Ensure both `in_progress` and `ok`/`error` check-ins use the same `checkInId` |
|
|
231
|
+
| Schedule mismatch | Ensure `schedule.value` in config matches the actual cron expression in `wrangler.toml` |
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
# Durable Objects, Workflows, and D1 — Sentry Cloudflare SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `@sentry/cloudflare` v8.0.0+ Durable Object instrumentation: v8.x+
|
|
4
|
+
> `instrumentPrototypeMethods`: v10.x+ Workflow instrumentation: v10.x+ D1 automatic
|
|
5
|
+
> (`env`-based) instrumentation: v10.x+ Durable Object Storage instrumentation: v10.x+
|
|
6
|
+
> Agents SDK instrumentation (`instrumentAgentWithSentry`): v10.69.0+ RPC trace
|
|
7
|
+
> propagation (`enableRpcTracePropagation`): v10.52.0+
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Durable Objects
|
|
12
|
+
|
|
13
|
+
### Overview
|
|
14
|
+
|
|
15
|
+
`instrumentDurableObjectWithSentry` wraps a Durable Object class to automatically:
|
|
16
|
+
|
|
17
|
+
- Initialize the Sentry SDK per-request
|
|
18
|
+
- Capture unhandled errors in all DO methods
|
|
19
|
+
- Create spans for fetch, alarm, WebSocket, and RPC methods
|
|
20
|
+
- Track Durable Object Storage operations (get, put, delete, list)
|
|
21
|
+
|
|
22
|
+
### Setup
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import * as Sentry from "@sentry/cloudflare";
|
|
26
|
+
import { DurableObject } from "cloudflare:workers";
|
|
27
|
+
|
|
28
|
+
class MyDurableObjectBase extends DurableObject<Env> {
|
|
29
|
+
async fetch(request: Request): Promise<Response> {
|
|
30
|
+
const url = new URL(request.url);
|
|
31
|
+
|
|
32
|
+
if (url.pathname === "/process") {
|
|
33
|
+
await this.processData();
|
|
34
|
+
return new Response("Processed");
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return new Response("OK");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async alarm(): Promise<void> {
|
|
41
|
+
await this.runMaintenance();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async processData(): Promise<void> {
|
|
45
|
+
// Business logic — automatically instrumented as RPC span
|
|
46
|
+
await this.ctx.storage.put("last-processed", Date.now());
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Wrap the class with Sentry instrumentation
|
|
51
|
+
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
|
|
52
|
+
(env: Env) => ({
|
|
53
|
+
dsn: env.SENTRY_DSN,
|
|
54
|
+
tracesSampleRate: 1.0,
|
|
55
|
+
dataCollection: {
|
|
56
|
+
// To disable sending user data and HTTP bodies, uncomment the lines below. For more info visit:
|
|
57
|
+
// https://docs.sentry.io/platforms/javascript/guides/cloudflare/configuration/options/#dataCollection
|
|
58
|
+
// userInfo: false,
|
|
59
|
+
// httpBodies: [],
|
|
60
|
+
},
|
|
61
|
+
}),
|
|
62
|
+
MyDurableObjectBase,
|
|
63
|
+
);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
> **Important:** Export the wrapped class, not the base class.
|
|
67
|
+
> The wrapped class must be the one referenced in `wrangler.toml`.
|
|
68
|
+
|
|
69
|
+
### Instrumented Methods
|
|
70
|
+
|
|
71
|
+
| Method | Span Op | Auto-captured |
|
|
72
|
+
| ---------------------- | ---------------------------- | ---------------------------------------- |
|
|
73
|
+
| `fetch` | `http.server` | ✅ Errors and spans |
|
|
74
|
+
| `alarm` | — (named `alarm`) | ✅ Errors and spans |
|
|
75
|
+
| `webSocketMessage` | — (named `webSocketMessage`) | ✅ Errors and spans |
|
|
76
|
+
| `webSocketClose` | — (named `webSocketClose`) | ✅ Errors and spans |
|
|
77
|
+
| `webSocketError` | — (named `webSocketError`) | ✅ Errors captured with `handled: false` |
|
|
78
|
+
| Instance methods (RPC) | `rpc` | ✅ Errors and spans |
|
|
79
|
+
|
|
80
|
+
### Prototype Method Instrumentation
|
|
81
|
+
|
|
82
|
+
By default, only instance methods (defined directly on the object) are instrumented.
|
|
83
|
+
To also instrument methods defined on the prototype chain (useful for RPC methods
|
|
84
|
+
defined in a base class), enable `instrumentPrototypeMethods`:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
|
|
88
|
+
(env: Env) => ({
|
|
89
|
+
dsn: env.SENTRY_DSN,
|
|
90
|
+
tracesSampleRate: 1.0,
|
|
91
|
+
instrumentPrototypeMethods: true, // Instrument ALL prototype methods
|
|
92
|
+
}),
|
|
93
|
+
MyDurableObjectBase,
|
|
94
|
+
);
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Or instrument only specific methods:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
|
|
101
|
+
(env: Env) => ({
|
|
102
|
+
dsn: env.SENTRY_DSN,
|
|
103
|
+
tracesSampleRate: 1.0,
|
|
104
|
+
instrumentPrototypeMethods: ["myRpcMethod", "anotherMethod"],
|
|
105
|
+
}),
|
|
106
|
+
MyDurableObjectBase,
|
|
107
|
+
);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Durable Object Storage Instrumentation
|
|
111
|
+
|
|
112
|
+
Durable Object Storage operations (`get`, `put`, `delete`, `list`) are automatically
|
|
113
|
+
instrumented when using `instrumentDurableObjectWithSentry`. Each storage operation
|
|
114
|
+
creates a span.
|
|
115
|
+
|
|
116
|
+
> Framework-internal storage operations are filtered out automatically (v10.69.0+): keys
|
|
117
|
+
> prefixed with `cf_`, `cf:`, `__ps_`, or `/` (used internally by the Agents SDK and
|
|
118
|
+
> PartyServer) don’t create spans, so your traces show only your own storage access.
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
class MyDurableObjectBase extends DurableObject<Env> {
|
|
122
|
+
async fetch(request: Request): Promise<Response> {
|
|
123
|
+
// These storage operations are automatically traced
|
|
124
|
+
await this.ctx.storage.put("key", "value");
|
|
125
|
+
const value = await this.ctx.storage.get("key");
|
|
126
|
+
await this.ctx.storage.delete("key");
|
|
127
|
+
const entries = await this.ctx.storage.list();
|
|
128
|
+
|
|
129
|
+
return new Response("OK");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
### Cloudflare Agents SDK (`instrumentAgentWithSentry`)
|
|
135
|
+
|
|
136
|
+
> `instrumentAgentWithSentry`: v10.69.0+
|
|
137
|
+
|
|
138
|
+
For classes built on the
|
|
139
|
+
[Cloudflare Agents SDK](https://developers.cloudflare.com/agents/) (`Agent` from
|
|
140
|
+
`agents`, `AIChatAgent` from `@cloudflare/ai-chat`, `McpAgent` from `agents/mcp`), use
|
|
141
|
+
the dedicated `instrumentAgentWithSentry` wrapper.
|
|
142
|
+
Agents are Durable Objects under the hood, so it applies everything
|
|
143
|
+
`instrumentDurableObjectWithSentry` does (request transactions, `alarm`, WebSocket
|
|
144
|
+
handlers, RPC trace propagation, SQL spans) **plus** Agent-specific telemetry:
|
|
145
|
+
|
|
146
|
+
- **Callable RPC spans** — a span (op `rpc`) for each `@callable()` method invoked over
|
|
147
|
+
WebSocket, with `cloudflare.agent.class` / `cloudflare.agent.name` attributes
|
|
148
|
+
- **Automatic conversation IDs** — sets the conversation ID on the scope for each chat
|
|
149
|
+
turn (`onChatMessage`) and each callable RPC call, defaulting to the agent instance
|
|
150
|
+
name, so `gen_ai` spans group in Conversations without any `setConversationId` call
|
|
151
|
+
- **Conversation rotation on chat clear** — when the chat is cleared (`clearHistory()`
|
|
152
|
+
from `useAgentChat`, or anything that emits the
|
|
153
|
+
[`message:clear` observability event](https://developers.cloudflare.com/agents/runtime/operations/observability/#channels)),
|
|
154
|
+
the SDK rotates to a fresh conversation ID while the instance (and its MCP/OAuth
|
|
155
|
+
state) stays put
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { Agent, callable } from "agents";
|
|
159
|
+
import * as Sentry from "@sentry/cloudflare";
|
|
160
|
+
|
|
161
|
+
class MyAgentBase extends Agent<Env> {
|
|
162
|
+
@callable()
|
|
163
|
+
async greet(name: string): Promise<string> {
|
|
164
|
+
return `Hello, ${name}!`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
export const MyAgent = Sentry.instrumentAgentWithSentry(
|
|
169
|
+
(env: Env) => ({
|
|
170
|
+
dsn: env.SENTRY_DSN,
|
|
171
|
+
tracesSampleRate: 1.0,
|
|
172
|
+
enableRpcTracePropagation: true,
|
|
173
|
+
}),
|
|
174
|
+
MyAgentBase,
|
|
175
|
+
);
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
When building with the Sentry Vite plugin’s `autoInstrumentation`, Agent classes are
|
|
179
|
+
detected and wrapped with `instrumentAgentWithSentry` automatically (v10.69.0+) — see
|
|
180
|
+
`./ai-monitoring.md`.
|
|
181
|
+
|
|
182
|
+
The automatic conversation ID uses the agent instance name — correct when one instance
|
|
183
|
+
is one chat session (e.g. `useAgent({ name: chatSessionId })`). If your instances are
|
|
184
|
+
per-user or a shared singleton like `"default"`, override it with your own chat session
|
|
185
|
+
ID via `Sentry.setConversationId(id)` at the start of `onChatMessage` — see
|
|
186
|
+
`./ai-monitoring.md`.
|
|
187
|
+
|
|
188
|
+
On SDK versions before 10.69.0, wrap Agent classes with
|
|
189
|
+
`instrumentDurableObjectWithSentry` instead and call `Sentry.setConversationId()`
|
|
190
|
+
manually in the handler.
|
|
191
|
+
|
|
192
|
+
### RPC Trace Propagation
|
|
193
|
+
|
|
194
|
+
Trace context isn’t propagated across Durable Object RPC calls by default.
|
|
195
|
+
To connect a caller Worker and a DO into a single distributed trace, set
|
|
196
|
+
`enableRpcTracePropagation: true` on **both** the caller (`withSentry`) and the DO
|
|
197
|
+
(`instrumentDurableObjectWithSentry`) — recommended whenever you use Durable Objects.
|
|
198
|
+
See [RPC Trace Propagation in `./tracing.md`](./tracing.md#rpc-trace-propagation) for
|
|
199
|
+
the full setup.
|
|
200
|
+
|
|
201
|
+
---
|
|
202
|
+
|
|
203
|
+
## Workflows
|
|
204
|
+
|
|
205
|
+
### Overview
|
|
206
|
+
|
|
207
|
+
`instrumentWorkflowWithSentry` wraps a Workflow class to automatically:
|
|
208
|
+
|
|
209
|
+
- Initialize the Sentry SDK for each workflow run
|
|
210
|
+
- Create a consistent trace ID derived from the workflow instance ID
|
|
211
|
+
- Create spans for each `step.do()` call
|
|
212
|
+
- Capture errors in workflow steps with `handled: true` (since steps may retry)
|
|
213
|
+
- Disable the dedupe integration (to capture all step failures, even duplicates)
|
|
214
|
+
|
|
215
|
+
### Setup
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
import * as Sentry from "@sentry/cloudflare";
|
|
219
|
+
import { WorkflowEntrypoint } from "cloudflare:workers";
|
|
220
|
+
|
|
221
|
+
class MyWorkflowBase extends WorkflowEntrypoint<Env, { orderId: string }> {
|
|
222
|
+
async run(event, step) {
|
|
223
|
+
const order = await step.do("fetch-order", async () => {
|
|
224
|
+
return await fetchOrder(event.payload.orderId);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
await step.do("process-payment", { retries: { limit: 3, delay: "1s" } }, async () => {
|
|
228
|
+
return await processPayment(order);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
await step.do("send-confirmation", async () => {
|
|
232
|
+
return await sendEmail(order.email);
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
export const MyWorkflow = Sentry.instrumentWorkflowWithSentry(
|
|
238
|
+
(env: Env) => ({
|
|
239
|
+
dsn: env.SENTRY_DSN,
|
|
240
|
+
tracesSampleRate: 1.0,
|
|
241
|
+
}),
|
|
242
|
+
MyWorkflowBase,
|
|
243
|
+
);
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Step Span Attributes
|
|
247
|
+
|
|
248
|
+
Each `step.do()` creates a span with:
|
|
249
|
+
|
|
250
|
+
| Attribute | Value |
|
|
251
|
+
| ------------------------------------- | --------------------------------------------- |
|
|
252
|
+
| `op` | `function.step.do` |
|
|
253
|
+
| `name` | The step name (first argument to `step.do()`) |
|
|
254
|
+
| `cloudflare.workflow.timeout` | Step timeout config (if set) |
|
|
255
|
+
| `cloudflare.workflow.retries.limit` | Max retries (if set) |
|
|
256
|
+
| `cloudflare.workflow.retries.delay` | Retry delay (if set) |
|
|
257
|
+
| `cloudflare.workflow.retries.backoff` | Backoff strategy (if set) |
|
|
258
|
+
|
|
259
|
+
### Trace Consistency
|
|
260
|
+
|
|
261
|
+
The SDK generates a deterministic trace ID from the workflow instance ID. This means:
|
|
262
|
+
|
|
263
|
+
- All steps in the same workflow instance share the same trace
|
|
264
|
+
- Retried steps appear as separate spans within the same trace
|
|
265
|
+
- The sampling decision is consistent across steps
|
|
266
|
+
|
|
267
|
+
### Other Step Types
|
|
268
|
+
|
|
269
|
+
`step.sleep()`, `step.sleepUntil()`, and `step.waitForEvent()` are passed through
|
|
270
|
+
without instrumentation (they don’t execute user code).
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## D1 Database Instrumentation
|
|
275
|
+
|
|
276
|
+
### Overview
|
|
277
|
+
|
|
278
|
+
D1 bindings are **automatically instrumented** when accessed through the handler’s
|
|
279
|
+
`env`. As long as your Worker is wrapped with `withSentry` (or the DO/Workflow is
|
|
280
|
+
wrapped), every query on `env.DB` creates spans and breadcrumbs — no manual wrapping
|
|
281
|
+
needed.
|
|
282
|
+
|
|
283
|
+
### Setup
|
|
284
|
+
|
|
285
|
+
```typescript
|
|
286
|
+
import * as Sentry from "@sentry/cloudflare";
|
|
287
|
+
|
|
288
|
+
export default Sentry.withSentry(
|
|
289
|
+
(env: Env) => ({
|
|
290
|
+
dsn: env.SENTRY_DSN,
|
|
291
|
+
tracesSampleRate: 1.0,
|
|
292
|
+
}),
|
|
293
|
+
{
|
|
294
|
+
async fetch(request, env, ctx) {
|
|
295
|
+
// env.DB is already instrumented — use it directly
|
|
296
|
+
const users = await env.DB.prepare("SELECT * FROM users WHERE active = ?").bind(1).all();
|
|
297
|
+
|
|
298
|
+
return new Response(JSON.stringify(users.results));
|
|
299
|
+
},
|
|
300
|
+
} satisfies ExportedHandler<Env>,
|
|
301
|
+
);
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
> **Deprecated:** the explicit `Sentry.instrumentD1WithSentry(env.DB)` wrapper still
|
|
305
|
+
> works but is **deprecated and will be removed in v11**. Access `env.DB` directly
|
|
306
|
+
> instead — it’s instrumented automatically.
|
|
307
|
+
|
|
308
|
+
### Instrumented Methods
|
|
309
|
+
|
|
310
|
+
| Method | Span Name | Notes |
|
|
311
|
+
| ------------------- | ----------------------------- | ----------------------------------------------- |
|
|
312
|
+
| `statement.first()` | SQL query text | Returns first row |
|
|
313
|
+
| `statement.run()` | SQL query text | Execute with metadata return |
|
|
314
|
+
| `statement.all()` | SQL query text | Returns all rows with metadata |
|
|
315
|
+
| `statement.raw()` | SQL query text | Returns raw row arrays |
|
|
316
|
+
| `db.batch([...])` | SQL of the batched statements | Executes multiple statements in one transaction |
|
|
317
|
+
| `db.exec(sql)` | SQL query text | Executes raw SQL |
|
|
318
|
+
|
|
319
|
+
All methods create:
|
|
320
|
+
|
|
321
|
+
- A `db.query` span with the SQL statement as the span name
|
|
322
|
+
- A breadcrumb in the `query` category
|
|
323
|
+
- Span attributes: `cloudflare.d1.query_type`, `cloudflare.d1.duration`,
|
|
324
|
+
`cloudflare.d1.rows_read`, `cloudflare.d1.rows_written`
|
|
325
|
+
|
|
326
|
+
`db.batch()` and `db.exec()` additionally set:
|
|
327
|
+
|
|
328
|
+
- `db.operation.name` — `batch` or `exec`
|
|
329
|
+
- `db.operation.batch.size` — number of statements (for `batch`)
|
|
330
|
+
|
|
331
|
+
### Bind Support
|
|
332
|
+
|
|
333
|
+
The instrumentation follows through `statement.bind()`:
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
// bind() returns a new statement — it's also instrumented
|
|
337
|
+
const result = await env.DB.prepare("INSERT INTO users (name, email) VALUES (?, ?)")
|
|
338
|
+
.bind("Alice", "alice@example.com")
|
|
339
|
+
.run();
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Limitations
|
|
343
|
+
|
|
344
|
+
- Query parameters are not captured in span data (to avoid PII leakage)
|
|
345
|
+
|
|
346
|
+
---
|
|
347
|
+
|
|
348
|
+
## Best Practices
|
|
349
|
+
|
|
350
|
+
1. **Access D1 via `env`** — use `env.DB` directly; it’s auto-instrumented.
|
|
351
|
+
Don’t reach for the deprecated `instrumentD1WithSentry` wrapper.
|
|
352
|
+
|
|
353
|
+
2. **Export wrapped classes** — always export the instrumented class
|
|
354
|
+
(`Sentry.instrumentDurableObjectWithSentry(...)`) as the binding target, not the base
|
|
355
|
+
class.
|
|
356
|
+
|
|
357
|
+
3. **Use `instrumentPrototypeMethods` selectively** — it wraps all prototype methods
|
|
358
|
+
which adds overhead.
|
|
359
|
+
Use an array of method names if you only need specific RPC methods.
|
|
360
|
+
|
|
361
|
+
4. **Enable RPC trace propagation for cross-Worker traces** — set
|
|
362
|
+
`enableRpcTracePropagation: true` on both caller and receiver when you want
|
|
363
|
+
DO/service-binding RPC calls in one trace (see
|
|
364
|
+
[RPC Trace Propagation](#rpc-trace-propagation)).
|
|
365
|
+
|
|
366
|
+
5. **Workflow error handling** — step errors are captured with `handled: true` since
|
|
367
|
+
Workflows may retry steps.
|
|
368
|
+
The dedupe integration is automatically disabled.
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## Troubleshooting
|
|
373
|
+
|
|
374
|
+
| Issue | Solution |
|
|
375
|
+
| ------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
376
|
+
| DO errors not captured | Ensure you exported the instrumented class, not the base class |
|
|
377
|
+
| RPC methods not creating spans | Enable `instrumentPrototypeMethods: true` or list specific methods |
|
|
378
|
+
| D1 queries not traced | Access the binding via `env.DB` (auto-instrumented by `withSentry`) and ensure `tracesSampleRate` is set |
|
|
379
|
+
| Workflow spans disconnected | Verify all steps in the same workflow instance share the same trace (automatic) |
|
|
380
|
+
| Storage operations not traced | Ensure you’re using `instrumentDurableObjectWithSentry` — storage instrumentation is included |
|
|
381
|
+
| DO / service-binding RPC calls in separate traces | Set `enableRpcTracePropagation: true` on both caller and receiver |
|