@danieljvdm/dev-kit 1.0.2 → 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 +2 -33
- package/skill-sources.lock.json +15 -117
- 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 +10 -70
- 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,131 @@
|
|
|
1
|
+
# AI / Agent Monitoring — What & Why
|
|
2
|
+
|
|
3
|
+
## What it is
|
|
4
|
+
|
|
5
|
+
Tracing specialized for LLM apps.
|
|
6
|
+
LLM calls, agent runs, tool calls, and agent-to-agent handoffs are captured as
|
|
7
|
+
`gen_ai.*` spans carrying model, token usage, cost, and latency.
|
|
8
|
+
It is built on [tracing](tracing.md), so tracing must be on
|
|
9
|
+
(`tracesSampleRate`/`traces_sample_rate` > 0) — without spans there is nothing to attach
|
|
10
|
+
`gen_ai` data to.
|
|
11
|
+
|
|
12
|
+
Auto-instrumented for detected AI SDKs on **JavaScript, Python, and Laravel** (OpenAI,
|
|
13
|
+
Anthropic, Vercel AI, LangChain/LangGraph, Google GenAI, HuggingFace, Pydantic AI, and
|
|
14
|
+
Laravel AI; `litellm` needs explicit registration).
|
|
15
|
+
Every other platform is manual `gen_ai.*` instrumentation, or unsupported — the platform
|
|
16
|
+
`index.md` says which.
|
|
17
|
+
|
|
18
|
+
**Auto-instrumentation is runtime-dependent, not just language-dependent.** It patches
|
|
19
|
+
the AI client at require/import time, so it only applies on a patchable runtime.
|
|
20
|
+
On workerd (Cloudflare Workers) and in browser/client-side code there is nothing to
|
|
21
|
+
patch — those need build-time instrumentation (the Cloudflare Vite plugin) or a manual
|
|
22
|
+
client wrapper (`Sentry.instrumentOpenAiClient` and friends).
|
|
23
|
+
Check the platform’s `ai-monitoring.md` before assuming “it’s JavaScript, so it’s
|
|
24
|
+
automatic”.
|
|
25
|
+
|
|
26
|
+
## What the artifact shows
|
|
27
|
+
|
|
28
|
+
A trace _is_ the agent run: a `gen_ai.invoke_agent` span parents the `gen_ai.chat` (LLM
|
|
29
|
+
call), `gen_ai.execute_tool`, and `gen_ai.handoff` children it triggered.
|
|
30
|
+
Read cost and latency off the child spans’ token attributes.
|
|
31
|
+
Two views surface it: the **AI Agents** dashboard and **Explore > Conversations**.
|
|
32
|
+
|
|
33
|
+
The span `op` is `gen_ai.{operation}` — `chat`, `embeddings`, `generate_content`,
|
|
34
|
+
`text_completion` for calls, plus `invoke_agent`, `execute_tool`, `handoff`. The span
|
|
35
|
+
**name** repeats the operation with its subject: `chat gpt-4o`,
|
|
36
|
+
`invoke_agent Weather Agent`, `execute_tool get_weather`,
|
|
37
|
+
`handoff from triage to billing`. Attributes accept primitives only; arrays/objects are
|
|
38
|
+
JSON-stringified. The canonical attribute set lives under
|
|
39
|
+
`references/semantics/gen_ai.md` in skills that hydrate semantic conventions (see the
|
|
40
|
+
instrument skill’s Semantic conventions list).
|
|
41
|
+
The SDK docs can lag, and deprecated attributes are omitted from that reference on
|
|
42
|
+
purpose.
|
|
43
|
+
|
|
44
|
+
## Conversations
|
|
45
|
+
|
|
46
|
+
Conversations groups spans by `gen_ai.conversation.id` into a chat-style timeline.
|
|
47
|
+
A conversation can span multiple traces (a page refresh mid-chat), and one trace can
|
|
48
|
+
hold spans from multiple conversations — the two are independent.
|
|
49
|
+
|
|
50
|
+
**Conversation ID format matters:** use a short, opaque identifier — alphanumeric with
|
|
51
|
+
dashes or underscores only (a UUID, or a prefixed id like `conv_5j66Up…`). Never use a
|
|
52
|
+
URL, email, or other free-form text: Sentry uses the id as a URL path segment, so a
|
|
53
|
+
value containing a slash breaks Conversations for that session.
|
|
54
|
+
Some integrations infer the id automatically (Python OpenAI Agents, Node OpenAI, Laravel
|
|
55
|
+
AI agents using `Conversational` + `RemembersConversations`); everything else sets it
|
|
56
|
+
explicitly. The view also needs input/output capture and gen_ai span streaming (both on
|
|
57
|
+
by default on recent JS/Python SDKs; Laravel AI spans are emitted directly) or it
|
|
58
|
+
renders empty, and a `setUser`/`set_user` call to populate the User column where
|
|
59
|
+
supported.
|
|
60
|
+
|
|
61
|
+
## Token accounting (avoid negative costs)
|
|
62
|
+
|
|
63
|
+
Sentry computes cost from token attributes, and cached/reasoning counts are **subsets**
|
|
64
|
+
of the totals, not separate buckets: `gen_ai.usage.input_tokens` already includes
|
|
65
|
+
`.input_tokens.cached`, and `gen_ai.usage.output_tokens` already includes
|
|
66
|
+
`.output_tokens.reasoning`. Reporting a subset larger than its total makes Sentry
|
|
67
|
+
subtract past zero and show a negative cost.
|
|
68
|
+
|
|
69
|
+
## Input/output message shape
|
|
70
|
+
|
|
71
|
+
`gen_ai.input.messages` and `gen_ai.output.messages` are JSON-stringified arrays of
|
|
72
|
+
`{role, parts}`, where each part is `{type, content}` — part types include `text`,
|
|
73
|
+
`reasoning`, `tool_call`, and `tool_call_response`.
|
|
74
|
+
|
|
75
|
+
Extended thinking (Anthropic `thinking`, Gemini `thought`, DeepSeek `reasoning_content`)
|
|
76
|
+
belongs in a **`reasoning` part, never folded into a `text` part**: Sentry surfaces
|
|
77
|
+
reasoning separately and filters it out of the user-facing Conversations view, so
|
|
78
|
+
thinking passed as `text` shows up as if the model said it.
|
|
79
|
+
When prior thinking is fed back into a multi-turn request, keep those same `reasoning`
|
|
80
|
+
parts in the assistant messages inside `gen_ai.input.messages`.
|
|
81
|
+
|
|
82
|
+
The system prompt is separate from the messages — it goes in
|
|
83
|
+
`gen_ai.system_instructions` — as is the tool catalog offered to the model,
|
|
84
|
+
`gen_ai.tool.definitions`. Both are model input and carry the same PII weight as the
|
|
85
|
+
messages.
|
|
86
|
+
|
|
87
|
+
## PII
|
|
88
|
+
|
|
89
|
+
Prompts and model outputs are user content and are **likely PII**. JavaScript captures
|
|
90
|
+
input/output by default (governed by `dataCollection.genAI`); Python gates it behind
|
|
91
|
+
`send_default_pii=True`; Laravel gates it behind `SENTRY_SEND_DEFAULT_PII=true`. Confirm
|
|
92
|
+
the privacy policy and regulations allow it and **ask the user before enabling capture**
|
|
93
|
+
— see [data-scrubbing.md](data-scrubbing.md).
|
|
94
|
+
|
|
95
|
+
## Setup essentials
|
|
96
|
+
|
|
97
|
+
- Tracing must be on; then detect the AI SDK and let auto-instrumentation handle it
|
|
98
|
+
(JS/Python/Laravel AI), or instrument `gen_ai.*` spans manually.
|
|
99
|
+
- Sample AI traces at **100%** — see Sampling below.
|
|
100
|
+
- Set a `gen_ai.conversation.id` wherever multi-turn chats need grouping.
|
|
101
|
+
|
|
102
|
+
## Sampling
|
|
103
|
+
|
|
104
|
+
An agent run is one span tree and the sampling decision is made at the **root**;
|
|
105
|
+
children inherit it unconditionally.
|
|
106
|
+
Drop the root and every `gen_ai` child goes with it — so at any rate below 1.0 you lose
|
|
107
|
+
whole agent runs, not a fraction of each.
|
|
108
|
+
Which root depends on the app:
|
|
109
|
+
|
|
110
|
+
- **The `gen_ai` span is itself the root** (cron job, queue consumer, CLI): the sampler
|
|
111
|
+
function sees the `gen_ai.*` op directly — match on it and return 1.0.
|
|
112
|
+
- **The `gen_ai` spans hang off an HTTP transaction** (most web apps): the sampler never
|
|
113
|
+
runs for them, because the request was already sampled before any AI code executed.
|
|
114
|
+
Keep the AI-serving routes at 1.0 instead.
|
|
115
|
+
|
|
116
|
+
If AI is the core product, skip the sampler and keep tracing at 1.0 outright.
|
|
117
|
+
|
|
118
|
+
**Read the app’s current rate before changing it, and ask.** If tracing is below 1.0
|
|
119
|
+
with no sampler configured, say what the current rate is and what a dropped root costs,
|
|
120
|
+
then wait for an answer — raising trace volume is the user’s cost decision, the same as
|
|
121
|
+
the PII gate above.
|
|
122
|
+
|
|
123
|
+
When 100% tracing isn’t affordable, metrics and logs are sampled independently of
|
|
124
|
+
traces: emit token counts and per-call log records on every LLM call to keep full
|
|
125
|
+
cost/usage coverage alongside sampled traces.
|
|
126
|
+
|
|
127
|
+
## Related
|
|
128
|
+
|
|
129
|
+
- [`tracing.md`](tracing.md) — AI monitoring is tracing; spans are the substrate.
|
|
130
|
+
- [`data-scrubbing.md`](data-scrubbing.md) — prompt/output capture is the PII decision.
|
|
131
|
+
- [`reduce-volume.md`](reduce-volume.md) — the volume/cost tradeoff across signals.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Choosing a signal
|
|
2
|
+
|
|
3
|
+
Sentry captures several distinct **signals**. They are not interchangeable.
|
|
4
|
+
Picking the right one is the single most important instrumentation decision, and the
|
|
5
|
+
wrong one is the most common waste of quota.
|
|
6
|
+
Decide by the question you are trying to answer.
|
|
7
|
+
|
|
8
|
+
| You want to know… | Reach for | Why |
|
|
9
|
+
| --------------------------------------------------------------------------------------------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------- |
|
|
10
|
+
| _Something broke — what, where, and why?_ | **Error** | An exception/crash with a stack trace, grouped into an issue. The default, always-on signal. |
|
|
11
|
+
| _Why is this slow? What’s the chain of calls? Did the request flow through the system as expected?_ | **Span / trace** | Timing and structure of a request across services (distributed tracing). Powers performance-issue detection (N+1, slow DB). |
|
|
12
|
+
| _What happened leading up to this?_ | **Log** | A searchable, structured, trace-connected record of discrete events. Narrative context, not timing. |
|
|
13
|
+
| _How many / how much / what’s the trend over time?_ | **Metric** | An aggregate number (counter / gauge / distribution) for a KPI you watch and alert on. |
|
|
14
|
+
| _Which exact function/line is burning CPU?_ | **Profile** | Code-level sampling under a traced transaction. Requires tracing on. |
|
|
15
|
+
| _What did the user actually see and do?_ | **Session Replay** | A video-like reproduction of a frontend/mobile session around an error or UX problem. |
|
|
16
|
+
| _What does the user think went wrong?_ | **User Feedback** | A qualitative report from a human, linked to the surrounding context. |
|
|
17
|
+
| _Did my scheduled job run on time?_ | **Cron monitor** | Check-ins that detect missed, late, or failed recurring jobs. |
|
|
18
|
+
|
|
19
|
+
Most of these signals carry the same **trace ID**, so once one surfaces a problem you
|
|
20
|
+
can pivot to the others in the same request — the trace is the connective tissue that
|
|
21
|
+
ties errors, spans, logs, replays, and metrics together for debugging.
|
|
22
|
+
|
|
23
|
+
## Comparisons
|
|
24
|
+
|
|
25
|
+
- **Error vs. log.** An exception your code can’t handle is an **error** (capture it as
|
|
26
|
+
one — it groups into an issue and gets a stack trace).
|
|
27
|
+
A noteworthy thing that happened but isn’t a failure is a **log**. Don’t log-spam
|
|
28
|
+
things that should be errors; don’t capture routine events as errors and pollute the
|
|
29
|
+
issue stream.
|
|
30
|
+
- **Log vs. span.** A log answers _what happened_; a span answers _how long it took and
|
|
31
|
+
what it called_. If you find yourself logging start/end timestamps to measure
|
|
32
|
+
duration, you want a span instead.
|
|
33
|
+
- **Span vs. metric.** A span is one sampled instance of an operation (great for “show me
|
|
34
|
+
a slow request”). An **Application Metric** is a numeric measurement aggregated over
|
|
35
|
+
all occurrences at query time (great for “alert when p95 latency exceeds 500ms”) and,
|
|
36
|
+
unlike a traditional metric, can carry high-cardinality attributes.
|
|
37
|
+
- **Metric vs. counting events.** Don’t emit a custom metric for something Sentry already
|
|
38
|
+
derives from errors/spans (issue counts, throughput, latency percentiles, crash-free
|
|
39
|
+
rate). Reserve custom metrics for **business/operational KPIs** Sentry can’t see —
|
|
40
|
+
`checkout.failed`, `queue.depth`, `cache.hit_ratio`.
|
|
41
|
+
- **Profile rides on tracing.** Profiling is not a standalone signal — it samples
|
|
42
|
+
_inside_ traced transactions.
|
|
43
|
+
Tracing must be on first.
|
|
44
|
+
|
|
45
|
+
## What to instrument where
|
|
46
|
+
|
|
47
|
+
- **Errors:** everywhere, always.
|
|
48
|
+
This is the baseline and the first thing to get working.
|
|
49
|
+
- **Tracing:** the request **boundaries** first — incoming HTTP, outbound HTTP, DB /
|
|
50
|
+
cache / queue. Auto-instrumentation covers most of these once tracing is on.
|
|
51
|
+
Add custom spans only for meaningful business operations.
|
|
52
|
+
- **Logging:** a few high-signal events per request with structured attributes — not a
|
|
53
|
+
firehose.
|
|
54
|
+
- **Metrics:** a small, deliberate set of KPIs that map to a real decision or alert.
|
|
55
|
+
- **Replay:** frontend (and mobile) only; high sampling on errors, low on normal
|
|
56
|
+
sessions.
|
|
57
|
+
- **Crons:** every scheduled job whose silent failure would hurt.
|
|
58
|
+
|
|
59
|
+
When the user is unsure, ask what question they’re trying to answer and map it with the
|
|
60
|
+
table above. When they say “set it up properly” / “you pick the defaults,” lean on the
|
|
61
|
+
recommended baseline: **errors + tracing at a modest sample rate + releases + source
|
|
62
|
+
maps**, then add logs/replay/profiling as the use case warrants.
|
|
63
|
+
|
|
64
|
+
## Cross-cutting concepts (not signals)
|
|
65
|
+
|
|
66
|
+
These shape how the signals above behave and how you act on them — each has its own
|
|
67
|
+
reference:
|
|
68
|
+
|
|
69
|
+
- **Releases** — tie every event to a deployed version.
|
|
70
|
+
Unlocks regression detection, crash-free rates, suspect commits, and
|
|
71
|
+
resolve-in-next-release.
|
|
72
|
+
- **Monitors → Issues → Alerts** — Sentry’s detection-and-response model.
|
|
73
|
+
_Monitors_ decide when a signal becomes an **issue**; _Alerts_ act on issues.
|
|
74
|
+
- **Data scrubbing / PII** — what’s sensitive, and the defense-in-depth model for
|
|
75
|
+
keeping it out.
|
|
76
|
+
- **Volume & cost** — what to keep vs.
|
|
77
|
+
drop, and where to sample.
|
|
78
|
+
- **Search query language** — the `key:value` grammar shared by every query surface.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Cron / Scheduled-Job Monitoring — What & Why
|
|
2
|
+
|
|
3
|
+
Monitoring for recurring jobs — cron jobs, scheduled tasks, queue workers.
|
|
4
|
+
Sentry watches for runs that are **missed**, **late**, **timed out**, or **failed** and
|
|
5
|
+
turns those into issues.
|
|
6
|
+
It works via **check-ins**: the job reports `in_progress` when it starts and
|
|
7
|
+
`ok`/`error` when it finishes; a run that never checks in (or checks in late) is flagged
|
|
8
|
+
against the monitor’s schedule.
|
|
9
|
+
|
|
10
|
+
Reach for it where **silent failure is dangerous** — a nightly billing run, a data sync,
|
|
11
|
+
a backup — and “it didn’t run” is as bad as “it crashed.”
|
|
12
|
+
|
|
13
|
+
## Why a cron issue often isn’t where you’d look
|
|
14
|
+
|
|
15
|
+
- **A “missed” issue frequently isn’t in the job code.** Missed means no check-in
|
|
16
|
+
arrived in the expected window — commonly the **scheduler** (misconfigured, skipped,
|
|
17
|
+
never started the job), a **network** problem (outbound firewall, flaky connection),
|
|
18
|
+
or a timeout. Don’t assume the job body threw.
|
|
19
|
+
- **The real exception is a separate error event on the same trace.** If the SDK is
|
|
20
|
+
configured, errors thrown during the run are captured as normal error events and tied
|
|
21
|
+
back to the check-in through the run’s trace — follow the trace from the cron issue to
|
|
22
|
+
find them.
|
|
23
|
+
- **Issue creation is threshold-gated,** not per-failure: `failure_issue_threshold` (N
|
|
24
|
+
consecutive failures before an issue opens) and `recovery_threshold` (N consecutive
|
|
25
|
+
OKs before it resolves).
|
|
26
|
+
A single failure may not create an issue.
|
|
27
|
+
- **Absence of alerts ≠ healthy.** A monitor broken for weeks gets auto-muted — it stops
|
|
28
|
+
producing issues and notifications while billing continues.
|
|
29
|
+
A silent monitor may be muted, not passing.
|
|
30
|
+
|
|
31
|
+
## Setup essentials
|
|
32
|
+
|
|
33
|
+
- **Monitor config is data** (server-side): the schedule (crontab — 5-field only — or
|
|
34
|
+
interval), the **`timezone`**, **`checkin_margin`** (how late counts as missed), and
|
|
35
|
+
**`max_runtime`** (how long counts as hung).
|
|
36
|
+
Set the last two to the job’s real timing — tight enough to catch a hang, loose enough
|
|
37
|
+
to avoid false alarms.
|
|
38
|
+
- **Check-ins are code** (SDK-side).
|
|
39
|
+
Paths: the SDK **`withMonitor` / decorator** wrapper (cleanest when an SDK is present
|
|
40
|
+
— sends both start and outcome), an **HTTP check-in** (any language, ideal for shell
|
|
41
|
+
crontabs), or **`sentry-cli`** wrapping a shell command.
|
|
42
|
+
Wrap the **whole job** so both success and failure report; a bare heartbeat (single
|
|
43
|
+
`ok`/`error`) detects _missed_ but not _`max_runtime`_ timeouts.
|
|
44
|
+
- **Use a stable, descriptive slug** (`nightly-invoice-sync`, not `job-1`) — it’s the
|
|
45
|
+
check-in key, so slug churn on every deploy orphans monitors.
|
|
46
|
+
|
|
47
|
+
## Related
|
|
48
|
+
|
|
49
|
+
- [`monitors.md`](monitors.md) — a cron monitor is one kind of Monitor that creates
|
|
50
|
+
issues.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Data Scrubbing / PII — Strategy
|
|
2
|
+
|
|
3
|
+
Controlling what personal or sensitive data reaches (and is stored by) Sentry — a common
|
|
4
|
+
GDPR / PCI / SOC2 requirement, or just not wanting tokens in your error tracker.
|
|
5
|
+
Treat as sensitive: emails, names, IPs, user IDs that map to people, full
|
|
6
|
+
request/response **bodies**, **headers** (auth tokens, cookies, session IDs), query
|
|
7
|
+
strings with tokens, passwords, and anything regulated.
|
|
8
|
+
When in doubt, assume a field is sensitive.
|
|
9
|
+
|
|
10
|
+
## Defense in depth — two layers, both
|
|
11
|
+
|
|
12
|
+
1. **SDK-side (before data leaves the app)** — the strongest guarantee; data you never
|
|
13
|
+
send can’t leak.
|
|
14
|
+
- `sendDefaultPii` controls whether the SDK attaches request/user PII automatically
|
|
15
|
+
(default off).
|
|
16
|
+
- `beforeSend` / `beforeSendTransaction` hooks strip, redact, or drop fields on every
|
|
17
|
+
event.
|
|
18
|
+
2. **Server-side (Sentry, the backstop)** — data-scrubbing rules scrub on ingest
|
|
19
|
+
(Safe/Sensitive field lists + an advanced selector rules engine).
|
|
20
|
+
On by default.
|
|
21
|
+
|
|
22
|
+
Scrub at the earliest layer you can; keep the server-side rules as a backstop, because
|
|
23
|
+
you’ll eventually capture something you didn’t anticipate.
|
|
24
|
+
|
|
25
|
+
## AI/LLM attributes (`gen_ai.*`)
|
|
26
|
+
|
|
27
|
+
**Prompt and completion attributes (`gen_ai.input.messages`, `gen_ai.output.messages`,
|
|
28
|
+
`gen_ai.tool.call.*`, …) are not scrubbed by the default server-side rules.** Their
|
|
29
|
+
capture is itself opt-in (only when PII capture is enabled), but _once captured they
|
|
30
|
+
aren’t redacted_ — so if you instrument an LLM app, explicitly scrub them with an
|
|
31
|
+
advanced rule (`$span.data.'<attribute>'`) or disable their capture.
|
|
32
|
+
|
|
33
|
+
## Verify, don’t assume
|
|
34
|
+
|
|
35
|
+
Trigger an event and confirm the sensitive fields are absent/redacted in the event
|
|
36
|
+
detail. Logs and replay/screenshots are the easiest leaks — pair with
|
|
37
|
+
[`logging.md`](logging.md) and [`session-replay.md`](session-replay.md).
|
|
38
|
+
|
|
39
|
+
## Related
|
|
40
|
+
|
|
41
|
+
- [`logging.md`](logging.md)
|
|
42
|
+
- [`session-replay.md`](session-replay.md)
|
|
43
|
+
- [`reduce-volume.md`](reduce-volume.md)
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Error monitoring
|
|
2
|
+
|
|
3
|
+
Unhandled exceptions and crashes — plus anything you send explicitly with
|
|
4
|
+
`captureException` — grouped into **issues** with the context needed to fix them: a
|
|
5
|
+
stack trace, breadcrumbs (the events leading up to the error), and request/user/release
|
|
6
|
+
metadata. An issue is the unit you triage, assign, resolve, and link a fix to.
|
|
7
|
+
|
|
8
|
+
## What an issue actually is
|
|
9
|
+
|
|
10
|
+
- An **issue is a group of events** sharing a fingerprint (stack trace + exception
|
|
11
|
+
type/message), not a single occurrence.
|
|
12
|
+
Sentry surfaces one **representative event** — the one richest in context, which is
|
|
13
|
+
not necessarily the latest — so you reason about the group and drill into an event for
|
|
14
|
+
specifics.
|
|
15
|
+
- **The cause isn’t always in the stack trace.** Suspect commits tie the issue to the
|
|
16
|
+
commit that likely introduced it, and a **trace-related issue** points to a
|
|
17
|
+
_different_ issue in the same request that may be the real origin — the crash you’re
|
|
18
|
+
looking at can be a downstream symptom.
|
|
19
|
+
- **When one bug shows up as several issues (or several bugs as one), that’s a grouping
|
|
20
|
+
problem** — the fingerprint is tunable, not something to live with.
|
|
21
|
+
|
|
22
|
+
## What makes an error actionable
|
|
23
|
+
|
|
24
|
+
- **A readable stack trace** — minified JS or unsymbolicated native frames make an issue
|
|
25
|
+
nearly useless; readable frames depend on source maps (JS) or debug symbols
|
|
26
|
+
(native/mobile) being uploaded.
|
|
27
|
+
- **`release` and `environment` tags** — unlock regression detection,
|
|
28
|
+
resolve-in-next-release, and separating prod from staging noise.
|
|
29
|
+
Set them from the start.
|
|
30
|
+
- **Context, not PII** — tags, user IDs, and breadcrumbs make an error diagnosable;
|
|
31
|
+
scrub sensitive data before it leaves the app
|
|
32
|
+
([`data-scrubbing.md`](data-scrubbing.md)).
|
|
33
|
+
- **Not routine control flow** — expected 404s and validation rejections aren’t errors;
|
|
34
|
+
capturing them buries the real problems.
|
|
35
|
+
|
|
36
|
+
## Related
|
|
37
|
+
|
|
38
|
+
- [`tracing.md`](tracing.md)
|
|
39
|
+
- [`releases.md`](releases.md)
|
|
40
|
+
- [`data-scrubbing.md`](data-scrubbing.md)
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Structured Logging — What & Why
|
|
2
|
+
|
|
3
|
+
Structured, trace-connected logs: each log carries a level, a message, and key/value
|
|
4
|
+
**attributes**, and Sentry automatically attaches the trace ID so it correlates with the
|
|
5
|
+
spans, errors, and other logs in the same request.
|
|
6
|
+
Logs record the context and decisions that explain _what happened_ during execution —
|
|
7
|
+
the context a stack trace alone can’t give.
|
|
8
|
+
|
|
9
|
+
## When to reach for a log
|
|
10
|
+
|
|
11
|
+
- **Not for timing or flow** — that’s a span / trace.
|
|
12
|
+
- **Not for unexpected critical failures** — that’s an error (it groups into an issue
|
|
13
|
+
with a stack trace).
|
|
14
|
+
A log is for noteworthy-but-handled events: a runtime decision (a feature flag served
|
|
15
|
+
a different path), an audit or business event (created / updated / deleted /
|
|
16
|
+
permission changed), a summary of a multi-step operation, or context around a
|
|
17
|
+
_recoverable_ failure (a retry before the final attempt, a non-critical upstream that
|
|
18
|
+
failed).
|
|
19
|
+
- **Not for every function call** — high-frequency line-spam is noise and billed volume.
|
|
20
|
+
A log should answer a concrete production question and still be useful if emitted
|
|
21
|
+
thousands of times.
|
|
22
|
+
|
|
23
|
+
## Structure
|
|
24
|
+
|
|
25
|
+
- **Consistent key/value attributes, not interpolation.** Namespace them
|
|
26
|
+
(`myapp.<domain>.<field>`) and reuse field names across the app so events can be
|
|
27
|
+
searched and aggregated.
|
|
28
|
+
A good log answers who did it, what happened, and when.
|
|
29
|
+
Attributes are what you query — `severity:error`, `trace_id:...`, `user.id:...` with
|
|
30
|
+
`AND`/`OR` (the level field is `severity` in search); raw text search matches only the
|
|
31
|
+
message, so anything you want to filter on must be an attribute.
|
|
32
|
+
- **Agree conventions once, across services.** Decide the attribute namespacing,
|
|
33
|
+
event-name phrasing, and levels up front so logs from every language and service can
|
|
34
|
+
be searched and correlated together.
|
|
35
|
+
On both sides of a call that propagates trace headers (`baggage` / `sentry-trace`),
|
|
36
|
+
use the same attribute names so a single trace reads coherently across services.
|
|
37
|
+
- **Accumulate context as a request evolves** — early logs may carry only request info;
|
|
38
|
+
later ones add the authenticated user, feature flags, and outcomes.
|
|
39
|
+
Prefer the SDK’s `set_user` over repeating a user ID on every log.
|
|
40
|
+
- **Levels carry meaning:** `debug` (temporary diagnostics), `info` (normal events),
|
|
41
|
+
`warn` (recoverable but notable), `error` (handled failures).
|
|
42
|
+
For anything critical — or that should group into an issue with a stack trace —
|
|
43
|
+
capture a real Sentry **error** event, not a log.
|
|
44
|
+
On the `error`-level logs you do keep, include what explains the failure: retry count,
|
|
45
|
+
the response status and key non-sensitive request/response fields for external calls,
|
|
46
|
+
and the runtime decisions that led there.
|
|
47
|
+
- **Log fields, not whole objects** — pick the fields you’ll query and omit absent
|
|
48
|
+
optional attributes rather than logging `null`.
|
|
49
|
+
- Sentry can integrate with an existing logging abstraction (Monolog, slog, Rails
|
|
50
|
+
logger, Pino/console) or you can call the SDK’s logger directly.
|
|
51
|
+
|
|
52
|
+
## Don’t log sensitive data
|
|
53
|
+
|
|
54
|
+
Assume anything logged will be read by another human.
|
|
55
|
+
Never log passwords, tokens, or API keys; prefer opaque user IDs over emails or names,
|
|
56
|
+
and mind PCI / GDPR / CCPA / HIPAA-regulated fields.
|
|
57
|
+
Large raw payloads — a full LLM prompt/response, a webhook or HTTP body — have
|
|
58
|
+
legitimate debugging uses, but users put personal data in prompts and bodies carry
|
|
59
|
+
secrets, so weigh the cost and risk and prefer logging the specific fields you’ll query
|
|
60
|
+
over the whole payload.
|
|
61
|
+
Server-side scrubbing is a backstop, not a license to log carelessly
|
|
62
|
+
([`data-scrubbing.md`](data-scrubbing.md)).
|
|
63
|
+
|
|
64
|
+
## Is a log worth keeping?
|
|
65
|
+
|
|
66
|
+
Review each log you add or change, and drop any that can’t answer yes to all of these:
|
|
67
|
+
|
|
68
|
+
- **Production question** — what concrete production question does it answer?
|
|
69
|
+
- **Useful at volume** — would it still help if emitted thousands of times?
|
|
70
|
+
- **Right signal** — is it better as a span, a metric, or a real Sentry error?
|
|
71
|
+
- **Not already covered** — does an exception, an existing log, or a shared API/client
|
|
72
|
+
wrapper already capture it?
|
|
73
|
+
- **Consistent** — do its event name and attributes follow the app’s conventions?
|
|
74
|
+
- **Safe** — no PII, secrets, raw payloads, or unstable exception-message text?
|
|
75
|
+
- **Actionable** — would seeing it change how someone investigates or responds?
|
|
76
|
+
|
|
77
|
+
For each log you keep, be able to say: _“This log is valuable because it helps answer
|
|
78
|
+
<specific question>.”_ Drop logs that merely confirm a routine UI interaction, duplicate
|
|
79
|
+
a generic API failure, or record an expected validation failure without adding context.
|
|
80
|
+
|
|
81
|
+
## Related
|
|
82
|
+
|
|
83
|
+
- [`data-scrubbing.md`](data-scrubbing.md)
|
|
84
|
+
- [`reduce-volume.md`](reduce-volume.md)
|
|
85
|
+
- [`search-query-language.md`](../search-query-language.md) — querying logs.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Application Metrics — What & Why
|
|
2
|
+
|
|
3
|
+
**Application Metrics** are numeric values you emit and watch over time, trace-connected
|
|
4
|
+
so a spike on a chart links back to the producing traces.
|
|
5
|
+
Unlike traditional (StatsD-style) metrics they support high cardinality and
|
|
6
|
+
dimensionality — a key difference that changes how you instrument them (see below).
|
|
7
|
+
Three types, picked by the question:
|
|
8
|
+
|
|
9
|
+
| Type | Answers | Example |
|
|
10
|
+
| ---------------- | ---------------------------------- | ------------------------------------- |
|
|
11
|
+
| **count** | _How many?_ | `checkout.failed`, `signup.completed` |
|
|
12
|
+
| **gauge** | _What’s the value now?_ | `queue.depth`, `connections.active` |
|
|
13
|
+
| **distribution** | _What’s the spread (p50/p95/max)?_ | `api.latency`, `payload.size` |
|
|
14
|
+
|
|
15
|
+
## What Application Metrics excel at
|
|
16
|
+
|
|
17
|
+
They answer _how many / how much / what’s the trend_ — the aggregate view you alert and
|
|
18
|
+
build dashboards on, where the other signals don’t fit: tracing is for request
|
|
19
|
+
performance and flow, logging for runtime decisions and audit trails, errors for
|
|
20
|
+
critical failures. A metric tells you _that_ something moved, not _why_ — and because
|
|
21
|
+
Application Metrics are trace-connected, you pivot from a point on the chart to its
|
|
22
|
+
samples and the traces behind them to find the cause.
|
|
23
|
+
|
|
24
|
+
## Setup essentials
|
|
25
|
+
|
|
26
|
+
- **Don’t re-invent what Sentry derives** — issue counts, throughput, latency
|
|
27
|
+
percentiles, and crash-free rate come from errors/spans for free.
|
|
28
|
+
Reserve Application Metrics for KPIs Sentry can’t see: conversion, business failures,
|
|
29
|
+
saturation, cache-hit ratio.
|
|
30
|
+
- **A KPI already sitting in your logs is a candidate to promote to a metric** — a log
|
|
31
|
+
is an ephemeral signal optimized for search; a metric is a durable, review-worthy code
|
|
32
|
+
artifact optimized for alerting and dashboards.
|
|
33
|
+
- **High cardinality and dimensionality are fine — and a key benefit.** Unlike
|
|
34
|
+
traditional metrics, Application Metrics can carry high-cardinality attributes (user
|
|
35
|
+
IDs, request IDs, URLs); don’t force low-cardinality attributes the way you would with
|
|
36
|
+
a StatsD-style metric or you’ll throw away useful signal.
|
|
37
|
+
Set **units** on distributions (ms, bytes) and name consistently
|
|
38
|
+
(`domain.thing.action`).
|
|
39
|
+
- Values are emitted **per occurrence and aggregated at query time** (not a client-side
|
|
40
|
+
pre-aggregate).
|
|
41
|
+
- The old beta `Sentry.metrics.increment` / StatsD-style API was **removed in SDK v9** —
|
|
42
|
+
use the current `count` / `gauge` / `distribution` API (the exact surface varies by
|
|
43
|
+
platform).
|
|
44
|
+
|
|
45
|
+
## Related
|
|
46
|
+
|
|
47
|
+
- [`monitors.md`](monitors.md) — a Metric Monitor can alert on an Application Metric (it
|
|
48
|
+
can also watch logs, spans, or errors — it isn’t metrics-specific).
|
|
49
|
+
- [`tracing.md`](tracing.md) — Application Metrics complement, don’t replace, spans.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# Monitors → Issues → Alerts — The Model
|
|
2
|
+
|
|
3
|
+
Sentry separates **what you detect** from **what you do about it**, in three stages —
|
|
4
|
+
**Monitors** detect, **Issues** are the unit you triage, and **Alerts** respond:
|
|
5
|
+
|
|
6
|
+
- A **Monitor** decides _when_ a signal becomes an **issue**.
|
|
7
|
+
- An **Issue** is the unit you triage — a grouped, stateful object (status, priority,
|
|
8
|
+
assignee, history).
|
|
9
|
+
- An **Alert** decides _what to do_ once an issue matches its conditions — notify Slack,
|
|
10
|
+
page someone, open a ticket, hit a webhook.
|
|
11
|
+
|
|
12
|
+
Monitors detect; Alerts respond.
|
|
13
|
+
They’re configured independently: one alert can watch many monitors/projects, and one
|
|
14
|
+
monitor can feed several alerts.
|
|
15
|
+
|
|
16
|
+
> Terminology: this model uses **Metric Monitor** for the detection stage and reserves
|
|
17
|
+
> **Alert** for the response stage.
|
|
18
|
+
> Older docs and integrations still say “metric **alert**” for the same detection
|
|
19
|
+
> concept — treat them as the same thing; the rename isn’t fully settled across the
|
|
20
|
+
> product.
|
|
21
|
+
|
|
22
|
+
## Monitors — when a signal becomes an issue
|
|
23
|
+
|
|
24
|
+
- **Default monitors** — auto-created per project: the **Issue Stream Monitor** and
|
|
25
|
+
**Error Monitor** (the error-detection / grouping pipeline).
|
|
26
|
+
Nothing to set up; worth knowing they’re “monitors” in this model.
|
|
27
|
+
- **Custom monitors:**
|
|
28
|
+
- **Metric Monitor** — a threshold on errors / spans / logs / releases / Application
|
|
29
|
+
Metrics; the threshold can be **fixed**, a **percentage change** vs.
|
|
30
|
+
a prior window, or **dynamic anomaly detection**. Often created straight from a
|
|
31
|
+
saved Discover or Metrics-Explorer query.
|
|
32
|
+
- **Cron Monitor** — a scheduled-job watch via check-ins ([`crons.md`](crons.md)).
|
|
33
|
+
- **Uptime Monitor** — periodic HTTP checks against a URL.
|
|
34
|
+
- **Mobile Builds Monitor** — app-size thresholds across iOS/Android builds.
|
|
35
|
+
|
|
36
|
+
**Monitor config also sets issue attributes at creation** — priority, auto-resolve, and
|
|
37
|
+
assignee (ownership rules can override the assignee).
|
|
38
|
+
The monitor decides not just _that_ something becomes an issue but _how important_ it is
|
|
39
|
+
and _who owns it_.
|
|
40
|
+
|
|
41
|
+
## Alerts — acting on issues
|
|
42
|
+
|
|
43
|
+
An alert is **sources → triggers → filters → actions**:
|
|
44
|
+
|
|
45
|
+
- **Sources** — which projects/monitors it watches.
|
|
46
|
+
- **Triggers** — which issue-state changes fire it (new, regression, reappearance,
|
|
47
|
+
resolved); triggers are OR’d.
|
|
48
|
+
- **Filters** — conditions the issue/event must match before actions run (priority,
|
|
49
|
+
frequency, tags, assignment, age); filter groups can be ANY or ALL. **If an issue
|
|
50
|
+
exists but no alert fired, a filter is usually why.**
|
|
51
|
+
- **Actions** — Slack, email, PagerDuty, Discord, Jira, webhook, …
|
|
52
|
+
|
|
53
|
+
## When to reach for what
|
|
54
|
+
|
|
55
|
+
- _“Tell me in Slack when a new issue shows up”_ → an **Alert** (the default error
|
|
56
|
+
monitor already makes the issues).
|
|
57
|
+
- _“Alert when error rate / latency / a metric crosses a line”_ → a **Metric Monitor**,
|
|
58
|
+
then an alert.
|
|
59
|
+
- _“My nightly job didn’t run”_ → a **Cron Monitor**. _“Is my endpoint up?”_ → an
|
|
60
|
+
**Uptime Monitor**.
|
|
61
|
+
|
|
62
|
+
## Coverage honesty
|
|
63
|
+
|
|
64
|
+
Alert creation is automatable via Sentry’s workflow-engine API; several monitor types
|
|
65
|
+
(uptime, dashboards) are heavier UI/API hand-offs today — be upfront about what the
|
|
66
|
+
agent can do end-to-end vs.
|
|
67
|
+
where it walks the user through the UI. The MCP is **read-only** here: it can inspect
|
|
68
|
+
alert rules (`find_alert_rules`, `get_alert_rule`), cron monitors and their check-ins
|
|
69
|
+
(`find_monitors`, `get_monitor_details`), and dashboards — useful for verifying after
|
|
70
|
+
creation — but there is no create or update path for any of them, and uptime monitors
|
|
71
|
+
have no MCP surface at all.
|
|
72
|
+
|
|
73
|
+
## Related
|
|
74
|
+
|
|
75
|
+
- [`crons.md`](crons.md)
|
|
76
|
+
- [`metrics.md`](metrics.md)
|
|
77
|
+
- [`releases.md`](releases.md)
|
|
78
|
+
- [`search-query-language.md`](../search-query-language.md)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Profiling — What & Why
|
|
2
|
+
|
|
3
|
+
Code-level sampling of production execution.
|
|
4
|
+
Tracing tells you _which operation_ is slow; profiling tells you _which function and
|
|
5
|
+
line_ inside it is burning the time.
|
|
6
|
+
The output is a **flame graph**, also available as **differential** ("what got slower
|
|
7
|
+
between releases") views.
|
|
8
|
+
|
|
9
|
+
## What a flame graph represents
|
|
10
|
+
|
|
11
|
+
A flame graph aggregates many stack samples, and its two shapes have **different
|
|
12
|
+
x-axes**. In a single-profile graph X is time and **width = time spent**, so the
|
|
13
|
+
bottleneck is the deepest wide frame with high **self-time** (time in the function
|
|
14
|
+
itself, excluding children) — a wide frame with little self-time just means the cost is
|
|
15
|
+
in a child. In an **aggregated** graph X is not time; **width = how often a frame
|
|
16
|
+
appears** across samples.
|
|
17
|
+
Frames are colored **application vs.
|
|
18
|
+
system**: you can only act on your own code, so a wide _application_ frame is the
|
|
19
|
+
target, not a wide system frame.
|
|
20
|
+
A profile covers one thread at a time.
|
|
21
|
+
|
|
22
|
+
## Setup essentials
|
|
23
|
+
|
|
24
|
+
- **Modes:** **Continuous profiling** (backend; Python/Node today) and **UI profiling**
|
|
25
|
+
(frontend/mobile) are the current products; legacy transaction-based profiling is
|
|
26
|
+
being replaced.
|
|
27
|
+
- **The dependency to get right:** in the default **`manual` lifecycle** mode, profiling
|
|
28
|
+
runs _independently_ of tracing — you start/stop it explicitly
|
|
29
|
+
(`start_profiler`/`stop_profiler`), and nothing is collected until you do.
|
|
30
|
+
Only the optional **`trace` lifecycle** mode (and legacy transaction-based profiling)
|
|
31
|
+
require tracing on and sample relative to sampled transactions.
|
|
32
|
+
- **Sample, don’t profile everything** — ~1–5% CPU overhead; sampling is session-scoped.
|
|
33
|
+
Mind minimum SDK versions (support varies by platform).
|
|
34
|
+
|
|
35
|
+
## Related
|
|
36
|
+
|
|
37
|
+
- [`tracing.md`](tracing.md) — profiling localizes a bottleneck tracing pointed at.
|
|
38
|
+
- [`reduce-volume.md`](reduce-volume.md) — sampling/overhead tradeoffs.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Volume & Cost — Strategy
|
|
2
|
+
|
|
3
|
+
Sentry bills by the volume of each signal (errors, spans, replays, profiles), and logs
|
|
4
|
+
and metrics are billed by _size_ — so attribute count and message length matter, not
|
|
5
|
+
just event count. Reducing volume is keeping the data that earns its place and dropping
|
|
6
|
+
the rest — for quota _and_ for signal-to-noise.
|
|
7
|
+
|
|
8
|
+
## The core tradeoff, per signal
|
|
9
|
+
|
|
10
|
+
- **Errors:** sample _lightly_ or not at all — usually what you can’t afford to miss.
|
|
11
|
+
The cheapest win is **filtering known noise** (browser-extension errors, bots, a
|
|
12
|
+
specific bogus exception), not blanket down-sampling.
|
|
13
|
+
- **Spans / traces:** sample _aggressively_ — the highest-volume signal and biggest
|
|
14
|
+
lever. A `tracesSampler` that keeps important paths and drops health-check noise beats
|
|
15
|
+
a flat low rate. (Note `tracesSampleRate: 0` doesn’t disable tracing — see
|
|
16
|
+
[`tracing.md`](tracing.md).)
|
|
17
|
+
- **Replays / profiles:** keep the asymmetric/sampled defaults (high on error, low on
|
|
18
|
+
normal).
|
|
19
|
+
- **Logs / metrics:** billed by size — trim attribute count and message length, not just
|
|
20
|
+
event count, on top of emitting fewer, higher-signal events.
|
|
21
|
+
|
|
22
|
+
## Where to sample — head vs. server-side
|
|
23
|
+
|
|
24
|
+
- **Client / head sampling (SDK)** — decide before sending; cheapest, and the decision
|
|
25
|
+
propagates across a trace so you keep whole traces.
|
|
26
|
+
The first lever.
|
|
27
|
+
- **Server-side (Sentry)** — a backstop, and for what the SDK can’t cleanly decide:
|
|
28
|
+
- **Inbound data filters** — browser-extension errors, known crawlers, legacy
|
|
29
|
+
browsers, `localhost`, specific error messages or releases, by IP. (Some are
|
|
30
|
+
Business-plan.)
|
|
31
|
+
- **Per-DSN rate limits** — cap a noisy key.
|
|
32
|
+
**Spike protection** — an automatic guard against a sudden flood.
|
|
33
|
+
**Delete & Discard** — stop ingesting a specific high-volume issue entirely.
|
|
34
|
+
|
|
35
|
+
## A practical workflow
|
|
36
|
+
|
|
37
|
+
1. **Find the top offenders first** (MCP / Explore across errors, spans, and logs) —
|
|
38
|
+
don’t cut blind.
|
|
39
|
+
2. **Filter known noise** — high precision, no fidelity loss on real data.
|
|
40
|
+
3. **Tune span sampling** with a `tracesSampler` — the biggest lever.
|
|
41
|
+
4. **Set rate limits / spike protection** as a safety net.
|
|
42
|
+
5. **Re-measure** to confirm you cut noise, not signal.
|
|
43
|
+
|
|
44
|
+
## Related
|
|
45
|
+
|
|
46
|
+
- [`tracing.md`](tracing.md) — span sampling, the main lever.
|
|
47
|
+
- [`logging.md`](logging.md)
|
|
48
|
+
- [`session-replay.md`](session-replay.md)
|
|
49
|
+
- [`profiling.md`](profiling.md)
|