@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,351 @@
|
|
|
1
|
+
# AI Monitoring — Sentry Python SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `sentry-sdk` >=2.64.0 (Gen AI span streaming is on by default at this
|
|
4
|
+
> version; the `stream_gen_ai_spans` option is available since 2.60.0).
|
|
5
|
+
|
|
6
|
+
## Prerequisites
|
|
7
|
+
|
|
8
|
+
Tracing must be enabled — AI spans require an active transaction:
|
|
9
|
+
|
|
10
|
+
```python
|
|
11
|
+
sentry_sdk.init(
|
|
12
|
+
dsn="...",
|
|
13
|
+
traces_sample_rate=1.0,
|
|
14
|
+
stream_gen_ai_spans=True,
|
|
15
|
+
send_default_pii=True,
|
|
16
|
+
)
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Integration Matrix
|
|
20
|
+
|
|
21
|
+
| Integration | Package | Min Library | Auto-Enabled | Status |
|
|
22
|
+
| ----------------- | ------------ | ----------------------- | ------------ | ------- |
|
|
23
|
+
| OpenAI | `sentry-sdk` | openai 1.0+ | ✅ Yes | Stable |
|
|
24
|
+
| Anthropic | `sentry-sdk` | anthropic 0.16.0+ | ✅ Yes | Stable |
|
|
25
|
+
| LangChain | `sentry-sdk` | langchain 0.1.0+ | ✅ Yes | Stable |
|
|
26
|
+
| LangGraph | `sentry-sdk` | langgraph 0.6.6+ | ✅ Yes | Stable |
|
|
27
|
+
| OpenAI Agents SDK | `sentry-sdk` | agents 0.0.19+ | ✅ Yes | ⚠️ Beta |
|
|
28
|
+
| Google GenAI | `sentry-sdk` | google-genai 1.29.0+ | ✅ Yes | Stable |
|
|
29
|
+
| HuggingFace Hub | `sentry-sdk` | huggingface_hub 0.24.7+ | ✅ Yes | Stable |
|
|
30
|
+
| LiteLLM | `sentry-sdk` | litellm 1.77.5+ | ❌ **No** | Stable |
|
|
31
|
+
| MCP | `sentry-sdk` | mcp 1.15.0+ | ✅ Yes | Stable |
|
|
32
|
+
| Pydantic AI | `sentry-sdk` | pydantic-ai 1.0.0+ | ✅ Yes | ⚠️ Beta |
|
|
33
|
+
|
|
34
|
+
**LiteLLM MUST be explicitly added to `integrations=[]`.**
|
|
35
|
+
|
|
36
|
+
## PII Control
|
|
37
|
+
|
|
38
|
+
Every integration follows the same two-layer control:
|
|
39
|
+
|
|
40
|
+
| `send_default_pii` | `include_prompts` | Prompts/outputs sent? |
|
|
41
|
+
| ------------------ | ----------------- | --------------------- |
|
|
42
|
+
| `False` (default) | `True` (default) | ❌ No |
|
|
43
|
+
| `True` | `True` (default) | ✅ Yes |
|
|
44
|
+
| `True` | `False` | ❌ No |
|
|
45
|
+
|
|
46
|
+
Set `send_default_pii=True` in `sentry_sdk.init()` and leave `include_prompts` at its
|
|
47
|
+
default `True`. Use `include_prompts=False` per integration only to opt out.
|
|
48
|
+
|
|
49
|
+
## Configuration Examples
|
|
50
|
+
|
|
51
|
+
### Auto-enabled integrations (OpenAI, Anthropic, LangChain, etc.)
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
import sentry_sdk
|
|
55
|
+
|
|
56
|
+
sentry_sdk.init(
|
|
57
|
+
dsn="https://<key>@<org>.ingest.sentry.io/<project>",
|
|
58
|
+
traces_sample_rate=1.0,
|
|
59
|
+
stream_gen_ai_spans=True,
|
|
60
|
+
send_default_pii=True, # required to capture prompts/outputs
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
# OpenAI, Anthropic, LangChain, LangGraph, HuggingFace Hub activate automatically
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Explicit configuration with `include_prompts` override
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
import sentry_sdk
|
|
70
|
+
from sentry_sdk.integrations.openai import OpenAIIntegration
|
|
71
|
+
from sentry_sdk.integrations.anthropic import AnthropicIntegration
|
|
72
|
+
|
|
73
|
+
sentry_sdk.init(
|
|
74
|
+
dsn="...",
|
|
75
|
+
traces_sample_rate=1.0,
|
|
76
|
+
stream_gen_ai_spans=True,
|
|
77
|
+
send_default_pii=True,
|
|
78
|
+
integrations=[
|
|
79
|
+
OpenAIIntegration(
|
|
80
|
+
include_prompts=True,
|
|
81
|
+
tiktoken_encoding_name="o200k_base", # for gpt-4o streaming token counts
|
|
82
|
+
),
|
|
83
|
+
AnthropicIntegration(include_prompts=True),
|
|
84
|
+
],
|
|
85
|
+
)
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Integrations that require explicit registration
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
import sentry_sdk
|
|
92
|
+
from sentry_sdk.integrations.litellm import LiteLLMIntegration
|
|
93
|
+
|
|
94
|
+
sentry_sdk.init(
|
|
95
|
+
dsn="...",
|
|
96
|
+
traces_sample_rate=1.0,
|
|
97
|
+
stream_gen_ai_spans=True,
|
|
98
|
+
send_default_pii=True,
|
|
99
|
+
integrations=[
|
|
100
|
+
LiteLLMIntegration(include_prompts=True), # 100+ providers via proxy
|
|
101
|
+
],
|
|
102
|
+
)
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Usage examples
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
from openai import OpenAI
|
|
109
|
+
import sentry_sdk
|
|
110
|
+
|
|
111
|
+
client = OpenAI()
|
|
112
|
+
|
|
113
|
+
with sentry_sdk.start_transaction(name="AI inference", op="ai-inference"):
|
|
114
|
+
response = client.chat.completions.create(
|
|
115
|
+
model="gpt-4o",
|
|
116
|
+
messages=[{"role": "user", "content": "Say hello"}],
|
|
117
|
+
)
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
import anthropic, sentry_sdk
|
|
122
|
+
|
|
123
|
+
client = anthropic.Anthropic()
|
|
124
|
+
|
|
125
|
+
with sentry_sdk.start_transaction(name="claude-request"):
|
|
126
|
+
message = client.messages.create(
|
|
127
|
+
model="claude-opus-4-5",
|
|
128
|
+
max_tokens=1024,
|
|
129
|
+
messages=[{"role": "user", "content": "Explain async/await"}],
|
|
130
|
+
)
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Manual Instrumentation — `gen_ai.*` Spans
|
|
134
|
+
|
|
135
|
+
Use when the library isn’t supported, or for wrapping custom AI logic.
|
|
136
|
+
|
|
137
|
+
### `gen_ai.request` — Raw LLM call
|
|
138
|
+
|
|
139
|
+
```python
|
|
140
|
+
import sentry_sdk, json
|
|
141
|
+
|
|
142
|
+
messages = [{"role": "user", "content": "Tell me a joke"}]
|
|
143
|
+
|
|
144
|
+
with sentry_sdk.start_span(op="gen_ai.request", name="chat gpt-4o") as span:
|
|
145
|
+
span.set_data("gen_ai.request.model", "gpt-4o")
|
|
146
|
+
span.set_data("gen_ai.request.messages", json.dumps(messages)) # must JSON-stringify
|
|
147
|
+
span.set_data("gen_ai.request.temperature", 0.7)
|
|
148
|
+
span.set_data("gen_ai.request.max_tokens", 500)
|
|
149
|
+
|
|
150
|
+
result = my_llm_client.chat(model="gpt-4o", messages=messages)
|
|
151
|
+
|
|
152
|
+
span.set_data("gen_ai.response.text", json.dumps([result.choices[0].message.content]))
|
|
153
|
+
span.set_data("gen_ai.usage.input_tokens", result.usage.prompt_tokens)
|
|
154
|
+
span.set_data("gen_ai.usage.output_tokens", result.usage.completion_tokens)
|
|
155
|
+
span.set_data("gen_ai.usage.total_tokens", result.usage.total_tokens)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### `gen_ai.invoke_agent` — Full agent lifecycle
|
|
159
|
+
|
|
160
|
+
```python
|
|
161
|
+
import sentry_sdk
|
|
162
|
+
|
|
163
|
+
with sentry_sdk.start_span(op="gen_ai.invoke_agent",
|
|
164
|
+
name="invoke_agent Weather Agent") as span:
|
|
165
|
+
span.set_data("gen_ai.request.model", "gpt-4o")
|
|
166
|
+
span.set_data("gen_ai.agent.name", "Weather Agent")
|
|
167
|
+
|
|
168
|
+
final_output = my_agent.run(task="What's the weather in Paris?")
|
|
169
|
+
|
|
170
|
+
span.set_data("gen_ai.response.text", str(final_output))
|
|
171
|
+
span.set_data("gen_ai.usage.input_tokens", my_agent.usage.input_tokens)
|
|
172
|
+
span.set_data("gen_ai.usage.output_tokens", my_agent.usage.output_tokens)
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### `gen_ai.execute_tool` — Tool/function call
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
import sentry_sdk, json
|
|
179
|
+
|
|
180
|
+
with sentry_sdk.start_span(op="gen_ai.execute_tool",
|
|
181
|
+
name="execute_tool get_weather") as span:
|
|
182
|
+
span.set_data("gen_ai.tool.name", "get_weather")
|
|
183
|
+
span.set_data("gen_ai.tool.type", "function") # "function"|"extension"|"datastore"
|
|
184
|
+
span.set_data("gen_ai.tool.input", json.dumps({"location": "Paris"}))
|
|
185
|
+
|
|
186
|
+
result = get_weather(location="Paris")
|
|
187
|
+
|
|
188
|
+
span.set_data("gen_ai.tool.output", json.dumps(result))
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### `gen_ai.handoff` — Agent-to-agent transition
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
import sentry_sdk
|
|
195
|
+
|
|
196
|
+
with sentry_sdk.start_span(op="gen_ai.handoff",
|
|
197
|
+
name="handoff Billing → Refund Agent") as span:
|
|
198
|
+
span.set_data("gen_ai.agent.name", "Refund Agent")
|
|
199
|
+
result = refund_agent.run(context=billing_context)
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Span Attribute Reference
|
|
203
|
+
|
|
204
|
+
### Common attributes
|
|
205
|
+
|
|
206
|
+
| Attribute | Type | Required | Description |
|
|
207
|
+
| ----------------------- | ------ | -------- | ---------------------------------------------------- |
|
|
208
|
+
| `gen_ai.request.model` | string | ✅ | Model identifier (e.g., `gpt-4o`, `claude-opus-4-5`) |
|
|
209
|
+
| `gen_ai.operation.name` | string | No | Human-readable operation label |
|
|
210
|
+
| `gen_ai.agent.name` | string | No | Agent name (for agent spans) |
|
|
211
|
+
|
|
212
|
+
### Model config attributes
|
|
213
|
+
|
|
214
|
+
| Attribute | Type |
|
|
215
|
+
| ---------------------------------- | ------ |
|
|
216
|
+
| `gen_ai.request.temperature` | float |
|
|
217
|
+
| `gen_ai.request.max_tokens` | int |
|
|
218
|
+
| `gen_ai.request.top_p` | float |
|
|
219
|
+
| `gen_ai.request.frequency_penalty` | float |
|
|
220
|
+
| `gen_ai.request.presence_penalty` | float |
|
|
221
|
+
| `gen_ai.request.reasoning_effort` | string |
|
|
222
|
+
|
|
223
|
+
### Content attributes (PII-gated — only when `send_default_pii=True` + `include_prompts=True`)
|
|
224
|
+
|
|
225
|
+
| Attribute | Type | Description |
|
|
226
|
+
| -------------------------------- | ------ | ------------------------------------- |
|
|
227
|
+
| `gen_ai.request.messages` | string | **JSON-stringified** message array |
|
|
228
|
+
| `gen_ai.request.available_tools` | string | **JSON-stringified** tool definitions |
|
|
229
|
+
| `gen_ai.response.text` | string | **JSON-stringified** response array |
|
|
230
|
+
| `gen_ai.response.tool_calls` | string | **JSON-stringified** tool call array |
|
|
231
|
+
|
|
232
|
+
> ⚠️ Span attributes only accept primitives — arrays/objects must be JSON-stringified
|
|
233
|
+
> before calling `span.set_data()`.
|
|
234
|
+
|
|
235
|
+
### Token usage attributes
|
|
236
|
+
|
|
237
|
+
| Attribute | Type | Description |
|
|
238
|
+
| --------------------------------------- | ---- | ----------------------------------------- |
|
|
239
|
+
| `gen_ai.usage.input_tokens` | int | Total input tokens (including cached) |
|
|
240
|
+
| `gen_ai.usage.input_tokens.cached` | int | Subset served from cache |
|
|
241
|
+
| `gen_ai.usage.input_tokens.cache_write` | int | Tokens written to cache (Anthropic) |
|
|
242
|
+
| `gen_ai.usage.output_tokens` | int | Total output tokens (including reasoning) |
|
|
243
|
+
| `gen_ai.usage.output_tokens.reasoning` | int | Subset for chain-of-thought reasoning |
|
|
244
|
+
| `gen_ai.usage.total_tokens` | int | Sum of input + output |
|
|
245
|
+
|
|
246
|
+
> ⚠️ Cached and reasoning tokens are **subsets** of totals, not additive.
|
|
247
|
+
> Incorrect reporting produces wrong cost calculations in the dashboard.
|
|
248
|
+
|
|
249
|
+
## Agent Workflow Hierarchy
|
|
250
|
+
|
|
251
|
+
```
|
|
252
|
+
Transaction
|
|
253
|
+
└── gen_ai.invoke_agent "Weather Agent"
|
|
254
|
+
├── gen_ai.request "chat gpt-4o"
|
|
255
|
+
├── gen_ai.execute_tool "get_weather"
|
|
256
|
+
├── gen_ai.request "chat gpt-4o" ← follow-up
|
|
257
|
+
└── gen_ai.handoff "→ Report Writer"
|
|
258
|
+
└── gen_ai.invoke_agent "Report Writer"
|
|
259
|
+
├── gen_ai.request "chat gpt-4o"
|
|
260
|
+
└── gen_ai.execute_tool "format_report"
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
This populates the **AI Agents Dashboard** in Sentry with per-agent latency, tool call
|
|
264
|
+
rates, token consumption, and model cost attribution.
|
|
265
|
+
|
|
266
|
+
### Conversation Tracking
|
|
267
|
+
|
|
268
|
+
Link AI spans across turns in a multi-turn conversation.
|
|
269
|
+
Sentry groups spans by `gen_ai.conversation.id` into a chat-style timeline at **Explore
|
|
270
|
+
\> Conversations**.
|
|
271
|
+
|
|
272
|
+
**Prerequisites:** SDK >=2.64.0 (where `stream_gen_ai_spans` defaults to `True`, so AI
|
|
273
|
+
spans stream as standalone items) and `send_default_pii=True` — Conversations
|
|
274
|
+
reconstructs the chat from input/output attributes, so without PII capture the view will
|
|
275
|
+
be empty.
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
import sentry_sdk.ai
|
|
279
|
+
|
|
280
|
+
# Set at the start of a conversation
|
|
281
|
+
sentry_sdk.ai.set_conversation_id("conv_abc123")
|
|
282
|
+
# All subsequent AI spans carry gen_ai.conversation.id = "conv_abc123"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
Some integrations infer the conversation ID automatically.
|
|
286
|
+
For example, the OpenAI integration picks it up when you use the `conversation`
|
|
287
|
+
parameter:
|
|
288
|
+
|
|
289
|
+
```python
|
|
290
|
+
import openai
|
|
291
|
+
import sentry_sdk
|
|
292
|
+
|
|
293
|
+
sentry_sdk.init(...)
|
|
294
|
+
|
|
295
|
+
conversation = openai.conversations.create()
|
|
296
|
+
response = openai.responses.create(
|
|
297
|
+
model="gpt-5.4",
|
|
298
|
+
input=[{"role": "user", "content": "What are the 5 Ds of dodgeball?"}],
|
|
299
|
+
conversation=conversation.id # automatically sets gen_ai.conversation.id
|
|
300
|
+
)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
A single conversation can span multiple traces, and a single trace can contain multiple
|
|
304
|
+
conversations.
|
|
305
|
+
|
|
306
|
+
### User Attribution
|
|
307
|
+
|
|
308
|
+
To populate the **User** column in Conversations, call `set_user` once per request or
|
|
309
|
+
session before any AI calls:
|
|
310
|
+
|
|
311
|
+
```python
|
|
312
|
+
sentry_sdk.set_user({"id": "user_123", "email": "jane@example.com", "username": "jane"})
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Streaming
|
|
316
|
+
|
|
317
|
+
| Integration | Streaming | Token counts in streams |
|
|
318
|
+
| ----------------- | --------- | -------------------------------------------------------- |
|
|
319
|
+
| OpenAI | ✅ | Requires `tiktoken>=0.3.0`; set `tiktoken_encoding_name` |
|
|
320
|
+
| Anthropic | ✅ | Automatic |
|
|
321
|
+
| LangChain | ✅ | Tracked |
|
|
322
|
+
| LiteLLM | ✅ | Tracked |
|
|
323
|
+
| Manual `gen_ai.*` | ✅ | Set token counts after stream completes |
|
|
324
|
+
|
|
325
|
+
## Unsupported Providers
|
|
326
|
+
|
|
327
|
+
| Provider | Workaround |
|
|
328
|
+
| ----------- | --------------------------------------------------- |
|
|
329
|
+
| Cohere | Use `LiteLLMIntegration` or manual `gen_ai.*` spans |
|
|
330
|
+
| AWS Bedrock | Manual instrumentation |
|
|
331
|
+
| Mistral | `LiteLLMIntegration` |
|
|
332
|
+
| Groq | `LiteLLMIntegration` |
|
|
333
|
+
| Vertex AI | `GoogleGenAIIntegration` or `LiteLLMIntegration` |
|
|
334
|
+
|
|
335
|
+
## Sampling Strategy
|
|
336
|
+
|
|
337
|
+
If your `traces_sample_rate` is below 1.0, you may be losing entire agent runs.
|
|
338
|
+
Use a `traces_sampler` that keeps 100% of gen_ai-related transactions while sampling
|
|
339
|
+
other traffic at a lower rate.
|
|
340
|
+
|
|
341
|
+
## Troubleshooting
|
|
342
|
+
|
|
343
|
+
| Issue | Solution |
|
|
344
|
+
| ----------------------------------------- | -------------------------------------------------------------------------------------- |
|
|
345
|
+
| No AI spans appearing | Verify `traces_sample_rate > 0`; wrap calls in a transaction |
|
|
346
|
+
| Prompts not captured | Set `send_default_pii=True` and verify `include_prompts=True` (default) |
|
|
347
|
+
| LiteLLM not tracked | LiteLLM is NOT auto-enabled — add `LiteLLMIntegration` to `integrations=[]` explicitly |
|
|
348
|
+
| Token counts missing for OpenAI streaming | Install `tiktoken>=0.3.0` and set `tiktoken_encoding_name` |
|
|
349
|
+
| AI Agents Dashboard empty | Wrap agent runs in `gen_ai.invoke_agent` spans |
|
|
350
|
+
| User column shows “Unknown” | Call `sentry_sdk.set_user()` once per request or session |
|
|
351
|
+
| Wrong cost calculations | Ensure cached/reasoning token counts are subsets of totals, not additions |
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# Crons — Sentry Python SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `sentry-sdk` 1.x+ (stable); 1.44.1+ for async `@monitor`; 1.45.0+ for
|
|
4
|
+
> `MonitorConfig` upsert
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
Sentry Crons monitors scheduled jobs by receiving check-ins at job start, success, and
|
|
9
|
+
failure. Three approaches:
|
|
10
|
+
|
|
11
|
+
| Approach | Use when |
|
|
12
|
+
| -------------------------------------------- | ----------------------------------------------- |
|
|
13
|
+
| `@monitor` decorator | Simple wrapping of any function |
|
|
14
|
+
| `capture_checkin()` manually | Need control over timing, status, or heartbeats |
|
|
15
|
+
| `CeleryIntegration(monitor_beat_tasks=True)` | Celery Beat tasks — zero boilerplate |
|
|
16
|
+
|
|
17
|
+
## Code Examples
|
|
18
|
+
|
|
19
|
+
### `@monitor` decorator (simplest)
|
|
20
|
+
|
|
21
|
+
```python
|
|
22
|
+
import sentry_sdk
|
|
23
|
+
from sentry_sdk.crons import monitor
|
|
24
|
+
|
|
25
|
+
@monitor(monitor_slug="nightly-report")
|
|
26
|
+
def generate_report():
|
|
27
|
+
# Sends IN_PROGRESS on start, OK on success, ERROR on exception
|
|
28
|
+
run_report()
|
|
29
|
+
|
|
30
|
+
# Async support (SDK 1.44.1+)
|
|
31
|
+
@monitor(monitor_slug="async-job")
|
|
32
|
+
async def async_task():
|
|
33
|
+
await do_async_work()
|
|
34
|
+
|
|
35
|
+
# Context manager syntax
|
|
36
|
+
def generate_report():
|
|
37
|
+
with monitor(monitor_slug="nightly-report"):
|
|
38
|
+
run_report()
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### `@monitor` with `MonitorConfig` — upsert monitor definition (SDK 1.45.0+)
|
|
42
|
+
|
|
43
|
+
```python
|
|
44
|
+
from sentry_sdk.crons import monitor
|
|
45
|
+
|
|
46
|
+
# Crontab schedule
|
|
47
|
+
@monitor(
|
|
48
|
+
monitor_slug="nightly-report",
|
|
49
|
+
monitor_config={
|
|
50
|
+
"schedule": {"type": "crontab", "value": "0 2 * * *"},
|
|
51
|
+
"timezone": "Europe/Vienna",
|
|
52
|
+
"checkin_margin": 10, # minutes late before MISSED alert
|
|
53
|
+
"max_runtime": 30, # minutes before TIMEOUT alert
|
|
54
|
+
"failure_issue_threshold": 3,
|
|
55
|
+
"recovery_threshold": 3,
|
|
56
|
+
},
|
|
57
|
+
)
|
|
58
|
+
def nightly_report():
|
|
59
|
+
generate_report()
|
|
60
|
+
|
|
61
|
+
# Interval schedule
|
|
62
|
+
@monitor(
|
|
63
|
+
monitor_slug="sync-job",
|
|
64
|
+
monitor_config={
|
|
65
|
+
"schedule": {
|
|
66
|
+
"type": "interval",
|
|
67
|
+
"value": 2,
|
|
68
|
+
"unit": "hour", # minute | hour | day | week | month | year
|
|
69
|
+
},
|
|
70
|
+
"checkin_margin": 5,
|
|
71
|
+
"max_runtime": 20,
|
|
72
|
+
},
|
|
73
|
+
)
|
|
74
|
+
def sync_data():
|
|
75
|
+
sync()
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Manual check-ins with `capture_checkin()`
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
from sentry_sdk.crons import capture_checkin
|
|
82
|
+
from sentry_sdk.crons.consts import MonitorStatus
|
|
83
|
+
|
|
84
|
+
# 1. Signal job started
|
|
85
|
+
check_in_id = capture_checkin(
|
|
86
|
+
monitor_slug="my-cron-job",
|
|
87
|
+
status=MonitorStatus.IN_PROGRESS,
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
run_job()
|
|
92
|
+
|
|
93
|
+
# 2a. Signal success
|
|
94
|
+
capture_checkin(
|
|
95
|
+
monitor_slug="my-cron-job",
|
|
96
|
+
check_in_id=check_in_id, # links back to IN_PROGRESS
|
|
97
|
+
status=MonitorStatus.OK,
|
|
98
|
+
)
|
|
99
|
+
except Exception:
|
|
100
|
+
# 2b. Signal failure
|
|
101
|
+
capture_checkin(
|
|
102
|
+
monitor_slug="my-cron-job",
|
|
103
|
+
check_in_id=check_in_id,
|
|
104
|
+
status=MonitorStatus.ERROR,
|
|
105
|
+
)
|
|
106
|
+
raise
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Heartbeat pattern for long-running jobs
|
|
110
|
+
|
|
111
|
+
```python
|
|
112
|
+
from sentry_sdk.crons import capture_checkin
|
|
113
|
+
from sentry_sdk.crons.consts import MonitorStatus
|
|
114
|
+
import time
|
|
115
|
+
|
|
116
|
+
def long_running_job():
|
|
117
|
+
check_in_id = capture_checkin(
|
|
118
|
+
monitor_slug="data-pipeline",
|
|
119
|
+
status=MonitorStatus.IN_PROGRESS,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
for batch in get_batches():
|
|
123
|
+
process_batch(batch)
|
|
124
|
+
# Send periodic heartbeat to prevent TIMEOUT
|
|
125
|
+
capture_checkin(
|
|
126
|
+
monitor_slug="data-pipeline",
|
|
127
|
+
check_in_id=check_in_id,
|
|
128
|
+
status=MonitorStatus.IN_PROGRESS,
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
capture_checkin(
|
|
132
|
+
monitor_slug="data-pipeline",
|
|
133
|
+
check_in_id=check_in_id,
|
|
134
|
+
status=MonitorStatus.OK,
|
|
135
|
+
)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Celery Beat auto-discovery
|
|
139
|
+
|
|
140
|
+
```python
|
|
141
|
+
import sentry_sdk
|
|
142
|
+
from sentry_sdk.integrations.celery import CeleryIntegration
|
|
143
|
+
|
|
144
|
+
sentry_sdk.init(
|
|
145
|
+
dsn="...",
|
|
146
|
+
integrations=[
|
|
147
|
+
CeleryIntegration(
|
|
148
|
+
monitor_beat_tasks=True, # enables auto-discovery
|
|
149
|
+
exclude_beat_tasks=[
|
|
150
|
+
"some-noisy-task", # exact match
|
|
151
|
+
"health-check-.*", # regex pattern
|
|
152
|
+
],
|
|
153
|
+
),
|
|
154
|
+
],
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
# In celery config — monitor slug = beat schedule entry name
|
|
158
|
+
from celery.schedules import crontab
|
|
159
|
+
|
|
160
|
+
app.conf.beat_schedule = {
|
|
161
|
+
"nightly-cleanup": { # → monitor slug: "nightly-cleanup"
|
|
162
|
+
"task": "tasks.cleanup_old_records",
|
|
163
|
+
"schedule": crontab(hour="1", minute="0"),
|
|
164
|
+
},
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Celery Beat constraints:
|
|
169
|
+
|
|
170
|
+
| Rule | Detail |
|
|
171
|
+
| -------------------- | ------------------------------------------------------------ |
|
|
172
|
+
| Auto-parses | `crontab` schedules only |
|
|
173
|
+
| First-run creation | Monitor created lazily on first task execution |
|
|
174
|
+
| No double-decoration | Don’t use `@monitor` on tasks with `monitor_beat_tasks=True` |
|
|
175
|
+
| Default | `monitor_beat_tasks=False` — must be explicitly enabled |
|
|
176
|
+
|
|
177
|
+
## `MonitorStatus` Reference
|
|
178
|
+
|
|
179
|
+
```python
|
|
180
|
+
from sentry_sdk.crons.consts import MonitorStatus
|
|
181
|
+
|
|
182
|
+
MonitorStatus.IN_PROGRESS # job has started
|
|
183
|
+
MonitorStatus.OK # job completed successfully
|
|
184
|
+
MonitorStatus.ERROR # job failed
|
|
185
|
+
# MISSED and TIMEOUT are generated server-side — not sent by SDK
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## `MonitorConfig` Fields
|
|
189
|
+
|
|
190
|
+
| Field | Type | Required | Description |
|
|
191
|
+
| ------------------------- | ------ | -------- | ------------------------------------------------------------------------------------------------ |
|
|
192
|
+
| `schedule` | `dict` | ✅ | `{"type": "crontab", "value": "* * * * *"}` or `{"type": "interval", "value": N, "unit": "..."}` |
|
|
193
|
+
| `timezone` | `str` | No | IANA timezone name, default `"UTC"` |
|
|
194
|
+
| `checkin_margin` | `int` | No | Minutes late before MISSED alert |
|
|
195
|
+
| `max_runtime` | `int` | No | Minutes after IN_PROGRESS before TIMEOUT |
|
|
196
|
+
| `failure_issue_threshold` | `int` | No | Consecutive failures before opening an issue |
|
|
197
|
+
| `recovery_threshold` | `int` | No | Consecutive successes to resolve an issue |
|
|
198
|
+
|
|
199
|
+
## Best Practices
|
|
200
|
+
|
|
201
|
+
- Use `@monitor` with `monitor_config` so monitors are created automatically on first
|
|
202
|
+
run — no Sentry UI setup needed
|
|
203
|
+
- For Celery Beat, prefer `monitor_beat_tasks=True` over decorating individual tasks
|
|
204
|
+
- Send `IN_PROGRESS` before starting work so TIMEOUT detection starts immediately
|
|
205
|
+
- For jobs longer than `max_runtime`, send periodic `IN_PROGRESS` check-ins as
|
|
206
|
+
heartbeats
|
|
207
|
+
- Sentry enforces a rate limit of **6 check-ins/minute per monitor-environment** —
|
|
208
|
+
excess are dropped silently
|
|
209
|
+
|
|
210
|
+
## Troubleshooting
|
|
211
|
+
|
|
212
|
+
| Issue | Solution |
|
|
213
|
+
| ------------------------------------ | ---------------------------------------------------------------------------------------- |
|
|
214
|
+
| Monitor not created in Sentry | Provide `monitor_config` — monitors are not auto-created without it (unless Celery Beat) |
|
|
215
|
+
| MISSED alerts firing too early | Increase `checkin_margin` to allow for job startup time |
|
|
216
|
+
| TIMEOUT alerts on slow jobs | Increase `max_runtime` or send periodic `IN_PROGRESS` heartbeats |
|
|
217
|
+
| Duplicate check-ins for Celery tasks | Remove `@monitor` decorator from tasks that use `monitor_beat_tasks=True` |
|
|
218
|
+
| Async `@monitor` not working | Upgrade SDK to ≥ 1.44.1 |
|