@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,387 @@
|
|
|
1
|
+
# Logging — Sentry Flutter SDK
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK:** `sentry_flutter` ≥ **9.5.0** for structured logs (`enableLogs`)\
|
|
4
|
+
> **`sentry_logging` integration:** `sentry_logging` ≥ **9.5.0** + Dart `logging`
|
|
5
|
+
> package ≥ **1.0.0**\
|
|
6
|
+
> **`enableLogs` flag:** off by default — must be explicitly enabled
|
|
7
|
+
|
|
8
|
+
Flutter/Dart has two complementary logging paths:
|
|
9
|
+
|
|
10
|
+
1. **Sentry structured logs** — `Sentry.logger.*` API (direct) or via `sentry_logging`
|
|
11
|
+
integration (bridges the Dart `logging` package)
|
|
12
|
+
2. **Breadcrumbs** — Automatic breadcrumbs from `sentry_logging` for navigation and
|
|
13
|
+
debug events
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## Table of Contents
|
|
18
|
+
|
|
19
|
+
1. [Enabling Logs](#1-enabling-logs)
|
|
20
|
+
2. [Direct Logger API](#2-direct-logger-api)
|
|
21
|
+
3. [sentry_logging Integration (Dart logging package)](#3-sentry_logging-integration-dart-logging-package)
|
|
22
|
+
4. [Structured Attributes](#4-structured-attributes)
|
|
23
|
+
5. [Filtering with beforeSendLog](#5-filtering-with-beforesendlog)
|
|
24
|
+
6. [Log Correlation with Traces](#6-log-correlation-with-traces)
|
|
25
|
+
7. [Configuration Reference](#7-configuration-reference)
|
|
26
|
+
8. [Known Limitations](#8-known-limitations)
|
|
27
|
+
9. [Troubleshooting](#9-troubleshooting)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## 1. Enabling Logs
|
|
32
|
+
|
|
33
|
+
`enableLogs` is **off by default** — opt in explicitly:
|
|
34
|
+
|
|
35
|
+
```dart
|
|
36
|
+
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
37
|
+
|
|
38
|
+
Future<void> main() async {
|
|
39
|
+
await SentryFlutter.init(
|
|
40
|
+
(options) {
|
|
41
|
+
options.dsn = 'YOUR_DSN';
|
|
42
|
+
options.enableLogs = true; // required — logs are disabled unless this is set
|
|
43
|
+
},
|
|
44
|
+
appRunner: () => runApp(MyApp()),
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 2. Direct Logger API
|
|
52
|
+
|
|
53
|
+
Use `Sentry.logger` to emit structured logs at six severity levels:
|
|
54
|
+
|
|
55
|
+
```dart
|
|
56
|
+
import 'package:sentry/sentry.dart';
|
|
57
|
+
|
|
58
|
+
// Fine-grained debugging — high volume, filter in production
|
|
59
|
+
Sentry.logger.trace('Starting checkout flow', attributes: {'step': SentryAttribute.string('init')});
|
|
60
|
+
|
|
61
|
+
// Development diagnostics
|
|
62
|
+
Sentry.logger.debug('Cache lookup', attributes: {
|
|
63
|
+
'key': SentryAttribute.string('user:123'),
|
|
64
|
+
'hit': SentryAttribute.bool(false),
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// Normal operations and business milestones
|
|
68
|
+
Sentry.logger.info('Order created', attributes: {
|
|
69
|
+
'orderId': SentryAttribute.string('order_456'),
|
|
70
|
+
'total': SentryAttribute.double(99.99),
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Degraded state, approaching limits
|
|
74
|
+
Sentry.logger.warn('Rate limit approaching', attributes: {
|
|
75
|
+
'endpoint': SentryAttribute.string('/api/search/'),
|
|
76
|
+
'current': SentryAttribute.int(95),
|
|
77
|
+
'max': SentryAttribute.int(100),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Failures requiring attention
|
|
81
|
+
Sentry.logger.error('Payment failed', attributes: {
|
|
82
|
+
'reason': SentryAttribute.string('card_declined'),
|
|
83
|
+
'userId': SentryAttribute.string('u_1'),
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Critical failures — app or subsystem is down
|
|
87
|
+
Sentry.logger.fatal('Database unavailable', attributes: {'host': SentryAttribute.string('db-primary')});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Level selection guide
|
|
91
|
+
|
|
92
|
+
| Level | When to use |
|
|
93
|
+
| ------- | ---------------------------------------------------------------- |
|
|
94
|
+
| `trace` | Step-by-step internals, loop iterations, low-level flow tracking |
|
|
95
|
+
| `debug` | Diagnostic info useful during development |
|
|
96
|
+
| `info` | Business events, user actions, meaningful state transitions |
|
|
97
|
+
| `warn` | Recoverable errors, degraded performance, approaching limits |
|
|
98
|
+
| `error` | Failures that need investigation but don’t crash the app |
|
|
99
|
+
| `fatal` | Unrecoverable failures — app or critical subsystem is down |
|
|
100
|
+
|
|
101
|
+
**Attribute value types:** `String`, `int`, `double`, and `bool` only.
|
|
102
|
+
Other types will be dropped or coerced.
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 3. sentry_logging Integration (Dart logging package)
|
|
107
|
+
|
|
108
|
+
The `sentry_logging` package bridges the standard Dart `logging` package to Sentry.
|
|
109
|
+
This is ideal for projects already using `logging` for structured output.
|
|
110
|
+
|
|
111
|
+
### Installation
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
# pubspec.yaml
|
|
115
|
+
dependencies:
|
|
116
|
+
sentry_flutter: ^9.14.0
|
|
117
|
+
sentry_logging: ^9.14.0
|
|
118
|
+
logging: ^1.0.0
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Configuration
|
|
122
|
+
|
|
123
|
+
```dart
|
|
124
|
+
import 'package:sentry_flutter/sentry_flutter.dart';
|
|
125
|
+
import 'package:sentry_logging/sentry_logging.dart';
|
|
126
|
+
import 'package:logging/logging.dart';
|
|
127
|
+
|
|
128
|
+
Future<void> main() async {
|
|
129
|
+
await SentryFlutter.init(
|
|
130
|
+
(options) {
|
|
131
|
+
options.dsn = 'YOUR_DSN';
|
|
132
|
+
options.enableLogs = true;
|
|
133
|
+
|
|
134
|
+
options.addIntegration(
|
|
135
|
+
LoggingIntegration(
|
|
136
|
+
// Minimum level that creates breadcrumbs (default: Level.INFO)
|
|
137
|
+
minBreadcrumbLevel: Level.INFO,
|
|
138
|
+
// Minimum level that creates Sentry error events (default: Level.SEVERE)
|
|
139
|
+
minEventLevel: Level.SEVERE,
|
|
140
|
+
// Minimum level that creates structured logs (default: Level.INFO)
|
|
141
|
+
minSentryLogLevel: Level.INFO,
|
|
142
|
+
),
|
|
143
|
+
);
|
|
144
|
+
},
|
|
145
|
+
appRunner: () => runApp(MyApp()),
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Usage with the logging package
|
|
151
|
+
|
|
152
|
+
```dart
|
|
153
|
+
import 'package:logging/logging.dart';
|
|
154
|
+
|
|
155
|
+
final _logger = Logger('PaymentService');
|
|
156
|
+
|
|
157
|
+
class PaymentService {
|
|
158
|
+
Future<void> processPayment(String orderId, double amount) async {
|
|
159
|
+
_logger.info('Processing payment for order $orderId (amount: $amount)');
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
final result = await _chargeCard(amount);
|
|
163
|
+
_logger.info(
|
|
164
|
+
'Payment succeeded for order $orderId (transaction: ${result.transactionId})');
|
|
165
|
+
} catch (e, stackTrace) {
|
|
166
|
+
// Pass error and stackTrace for accurate reporting
|
|
167
|
+
_logger.severe('Payment failed', e, stackTrace);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Stack trace handling
|
|
174
|
+
|
|
175
|
+
The Dart `logging` package does **not** automatically capture stack traces.
|
|
176
|
+
Configure it explicitly:
|
|
177
|
+
|
|
178
|
+
```dart
|
|
179
|
+
// Option 1 — automatic stack trace capture at SEVERE and above
|
|
180
|
+
Logger.root.recordStackTraceAtLevel = Level.SEVERE;
|
|
181
|
+
|
|
182
|
+
// Option 2 — pass stack trace manually to each log call
|
|
183
|
+
Logger('MyService').severe('Error occurred', error, stackTrace);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### What each log level produces
|
|
187
|
+
|
|
188
|
+
| Dart Level | ≥ `minBreadcrumbLevel` | ≥ `minSentryLogLevel` | ≥ `minEventLevel` |
|
|
189
|
+
| ----------------------------- | -------------------------- | --------------------- | ----------------- |
|
|
190
|
+
| `Level.FINEST`/`FINER`/`FINE` | Breadcrumb (if configured) | Structured log | — |
|
|
191
|
+
| `Level.INFO`/`CONFIG` | ✅ Breadcrumb | ✅ Structured log | — |
|
|
192
|
+
| `Level.WARNING` | ✅ Breadcrumb | ✅ Structured log | — |
|
|
193
|
+
| `Level.SEVERE` | ✅ Breadcrumb | ✅ Structured log | ✅ Error event |
|
|
194
|
+
| `Level.SHOUT` | ✅ Breadcrumb | ✅ Structured log | ✅ Error event |
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## 4. Structured Attributes
|
|
199
|
+
|
|
200
|
+
Attributes passed to `Sentry.logger.*` become **queryable columns** in the Sentry Logs
|
|
201
|
+
UI:
|
|
202
|
+
|
|
203
|
+
```dart
|
|
204
|
+
Sentry.logger.info('Checkout completed', attributes: {
|
|
205
|
+
'orderId': SentryAttribute.string(order.id),
|
|
206
|
+
'userId': SentryAttribute.string(user.id),
|
|
207
|
+
'cartValue': SentryAttribute.double(cart.total),
|
|
208
|
+
'itemCount': SentryAttribute.int(cart.items.length),
|
|
209
|
+
'paymentMethod': SentryAttribute.string('stripe'),
|
|
210
|
+
'durationMs': SentryAttribute.int(
|
|
211
|
+
DateTime.now().difference(startTime).inMilliseconds),
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
Sentry.logger.error('Navigation failed', attributes: {
|
|
215
|
+
'fromRoute': SentryAttribute.string('/home'),
|
|
216
|
+
'toRoute': SentryAttribute.string('/profile'),
|
|
217
|
+
'errorCode': SentryAttribute.string(err.code),
|
|
218
|
+
'retryable': SentryAttribute.bool(true),
|
|
219
|
+
});
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Scope-level attributes
|
|
223
|
+
|
|
224
|
+
Set attributes on the scope and they are automatically attached to all logs emitted
|
|
225
|
+
while the scope is active:
|
|
226
|
+
|
|
227
|
+
```dart
|
|
228
|
+
// Global scope — set once at app startup
|
|
229
|
+
Sentry.configureScope((scope) {
|
|
230
|
+
scope.setContexts('app', {
|
|
231
|
+
'version': '2.1.0',
|
|
232
|
+
'build': '42',
|
|
233
|
+
'flavor': 'production',
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
// Per-operation scope — configure the current scope before logging
|
|
238
|
+
Sentry.configureScope((scope) {
|
|
239
|
+
scope.setTag('orderId', 'ord_789');
|
|
240
|
+
scope.setTag('paymentMethod', 'stripe');
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
Sentry.logger.info('Validating cart', attributes: {'cartId': SentryAttribute.string(cart.id)});
|
|
244
|
+
await processPayment();
|
|
245
|
+
Sentry.logger.info('Payment complete');
|
|
246
|
+
// Both logs above carry orderId and paymentMethod tags
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Auto-attached attributes
|
|
250
|
+
|
|
251
|
+
The SDK automatically attaches these to every log:
|
|
252
|
+
|
|
253
|
+
| Attribute | Source |
|
|
254
|
+
| ---------------------------------------- | -------------------------------------------- |
|
|
255
|
+
| `sentry.environment` | `options.environment` |
|
|
256
|
+
| `sentry.release` | `options.release` |
|
|
257
|
+
| `sentry.sdk.name` / `sentry.sdk.version` | SDK internals |
|
|
258
|
+
| `user.id`, `user.email` | `Sentry.setUser()` when set |
|
|
259
|
+
| `origin` | Identifies which integration emitted the log |
|
|
260
|
+
|
|
261
|
+
---
|
|
262
|
+
|
|
263
|
+
## 5. Filtering with beforeSendLog
|
|
264
|
+
|
|
265
|
+
Filter or mutate every log before it is transmitted.
|
|
266
|
+
Return `null` to drop the log entirely:
|
|
267
|
+
|
|
268
|
+
```dart
|
|
269
|
+
await SentryFlutter.init(
|
|
270
|
+
(options) {
|
|
271
|
+
options.dsn = 'YOUR_DSN';
|
|
272
|
+
options.enableLogs = true;
|
|
273
|
+
|
|
274
|
+
options.beforeSendLog = (log) {
|
|
275
|
+
// Drop trace/debug in production to reduce volume
|
|
276
|
+
if (log.level == SentryLogLevel.trace ||
|
|
277
|
+
log.level == SentryLogLevel.debug) {
|
|
278
|
+
return null;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Scrub sensitive attribute values
|
|
282
|
+
if (log.attributes.containsKey('password')) {
|
|
283
|
+
log.attributes.remove('password');
|
|
284
|
+
}
|
|
285
|
+
if (log.attributes.containsKey('creditCard')) {
|
|
286
|
+
log.attributes['creditCard'] = '[REDACTED]';
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
return log;
|
|
290
|
+
};
|
|
291
|
+
},
|
|
292
|
+
appRunner: () => runApp(MyApp()),
|
|
293
|
+
);
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
---
|
|
297
|
+
|
|
298
|
+
## 6. Log Correlation with Traces
|
|
299
|
+
|
|
300
|
+
When tracing is enabled, logs emitted inside an active span are **automatically
|
|
301
|
+
correlated** in the Sentry UI. You can navigate from a log to its parent transaction.
|
|
302
|
+
|
|
303
|
+
```dart
|
|
304
|
+
import 'package:sentry/sentry.dart';
|
|
305
|
+
|
|
306
|
+
Future<void> processOrder(String orderId) async {
|
|
307
|
+
final transaction = Sentry.startTransaction('process-order', 'task');
|
|
308
|
+
try {
|
|
309
|
+
Sentry.logger.info('Validating cart', attributes: {'orderId': SentryAttribute.string(orderId)});
|
|
310
|
+
await validateCart(orderId);
|
|
311
|
+
|
|
312
|
+
Sentry.logger.info('Charging payment', attributes: {'orderId': SentryAttribute.string(orderId)});
|
|
313
|
+
await chargePayment(orderId);
|
|
314
|
+
|
|
315
|
+
Sentry.logger.info('Confirming order', attributes: {'orderId': SentryAttribute.string(orderId)});
|
|
316
|
+
await confirmOrder(orderId);
|
|
317
|
+
|
|
318
|
+
transaction.finish(status: const SpanStatus.ok());
|
|
319
|
+
} catch (e) {
|
|
320
|
+
transaction.finish(status: const SpanStatus.internalError());
|
|
321
|
+
rethrow;
|
|
322
|
+
}
|
|
323
|
+
// All three logs are linked to the process-order span in the trace view
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
Enable tracing in `SentryFlutter.init`:
|
|
328
|
+
|
|
329
|
+
```dart
|
|
330
|
+
options.tracesSampleRate = 1.0; // required for log-to-trace correlation
|
|
331
|
+
options.enableLogs = true;
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## 7. Configuration Reference
|
|
337
|
+
|
|
338
|
+
### `SentryFlutter.init` options
|
|
339
|
+
|
|
340
|
+
| Option | Type | Default | Description |
|
|
341
|
+
| --------------- | -------------------------------- | ------- | -------------------------------------------------------------- |
|
|
342
|
+
| `enableLogs` | `bool` | `false` | Master switch — must be `true` for all structured logging |
|
|
343
|
+
| `beforeSendLog` | `SentryLog? Function(SentryLog)` | `null` | Filter/mutate logs before transmission. Return `null` to drop. |
|
|
344
|
+
|
|
345
|
+
### `LoggingIntegration` options
|
|
346
|
+
|
|
347
|
+
| Option | Type | Default | Description |
|
|
348
|
+
| -------------------- | ------- | -------------- | ------------------------------------------------------- |
|
|
349
|
+
| `minBreadcrumbLevel` | `Level` | `Level.INFO` | Minimum Dart log level to create Sentry breadcrumbs |
|
|
350
|
+
| `minEventLevel` | `Level` | `Level.SEVERE` | Minimum Dart log level to create Sentry error events |
|
|
351
|
+
| `minSentryLogLevel` | `Level` | `Level.INFO` | Minimum Dart log level to create Sentry structured logs |
|
|
352
|
+
|
|
353
|
+
### Version requirements
|
|
354
|
+
|
|
355
|
+
| Feature | Min Package | Min SDK Version |
|
|
356
|
+
| ------------------------------ | ---------------- | --------------- |
|
|
357
|
+
| `enableLogs` / structured logs | `sentry_flutter` | `9.5.0` |
|
|
358
|
+
| `sentry_logging` integration | `sentry_logging` | `9.5.0` |
|
|
359
|
+
| `beforeSendLog` hook | `sentry_flutter` | `9.5.0` |
|
|
360
|
+
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
## 8. Known Limitations
|
|
364
|
+
|
|
365
|
+
| Limitation | Details |
|
|
366
|
+
| ------------------------------------ | ------------------------------------------------------------------------------------------- |
|
|
367
|
+
| Crash buffer loss | Logs buffered since last flush are lost on unexpected termination before the buffer is sent |
|
|
368
|
+
| No per-log sampling | Use `beforeSendLog` to reduce volume — sampling is all-or-nothing |
|
|
369
|
+
| Dart logging package stack traces | Must be enabled manually via `Logger.root.recordStackTraceAtLevel` or passed explicitly |
|
|
370
|
+
| `sentry_logging` is separate package | Must be added to `pubspec.yaml` separately — not bundled with `sentry_flutter` |
|
|
371
|
+
| `enableLogs` is off by default | Logs are silently discarded if `enableLogs` is not `true` |
|
|
372
|
+
|
|
373
|
+
---
|
|
374
|
+
|
|
375
|
+
## 9. Troubleshooting
|
|
376
|
+
|
|
377
|
+
| Issue | Solution |
|
|
378
|
+
| ------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------- |
|
|
379
|
+
| Logs not appearing in Sentry | Verify `enableLogs: true` is set in `SentryFlutter.init()` |
|
|
380
|
+
| `Sentry.logger` not available | Import `package:sentry/sentry.dart`; check `sentry_flutter` ≥ 9.5.0 |
|
|
381
|
+
| `LoggingIntegration` type not found | Add `sentry_logging` to `pubspec.yaml` and import `package:sentry_logging/sentry_logging.dart` |
|
|
382
|
+
| Logs appear but no stack traces on errors | Set `Logger.root.recordStackTraceAtLevel = Level.SEVERE` or pass `stackTrace` manually |
|
|
383
|
+
| Attribute values showing `[Filtered]` | Server-side PII scrubbing rule matched — adjust **Data Scrubbing** settings in your Sentry project |
|
|
384
|
+
| Logs not linked to traces | Enable tracing (`tracesSampleRate > 0`) and emit logs inside an active transaction (`Sentry.startTransaction()`) |
|
|
385
|
+
| Too many logs in production | Use `beforeSendLog` to drop `trace`/`debug` levels |
|
|
386
|
+
| `sentry_logging` logs not forwarded as structured logs | Check that `minSentryLogLevel` is set to the expected level and `enableLogs: true` |
|
|
387
|
+
| Logs disappearing silently | Check your Sentry org stats for rate limiting; verify log payload < 1 MB |
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
# Metrics — Sentry Flutter SDK
|
|
2
|
+
|
|
3
|
+
> **Minimum SDK:** `sentry_flutter` ≥ **9.11.0** for trace-connected metrics\
|
|
4
|
+
> **Supported metric types:** Counter, Distribution, Gauge (no `set` type)\
|
|
5
|
+
> **Per-metric key limit:** 2 KB
|
|
6
|
+
|
|
7
|
+
Metrics let you track quantitative data about your app’s behavior — things like button
|
|
8
|
+
tap counts, API latency distributions, or active session gauges.
|
|
9
|
+
Unlike error events, metrics are aggregated before being sent to Sentry.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Table of Contents
|
|
14
|
+
|
|
15
|
+
1. [Metric Types Overview](#1-metric-types-overview)
|
|
16
|
+
2. [Counter](#2-counter)
|
|
17
|
+
3. [Distribution](#3-distribution)
|
|
18
|
+
4. [Gauge](#4-gauge)
|
|
19
|
+
5. [Tags and Trace Correlation](#5-tags-and-trace-correlation)
|
|
20
|
+
6. [Configuration Reference](#6-configuration-reference)
|
|
21
|
+
7. [Known Limitations](#7-known-limitations)
|
|
22
|
+
8. [Troubleshooting](#8-troubleshooting)
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 1. Metric Types Overview
|
|
27
|
+
|
|
28
|
+
| Type | Method | Use Case | Example |
|
|
29
|
+
| ---------------- | ------------------------------- | ---------------------------- | -------------------------------- |
|
|
30
|
+
| **Counter** | `Sentry.metrics.increment()` | Count occurrences | Button taps, API calls, errors |
|
|
31
|
+
| **Distribution** | `Sentry.metrics.distribution()` | Measure value distributions | API response times, image sizes |
|
|
32
|
+
| **Gauge** | `Sentry.metrics.gauge()` | Track min/max/avg of a value | Active sessions, queue depth |
|
|
33
|
+
| ~~Set~~ | ~~`Sentry.metrics.set()`~~ | ~~Count unique occurrences~~ | **Not supported in Flutter SDK** |
|
|
34
|
+
|
|
35
|
+
> **Note on `set` metrics:** The `set` type is not available in the Sentry Flutter/Dart
|
|
36
|
+
> SDK. Use a counter or external unique-value tracking if you need to count distinct
|
|
37
|
+
> users or IDs.
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 2. Counter
|
|
42
|
+
|
|
43
|
+
Counters track how many times something happens.
|
|
44
|
+
Use `increment()` — each call adds to the running total.
|
|
45
|
+
|
|
46
|
+
```dart
|
|
47
|
+
import 'package:sentry/sentry.dart';
|
|
48
|
+
|
|
49
|
+
// Simple increment (adds 1)
|
|
50
|
+
Sentry.metrics.increment('button.tapped');
|
|
51
|
+
|
|
52
|
+
// Custom increment value
|
|
53
|
+
Sentry.metrics.increment('orders.processed', value: 5.0);
|
|
54
|
+
|
|
55
|
+
// With tags for segmentation
|
|
56
|
+
Sentry.metrics.increment(
|
|
57
|
+
'api.request',
|
|
58
|
+
value: 1.0,
|
|
59
|
+
unit: SentryMeasurementUnit.none,
|
|
60
|
+
tags: {
|
|
61
|
+
'endpoint': '/api/search',
|
|
62
|
+
'method': 'GET',
|
|
63
|
+
'status': '200',
|
|
64
|
+
},
|
|
65
|
+
);
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Practical examples
|
|
69
|
+
|
|
70
|
+
```dart
|
|
71
|
+
// Track feature usage
|
|
72
|
+
void onShareButtonTapped() {
|
|
73
|
+
Sentry.metrics.increment('feature.share.tapped');
|
|
74
|
+
// existing share logic...
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Count errors by type
|
|
78
|
+
void onPaymentError(String errorType) {
|
|
79
|
+
Sentry.metrics.increment(
|
|
80
|
+
'payment.error',
|
|
81
|
+
tags: {'type': errorType},
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Track A/B test variant interactions
|
|
86
|
+
void onExperimentAction(String variant, String action) {
|
|
87
|
+
Sentry.metrics.increment(
|
|
88
|
+
'experiment.action',
|
|
89
|
+
tags: {
|
|
90
|
+
'variant': variant,
|
|
91
|
+
'action': action,
|
|
92
|
+
},
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## 3. Distribution
|
|
100
|
+
|
|
101
|
+
Distributions capture the **spread of values** over time — min, max, sum, count, and
|
|
102
|
+
percentiles (p50, p75, p95, p99). Ideal for latency and size measurements.
|
|
103
|
+
|
|
104
|
+
```dart
|
|
105
|
+
import 'package:sentry/sentry.dart';
|
|
106
|
+
|
|
107
|
+
// API response time in milliseconds
|
|
108
|
+
final stopwatch = Stopwatch()..start();
|
|
109
|
+
await fetchUserData(userId);
|
|
110
|
+
stopwatch.stop();
|
|
111
|
+
|
|
112
|
+
Sentry.metrics.distribution(
|
|
113
|
+
'api.response_time',
|
|
114
|
+
value: stopwatch.elapsedMilliseconds.toDouble(),
|
|
115
|
+
unit: SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.milliSecond),
|
|
116
|
+
tags: {'endpoint': '/users', 'cached': 'false'},
|
|
117
|
+
);
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### Unit types
|
|
121
|
+
|
|
122
|
+
```dart
|
|
123
|
+
// Duration
|
|
124
|
+
SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.nanoSecond)
|
|
125
|
+
SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.microSecond)
|
|
126
|
+
SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.milliSecond)
|
|
127
|
+
SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.second)
|
|
128
|
+
SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.minute)
|
|
129
|
+
SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.hour)
|
|
130
|
+
|
|
131
|
+
// Data sizes
|
|
132
|
+
SentryMeasurementUnit.information(InformationSentryMeasurementUnit.byte)
|
|
133
|
+
SentryMeasurementUnit.information(InformationSentryMeasurementUnit.kilobyte)
|
|
134
|
+
SentryMeasurementUnit.information(InformationSentryMeasurementUnit.megabyte)
|
|
135
|
+
SentryMeasurementUnit.information(InformationSentryMeasurementUnit.gigabyte)
|
|
136
|
+
|
|
137
|
+
// Fractions
|
|
138
|
+
SentryMeasurementUnit.fraction(FractionSentryMeasurementUnit.ratio)
|
|
139
|
+
SentryMeasurementUnit.fraction(FractionSentryMeasurementUnit.percent)
|
|
140
|
+
|
|
141
|
+
// Custom / unitless
|
|
142
|
+
SentryMeasurementUnit.none
|
|
143
|
+
SentryMeasurementUnit.custom('items')
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Practical examples
|
|
147
|
+
|
|
148
|
+
```dart
|
|
149
|
+
// Image load time
|
|
150
|
+
Future<void> loadImage(String url) async {
|
|
151
|
+
final start = DateTime.now();
|
|
152
|
+
await precacheImage(NetworkImage(url), context);
|
|
153
|
+
final elapsed = DateTime.now().difference(start);
|
|
154
|
+
|
|
155
|
+
Sentry.metrics.distribution(
|
|
156
|
+
'image.load_time',
|
|
157
|
+
value: elapsed.inMilliseconds.toDouble(),
|
|
158
|
+
unit: SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.milliSecond),
|
|
159
|
+
tags: {'cached': 'false'},
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Payload size tracking
|
|
164
|
+
void onApiResponse(http.Response response) {
|
|
165
|
+
Sentry.metrics.distribution(
|
|
166
|
+
'api.response_size',
|
|
167
|
+
value: response.contentLength?.toDouble() ?? 0,
|
|
168
|
+
unit: SentryMeasurementUnit.information(InformationSentryMeasurementUnit.byte),
|
|
169
|
+
tags: {'endpoint': response.request?.url.path ?? 'unknown'},
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Cart value distribution
|
|
174
|
+
void onCheckoutCompleted(double cartTotal) {
|
|
175
|
+
Sentry.metrics.distribution(
|
|
176
|
+
'checkout.cart_value',
|
|
177
|
+
value: cartTotal,
|
|
178
|
+
unit: SentryMeasurementUnit.none,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## 4. Gauge
|
|
186
|
+
|
|
187
|
+
Gauges track the **statistical properties** (last, min, max, sum, count) of a set of
|
|
188
|
+
values emitted during the aggregation window.
|
|
189
|
+
Use for things that have a meaningful current state.
|
|
190
|
+
|
|
191
|
+
```dart
|
|
192
|
+
import 'package:sentry/sentry.dart';
|
|
193
|
+
|
|
194
|
+
// Track active background operations
|
|
195
|
+
Sentry.metrics.gauge(
|
|
196
|
+
'background.tasks.active',
|
|
197
|
+
value: activeTaskCount.toDouble(),
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
// Track session depth
|
|
201
|
+
Sentry.metrics.gauge(
|
|
202
|
+
'navigation.stack_depth',
|
|
203
|
+
value: Navigator.of(context).canPop() ? stackDepth.toDouble() : 0,
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
// Monitor cache entries
|
|
207
|
+
Sentry.metrics.gauge(
|
|
208
|
+
'cache.entry_count',
|
|
209
|
+
value: imageCache.currentSize.toDouble(),
|
|
210
|
+
tags: {'type': 'image_cache'},
|
|
211
|
+
);
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## 5. Tags and Trace Correlation
|
|
217
|
+
|
|
218
|
+
### Tags
|
|
219
|
+
|
|
220
|
+
All metric types accept a `tags` map.
|
|
221
|
+
Tags are key-value strings used to **filter and group metrics** in the Sentry Metrics
|
|
222
|
+
UI:
|
|
223
|
+
|
|
224
|
+
```dart
|
|
225
|
+
Sentry.metrics.increment(
|
|
226
|
+
'checkout.step',
|
|
227
|
+
tags: {
|
|
228
|
+
'step': 'payment', // string values only
|
|
229
|
+
'platform': 'ios',
|
|
230
|
+
'user_type': 'subscriber',
|
|
231
|
+
},
|
|
232
|
+
);
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Trace correlation
|
|
236
|
+
|
|
237
|
+
As of `sentry_flutter` 9.11.0, metrics are **automatically linked to the active trace**
|
|
238
|
+
when emitted inside a span.
|
|
239
|
+
This allows you to view metric data alongside transaction performance in the Sentry UI:
|
|
240
|
+
|
|
241
|
+
```dart
|
|
242
|
+
final transaction = Sentry.startTransaction('checkout', 'ui.action');
|
|
243
|
+
try {
|
|
244
|
+
// This increment is linked to the checkout transaction
|
|
245
|
+
Sentry.metrics.increment('checkout.started');
|
|
246
|
+
|
|
247
|
+
final start = DateTime.now();
|
|
248
|
+
await processCheckout();
|
|
249
|
+
final elapsed = DateTime.now().difference(start);
|
|
250
|
+
|
|
251
|
+
Sentry.metrics.distribution(
|
|
252
|
+
'checkout.duration',
|
|
253
|
+
value: elapsed.inMilliseconds.toDouble(),
|
|
254
|
+
unit: SentryMeasurementUnit.duration(DurationSentryMeasurementUnit.milliSecond),
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
Sentry.metrics.increment('checkout.completed');
|
|
258
|
+
|
|
259
|
+
transaction.finish(status: const SpanStatus.ok());
|
|
260
|
+
} catch (e) {
|
|
261
|
+
transaction.finish(status: const SpanStatus.internalError());
|
|
262
|
+
rethrow;
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## 6. Configuration Reference
|
|
269
|
+
|
|
270
|
+
No special configuration is required for metrics beyond initializing the SDK with a
|
|
271
|
+
valid DSN. Metrics are enabled by default.
|
|
272
|
+
|
|
273
|
+
| Method | Signature |
|
|
274
|
+
| ------------------------------------------------------- | --------------------------- |
|
|
275
|
+
| `Sentry.metrics.increment(key, {value, unit, tags})` | Increment a counter |
|
|
276
|
+
| `Sentry.metrics.distribution(key, {value, unit, tags})` | Record a distribution value |
|
|
277
|
+
| `Sentry.metrics.gauge(key, {value, unit, tags})` | Record a gauge observation |
|
|
278
|
+
|
|
279
|
+
### Version requirements
|
|
280
|
+
|
|
281
|
+
| Feature | Min SDK |
|
|
282
|
+
| ---------------------------- | -------- |
|
|
283
|
+
| `Sentry.metrics.*` basic API | `9.0.0` |
|
|
284
|
+
| Trace-connected metrics | `9.11.0` |
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## 7. Known Limitations
|
|
289
|
+
|
|
290
|
+
| Limitation | Details |
|
|
291
|
+
| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
292
|
+
| No `set` type | `Sentry.metrics.set()` is **not supported** in the Flutter/Dart SDK. Use counters or external tracking for unique-value counting. |
|
|
293
|
+
| 2 KB per-metric key limit | The metric key name + all tag key-value pairs must fit within 2 KB total. |
|
|
294
|
+
| Active development | The metrics API is stable but under active development. Some edge cases may change in future minor versions. |
|
|
295
|
+
| Aggregation window | Metrics are aggregated locally before being flushed. Individual data points are not preserved — you see aggregations (sum, count, min, max). |
|
|
296
|
+
| No sampling for metrics | Unlike errors and transactions, there is no sample rate for metrics — all emitted metrics are sent. Use tags and filtering instead of emitting fewer data points. |
|
|
297
|
+
| Tag values must be strings | Passing non-string tag values will be coerced or dropped. |
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 8. Troubleshooting
|
|
302
|
+
|
|
303
|
+
| Issue | Solution |
|
|
304
|
+
| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
|
|
305
|
+
| Metrics not appearing in Sentry | Verify DSN is correct and the SDK is initialized. Check Sentry → Metrics to ensure the feature is enabled for your organization. |
|
|
306
|
+
| SDK version doesn’t have `Sentry.metrics` | Upgrade `sentry_flutter` to ≥ 9.0.0 |
|
|
307
|
+
| Metrics not linked to traces | Upgrade to `sentry_flutter` ≥ 9.11.0 and emit metrics inside an active transaction (`Sentry.startTransaction()`) |
|
|
308
|
+
| `set` metric type not available | Expected — not supported in Flutter SDK. Use `increment` with a counter instead. |
|
|
309
|
+
| Metrics appear intermittently | Expected — metrics are batched and flushed on a schedule. Low-volume metrics may appear in Sentry with a delay. |
|
|
310
|
+
| Tags not showing up correctly | Verify all tag values are strings; check total metric key + tags size is under 2 KB |
|