@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,174 @@
|
|
|
1
|
+
# Logging — Sentry NestJS SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `@sentry/nestjs` 9.41.0+ for structured Sentry Logs (`enableLogs: true`)
|
|
4
|
+
|
|
5
|
+
## Two Logging Systems
|
|
6
|
+
|
|
7
|
+
| System | Produces | Requires |
|
|
8
|
+
| -------------------------- | ---------------------------------------------- | -------------------------------------- |
|
|
9
|
+
| **Sentry Structured Logs** | Searchable log records in Sentry Logs UI | `enableLogs: true` + `Sentry.logger.*` |
|
|
10
|
+
| **Framework integrations** | Bridge NestJS/Pino/Winston logs to Sentry Logs | Integration-specific setup |
|
|
11
|
+
|
|
12
|
+
## Configuration
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import * as Sentry from "@sentry/nestjs";
|
|
16
|
+
|
|
17
|
+
Sentry.init({
|
|
18
|
+
dsn: "https://<key>@<org>.ingest.sentry.io/<project>",
|
|
19
|
+
enableLogs: true, // required — without this, all Sentry.logger.* calls are no-ops
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Code Examples
|
|
24
|
+
|
|
25
|
+
### Sentry Structured Logs — direct API
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
import * as Sentry from "@sentry/nestjs";
|
|
29
|
+
|
|
30
|
+
// All six log levels
|
|
31
|
+
Sentry.logger.trace("Starting database connection {database}", { database: "users" });
|
|
32
|
+
Sentry.logger.debug("Cache miss for user {userId}", { userId: 123 });
|
|
33
|
+
Sentry.logger.info("User signed in");
|
|
34
|
+
Sentry.logger.warn("Rate limit reached for endpoint {endpoint}", { endpoint: "/api/results" });
|
|
35
|
+
Sentry.logger.error("Failed to process payment for order {orderId}", { orderId: "or_2342" });
|
|
36
|
+
Sentry.logger.fatal("Database {database} connection pool exhausted", { database: "users" });
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**Available levels:** `trace`, `debug`, `info`, `warn`, `error`, `fatal`
|
|
40
|
+
|
|
41
|
+
### Tagged template for parameterized messages
|
|
42
|
+
|
|
43
|
+
Use `Sentry.logger.fmt` to create structured, searchable messages where each placeholder
|
|
44
|
+
becomes an individually queryable attribute in the Sentry Logs UI:
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
import * as Sentry from "@sentry/nestjs";
|
|
48
|
+
|
|
49
|
+
Sentry.logger.info(Sentry.logger.fmt`User ${"userId"} signed in from ${"region"}`, {
|
|
50
|
+
userId: 42,
|
|
51
|
+
region: "eu-west-1",
|
|
52
|
+
});
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### NestJS ConsoleLogger integration
|
|
56
|
+
|
|
57
|
+
To route NestJS’s built-in `ConsoleLogger` output to Sentry Logs, use
|
|
58
|
+
`consoleLoggingIntegration` with `forceConsole: true`:
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import * as Sentry from "@sentry/nestjs";
|
|
62
|
+
import { consoleLoggingIntegration } from "@sentry/nestjs";
|
|
63
|
+
|
|
64
|
+
Sentry.init({
|
|
65
|
+
dsn: "...",
|
|
66
|
+
enableLogs: true,
|
|
67
|
+
integrations: [consoleLoggingIntegration({ forceConsole: true })],
|
|
68
|
+
});
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Then use NestJS’s built-in logger as usual — all output is captured:
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { Injectable, Logger } from "@nestjs/common";
|
|
75
|
+
|
|
76
|
+
@Injectable()
|
|
77
|
+
export class AppService {
|
|
78
|
+
private readonly logger = new Logger(AppService.name);
|
|
79
|
+
|
|
80
|
+
doSomething() {
|
|
81
|
+
this.logger.log("Processing request"); // → Sentry Logs: info
|
|
82
|
+
this.logger.warn("Unusual payload size"); // → Sentry Logs: warn
|
|
83
|
+
this.logger.error("Payment failed"); // → Sentry Logs: error
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Pino integration (SDK 10.18.0+)
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
npm install pino
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import * as Sentry from "@sentry/nestjs";
|
|
96
|
+
import { pinoIntegration } from "@sentry/nestjs";
|
|
97
|
+
|
|
98
|
+
Sentry.init({
|
|
99
|
+
dsn: "...",
|
|
100
|
+
enableLogs: true,
|
|
101
|
+
integrations: [pinoIntegration()],
|
|
102
|
+
});
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Winston integration
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
npm install winston
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
import * as Sentry from "@sentry/nestjs";
|
|
113
|
+
import { createSentryWinstonTransport } from "@sentry/nestjs";
|
|
114
|
+
import winston from "winston";
|
|
115
|
+
|
|
116
|
+
Sentry.init({ dsn: "...", enableLogs: true });
|
|
117
|
+
|
|
118
|
+
const logger = winston.createLogger({
|
|
119
|
+
transports: [
|
|
120
|
+
new winston.transports.Console(),
|
|
121
|
+
createSentryWinstonTransport({ minLevel: "info" }),
|
|
122
|
+
],
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
> **Bunyan is not supported.** Use Pino or Winston if you need a framework logger
|
|
127
|
+
> bridge.
|
|
128
|
+
|
|
129
|
+
### `beforeSendLog` hook — filter and sanitize
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import * as Sentry from "@sentry/nestjs";
|
|
133
|
+
|
|
134
|
+
Sentry.init({
|
|
135
|
+
dsn: "...",
|
|
136
|
+
enableLogs: true,
|
|
137
|
+
beforeSendLog(log) {
|
|
138
|
+
// Drop debug logs to reduce volume
|
|
139
|
+
if (log.level === "debug") return null;
|
|
140
|
+
|
|
141
|
+
// Redact sensitive fields
|
|
142
|
+
if (log.attributes?.["user.email"]) {
|
|
143
|
+
log.attributes["user.email"] = "[redacted]";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return log;
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## Log-to-Trace Correlation
|
|
152
|
+
|
|
153
|
+
Log entries are automatically correlated to the active trace — no configuration
|
|
154
|
+
required. When a log is emitted inside an instrumented request or span, Sentry links it
|
|
155
|
+
to the corresponding transaction in the Traces UI.
|
|
156
|
+
|
|
157
|
+
## Decision Table
|
|
158
|
+
|
|
159
|
+
| Goal | Tool |
|
|
160
|
+
| ----------------------------------------------- | --------------------------------------------------- |
|
|
161
|
+
| Searchable structured records in Sentry Logs UI | `Sentry.logger.*` + `enableLogs: true` |
|
|
162
|
+
| Bridge NestJS `ConsoleLogger` to Sentry Logs | `consoleLoggingIntegration({ forceConsole: true })` |
|
|
163
|
+
| Bridge Pino to Sentry Logs | `pinoIntegration()` (SDK 10.18.0+) |
|
|
164
|
+
| Bridge Winston to Sentry Logs | `createSentryWinstonTransport()` |
|
|
165
|
+
| Drop or modify a log before sending | `beforeSendLog` callback |
|
|
166
|
+
|
|
167
|
+
## Troubleshooting
|
|
168
|
+
|
|
169
|
+
| Issue | Solution |
|
|
170
|
+
| ------------------------------------------- | ----------------------------------------------------------- |
|
|
171
|
+
| `Sentry.logger.*` calls have no effect | Ensure `enableLogs: true` is set in `Sentry.init()` |
|
|
172
|
+
| NestJS `ConsoleLogger` output not appearing | Add `consoleLoggingIntegration({ forceConsole: true })` |
|
|
173
|
+
| Pino logs not appearing | Requires `@sentry/nestjs` 10.18.0+; add `pinoIntegration()` |
|
|
174
|
+
| Too many log records hitting quota | Use `beforeSendLog` to filter by level or attribute |
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
# Metrics — Sentry NestJS SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `@sentry/nestjs` 10.25.0+
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
`Sentry.metrics` provides custom counters, gauges, and distributions.
|
|
8
|
+
Metrics are enabled by default — no extra `init()` flag needed.
|
|
9
|
+
|
|
10
|
+
## Metric Types
|
|
11
|
+
|
|
12
|
+
| Type | API | Use for |
|
|
13
|
+
| ------------ | ------------------------------- | ----------------------------------------------------------- |
|
|
14
|
+
| Counter | `Sentry.metrics.count()` | Event occurrences, request counts |
|
|
15
|
+
| Distribution | `Sentry.metrics.distribution()` | Latencies, sizes — supports p50/p90/p95/p99 |
|
|
16
|
+
| Gauge | `Sentry.metrics.gauge()` | Current values (min, max, avg, sum, count — no percentiles) |
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
import "./instrument"; // Sentry init must run before anything else
|
|
22
|
+
import { NestFactory } from "@nestjs/core";
|
|
23
|
+
import { AppModule } from "./app.module";
|
|
24
|
+
|
|
25
|
+
async function bootstrap() {
|
|
26
|
+
const app = await NestFactory.create(AppModule);
|
|
27
|
+
await app.listen(3000);
|
|
28
|
+
}
|
|
29
|
+
bootstrap();
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
No extra flags required — metrics are on by default once `Sentry.init()` is called.
|
|
33
|
+
|
|
34
|
+
Optional `beforeSendMetric` hook:
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import * as Sentry from "@sentry/nestjs";
|
|
38
|
+
|
|
39
|
+
Sentry.init({
|
|
40
|
+
dsn: "https://<key>@<org>.ingest.sentry.io/<project>",
|
|
41
|
+
beforeSendMetric(metric) {
|
|
42
|
+
if (metric.name === "noisy-metric") {
|
|
43
|
+
return null; // drop this metric
|
|
44
|
+
}
|
|
45
|
+
metric.attributes["env"] = "prod"; // add attribute
|
|
46
|
+
return metric;
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Code Examples
|
|
52
|
+
|
|
53
|
+
### Counter — event occurrences
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import * as Sentry from '@sentry/nestjs';
|
|
57
|
+
|
|
58
|
+
// In a controller
|
|
59
|
+
@Controller('orders')
|
|
60
|
+
export class OrdersController {
|
|
61
|
+
@Post()
|
|
62
|
+
async createOrder(@Body() dto: CreateOrderDto) {
|
|
63
|
+
Sentry.metrics.count('orders.created', 1, {
|
|
64
|
+
attributes: {
|
|
65
|
+
type: dto.type,
|
|
66
|
+
region: dto.region,
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
return this.ordersService.create(dto);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Count per route/method
|
|
74
|
+
@Get(':id')
|
|
75
|
+
async getOrder(@Param('id') id: string) {
|
|
76
|
+
Sentry.metrics.count('http.requests', 1, {
|
|
77
|
+
attributes: {
|
|
78
|
+
route: '/orders/:id',
|
|
79
|
+
method: 'GET',
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
return this.ordersService.findOne(id);
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Distribution — percentile analysis
|
|
87
|
+
|
|
88
|
+
Best for latencies, response sizes, durations where p50/p90/p99 matter:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
import * as Sentry from "@sentry/nestjs";
|
|
92
|
+
|
|
93
|
+
@Injectable()
|
|
94
|
+
export class OrdersService {
|
|
95
|
+
async processOrder(order: Order): Promise<void> {
|
|
96
|
+
const start = Date.now();
|
|
97
|
+
|
|
98
|
+
await this.doProcessing(order);
|
|
99
|
+
|
|
100
|
+
Sentry.metrics.distribution("orders.processing_time", Date.now() - start, {
|
|
101
|
+
unit: "millisecond",
|
|
102
|
+
attributes: {
|
|
103
|
+
"order.type": order.type,
|
|
104
|
+
region: order.region,
|
|
105
|
+
},
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Database query timing:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
@Injectable()
|
|
115
|
+
export class UsersRepository {
|
|
116
|
+
async findByEmail(email: string) {
|
|
117
|
+
const start = Date.now();
|
|
118
|
+
const result = await this.db.users.findOne({ email });
|
|
119
|
+
|
|
120
|
+
Sentry.metrics.distribution("db.query_time", Date.now() - start, {
|
|
121
|
+
unit: "millisecond",
|
|
122
|
+
attributes: { table: "users", operation: "findOne" },
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
return result;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Gauge — current state
|
|
131
|
+
|
|
132
|
+
Use for values that fluctuate over time; no percentile support:
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import * as Sentry from "@sentry/nestjs";
|
|
136
|
+
|
|
137
|
+
// Bull/BullMQ queue depth
|
|
138
|
+
@Injectable()
|
|
139
|
+
export class QueueMonitorService {
|
|
140
|
+
constructor(@InjectQueue("email") private emailQueue: Queue) {}
|
|
141
|
+
|
|
142
|
+
@Cron(CronExpression.EVERY_MINUTE)
|
|
143
|
+
async reportQueueDepth() {
|
|
144
|
+
const waiting = await this.emailQueue.getWaitingCount();
|
|
145
|
+
const active = await this.emailQueue.getActiveCount();
|
|
146
|
+
|
|
147
|
+
Sentry.metrics.gauge("queue.depth", waiting, {
|
|
148
|
+
attributes: { queue: "email", state: "waiting" },
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
Sentry.metrics.gauge("queue.depth", active, {
|
|
152
|
+
attributes: { queue: "email", state: "active" },
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Business event counting
|
|
159
|
+
|
|
160
|
+
```typescript
|
|
161
|
+
@Injectable()
|
|
162
|
+
export class PaymentsService {
|
|
163
|
+
async chargeCard(dto: ChargeDto): Promise<Charge> {
|
|
164
|
+
try {
|
|
165
|
+
const charge = await this.stripe.charges.create(dto);
|
|
166
|
+
|
|
167
|
+
Sentry.metrics.count("payments.charged", 1, {
|
|
168
|
+
attributes: {
|
|
169
|
+
currency: dto.currency,
|
|
170
|
+
success: true,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
return charge;
|
|
175
|
+
} catch (err) {
|
|
176
|
+
Sentry.metrics.count("payments.charged", 1, {
|
|
177
|
+
attributes: {
|
|
178
|
+
currency: dto.currency,
|
|
179
|
+
success: false,
|
|
180
|
+
"error.type": err.type ?? "unknown",
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
throw err;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
### Attribute value types
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
Sentry.metrics.count("api.request", 1, {
|
|
193
|
+
attributes: {
|
|
194
|
+
endpoint: "/v2/users", // string
|
|
195
|
+
method: "POST",
|
|
196
|
+
success: true, // boolean
|
|
197
|
+
status_code: 201, // number
|
|
198
|
+
latency: 0.042, // number (float)
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Unit strings
|
|
204
|
+
|
|
205
|
+
| Category | Values |
|
|
206
|
+
| ------------- | ----------------------------------------------------------------------------------------------------- |
|
|
207
|
+
| Time | `"nanosecond"`, `"microsecond"`, `"millisecond"`, `"second"`, `"minute"`, `"hour"`, `"day"`, `"week"` |
|
|
208
|
+
| Data | `"bit"`, `"byte"`, `"kilobyte"`, `"megabyte"`, `"gigabyte"`, `"terabyte"` |
|
|
209
|
+
| Fractions | `"ratio"`, `"percent"` |
|
|
210
|
+
| Dimensionless | `"none"` (default when omitted) |
|
|
211
|
+
|
|
212
|
+
### `beforeSendMetric` — metric object schema
|
|
213
|
+
|
|
214
|
+
| Key | Type | Description |
|
|
215
|
+
| ------------ | --------------------------------------------- | ------------------------------------------ |
|
|
216
|
+
| `name` | `string` | Metric identifier |
|
|
217
|
+
| `type` | `string` | `"counter"` / `"gauge"` / `"distribution"` |
|
|
218
|
+
| `value` | `number` | Numeric measurement |
|
|
219
|
+
| `unit` | `string \| undefined` | Unit string |
|
|
220
|
+
| `attributes` | `Record<string, string \| number \| boolean>` | Custom key-value pairs |
|
|
221
|
+
| `timestamp` | `number` | Epoch seconds |
|
|
222
|
+
| `traceId` | `string \| undefined` | Associated trace ID |
|
|
223
|
+
| `spanId` | `string \| undefined` | Active span ID |
|
|
224
|
+
|
|
225
|
+
## Best Practices
|
|
226
|
+
|
|
227
|
+
- Keep attribute cardinality low — avoid user IDs, UUIDs, or timestamps as attribute
|
|
228
|
+
values
|
|
229
|
+
- Use `distribution` over `gauge` when you need percentile analysis
|
|
230
|
+
- Prefix metric names with your service name: `"payments.charge_time"` not
|
|
231
|
+
`"charge_time"`
|
|
232
|
+
- Use standard unit strings — Sentry renders them in the UI with proper labels
|
|
233
|
+
- Each metric consumes up to 2 KB — avoid unbounded attribute value sets
|
|
234
|
+
- Metrics are buffered and flushed periodically — not suitable for sub-second alerting
|
|
235
|
+
|
|
236
|
+
## Troubleshooting
|
|
237
|
+
|
|
238
|
+
| Issue | Solution |
|
|
239
|
+
| --------------------------- | --------------------------------------------------------------------------- |
|
|
240
|
+
| Metrics not appearing | Verify `@sentry/nestjs` ≥ 10.25.0; check `debug: true` output |
|
|
241
|
+
| Metric dropped silently | Check `beforeSendMetric` hook; verify metric name has no special characters |
|
|
242
|
+
| High cardinality warning | Reduce attribute values — avoid per-user or per-request identifiers |
|
|
243
|
+
| No percentiles in Sentry UI | Switch from `gauge` to `distribution` — gauges do not support percentiles |
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# Profiling — Sentry NestJS SDK
|
|
2
|
+
|
|
3
|
+
> Requires `@sentry/profiling-node` (version must **exactly match** `@sentry/nestjs`)
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @sentry/profiling-node --save
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Configuration
|
|
12
|
+
|
|
13
|
+
| Option | Purpose |
|
|
14
|
+
| -------------------------------------------- | ------------------------------------------------------------------ |
|
|
15
|
+
| `integrations: [nodeProfilingIntegration()]` | Enable the V8 CPU profiler |
|
|
16
|
+
| `profileSessionSampleRate` | Fraction of processes/pods to profile (evaluated **once at init**) |
|
|
17
|
+
| `profileLifecycle` | `'trace'` = auto-managed; `'manual'` = explicit start/stop |
|
|
18
|
+
| `tracesSampleRate` | Must be `> 0` — profiling requires tracing to be active |
|
|
19
|
+
|
|
20
|
+
## Mode Comparison
|
|
21
|
+
|
|
22
|
+
| | Trace lifecycle (`'trace'`) | Manual (`'manual'`) |
|
|
23
|
+
| ----------------- | ------------------------------- | --------------------------------- |
|
|
24
|
+
| **Start trigger** | First active span | `Sentry.profiler.startProfiler()` |
|
|
25
|
+
| **Stop trigger** | Last span ends | `Sentry.profiler.stopProfiler()` |
|
|
26
|
+
| **Coverage** | All code during active spans | Only between explicit start/stop |
|
|
27
|
+
| **Use case** | General profiling (recommended) | Targeted hot paths |
|
|
28
|
+
| **Setup** | Zero — fully automatic | Manual call sites required |
|
|
29
|
+
|
|
30
|
+
## Code Examples
|
|
31
|
+
|
|
32
|
+
### Trace lifecycle — recommended
|
|
33
|
+
|
|
34
|
+
Add `nodeProfilingIntegration()` to the `integrations` array in `instrument.ts`:
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
// instrument.ts (must be the first file loaded — see main skill)
|
|
38
|
+
import * as Sentry from "@sentry/nestjs";
|
|
39
|
+
import { nodeProfilingIntegration } from "@sentry/profiling-node";
|
|
40
|
+
|
|
41
|
+
Sentry.init({
|
|
42
|
+
dsn: process.env.SENTRY_DSN,
|
|
43
|
+
integrations: [nodeProfilingIntegration()],
|
|
44
|
+
tracesSampleRate: 1.0,
|
|
45
|
+
profileSessionSampleRate: 1.0, // profile 100% of process sessions
|
|
46
|
+
profileLifecycle: "trace", // SDK auto-manages profiler lifetime
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
All HTTP requests, lifecycle spans, `@OnEvent` handlers, and custom spans are profiled
|
|
51
|
+
automatically.
|
|
52
|
+
|
|
53
|
+
### Manual mode — targeted profiling
|
|
54
|
+
|
|
55
|
+
```typescript
|
|
56
|
+
import * as Sentry from "@sentry/nestjs";
|
|
57
|
+
import { nodeProfilingIntegration } from "@sentry/profiling-node";
|
|
58
|
+
|
|
59
|
+
Sentry.init({
|
|
60
|
+
dsn: process.env.SENTRY_DSN,
|
|
61
|
+
integrations: [nodeProfilingIntegration()],
|
|
62
|
+
tracesSampleRate: 1.0,
|
|
63
|
+
profileSessionSampleRate: 1.0,
|
|
64
|
+
profileLifecycle: "manual",
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Somewhere in application code:
|
|
68
|
+
Sentry.profiler.startProfiler();
|
|
69
|
+
await expensiveOperation();
|
|
70
|
+
Sentry.profiler.stopProfiler();
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Production fleet sampling
|
|
74
|
+
|
|
75
|
+
`profileSessionSampleRate` is decided **once at process startup** — use it to sample a
|
|
76
|
+
fraction of pods/containers rather than per-request:
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
Sentry.init({
|
|
80
|
+
dsn: process.env.SENTRY_DSN,
|
|
81
|
+
integrations: [nodeProfilingIntegration()],
|
|
82
|
+
tracesSampleRate: 0.1, // sample 10% of requests for traces
|
|
83
|
+
profileSessionSampleRate: 0.25, // profile 25% of pods/instances
|
|
84
|
+
profileLifecycle: "trace",
|
|
85
|
+
});
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Technical Details
|
|
89
|
+
|
|
90
|
+
- Uses **V8’s `CpuProfiler`** native C++ add-on — ~100 Hz sampling (10 ms interval)
|
|
91
|
+
- Precompiled binaries available for:
|
|
92
|
+
- macOS x64 / ARM64
|
|
93
|
+
- Linux x64 glibc / ARM64 musl
|
|
94
|
+
- Windows x64
|
|
95
|
+
- Node.js 18, 20, 22, 24
|
|
96
|
+
- **Not supported** in Deno or Bun
|
|
97
|
+
|
|
98
|
+
## Environment Variables
|
|
99
|
+
|
|
100
|
+
| Variable | Purpose |
|
|
101
|
+
| ------------------------------ | ------------------------------------------------- |
|
|
102
|
+
| `SENTRY_PROFILER_BINARY_PATH` | Override full path to `profiler.node` binary |
|
|
103
|
+
| `SENTRY_PROFILER_BINARY_DIR` | Override directory containing `profiler.node` |
|
|
104
|
+
| `SENTRY_PROFILER_LOGGING_MODE` | `eager` (default) or `lazy` (starts on first use) |
|
|
105
|
+
|
|
106
|
+
**Eager mode (default):** Profiler always running — lower latency to first profile, uses
|
|
107
|
+
CPU between requests.\
|
|
108
|
+
**Lazy mode:** Starts on first use — lower baseline CPU overhead, small latency on first
|
|
109
|
+
profile.
|
|
110
|
+
|
|
111
|
+
## Performance Overhead
|
|
112
|
+
|
|
113
|
+
- 100 Hz sampling has minimal per-sample cost
|
|
114
|
+
- Eager mode consumes some CPU even between requests
|
|
115
|
+
- Load test before enabling in high-throughput production services
|
|
116
|
+
- Start with a low `profileSessionSampleRate` (e.g., `0.1`) and increase based on
|
|
117
|
+
observed overhead
|
|
118
|
+
|
|
119
|
+
## Troubleshooting
|
|
120
|
+
|
|
121
|
+
| Issue | Solution |
|
|
122
|
+
| ----------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
123
|
+
| No profiles appearing | Verify `tracesSampleRate > 0` and both `profileSessionSampleRate` + `profileLifecycle` are set |
|
|
124
|
+
| Native binary fails to load | Check Node.js version is 18–24 and platform is supported; set `SENTRY_PROFILER_BINARY_PATH` if needed |
|
|
125
|
+
| Version mismatch error | `@sentry/profiling-node` version must exactly match `@sentry/nestjs` |
|
|
126
|
+
| Profiler not stopping (manual mode) | Ensure `Sentry.profiler.stopProfiler()` is called on shutdown / after the target code |
|
|
127
|
+
| High CPU in idle | Switch to `SENTRY_PROFILER_LOGGING_MODE=lazy` or reduce `profileSessionSampleRate` |
|