diff --git a/docs/platforms/javascript/guides/effect/config.yml b/docs/platforms/javascript/guides/effect/config.yml new file mode 100644 index 0000000000000..e57128d920a2e --- /dev/null +++ b/docs/platforms/javascript/guides/effect/config.yml @@ -0,0 +1,8 @@ +title: Effect +description: Learn how to set up Sentry in your Effect application with first-class integration for tracing, logging, and metrics. +sdk: sentry.javascript.effect +categories: + - javascript + - server + - server-node + - browser diff --git a/docs/platforms/javascript/guides/effect/index.mdx b/docs/platforms/javascript/guides/effect/index.mdx new file mode 100644 index 0000000000000..61faffbba73e7 --- /dev/null +++ b/docs/platforms/javascript/guides/effect/index.mdx @@ -0,0 +1,183 @@ +--- +title: Effect +sdk: sentry.javascript.effect +description: Learn how to set up Sentry in your Effect application with first-class integration for tracing, logging, and metrics. +--- + + + +This SDK is currently in **ALPHA**. Alpha features are still in progress, may have bugs, and might include breaking changes. +Please reach out on [GitHub](https://github.com/getsentry/sentry-javascript/issues/new/choose) if you have any feedback or concerns. + + + +The `@sentry/effect` SDK provides first-class integration with [Effect](https://effect.website/), enabling automatic tracing, logging, and metrics capture for Effect-based applications. + + + +## Step 1: Install + +Choose the features you want to configure, and this guide will show you how: + + + + + +### Install the Sentry SDK + +```bash {tabTitle:npm} +npm install @sentry/effect --save +``` + +```bash {tabTitle:yarn} +yarn add @sentry/effect +``` + +```bash {tabTitle:pnpm} +pnpm add @sentry/effect +``` + +## Step 2: Configure + +The SDK provides an `effectLayer` that initializes Sentry. You can compose it with additional Effect layers to enable tracing, logging, and metrics. + +### Server Usage + +```typescript {filename:main.ts} +import * as Sentry from "@sentry/effect/server"; +import { NodeRuntime } from "@effect/platform-node"; +// ___PRODUCT_OPTION_START___ logs +import * as Logger from "effect/Logger"; +// ___PRODUCT_OPTION_END___ logs +import * as Layer from "effect/Layer"; +import { HttpLive } from "./Http.js"; + +const SentryLive = Layer.mergeAll( + Sentry.effectLayer({ + dsn: "___PUBLIC_DSN___", + // ___PRODUCT_OPTION_START___ performance + + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for tracing. + // We recommend adjusting this value in production. + tracesSampleRate: 1.0, + // ___PRODUCT_OPTION_END___ performance + // ___PRODUCT_OPTION_START___ logs + + // Enable logs to be sent to Sentry + enableLogs: true, + // ___PRODUCT_OPTION_END___ logs + }), + // ___PRODUCT_OPTION_START___ performance + + // Enable Effect tracing + Layer.setTracer(Sentry.SentryEffectTracer), + // ___PRODUCT_OPTION_END___ performance + // ___PRODUCT_OPTION_START___ logs + + // Forward Effect logs to Sentry + Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger), + // ___PRODUCT_OPTION_END___ logs + // ___PRODUCT_OPTION_START___ metrics + + // Forward Effect metrics to Sentry + Sentry.SentryEffectMetricsLayer, + // ___PRODUCT_OPTION_END___ metrics +); + +const MainLive = HttpLive.pipe(Layer.provide(SentryLive)); + +MainLive.pipe(Layer.launch, NodeRuntime.runMain); +``` + +### Client Usage + +```typescript {filename:main.ts} +import * as Sentry from "@sentry/effect/client"; +// ___PRODUCT_OPTION_START___ logs +import { Logger } from "effect"; +// ___PRODUCT_OPTION_END___ logs +import { Layer } from "effect"; + +const SentryLive = Layer.mergeAll( + Sentry.effectLayer({ + dsn: "___PUBLIC_DSN___", + // ___PRODUCT_OPTION_START___ performance + + // Set tracesSampleRate to 1.0 to capture 100% + // of transactions for tracing. + // We recommend adjusting this value in production. + tracesSampleRate: 1.0, + integrations: [Sentry.browserTracingIntegration()], + // ___PRODUCT_OPTION_END___ performance + // ___PRODUCT_OPTION_START___ logs + + // Enable logs to be sent to Sentry + enableLogs: true, + // ___PRODUCT_OPTION_END___ logs + }), + // ___PRODUCT_OPTION_START___ performance + + // Enable Effect tracing + Layer.setTracer(Sentry.SentryEffectTracer), + // ___PRODUCT_OPTION_END___ performance + // ___PRODUCT_OPTION_START___ logs + + // Forward Effect logs to Sentry + Logger.replace(Logger.defaultLogger, Sentry.SentryEffectLogger), + // ___PRODUCT_OPTION_END___ logs +); + +const MainLive = YourAppLayer.pipe(Layer.provide(SentryLive)); +``` + +## Features + +The SDK provides composable layers for Effect integration: + + +- **Tracing** via `Sentry.SentryEffectTracer`: Effect spans are automatically traced as Sentry spans with distributed tracing support + + +- **Logging** via `Sentry.SentryEffectLogger`: Effect logs are forwarded to Sentry (requires `enableLogs: true`) + + +- **Metrics** via `Sentry.SentryEffectMetricsLayer`: Effect metrics (counters, gauges, histograms) are sent to Sentry + + +## Step 3: Verify + +Add a test error to verify your setup: + +```typescript +import { Effect } from "effect"; +import * as Sentry from "@sentry/effect/server"; + +const program = Effect.gen(function* () { + yield* Effect.fail(new Error("Sentry Test Error")); +}); + +// Run with your layer that includes Sentry.effectLayer +``` + +Head over to your project on [Sentry.io](https://sentry.io) to view the collected data. + +## Next Steps + +- Learn how to [manually capture errors](/platforms/javascript/guides/effect/usage/) +- Continue to [customize your configuration](/platforms/javascript/guides/effect/configuration/) +- Get familiar with [Sentry's product features](/product/) like tracing, insights, and alerts + + + +- Find various topics in Troubleshooting +- [Get support](https://sentry.zendesk.com/hc/en-us/) + + diff --git a/package.json b/package.json index 65fcd57e1dfd9..716ebf25bee5b 100644 --- a/package.json +++ b/package.json @@ -91,7 +91,7 @@ "next-themes": "^0.3.0", "nextjs-toploader": "^1.6.6", "p-limit": "^6.2.0", - "platformicons": "^9.0.7", + "platformicons": "^9.2.1", "prism-sentry": "^1.0.2", "react": "^19.2.4", "react-dom": "^19.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c3f8b0f61f462..7e5524c9a341b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -181,8 +181,8 @@ importers: specifier: ^6.2.0 version: 6.2.0 platformicons: - specifier: ^9.0.7 - version: 9.0.7(react@19.2.4) + specifier: ^9.2.1 + version: 9.2.1(react@19.2.4) prism-sentry: specifier: ^1.0.2 version: 1.0.2 @@ -378,10 +378,10 @@ importers: version: 5.9.3 vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) + version: 5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2)) vitest: specifier: ^3.0.7 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.11)(jiti@1.21.7)(jsdom@20.0.3)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.11)(jiti@1.21.7)(jsdom@20.0.3)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2) ws: specifier: ^8.17.1 version: 8.19.0 @@ -3922,6 +3922,9 @@ packages: '@types/node@22.19.11': resolution: {integrity: sha512-BH7YwL6rA93ReqeQS1c4bsPpcfOmJasG+Fkr6Y59q83f9M1WcBRHR2vM+P9eOisYRcN3ujQoiZY8uk5W+1WL8w==} + '@types/node@22.19.15': + resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -5239,8 +5242,8 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} entities@2.2.0: @@ -7141,8 +7144,8 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - platformicons@9.0.7: - resolution: {integrity: sha512-+3t3J5LllMANkZ3Ykg44Tka0blhEGz9+ydSg3m6rUCsWF3y6RbFLTqn9GiM3gmeSzTidwSxg3RDA4WCG+h5YpA==} + platformicons@9.2.1: + resolution: {integrity: sha512-xY+epkdZKpvditx0IyeCBV7DNbHJVQDfg4DGIQN+DqwuBaeHe9UxA7sFaiKfoL+d12958QeyIaeVWXJ85IEG9g==} peerDependencies: react: '*' @@ -7299,9 +7302,6 @@ packages: '@types/react-dom': optional: true - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - react-dom@19.2.4: resolution: {integrity: sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==} peerDependencies: @@ -7700,9 +7700,6 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - server-only@0.0.1: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} @@ -7977,8 +7974,8 @@ packages: resolution: {integrity: sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==} engines: {node: '>=14'} - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} + terser-webpack-plugin@5.4.0: + resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -7993,8 +7990,8 @@ packages: uglify-js: optional: true - terser@5.46.0: - resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} + terser@5.46.1: + resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} engines: {node: '>=10'} hasBin: true @@ -12970,6 +12967,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@22.19.15': + dependencies: + undici-types: 6.21.0 + '@types/parse-json@4.0.2': {} '@types/pg-pool@2.0.6': @@ -13341,13 +13342,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -14423,7 +14424,7 @@ snapshots: dependencies: once: 1.4.0 - enhanced-resolve@5.19.0: + enhanced-resolve@5.20.1: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -14640,7 +14641,7 @@ snapshots: eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) @@ -14660,7 +14661,7 @@ snapshots: eslint-config-sentry: 2.10.0(eslint@8.57.1) eslint-config-sentry-react: 2.10.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3))(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3) eslint-plugin-no-lookahead-lookbehind-regexp: 0.3.0(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) @@ -14717,7 +14718,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -14728,18 +14729,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14750,7 +14750,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14768,7 +14768,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14779,7 +14779,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14791,7 +14791,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.1)(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -16238,7 +16238,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 22.19.11 + '@types/node': 22.19.15 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -17310,7 +17310,7 @@ snapshots: mlly: 1.8.0 pathe: 2.0.3 - platformicons@9.0.7(react@19.2.4): + platformicons@9.2.1(react@19.2.4): dependencies: '@types/node': 22.19.11 '@types/react': 18.3.12 @@ -17496,10 +17496,6 @@ snapshots: '@types/react': 18.3.12 '@types/react-dom': 18.3.1 - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - react-dom@19.2.4(react@19.2.4): dependencies: react: 19.2.4 @@ -18170,10 +18166,6 @@ snapshots: semver@7.7.4: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - server-only@0.0.1: {} set-function-length@1.2.2: @@ -18547,18 +18539,17 @@ snapshots: - encoding - supports-color - terser-webpack-plugin@5.3.16(esbuild@0.25.12)(webpack@5.105.2(esbuild@0.25.12)): + terser-webpack-plugin@5.4.0(esbuild@0.25.12)(webpack@5.105.2(esbuild@0.25.12)): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.46.0 + terser: 5.46.1 webpack: 5.105.2(esbuild@0.25.12) optionalDependencies: esbuild: 0.25.12 - terser@5.46.0: + terser@5.46.1: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -18996,13 +18987,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite-node@3.2.4(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -19017,18 +19008,18 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)): + vite-tsconfig-paths@5.1.4(typescript@5.9.3)(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2)): dependencies: debug: 4.4.3 globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.9.3) optionalDependencies: - vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2) transitivePeerDependencies: - supports-color - typescript - vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2): + vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -19041,14 +19032,14 @@ snapshots: fsevents: 2.3.3 jiti: 1.21.7 sass: 1.97.3 - terser: 5.46.0 + terser: 5.46.1 yaml: 2.8.2 - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.11)(jiti@1.21.7)(jsdom@20.0.3)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.19.11)(jiti@1.21.7)(jsdom@20.0.3)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -19066,8 +19057,8 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@22.19.11)(jiti@1.21.7)(sass@1.97.3)(terser@5.46.1)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -19157,7 +19148,7 @@ snapshots: acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.1 es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 @@ -19169,7 +19160,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.3 tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.25.12)(webpack@5.105.2(esbuild@0.25.12)) + terser-webpack-plugin: 5.4.0(esbuild@0.25.12)(webpack@5.105.2(esbuild@0.25.12)) watchpack: 2.5.1 webpack-sources: 3.3.4 transitivePeerDependencies: diff --git a/src/components/onboarding/index.tsx b/src/components/onboarding/index.tsx index f80eb05d69329..8f5c33084e0ef 100644 --- a/src/components/onboarding/index.tsx +++ b/src/components/onboarding/index.tsx @@ -23,6 +23,7 @@ const OPTION_IDS = [ 'source-context', 'dsym', 'opentelemetry', + 'metrics', ] as const; const OPTION_IDS_SET = new Set(OPTION_IDS); @@ -106,6 +107,15 @@ const optionDetails: Record< ), }, + metrics: { + name: 'Metrics', + description: ( + + Send metrics from your application to Sentry for viewing alongside relevant errors + and searching by metric name or attributes. + + ), + }, dsym: { name: 'dSYM', description: ( diff --git a/src/components/platformIcon.tsx b/src/components/platformIcon.tsx index f3e252fbc231f..f09c60239d42f 100644 --- a/src/components/platformIcon.tsx +++ b/src/components/platformIcon.tsx @@ -40,6 +40,7 @@ import DotnetSVG from 'platformicons/svg/dotnet.svg'; import DotnetcoreSVG from 'platformicons/svg/dotnetcore.svg'; import DotnetfxSVG from 'platformicons/svg/dotnetfx.svg'; import EchoSVG from 'platformicons/svg/echo.svg'; +import EffectSVG from 'platformicons/svg/effect.svg'; import ElectronSVG from 'platformicons/svg/electron.svg'; import ElixirSVG from 'platformicons/svg/elixir.svg'; import EmberSVG from 'platformicons/svg/ember.svg'; @@ -190,6 +191,7 @@ import DotnetSVGLarge from 'platformicons/svg_80x80/dotnet.svg'; import DotnetcoreSVGLarge from 'platformicons/svg_80x80/dotnetcore.svg'; import DotnetfxSVGLarge from 'platformicons/svg_80x80/dotnetfx.svg'; import EchoSVGLarge from 'platformicons/svg_80x80/echo.svg'; +import EffectSVGLarge from 'platformicons/svg_80x80/effect.svg'; import ElectronSVGLarge from 'platformicons/svg_80x80/electron.svg'; import ElixirSVGLarge from 'platformicons/svg_80x80/elixir.svg'; import EmberSVGLarge from 'platformicons/svg_80x80/ember.svg'; @@ -478,6 +480,10 @@ const formatToSVG = { sm: EchoSVG, lg: EchoSVGLarge, }, + effect: { + sm: EffectSVG, + lg: EffectSVGLarge, + }, electron: { sm: ElectronSVG, lg: ElectronSVGLarge, @@ -985,6 +991,7 @@ export const PLATFORM_TO_ICON = { 'javascript-cordova': 'cordova', 'javascript-cloudflare': 'cloudflare', 'javascript-deno': 'deno', + 'javascript-effect': 'effect', 'javascript-electron': 'electron', 'javascript-ember': 'ember', 'javascript-express': 'express',