@danieljvdm/dev-kit 1.0.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/package.json +1 -1
- package/skill-sources.jsonc +6 -29
- package/skill-sources.lock.json +23 -109
- package/skills/animate/LICENSE +21 -0
- package/skills/animate/NOTICE +10 -0
- package/skills/animate/SKILL.md +34 -0
- package/skills/animate/references/gestures.md +27 -0
- package/skills/animate/references/glossary.md +136 -0
- package/skills/animate/references/implementation.md +22 -0
- package/skills/animate/references/opportunities.md +18 -0
- package/skills/animate/references/principles.md +48 -0
- package/skills/animate/references/review.md +19 -0
- package/skills/cloudflare-workers/LICENSE +202 -0
- package/skills/cloudflare-workers/NOTICE +9 -0
- package/skills/cloudflare-workers/SKILL.md +26 -0
- package/skills/cloudflare-workers/references/durable-objects.md +68 -0
- package/skills/cloudflare-workers/references/sandbox.md +48 -0
- package/skills/cloudflare-workers/references/workers.md +63 -0
- package/skills/cloudflare-workers/references/wrangler.md +56 -0
- package/skills/design-ui/LICENSE +21 -0
- package/skills/design-ui/NOTICE +8 -0
- package/skills/design-ui/SKILL.md +29 -0
- package/skills/design-ui/references/appearance.md +22 -0
- package/skills/design-ui/references/components.md +33 -0
- package/skills/design-ui/references/exploration.md +50 -0
- package/skills/design-ui/references/libraries.md +39 -0
- package/skills/design-ui/references/themes.md +23 -0
- package/skills/dev-kit/SKILL.md +19 -38
- package/skills/dev-kit/references/cloudflare-worker-api.md +1 -1
- package/skills/dev-kit/references/skills.md +2 -2
- package/skills/effect-development/SKILL.md +27 -0
- package/skills/effect-development/agents/openai.yaml +4 -0
- package/skills/effect-development/references/api/index.md +32 -0
- package/skills/effect-development/references/api/schema-codecs.md +15 -0
- package/skills/{build-effect-apis/references → effect-development/references/api}/verification.md +10 -5
- package/skills/{effect-architecture-audit/SKILL.md → effect-development/references/architecture/index.md} +1 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-client.md +8 -6
- package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-testing.md +7 -2
- package/skills/effect-development/references/atom/index.md +40 -0
- package/skills/{build-effect-clis/references → effect-development/references/cli}/entrypoints-and-testing.md +6 -2
- package/skills/effect-development/references/cli/index.md +39 -0
- package/skills/effect-development/references/setup.md +15 -0
- package/skills/open-pull-request/SKILL.md +11 -115
- package/skills/open-pull-request/agents/openai.yaml +3 -3
- package/skills/open-pull-request/references/evidence.md +22 -0
- package/skills/open-pull-request/references/explanation.md +21 -0
- package/skills/open-pull-request/references/publication.md +21 -0
- package/skills/sentry/LICENSE +202 -0
- package/skills/sentry/LICENSE-UPSTREAM +21 -0
- package/skills/sentry/NOTICE +14 -0
- package/skills/sentry/SKILL.md +33 -0
- package/skills/sentry/references/alert-payloads.md +105 -0
- package/skills/sentry/references/alerts.md +17 -0
- package/skills/sentry/references/artifacts.md +25 -0
- package/skills/sentry/references/auth-token.md +65 -0
- package/skills/sentry/references/concepts/ai-monitoring.md +131 -0
- package/skills/sentry/references/concepts/choosing-a-signal.md +78 -0
- package/skills/sentry/references/concepts/crons.md +50 -0
- package/skills/sentry/references/concepts/data-scrubbing.md +43 -0
- package/skills/sentry/references/concepts/errors.md +40 -0
- package/skills/sentry/references/concepts/logging.md +85 -0
- package/skills/sentry/references/concepts/metrics.md +49 -0
- package/skills/sentry/references/concepts/monitors.md +78 -0
- package/skills/sentry/references/concepts/profiling.md +38 -0
- package/skills/sentry/references/concepts/reduce-volume.md +49 -0
- package/skills/sentry/references/concepts/releases.md +43 -0
- package/skills/sentry/references/concepts/session-replay.md +35 -0
- package/skills/sentry/references/concepts/tracing.md +54 -0
- package/skills/sentry/references/concepts/user-feedback.md +36 -0
- package/skills/sentry/references/debug-artifacts/android.md +68 -0
- package/skills/sentry/references/debug-artifacts/apple.md +96 -0
- package/skills/sentry/references/debug-artifacts/dotnet.md +70 -0
- package/skills/sentry/references/debug-artifacts/flutter.md +65 -0
- package/skills/sentry/references/debug-artifacts/index.md +75 -0
- package/skills/sentry/references/debug-artifacts/javascript.md +94 -0
- package/skills/sentry/references/debug-artifacts/matching.md +73 -0
- package/skills/sentry/references/debug-artifacts/react-native.md +75 -0
- package/skills/sentry/references/first-error-setup.md +25 -0
- package/skills/sentry/references/instrumentation.md +30 -0
- package/skills/sentry/references/issues.md +32 -0
- package/skills/sentry/references/new-project.md +17 -0
- package/skills/sentry/references/otel-exporter.md +30 -0
- package/skills/sentry/references/release-workflow.md +31 -0
- package/skills/sentry/references/releases/ci-pipeline.md +214 -0
- package/skills/sentry/references/releases/index.md +93 -0
- package/skills/sentry/references/releases/suspect-commits.md +155 -0
- package/skills/sentry/references/releases/tagging.md +131 -0
- package/skills/sentry/references/releases/troubleshooting.md +67 -0
- package/skills/sentry/references/sdks/android/crons.md +305 -0
- package/skills/sentry/references/sdks/android/error-monitoring.md +800 -0
- package/skills/sentry/references/sdks/android/index.md +748 -0
- package/skills/sentry/references/sdks/android/integrations.md +48 -0
- package/skills/sentry/references/sdks/android/logging.md +374 -0
- package/skills/sentry/references/sdks/android/metrics.md +288 -0
- package/skills/sentry/references/sdks/android/profiling.md +397 -0
- package/skills/sentry/references/sdks/android/session-replay.md +406 -0
- package/skills/sentry/references/sdks/android/tracing.md +861 -0
- package/skills/sentry/references/sdks/browser/error-monitoring.md +861 -0
- package/skills/sentry/references/sdks/browser/index.md +714 -0
- package/skills/sentry/references/sdks/browser/logging.md +315 -0
- package/skills/sentry/references/sdks/browser/profiling.md +236 -0
- package/skills/sentry/references/sdks/browser/session-replay.md +586 -0
- package/skills/sentry/references/sdks/browser/tracing.md +561 -0
- package/skills/sentry/references/sdks/browser/user-feedback.md +354 -0
- package/skills/sentry/references/sdks/cloudflare/ai-monitoring.md +661 -0
- package/skills/sentry/references/sdks/cloudflare/crons.md +231 -0
- package/skills/sentry/references/sdks/cloudflare/durable-objects.md +381 -0
- package/skills/sentry/references/sdks/cloudflare/error-monitoring.md +329 -0
- package/skills/sentry/references/sdks/cloudflare/index.md +698 -0
- package/skills/sentry/references/sdks/cloudflare/logging.md +169 -0
- package/skills/sentry/references/sdks/cloudflare/nodejs-compat.md +134 -0
- package/skills/sentry/references/sdks/cloudflare/tracing.md +475 -0
- package/skills/sentry/references/sdks/cocoa/error-monitoring.md +394 -0
- package/skills/sentry/references/sdks/cocoa/index.md +497 -0
- package/skills/sentry/references/sdks/cocoa/logging.md +209 -0
- package/skills/sentry/references/sdks/cocoa/metrics.md +136 -0
- package/skills/sentry/references/sdks/cocoa/profiling.md +223 -0
- package/skills/sentry/references/sdks/cocoa/session-replay.md +257 -0
- package/skills/sentry/references/sdks/cocoa/tracing.md +524 -0
- package/skills/sentry/references/sdks/cocoa/user-feedback.md +310 -0
- package/skills/sentry/references/sdks/dotnet/crons.md +465 -0
- package/skills/sentry/references/sdks/dotnet/error-monitoring.md +1100 -0
- package/skills/sentry/references/sdks/dotnet/index.md +614 -0
- package/skills/sentry/references/sdks/dotnet/logging.md +556 -0
- package/skills/sentry/references/sdks/dotnet/metrics.md +229 -0
- package/skills/sentry/references/sdks/dotnet/profiling.md +296 -0
- package/skills/sentry/references/sdks/dotnet/tracing.md +897 -0
- package/skills/sentry/references/sdks/elixir/crons.md +371 -0
- package/skills/sentry/references/sdks/elixir/error-monitoring.md +335 -0
- package/skills/sentry/references/sdks/elixir/index.md +383 -0
- package/skills/sentry/references/sdks/elixir/logging.md +239 -0
- package/skills/sentry/references/sdks/elixir/tracing.md +233 -0
- package/skills/sentry/references/sdks/flutter/ecosystem-integrations.md +70 -0
- package/skills/sentry/references/sdks/flutter/error-monitoring.md +312 -0
- package/skills/sentry/references/sdks/flutter/index.md +728 -0
- package/skills/sentry/references/sdks/flutter/logging.md +387 -0
- package/skills/sentry/references/sdks/flutter/metrics.md +310 -0
- package/skills/sentry/references/sdks/flutter/profiling.md +214 -0
- package/skills/sentry/references/sdks/flutter/session-replay.md +308 -0
- package/skills/sentry/references/sdks/flutter/tracing.md +502 -0
- package/skills/sentry/references/sdks/go/crons.md +270 -0
- package/skills/sentry/references/sdks/go/error-monitoring.md +361 -0
- package/skills/sentry/references/sdks/go/index.md +324 -0
- package/skills/sentry/references/sdks/go/logging.md +354 -0
- package/skills/sentry/references/sdks/go/metrics.md +273 -0
- package/skills/sentry/references/sdks/go/profiling.md +46 -0
- package/skills/sentry/references/sdks/go/tracing.md +366 -0
- package/skills/sentry/references/sdks/index.md +41 -0
- package/skills/sentry/references/sdks/nestjs/ai-monitoring.md +410 -0
- package/skills/sentry/references/sdks/nestjs/crons.md +268 -0
- package/skills/sentry/references/sdks/nestjs/error-monitoring.md +729 -0
- package/skills/sentry/references/sdks/nestjs/index.md +699 -0
- package/skills/sentry/references/sdks/nestjs/logging.md +174 -0
- package/skills/sentry/references/sdks/nestjs/metrics.md +243 -0
- package/skills/sentry/references/sdks/nestjs/profiling.md +127 -0
- package/skills/sentry/references/sdks/nestjs/tracing.md +762 -0
- package/skills/sentry/references/sdks/nextjs/ai-monitoring.md +494 -0
- package/skills/sentry/references/sdks/nextjs/crons.md +383 -0
- package/skills/sentry/references/sdks/nextjs/error-monitoring.md +974 -0
- package/skills/sentry/references/sdks/nextjs/index.md +491 -0
- package/skills/sentry/references/sdks/nextjs/logging.md +381 -0
- package/skills/sentry/references/sdks/nextjs/metrics.md +411 -0
- package/skills/sentry/references/sdks/nextjs/profiling.md +403 -0
- package/skills/sentry/references/sdks/nextjs/session-replay.md +462 -0
- package/skills/sentry/references/sdks/nextjs/tracing.md +628 -0
- package/skills/sentry/references/sdks/node/ai-monitoring.md +303 -0
- package/skills/sentry/references/sdks/node/crons.md +432 -0
- package/skills/sentry/references/sdks/node/error-monitoring.md +1125 -0
- package/skills/sentry/references/sdks/node/index.md +942 -0
- package/skills/sentry/references/sdks/node/logging.md +380 -0
- package/skills/sentry/references/sdks/node/metrics.md +278 -0
- package/skills/sentry/references/sdks/node/profiling.md +373 -0
- package/skills/sentry/references/sdks/node/tracing.md +878 -0
- package/skills/sentry/references/sdks/php/ai-monitoring.md +310 -0
- package/skills/sentry/references/sdks/php/crons.md +265 -0
- package/skills/sentry/references/sdks/php/error-monitoring.md +626 -0
- package/skills/sentry/references/sdks/php/index.md +362 -0
- package/skills/sentry/references/sdks/php/laravel.md +542 -0
- package/skills/sentry/references/sdks/php/logging.md +242 -0
- package/skills/sentry/references/sdks/php/metrics.md +193 -0
- package/skills/sentry/references/sdks/php/profiling.md +115 -0
- package/skills/sentry/references/sdks/php/symfony.md +552 -0
- package/skills/sentry/references/sdks/php/tracing.md +516 -0
- package/skills/sentry/references/sdks/python/ai-monitoring.md +351 -0
- package/skills/sentry/references/sdks/python/crons.md +218 -0
- package/skills/sentry/references/sdks/python/error-monitoring.md +292 -0
- package/skills/sentry/references/sdks/python/index.md +361 -0
- package/skills/sentry/references/sdks/python/logging.md +234 -0
- package/skills/sentry/references/sdks/python/metrics.md +154 -0
- package/skills/sentry/references/sdks/python/profiling.md +120 -0
- package/skills/sentry/references/sdks/python/tracing.md +364 -0
- package/skills/sentry/references/sdks/react/error-monitoring.md +1607 -0
- package/skills/sentry/references/sdks/react/index.md +492 -0
- package/skills/sentry/references/sdks/react/logging.md +364 -0
- package/skills/sentry/references/sdks/react/profiling.md +322 -0
- package/skills/sentry/references/sdks/react/react-features.md +1272 -0
- package/skills/sentry/references/sdks/react/session-replay.md +1193 -0
- package/skills/sentry/references/sdks/react/tracing.md +1415 -0
- package/skills/sentry/references/sdks/react-native/error-monitoring.md +1481 -0
- package/skills/sentry/references/sdks/react-native/expo-config-plugin.md +45 -0
- package/skills/sentry/references/sdks/react-native/index.md +1030 -0
- package/skills/sentry/references/sdks/react-native/logging.md +444 -0
- package/skills/sentry/references/sdks/react-native/profiling.md +386 -0
- package/skills/sentry/references/sdks/react-native/session-replay.md +704 -0
- package/skills/sentry/references/sdks/react-native/tracing.md +1086 -0
- package/skills/sentry/references/sdks/react-native/user-feedback.md +815 -0
- package/skills/sentry/references/sdks/react-router-framework/error-monitoring.md +127 -0
- package/skills/sentry/references/sdks/react-router-framework/index.md +411 -0
- package/skills/sentry/references/sdks/react-router-framework/logging.md +66 -0
- package/skills/sentry/references/sdks/react-router-framework/profiling.md +57 -0
- package/skills/sentry/references/sdks/react-router-framework/react-router-framework-features.md +110 -0
- package/skills/sentry/references/sdks/react-router-framework/session-replay.md +67 -0
- package/skills/sentry/references/sdks/react-router-framework/tracing.md +96 -0
- package/skills/sentry/references/sdks/react-router-framework/user-feedback.md +71 -0
- package/skills/sentry/references/sdks/ruby/crons.md +184 -0
- package/skills/sentry/references/sdks/ruby/error-monitoring.md +248 -0
- package/skills/sentry/references/sdks/ruby/index.md +297 -0
- package/skills/sentry/references/sdks/ruby/logging.md +168 -0
- package/skills/sentry/references/sdks/ruby/metrics.md +196 -0
- package/skills/sentry/references/sdks/ruby/migration.md +321 -0
- package/skills/sentry/references/sdks/ruby/profiling.md +107 -0
- package/skills/sentry/references/sdks/ruby/tracing.md +388 -0
- package/skills/sentry/references/sdks/svelte/error-monitoring.md +456 -0
- package/skills/sentry/references/sdks/svelte/index.md +467 -0
- package/skills/sentry/references/sdks/svelte/logging.md +344 -0
- package/skills/sentry/references/sdks/svelte/session-replay.md +369 -0
- package/skills/sentry/references/sdks/svelte/tracing.md +406 -0
- package/skills/sentry/references/sdks/tanstack-start/error-monitoring.md +149 -0
- package/skills/sentry/references/sdks/tanstack-start/index.md +381 -0
- package/skills/sentry/references/sdks/tanstack-start/logging.md +74 -0
- package/skills/sentry/references/sdks/tanstack-start/session-replay.md +76 -0
- package/skills/sentry/references/sdks/tanstack-start/tanstackstart-features.md +128 -0
- package/skills/sentry/references/sdks/tanstack-start/tracing.md +123 -0
- package/skills/sentry/references/sdks/tanstack-start/user-feedback.md +81 -0
- package/skills/sentry/references/search-query-language.md +226 -0
- package/skills/sentry/references/semantics/angular.md +7 -0
- package/skills/sentry/references/semantics/app.md +28 -0
- package/skills/sentry/references/semantics/art.md +17 -0
- package/skills/sentry/references/semantics/aws.md +43 -0
- package/skills/sentry/references/semantics/browser.md +34 -0
- package/skills/sentry/references/semantics/cache.md +12 -0
- package/skills/sentry/references/semantics/client.md +8 -0
- package/skills/sentry/references/semantics/cloud.md +12 -0
- package/skills/sentry/references/semantics/cloudflare.md +23 -0
- package/skills/sentry/references/semantics/code.md +11 -0
- package/skills/sentry/references/semantics/culture.md +11 -0
- package/skills/sentry/references/semantics/db.md +21 -0
- package/skills/sentry/references/semantics/device.md +43 -0
- package/skills/sentry/references/semantics/error.md +7 -0
- package/skills/sentry/references/semantics/event.md +8 -0
- package/skills/sentry/references/semantics/exception.md +10 -0
- package/skills/sentry/references/semantics/faas.md +19 -0
- package/skills/sentry/references/semantics/file.md +8 -0
- package/skills/sentry/references/semantics/flag.md +7 -0
- package/skills/sentry/references/semantics/gcp.md +16 -0
- package/skills/sentry/references/semantics/gen_ai.md +53 -0
- package/skills/sentry/references/semantics/general.md +11 -0
- package/skills/sentry/references/semantics/graphql.md +9 -0
- package/skills/sentry/references/semantics/grpc.md +19 -0
- package/skills/sentry/references/semantics/http.md +34 -0
- package/skills/sentry/references/semantics/index.md +63 -0
- package/skills/sentry/references/semantics/jsonrpc.md +8 -0
- package/skills/sentry/references/semantics/jvm.md +12 -0
- package/skills/sentry/references/semantics/koa.md +7 -0
- package/skills/sentry/references/semantics/logger.md +7 -0
- package/skills/sentry/references/semantics/mcp.md +37 -0
- package/skills/sentry/references/semantics/mdc.md +7 -0
- package/skills/sentry/references/semantics/messaging.md +23 -0
- package/skills/sentry/references/semantics/middleware.md +7 -0
- package/skills/sentry/references/semantics/navigation.md +9 -0
- package/skills/sentry/references/semantics/nel.md +11 -0
- package/skills/sentry/references/semantics/network.md +17 -0
- package/skills/sentry/references/semantics/os.md +15 -0
- package/skills/sentry/references/semantics/otel.md +10 -0
- package/skills/sentry/references/semantics/params.md +7 -0
- package/skills/sentry/references/semantics/process.md +14 -0
- package/skills/sentry/references/semantics/react.md +7 -0
- package/skills/sentry/references/semantics/remix.md +7 -0
- package/skills/sentry/references/semantics/resource.md +7 -0
- package/skills/sentry/references/semantics/rpc.md +10 -0
- package/skills/sentry/references/semantics/score.md +10 -0
- package/skills/sentry/references/semantics/sentry.md +69 -0
- package/skills/sentry/references/semantics/server.md +8 -0
- package/skills/sentry/references/semantics/service.md +8 -0
- package/skills/sentry/references/semantics/session.md +7 -0
- package/skills/sentry/references/semantics/state.md +7 -0
- package/skills/sentry/references/semantics/thread.md +8 -0
- package/skills/sentry/references/semantics/timber.md +7 -0
- package/skills/sentry/references/semantics/trpc.md +8 -0
- package/skills/sentry/references/semantics/ui.md +18 -0
- package/skills/sentry/references/semantics/url.md +15 -0
- package/skills/sentry/references/semantics/user.md +17 -0
- package/skills/sentry/references/semantics/user_agent.md +7 -0
- package/skills/sentry/references/semantics/vercel.md +42 -0
- package/skills/sentry/references/setup-verification.md +39 -0
- package/skills/sentry/references/snapshots/github-actions-fanout.md +206 -0
- package/skills/sentry/references/snapshots/github-actions-simple.md +102 -0
- package/skills/sentry/references/snapshots/github-actions-swift-snapshot-testing.md +118 -0
- package/skills/sentry/references/snapshots/index.md +19 -0
- package/skills/sentry/references/snapshots/snapshot-previews.md +100 -0
- package/skills/sentry/references/snapshots/snapshots.md +123 -0
- package/skills/sentry/references/snapshots/wizard-setup.md +134 -0
- package/skills/testing/LICENSE +21 -0
- package/skills/testing/NOTICE +7 -0
- package/skills/testing/SKILL.md +13 -19
- package/skills/testing/agents/openai.yaml +1 -2
- package/skills/testing/references/selection.md +23 -0
- package/skills/testing/references/tdd.md +19 -0
- package/skills/testing/references/test-design.md +17 -0
- package/src/catalog.ts +1 -7
- package/skills/build-effect-apis/SKILL.md +0 -81
- package/skills/build-effect-apis/agents/openai.yaml +0 -4
- package/skills/build-effect-clis/SKILL.md +0 -92
- package/skills/build-effect-clis/agents/openai.yaml +0 -4
- package/skills/effect-architecture-audit/agents/openai.yaml +0 -4
- package/skills/effect-atom-state/SKILL.md +0 -97
- package/skills/effect-atom-state/agents/openai.yaml +0 -4
- package/skills/effect-ts/SKILL.md +0 -35
- package/skills/effect-ts/agents/openai.yaml +0 -4
- /package/skills/{build-effect-apis/references → effect-development/references/api}/cloudflare-workers.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/runtime-assembly.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/server-and-middleware.md +0 -0
- /package/skills/{build-effect-apis/references → effect-development/references/api}/shared-contracts.md +0 -0
- /package/skills/{effect-architecture-audit/references → effect-development/references/architecture}/service-and-boundary-audit.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-lifecycle.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/effect-atom-workflows.md +0 -0
- /package/skills/{effect-atom-state/references → effect-development/references/atom}/tanstack-start.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/command-design.md +0 -0
- /package/skills/{build-effect-clis/references → effect-development/references/cli}/processes-and-platform.md +0 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Metrics — Sentry Go SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `github.com/getsentry/sentry-go` v0.42.0+
|
|
4
|
+
|
|
5
|
+
## Configuration
|
|
6
|
+
|
|
7
|
+
```go
|
|
8
|
+
sentry.Init(sentry.ClientOptions{
|
|
9
|
+
Dsn: os.Getenv("SENTRY_DSN"),
|
|
10
|
+
// Metrics are enabled by default. Disable with:
|
|
11
|
+
DisableMetrics: false,
|
|
12
|
+
// Filter or mutate metrics before sending:
|
|
13
|
+
BeforeSendMetric: func(metric *sentry.Metric) *sentry.Metric {
|
|
14
|
+
return metric // return nil to drop
|
|
15
|
+
},
|
|
16
|
+
})
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
| Option | Type | Default | Purpose |
|
|
20
|
+
| ------------------ | ----------------------- | ------- | ------------------------------------------ |
|
|
21
|
+
| `DisableMetrics` | `bool` | `false` | Set `true` to disable all metrics emission |
|
|
22
|
+
| `BeforeSendMetric` | `func(*Metric) *Metric` | `nil` | Mutate or drop individual metrics |
|
|
23
|
+
|
|
24
|
+
## Meter API
|
|
25
|
+
|
|
26
|
+
Create a `Meter` from any context:
|
|
27
|
+
|
|
28
|
+
```go
|
|
29
|
+
meter := sentry.NewMeter(ctx)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Returns a no-op `Meter` (silently drops all calls) if no client is bound to the hub or
|
|
33
|
+
`DisableMetrics: true`.
|
|
34
|
+
|
|
35
|
+
### Meter interface
|
|
36
|
+
|
|
37
|
+
```go
|
|
38
|
+
type Meter interface {
|
|
39
|
+
Count(name string, count int64, opts ...MeterOption)
|
|
40
|
+
Gauge(name string, value float64, opts ...MeterOption)
|
|
41
|
+
Distribution(name string, sample float64, opts ...MeterOption)
|
|
42
|
+
WithCtx(ctx context.Context) Meter // returns meter linked to new context/span
|
|
43
|
+
SetAttributes(attrs ...attribute.Builder) // permanent attributes on all metrics from this meter
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
> **The Go SDK has exactly three metric types: `Count`, `Gauge`, `Distribution`. Sets
|
|
48
|
+
> and timing helpers are not implemented.**
|
|
49
|
+
|
|
50
|
+
## Code Examples
|
|
51
|
+
|
|
52
|
+
### Basic metrics
|
|
53
|
+
|
|
54
|
+
```go
|
|
55
|
+
import (
|
|
56
|
+
"context"
|
|
57
|
+
"time"
|
|
58
|
+
"github.com/getsentry/sentry-go"
|
|
59
|
+
"github.com/getsentry/sentry-go/attribute"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
func main() {
|
|
63
|
+
sentry.Init(sentry.ClientOptions{Dsn: os.Getenv("SENTRY_DSN")})
|
|
64
|
+
defer sentry.Flush(2 * time.Second)
|
|
65
|
+
|
|
66
|
+
meter := sentry.NewMeter(context.Background())
|
|
67
|
+
|
|
68
|
+
// Counter — integer increments
|
|
69
|
+
meter.Count("emails.sent", 3,
|
|
70
|
+
sentry.WithAttributes(
|
|
71
|
+
attribute.String("provider", "sendgrid"),
|
|
72
|
+
attribute.Bool("transactional", true),
|
|
73
|
+
),
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
// Gauge — current snapshot value
|
|
77
|
+
meter.Gauge("queue.depth", 142.0,
|
|
78
|
+
sentry.WithAttributes(
|
|
79
|
+
attribute.String("queue.name", "orders"),
|
|
80
|
+
),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
// Distribution — histogram / percentile-friendly samples
|
|
84
|
+
meter.Distribution("api.response_time", 187.5,
|
|
85
|
+
sentry.WithUnit(sentry.UnitMillisecond),
|
|
86
|
+
sentry.WithAttributes(
|
|
87
|
+
attribute.String("endpoint", "/checkout"),
|
|
88
|
+
attribute.String("method", "POST"),
|
|
89
|
+
),
|
|
90
|
+
)
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Permanent meter attributes
|
|
95
|
+
|
|
96
|
+
```go
|
|
97
|
+
meter := sentry.NewMeter(context.Background())
|
|
98
|
+
meter.SetAttributes(
|
|
99
|
+
attribute.String("service", "payment-api"),
|
|
100
|
+
attribute.String("region", "us-east-1"),
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
// All metrics from this meter include service and region
|
|
104
|
+
meter.Count("orders.created", 1)
|
|
105
|
+
meter.Gauge("cpu.usage", 0.73, sentry.WithUnit(sentry.UnitRatio))
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Trace-linked metrics
|
|
109
|
+
|
|
110
|
+
Associate metrics with the current request’s trace span using `WithCtx`:
|
|
111
|
+
|
|
112
|
+
```go
|
|
113
|
+
http.HandleFunc("/checkout", func(w http.ResponseWriter, r *http.Request) {
|
|
114
|
+
// meter.WithCtx links metrics to the active span in r.Context()
|
|
115
|
+
meter.WithCtx(r.Context()).Count("checkout.attempts", 1,
|
|
116
|
+
sentry.WithAttributes(
|
|
117
|
+
attribute.String("method", r.Method),
|
|
118
|
+
),
|
|
119
|
+
)
|
|
120
|
+
// ... handler logic
|
|
121
|
+
})
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Timing a operation with Distribution
|
|
125
|
+
|
|
126
|
+
There is no built-in timer — measure elapsed time manually:
|
|
127
|
+
|
|
128
|
+
```go
|
|
129
|
+
func processOrder(ctx context.Context, orderID string) error {
|
|
130
|
+
start := time.Now()
|
|
131
|
+
|
|
132
|
+
err := doWork(ctx, orderID)
|
|
133
|
+
|
|
134
|
+
elapsed := float64(time.Since(start).Milliseconds())
|
|
135
|
+
meter.WithCtx(ctx).Distribution("order.processing_time", elapsed,
|
|
136
|
+
sentry.WithUnit(sentry.UnitMillisecond),
|
|
137
|
+
sentry.WithAttributes(
|
|
138
|
+
attribute.String("order.id", orderID),
|
|
139
|
+
attribute.Bool("success", err == nil),
|
|
140
|
+
),
|
|
141
|
+
)
|
|
142
|
+
return err
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Filtering metrics with BeforeSendMetric
|
|
147
|
+
|
|
148
|
+
```go
|
|
149
|
+
sentry.Init(sentry.ClientOptions{
|
|
150
|
+
Dsn: os.Getenv("SENTRY_DSN"),
|
|
151
|
+
BeforeSendMetric: func(m *sentry.Metric) *sentry.Metric {
|
|
152
|
+
// Drop sub-millisecond distributions (noise)
|
|
153
|
+
if m.Type == sentry.MetricTypeDistribution {
|
|
154
|
+
if v, ok := m.Value.Float64(); ok && v < 1.0 {
|
|
155
|
+
return nil
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Drop metrics from test environment
|
|
159
|
+
if env, ok := m.Attributes["sentry.environment"]; ok && env.String() == "test" {
|
|
160
|
+
return nil
|
|
161
|
+
}
|
|
162
|
+
return m
|
|
163
|
+
},
|
|
164
|
+
})
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Scope override
|
|
168
|
+
|
|
169
|
+
Override per-metric user/environment context without changing the global scope:
|
|
170
|
+
|
|
171
|
+
```go
|
|
172
|
+
customScope := sentry.NewScope()
|
|
173
|
+
customScope.SetUser(sentry.User{ID: "user-42"})
|
|
174
|
+
|
|
175
|
+
meter.Gauge("memory.usage", 512.0,
|
|
176
|
+
sentry.WithUnit(sentry.UnitMebibyte),
|
|
177
|
+
sentry.WithScopeOverride(customScope),
|
|
178
|
+
)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## MeterOption Reference
|
|
182
|
+
|
|
183
|
+
```go
|
|
184
|
+
sentry.WithUnit(unit string) // set measurement unit
|
|
185
|
+
sentry.WithAttributes(attrs ...attribute.Builder) // per-call attributes
|
|
186
|
+
sentry.WithScopeOverride(scope *sentry.Scope) // override scope for this metric
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Unit Constants
|
|
190
|
+
|
|
191
|
+
**Duration:**
|
|
192
|
+
|
|
193
|
+
| Constant | Value |
|
|
194
|
+
| ----------------- | --------------- |
|
|
195
|
+
| `UnitNanosecond` | `"nanosecond"` |
|
|
196
|
+
| `UnitMicrosecond` | `"microsecond"` |
|
|
197
|
+
| `UnitMillisecond` | `"millisecond"` |
|
|
198
|
+
| `UnitSecond` | `"second"` |
|
|
199
|
+
| `UnitMinute` | `"minute"` |
|
|
200
|
+
| `UnitHour` | `"hour"` |
|
|
201
|
+
| `UnitDay` | `"day"` |
|
|
202
|
+
| `UnitWeek` | `"week"` |
|
|
203
|
+
|
|
204
|
+
**Information:**
|
|
205
|
+
|
|
206
|
+
| Constant | Value |
|
|
207
|
+
| -------------- | ------------ |
|
|
208
|
+
| `UnitByte` | `"byte"` |
|
|
209
|
+
| `UnitKilobyte` | `"kilobyte"` |
|
|
210
|
+
| `UnitMegabyte` | `"megabyte"` |
|
|
211
|
+
| `UnitGigabyte` | `"gigabyte"` |
|
|
212
|
+
| `UnitMebibyte` | `"mebibyte"` |
|
|
213
|
+
| `UnitGibibyte` | `"gibibyte"` |
|
|
214
|
+
|
|
215
|
+
**Fraction:**
|
|
216
|
+
|
|
217
|
+
| Constant | Value |
|
|
218
|
+
| ------------- | ----------- |
|
|
219
|
+
| `UnitRatio` | `"ratio"` |
|
|
220
|
+
| `UnitPercent` | `"percent"` |
|
|
221
|
+
|
|
222
|
+
## Attribute Package
|
|
223
|
+
|
|
224
|
+
```go
|
|
225
|
+
import "github.com/getsentry/sentry-go/attribute"
|
|
226
|
+
|
|
227
|
+
attribute.String(key, value string) Builder
|
|
228
|
+
attribute.Int(key string, value int) Builder
|
|
229
|
+
attribute.Int64(key string, value int64) Builder
|
|
230
|
+
attribute.Float64(key string, v float64) Builder
|
|
231
|
+
attribute.Bool(key string, v bool) Builder
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Auto-Attached Attributes
|
|
235
|
+
|
|
236
|
+
| Attribute | Source |
|
|
237
|
+
| ------------------------------ | --------------------------------------------- |
|
|
238
|
+
| `sentry.release` | `ClientOptions.Release` |
|
|
239
|
+
| `sentry.environment` | `ClientOptions.Environment` |
|
|
240
|
+
| `sentry.server.address` | `ClientOptions.ServerName` or `os.Hostname()` |
|
|
241
|
+
| `sentry.sdk.name` / `.version` | SDK identifier |
|
|
242
|
+
|
|
243
|
+
## Metric Type Reference
|
|
244
|
+
|
|
245
|
+
| Method | Value type | Use for |
|
|
246
|
+
| -------------- | ---------- | ------------------------------------------------------------------ |
|
|
247
|
+
| `Count` | `int64` | Incrementing counters (events, errors, requests) |
|
|
248
|
+
| `Gauge` | `float64` | Current state snapshot (queue depth, memory, connections) |
|
|
249
|
+
| `Distribution` | `float64` | Variable measurements supporting percentiles (latency, file sizes) |
|
|
250
|
+
|
|
251
|
+
Note: `Count` takes `int64`, not `int`. `IntervalSchedule` also takes `int64`.
|
|
252
|
+
|
|
253
|
+
## Best Practices
|
|
254
|
+
|
|
255
|
+
- Use `Count` for events that accumulate (requests served, emails sent, errors thrown)
|
|
256
|
+
- Use `Gauge` for values that represent current state (queue depth, active connections,
|
|
257
|
+
cache size)
|
|
258
|
+
- Use `Distribution` for latency and sizes — it enables P50/P95/P99 analysis
|
|
259
|
+
- Keep metric names lowercase, dot-separated (`api.response_time`, `queue.depth`)
|
|
260
|
+
- Avoid high-cardinality tag values (user IDs, request IDs) — prefer categorical values
|
|
261
|
+
- Call `meter.SetAttributes()` once with service-level tags rather than repeating them
|
|
262
|
+
on every call
|
|
263
|
+
- Use `meter.WithCtx(ctx)` inside HTTP handlers to link metrics to the active trace span
|
|
264
|
+
|
|
265
|
+
## Troubleshooting
|
|
266
|
+
|
|
267
|
+
| Issue | Solution |
|
|
268
|
+
| ------------------------- | ---------------------------------------------------------------------------------------- |
|
|
269
|
+
| Metrics not appearing | Check `DisableMetrics` is not `true`; verify `sentry.Flush()` is called |
|
|
270
|
+
| `NewMeter` returns no-op | No client bound to hub; check `sentry.Init` was called |
|
|
271
|
+
| `Count` type error | `count` parameter is `int64`, not `int` — use explicit `int64(n)` cast |
|
|
272
|
+
| Missing attributes | Use `meter.SetAttributes()` for permanent attributes; they apply to all subsequent calls |
|
|
273
|
+
| High-cardinality warnings | Avoid using dynamic values (user IDs, UUIDs) as tag values |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Profiling — Sentry Go SDK
|
|
2
|
+
|
|
3
|
+
> **⚠️ Profiling is not available for Go.**
|
|
4
|
+
>
|
|
5
|
+
> Profiling support was added in v0.22.0 as an alpha feature and **removed in v0.31.0**
|
|
6
|
+
> (breaking change). As of v0.43.0, `ProfilesSampleRate` does not exist in
|
|
7
|
+
> `ClientOptions` and the field will not compile.
|
|
8
|
+
|
|
9
|
+
## Current Status
|
|
10
|
+
|
|
11
|
+
The Sentry Go SDK **does not support** transaction-based or continuous profiling.
|
|
12
|
+
The `/platforms/go/profiling/` documentation page returns 404.
|
|
13
|
+
|
|
14
|
+
```go
|
|
15
|
+
// ❌ This does NOT compile on v0.31.0+
|
|
16
|
+
sentry.Init(sentry.ClientOptions{
|
|
17
|
+
EnableTracing: true,
|
|
18
|
+
TracesSampleRate: 1.0,
|
|
19
|
+
ProfilesSampleRate: 1.0, // unknown field — compile error
|
|
20
|
+
})
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Alternatives
|
|
24
|
+
|
|
25
|
+
For Go application profiling, use these standard approaches independently of Sentry:
|
|
26
|
+
|
|
27
|
+
**pprof (stdlib):**
|
|
28
|
+
|
|
29
|
+
```go
|
|
30
|
+
import _ "net/http/pprof"
|
|
31
|
+
|
|
32
|
+
// Exposes /debug/pprof/ on your HTTP server
|
|
33
|
+
http.ListenAndServe(":6060", nil)
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Continuous profiling services:**
|
|
37
|
+
|
|
38
|
+
- [Pyroscope](https://pyroscope.io/) — open-source continuous profiling
|
|
39
|
+
- [Google Cloud Profiler](https://cloud.google.com/profiler)
|
|
40
|
+
- [Datadog Continuous Profiler](https://docs.datadoghq.com/profiler/)
|
|
41
|
+
|
|
42
|
+
## Check for Future Support
|
|
43
|
+
|
|
44
|
+
Monitor the [sentry-go releases](https://github.com/getsentry/sentry-go/releases) and
|
|
45
|
+
[docs.sentry.io/platforms/go/](https://docs.sentry.io/platforms/go/) for profiling to be
|
|
46
|
+
re-introduced.
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
# Tracing — Sentry Go SDK
|
|
2
|
+
|
|
3
|
+
> Minimum SDK: `github.com/getsentry/sentry-go` v0.9.0+
|
|
4
|
+
|
|
5
|
+
## Configuration
|
|
6
|
+
|
|
7
|
+
```go
|
|
8
|
+
sentry.Init(sentry.ClientOptions{
|
|
9
|
+
Dsn: os.Getenv("SENTRY_DSN"),
|
|
10
|
+
EnableTracing: true, // REQUIRED — tracing is off by default
|
|
11
|
+
TracesSampleRate: 1.0, // start at 1.0 for dev; lower in production
|
|
12
|
+
})
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Key tracing fields in `ClientOptions`:
|
|
16
|
+
|
|
17
|
+
| Option | Type | Default | Purpose |
|
|
18
|
+
| ------------------------- | --------------- | --------- | ------------------------------------------------------------- |
|
|
19
|
+
| `EnableTracing` | `bool` | `false` | Must be `true` to enable tracing |
|
|
20
|
+
| `TracesSampleRate` | `float64` | `0.0` | Uniform sample rate [0.0–1.0] |
|
|
21
|
+
| `TracesSampler` | `TracesSampler` | `nil` | Custom per-transaction sampling; overrides `TracesSampleRate` |
|
|
22
|
+
| `MaxSpans` | `int` | `1000` | Max child spans per transaction |
|
|
23
|
+
| `TracePropagationTargets` | `[]string` | `nil` | URLs to inject trace headers into (nil = all) |
|
|
24
|
+
| `PropagateTraceparent` | `bool` | `false` | Also propagate W3C `traceparent` header |
|
|
25
|
+
| `TraceIgnoreStatusCodes` | `[][]int` | `[[404]]` | HTTP codes that skip trace creation |
|
|
26
|
+
| `BeforeSendTransaction` | `func` | `nil` | Mutate or drop transaction events |
|
|
27
|
+
|
|
28
|
+
## Code Examples
|
|
29
|
+
|
|
30
|
+
### Custom sampler
|
|
31
|
+
|
|
32
|
+
Use `TracesSampler` instead of `TracesSampleRate` for per-transaction control.
|
|
33
|
+
Setting both — sampler wins.
|
|
34
|
+
|
|
35
|
+
```go
|
|
36
|
+
sentry.Init(sentry.ClientOptions{
|
|
37
|
+
Dsn: os.Getenv("SENTRY_DSN"),
|
|
38
|
+
EnableTracing: true,
|
|
39
|
+
TracesSampler: sentry.TracesSampler(func(ctx sentry.SamplingContext) float64 {
|
|
40
|
+
switch ctx.Span.Name {
|
|
41
|
+
case "GET /healthz", "GET /metrics":
|
|
42
|
+
return 0.0 // never sample
|
|
43
|
+
case "POST /checkout":
|
|
44
|
+
return 1.0 // always sample
|
|
45
|
+
default:
|
|
46
|
+
return 0.1 // 10% of everything else
|
|
47
|
+
}
|
|
48
|
+
}),
|
|
49
|
+
})
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`SamplingContext` fields:
|
|
53
|
+
|
|
54
|
+
- `ctx.Span` — current span (always non-nil)
|
|
55
|
+
- `ctx.Parent` — parent span (nil for root transactions)
|
|
56
|
+
|
|
57
|
+
### Manual transactions and spans
|
|
58
|
+
|
|
59
|
+
```go
|
|
60
|
+
// Start a root transaction
|
|
61
|
+
tx := sentry.StartTransaction(ctx, "process-order",
|
|
62
|
+
sentry.WithOpName("task"),
|
|
63
|
+
sentry.WithTransactionSource(sentry.SourceCustom),
|
|
64
|
+
)
|
|
65
|
+
defer tx.Finish()
|
|
66
|
+
|
|
67
|
+
// Start a child span — pass tx.Context() to nest under the transaction
|
|
68
|
+
dbSpan := sentry.StartSpan(tx.Context(), "db.query")
|
|
69
|
+
dbSpan.Description = "INSERT INTO orders (user_id, total) VALUES (?, ?)"
|
|
70
|
+
dbSpan.SetData("db.system", "postgresql")
|
|
71
|
+
dbSpan.SetData("db.rows_affected", 1)
|
|
72
|
+
defer dbSpan.Finish()
|
|
73
|
+
|
|
74
|
+
// Alternative: StartChild on the parent span directly
|
|
75
|
+
cacheSpan := tx.StartChild("cache.get",
|
|
76
|
+
sentry.WithDescription("get:user:42"),
|
|
77
|
+
)
|
|
78
|
+
defer cacheSpan.Finish()
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### HTTP handler with manual transaction
|
|
82
|
+
|
|
83
|
+
```go
|
|
84
|
+
http.HandleFunc("/users", func(w http.ResponseWriter, r *http.Request) {
|
|
85
|
+
hub := sentry.CurrentHub().Clone()
|
|
86
|
+
ctx := sentry.SetHubOnContext(r.Context(), hub)
|
|
87
|
+
|
|
88
|
+
tx := sentry.StartTransaction(ctx,
|
|
89
|
+
fmt.Sprintf("%s %s", r.Method, r.URL.Path),
|
|
90
|
+
sentry.WithOpName("http.server"),
|
|
91
|
+
sentry.ContinueFromRequest(r), // link to incoming distributed trace
|
|
92
|
+
sentry.WithTransactionSource(sentry.SourceURL),
|
|
93
|
+
)
|
|
94
|
+
defer tx.Finish()
|
|
95
|
+
|
|
96
|
+
users, err := fetchUsers(tx.Context())
|
|
97
|
+
if err != nil {
|
|
98
|
+
hub.CaptureException(err)
|
|
99
|
+
http.Error(w, "internal error", 500)
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
fmt.Fprintf(w, "%d users", len(users))
|
|
103
|
+
})
|
|
104
|
+
|
|
105
|
+
func fetchUsers(ctx context.Context) ([]string, error) {
|
|
106
|
+
span := sentry.StartSpan(ctx, "db.query")
|
|
107
|
+
span.Description = "SELECT id, name FROM users"
|
|
108
|
+
span.SetData("db.system", "postgresql")
|
|
109
|
+
defer span.Finish()
|
|
110
|
+
|
|
111
|
+
time.Sleep(10 * time.Millisecond)
|
|
112
|
+
span.Status = sentry.SpanStatusOK
|
|
113
|
+
return []string{"alice", "bob"}, nil
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Setting span status and data
|
|
118
|
+
|
|
119
|
+
```go
|
|
120
|
+
span := sentry.StartSpan(ctx, "http.client")
|
|
121
|
+
span.Description = "GET https://api.stripe.com/v1/charges"
|
|
122
|
+
span.SetData("http.request.method", "GET")
|
|
123
|
+
span.SetData("server.address", "api.stripe.com")
|
|
124
|
+
|
|
125
|
+
req, _ := http.NewRequestWithContext(span.Context(), "GET", "https://api.stripe.com/v1/charges", nil)
|
|
126
|
+
resp, err := http.DefaultClient.Do(req)
|
|
127
|
+
if err != nil {
|
|
128
|
+
span.Status = sentry.SpanStatusInternalError
|
|
129
|
+
} else {
|
|
130
|
+
span.Status = sentry.HTTPtoSpanStatus(resp.StatusCode)
|
|
131
|
+
span.SetData("http.response.status_code", resp.StatusCode)
|
|
132
|
+
}
|
|
133
|
+
defer span.Finish()
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
> `span.Status` is set **directly** — there is no `SetStatus()` method.
|
|
137
|
+
|
|
138
|
+
### Retrieving active transaction or span from context
|
|
139
|
+
|
|
140
|
+
```go
|
|
141
|
+
// Root transaction
|
|
142
|
+
tx := sentry.TransactionFromContext(ctx)
|
|
143
|
+
if tx != nil {
|
|
144
|
+
tx.SetTag("user_id", "42")
|
|
145
|
+
tx.Name = "custom-name"
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Innermost span (may be a child)
|
|
149
|
+
span := sentry.SpanFromContext(ctx)
|
|
150
|
+
span.SetData("result_count", 47)
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
## Framework Middleware
|
|
154
|
+
|
|
155
|
+
All framework middlewares automatically start a root transaction per request and
|
|
156
|
+
continue incoming distributed traces.
|
|
157
|
+
|
|
158
|
+
| Framework | Import | Middleware call | Transaction source |
|
|
159
|
+
| ---------- | ----------------- | ---------------------------------- | ------------------ |
|
|
160
|
+
| `net/http` | `sentry-go/http` | `sentryhttp.New(opts).Handle(mux)` | `SourceURL` |
|
|
161
|
+
| Gin | `sentry-go/gin` | `router.Use(sentrygin.New(opts))` | `SourceRoute` |
|
|
162
|
+
| Echo | `sentry-go/echo` | `e.Use(sentryecho.New(opts))` | `SourceRoute` |
|
|
163
|
+
| Fiber | `sentry-go/fiber` | `app.Use(sentryfiber.New(opts))` | `SourceURL` |
|
|
164
|
+
| Iris | `sentry-go/iris` | `app.Use(sentryiris.New(opts))` | `SourceRoute` |
|
|
165
|
+
|
|
166
|
+
Accessing the current transaction in a framework handler:
|
|
167
|
+
|
|
168
|
+
```go
|
|
169
|
+
// net/http — use the standard context
|
|
170
|
+
tx := sentry.TransactionFromContext(r.Context())
|
|
171
|
+
|
|
172
|
+
// Gin
|
|
173
|
+
tx := sentrygin.GetSpanFromContext(c)
|
|
174
|
+
|
|
175
|
+
// Echo
|
|
176
|
+
tx := sentryecho.GetSpanFromContext(c)
|
|
177
|
+
|
|
178
|
+
// Fiber
|
|
179
|
+
tx := sentryfiber.GetSpanFromContext(c)
|
|
180
|
+
|
|
181
|
+
// Iris
|
|
182
|
+
tx := sentryiris.GetSpanFromContext(c)
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Adding a child span in a Gin handler:
|
|
186
|
+
|
|
187
|
+
```go
|
|
188
|
+
router.GET("/users/:id", func(c *gin.Context) {
|
|
189
|
+
tx := sentrygin.GetSpanFromContext(c)
|
|
190
|
+
|
|
191
|
+
dbSpan := sentry.StartSpan(tx.Context(), "db.query")
|
|
192
|
+
dbSpan.Description = "SELECT * FROM users WHERE id = ?"
|
|
193
|
+
defer dbSpan.Finish()
|
|
194
|
+
|
|
195
|
+
// handler logic...
|
|
196
|
+
})
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Distributed Tracing
|
|
200
|
+
|
|
201
|
+
Sentry propagates two headers:
|
|
202
|
+
|
|
203
|
+
| Header | Constant | Purpose |
|
|
204
|
+
| -------------- | ---------------------------- | --------------------------- |
|
|
205
|
+
| `sentry-trace` | `sentry.SentryTraceHeader` | Links spans across services |
|
|
206
|
+
| `baggage` | `sentry.SentryBaggageHeader` | Dynamic Sampling Context |
|
|
207
|
+
|
|
208
|
+
**Consuming an incoming trace (downstream service):**
|
|
209
|
+
|
|
210
|
+
```go
|
|
211
|
+
// ContinueFromRequest reads both sentry-trace and baggage headers automatically
|
|
212
|
+
tx := sentry.StartTransaction(ctx, "GET /api/check",
|
|
213
|
+
sentry.WithOpName("http.server"),
|
|
214
|
+
sentry.ContinueFromRequest(r),
|
|
215
|
+
sentry.WithTransactionSource(sentry.SourceRoute),
|
|
216
|
+
)
|
|
217
|
+
defer tx.Finish()
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
**Propagating to an outgoing request (upstream service):**
|
|
221
|
+
|
|
222
|
+
```go
|
|
223
|
+
func callDownstream(ctx context.Context, url string) {
|
|
224
|
+
hub := sentry.GetHubFromContext(ctx)
|
|
225
|
+
|
|
226
|
+
req, _ := http.NewRequest("GET", url, nil)
|
|
227
|
+
req.Header.Set(sentry.SentryTraceHeader, hub.GetTraceparent())
|
|
228
|
+
req.Header.Set(sentry.SentryBaggageHeader, hub.GetBaggage())
|
|
229
|
+
|
|
230
|
+
http.DefaultClient.Do(req)
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Hub header methods:**
|
|
235
|
+
|
|
236
|
+
```go
|
|
237
|
+
hub.GetTraceparent() // sentry-trace format: "traceID-spanID-sampled"
|
|
238
|
+
hub.GetTraceparentW3C() // W3C format: "00-traceID-spanID-01"
|
|
239
|
+
hub.GetBaggage() // "sentry-trace_id=...,sentry-environment=production,..."
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Both `sentry-trace` AND `baggage` headers must be propagated for correct Dynamic
|
|
243
|
+
Sampling Context.
|
|
244
|
+
|
|
245
|
+
### OpenTelemetry bridge
|
|
246
|
+
|
|
247
|
+
For projects already using OpenTelemetry, forward OTel spans to Sentry without changing
|
|
248
|
+
instrumentation:
|
|
249
|
+
|
|
250
|
+
```go
|
|
251
|
+
import (
|
|
252
|
+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
|
253
|
+
sentryotel "github.com/getsentry/sentry-go/otel"
|
|
254
|
+
"go.opentelemetry.io/otel"
|
|
255
|
+
"go.opentelemetry.io/otel/propagation"
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
sentry.Init(sentry.ClientOptions{
|
|
259
|
+
Dsn: os.Getenv("SENTRY_DSN"),
|
|
260
|
+
EnableTracing: true,
|
|
261
|
+
TracesSampleRate: 1.0,
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
tp := sdktrace.NewTracerProvider(
|
|
265
|
+
sdktrace.WithSpanProcessor(sentryotel.NewSentrySpanProcessor()),
|
|
266
|
+
)
|
|
267
|
+
otel.SetTracerProvider(tp)
|
|
268
|
+
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(
|
|
269
|
+
propagation.TraceContext{},
|
|
270
|
+
propagation.Baggage{},
|
|
271
|
+
sentryotel.NewSentryPropagator(),
|
|
272
|
+
))
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
When using OTel, pass the OTel context explicitly when capturing errors — global
|
|
276
|
+
`sentry.CaptureException` does not auto-link:
|
|
277
|
+
|
|
278
|
+
```go
|
|
279
|
+
hub := sentry.CurrentHub()
|
|
280
|
+
hub.Client().CaptureException(
|
|
281
|
+
err,
|
|
282
|
+
&sentry.EventHint{Context: otelCtx},
|
|
283
|
+
hub.Scope(),
|
|
284
|
+
)
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## SpanOption Reference
|
|
288
|
+
|
|
289
|
+
```go
|
|
290
|
+
sentry.WithOpName("http.server") // sets span.Op
|
|
291
|
+
sentry.WithDescription("SELECT * FROM users") // sets span.Description
|
|
292
|
+
sentry.WithTransactionName("checkout") // sets root span name
|
|
293
|
+
sentry.WithTransactionSource(sentry.SourceRoute) // transaction naming source
|
|
294
|
+
sentry.WithSpanSampled(sentry.SampledTrue) // force-sample this span
|
|
295
|
+
sentry.ContinueFromRequest(r *http.Request) // read sentry-trace + baggage from request
|
|
296
|
+
sentry.ContinueFromHeaders(trace, baggage string)// pass raw header strings
|
|
297
|
+
sentry.ContinueTrace(hub, traceparent, baggage) // hub-aware form
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## TransactionSource Constants
|
|
301
|
+
|
|
302
|
+
| Constant | Value | Use when … |
|
|
303
|
+
| -------------- | ---------- | --------------------------------------------------------- |
|
|
304
|
+
| `SourceURL` | `"url"` | Raw URL path (low-cardinality risk) |
|
|
305
|
+
| `SourceRoute` | `"route"` | Parameterised template, e.g. `/users/:id` — **preferred** |
|
|
306
|
+
| `SourceView` | `"view"` | View/controller name |
|
|
307
|
+
| `SourceCustom` | `"custom"` | Manually set name |
|
|
308
|
+
| `SourceTask` | `"task"` | Background task name |
|
|
309
|
+
|
|
310
|
+
Use `SourceRoute` with parameterised paths to prevent high-cardinality grouping in
|
|
311
|
+
Sentry’s Performance UI.
|
|
312
|
+
|
|
313
|
+
## SpanStatus Constants
|
|
314
|
+
|
|
315
|
+
Set directly: `span.Status = sentry.SpanStatusOK`
|
|
316
|
+
|
|
317
|
+
| Constant | When to use |
|
|
318
|
+
| ---------------------------- | ---------------------- |
|
|
319
|
+
| `SpanStatusOK` | Success |
|
|
320
|
+
| `SpanStatusInternalError` | Unhandled server error |
|
|
321
|
+
| `SpanStatusNotFound` | Resource not found |
|
|
322
|
+
| `SpanStatusPermissionDenied` | Auth failure |
|
|
323
|
+
| `SpanStatusDeadlineExceeded` | Timeout |
|
|
324
|
+
| `SpanStatusInvalidArgument` | Bad input |
|
|
325
|
+
| `SpanStatusUnavailable` | Service unavailable |
|
|
326
|
+
|
|
327
|
+
Or derive from HTTP response: `span.Status = sentry.HTTPtoSpanStatus(resp.StatusCode)`
|
|
328
|
+
|
|
329
|
+
## Common Span Op Values
|
|
330
|
+
|
|
331
|
+
| Op | Usage |
|
|
332
|
+
| --------------------------------- | ------------------------------- |
|
|
333
|
+
| `http.server` | Incoming HTTP requests |
|
|
334
|
+
| `http.client` | Outgoing HTTP calls |
|
|
335
|
+
| `db.query` | SQL SELECT/INSERT/UPDATE/DELETE |
|
|
336
|
+
| `db` | Generic database operation |
|
|
337
|
+
| `cache.get` / `cache.set` | Cache reads/writes |
|
|
338
|
+
| `queue.publish` / `queue.process` | Message queues |
|
|
339
|
+
| `function` | Generic function call |
|
|
340
|
+
| `task` | Background job |
|
|
341
|
+
| `grpc.server` / `grpc.client` | gRPC spans |
|
|
342
|
+
|
|
343
|
+
## Best Practices
|
|
344
|
+
|
|
345
|
+
- Set `EnableTracing: true` explicitly — it defaults to `false`
|
|
346
|
+
- Use `TracesSampler` (not `TracesSampleRate`) for any environment-specific or
|
|
347
|
+
route-specific sampling logic
|
|
348
|
+
- Always `defer span.Finish()` — unfinished spans are silently dropped
|
|
349
|
+
- Use `SourceRoute` with parameterised route templates to avoid high-cardinality
|
|
350
|
+
transaction names
|
|
351
|
+
- Use `ContinueFromRequest(r)` in every HTTP handler to preserve distributed traces
|
|
352
|
+
- Propagate both `sentry-trace` AND `baggage` headers on outgoing requests
|
|
353
|
+
- Don’t set `MaxSpans` below the number of expected child spans in your largest
|
|
354
|
+
transactions
|
|
355
|
+
|
|
356
|
+
## Troubleshooting
|
|
357
|
+
|
|
358
|
+
| Issue | Solution |
|
|
359
|
+
| ---------------------------------- | ----------------------------------------------------------------------------------- |
|
|
360
|
+
| No transactions appearing | Ensure `EnableTracing: true` and `TracesSampleRate > 0` |
|
|
361
|
+
| Spans missing from transaction | Ensure `defer span.Finish()` is called on every span |
|
|
362
|
+
| High-cardinality transaction names | Use `WithTransactionSource(SourceRoute)` with parameterised route templates |
|
|
363
|
+
| Distributed trace not linked | Propagate both `sentry-trace` and `baggage` headers; use `ContinueFromRequest` |
|
|
364
|
+
| Health checks polluting data | Use `TracesSampler` to return `0.0` for health endpoints |
|
|
365
|
+
| Too many spans | Lower `MaxSpans`; coalesce high-frequency child spans (e.g., N+1 DB calls) |
|
|
366
|
+
| OTel errors not linked to trace | Pass OTel `ctx` via `EventHint.Context`; don’t use global `sentry.CaptureException` |
|