From a34d81325c1760cb11173d69510945ab33109a9d Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Mon, 23 Jun 2025 15:17:17 -0300 Subject: [PATCH 1/9] Add Flagsmith to feature flags Change Tracking docs --- .../img/flagsmith-sentry-webhook-modal.png | Bin 0 -> 91506 bytes .../feature-flag/flagsmith/index.mdx | 38 ++++++++++++++++++ .../integrations/feature-flag/index.mdx | 1 + .../feature-flag/launchdarkly/index.mdx | 2 +- .../integrations/feature-flag/split/index.mdx | 2 +- .../feature-flag/statsig/index.mdx | 2 +- .../feature-flag/unleash/index.mdx | 2 +- 7 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 docs/organization/integrations/feature-flag/flagsmith/img/flagsmith-sentry-webhook-modal.png create mode 100644 docs/organization/integrations/feature-flag/flagsmith/index.mdx diff --git a/docs/organization/integrations/feature-flag/flagsmith/img/flagsmith-sentry-webhook-modal.png b/docs/organization/integrations/feature-flag/flagsmith/img/flagsmith-sentry-webhook-modal.png new file mode 100644 index 0000000000000000000000000000000000000000..d70b4a6ef9a79bab39f975da7339c329c75de611 GIT binary patch literal 91506 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 r2u1?~5=o Date: Mon, 23 Jun 2025 15:18:00 -0300 Subject: [PATCH 2/9] Add Flagsmith to feature flags Evaluation Tracking docs --- .../configuration/integrations/flagsmith.mdx | 42 +++++++++++ docs/platforms/python/feature-flags/index.mdx | 1 + .../python/integrations/flagsmith/index.mdx | 75 +++++++++++++++++++ .../flagsmith/javascript.angular.mdx | 45 +++++++++++ .../flagsmith/javascript.astro.mdx | 45 +++++++++++ .../flagsmith/javascript.ember.mdx | 45 +++++++++++ .../flagsmith/javascript.gatsby.mdx | 45 +++++++++++ .../configuration/flagsmith/javascript.mdx | 45 +++++++++++ .../flagsmith/javascript.nextjs.mdx | 45 +++++++++++ .../flagsmith/javascript.nuxt.mdx | 45 +++++++++++ .../flagsmith/javascript.react.mdx | 45 +++++++++++ .../flagsmith/javascript.remix.mdx | 45 +++++++++++ .../flagsmith/javascript.solid.mdx | 45 +++++++++++ .../flagsmith/javascript.solidstart.mdx | 45 +++++++++++ .../flagsmith/javascript.svelte.mdx | 45 +++++++++++ .../flagsmith/javascript.sveltekit.mdx | 45 +++++++++++ .../flagsmith/javascript.vue.mdx | 45 +++++++++++ 17 files changed, 748 insertions(+) create mode 100644 docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx create mode 100644 docs/platforms/python/integrations/flagsmith/index.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.angular.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.astro.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.ember.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.gatsby.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.nextjs.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.nuxt.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.react.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.remix.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.solid.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.solidstart.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.svelte.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.sveltekit.mdx create mode 100644 platform-includes/configuration/flagsmith/javascript.vue.mdx diff --git a/docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx b/docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx new file mode 100644 index 0000000000000..5586d3d060c08 --- /dev/null +++ b/docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx @@ -0,0 +1,42 @@ +--- +title: Flagsmith +description: "Learn how to use Sentry with Flagsmith." +notSupported: + - javascript.aws-lambda + - javascript.azure-functions + - javascript.bun + - javascript.capacitor + - javascript.cloudflare + - javascript.connect + - javascript.cordova + - javascript.deno + - javascript.electron + - javascript.express + - javascript.fastify + - javascript.gcp-functions + - javascript.hapi + - javascript.hono + - javascript.koa + - javascript.nestjs + - javascript.node + - javascript.wasm + - javascript.tanstackstart-react +--- + + + + + +This integration only works inside a browser environment. It is only available from a package-based install (e.g. `npm` or `yarn`). + + + +[Flagsmith](https://flagsmith.com/) relies on the [OpenFeature](https://openfeature.dev/) integration to track feature flag evaluations produced by the OpenFeature SDK. These evaluations are held in memory, and in the event an error occurs, sent to Sentry for review and analysis. **At the moment, we only support boolean flag evaluations.** This integration is available in Sentry SDK **versions 8.43.0 or higher.** + +_Import name: `Sentry.openFeatureIntegration` and `Sentry.OpenFeatureIntegrationHook`_ + + + +Visit the Sentry website and confirm that your error event has recorded the feature flag "test-flag" and its value "false". + + diff --git a/docs/platforms/python/feature-flags/index.mdx b/docs/platforms/python/feature-flags/index.mdx index 7aeec37983db5..a2da145e14a9c 100644 --- a/docs/platforms/python/feature-flags/index.mdx +++ b/docs/platforms/python/feature-flags/index.mdx @@ -15,6 +15,7 @@ description: With Feature Flags, Sentry tracks feature flag evaluations in your If you use a third-party SDK to evaluate feature flags, you can enable a Sentry SDK integration to track those evaluations. Integrations are provider specific. Documentation for supported SDKs is listed below. +- [Flagsmith](/platforms/python/integrations/flagsmith/) - [LaunchDarkly](/platforms/python/integrations/launchdarkly/) - [OpenFeature](/platforms/python/integrations/openfeature/) - [Statsig](/platforms/python/integrations/statsig/) diff --git a/docs/platforms/python/integrations/flagsmith/index.mdx b/docs/platforms/python/integrations/flagsmith/index.mdx new file mode 100644 index 0000000000000..ccf39780cf4c3 --- /dev/null +++ b/docs/platforms/python/integrations/flagsmith/index.mdx @@ -0,0 +1,75 @@ +--- +title: Flagsmith +description: "Learn how to use Sentry with Flagsmith." +--- + + + +[Flagsmith](https://flagsmith.com/) relies on the [OpenFeature](https://openfeature.dev/) integration to track feature flag evaluations produced by the OpenFeature SDK. These evaluations are held in memory and sent to Sentry for review and analysis if an error occurs. **At the moment, we only support boolean flag evaluations.** + +## Install + +Install `sentry-sdk` from PyPI with the `openfeature` extra. + +```bash {tabTitle:pip} +pip install "sentry-sdk[openfeature]" openfeature-provider-flagsmith +``` +```bash {tabTitle:uv} +uv add "sentry-sdk[openfeature]" openfeature-provider-flagsmith +``` + +## Configure + +Set `FlagsmithProvider()` as the provider for the OpenFeature client, then add `OpenFeatureIntegration()` to your `integrations` list: + +```python +import flagsmith +import sentry_sdk +from openfeature import api +from openfeature_flagsmith.provider import FlagsmithProvider +from sentry_sdk.integrations.openfeature import OpenFeatureIntegration + +flagsmith_client = flagsmith.Flagsmith( + environment_key='', +) + +flagsmith_provider = FlagsmithProvider( + client=flagsmith_client, +) + +api.set_provider(flagsmith_provider) + +sentry_sdk.init( + dsn="___PUBLIC_DSN___", + # Add data like request headers and IP for users, if applicable; + # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info + send_default_pii=True, + integrations=[ + OpenFeatureIntegration(), + ], +) +``` + +## Verify + +The integration is tested by evaluating a feature flag using your OpenFeature SDK before capturing an exception. + +```python +from openfeature import api +import sentry_sdk + +client = api.get_client() +client.get_boolean_value("hello", default_value=False) + +sentry_sdk.capture_exception(Exception("Something went wrong!")) +``` + +Visit the Sentry website and confirm that your error event has recorded the feature flag "hello" and its value "false". + +## Supported Versions + +- openfeature-sdk >= 0.7.1 +- sentry-sdk >= 2.19.2 +- python >= 3.9 + + diff --git a/platform-includes/configuration/flagsmith/javascript.angular.mdx b/platform-includes/configuration/flagsmith/javascript.angular.mdx new file mode 100644 index 0000000000000..b74a49c9ceafb --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.angular.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/angular'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/angular'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.astro.mdx b/platform-includes/configuration/flagsmith/javascript.astro.mdx new file mode 100644 index 0000000000000..86a0738957edd --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.astro.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/astro'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/astro'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.ember.mdx b/platform-includes/configuration/flagsmith/javascript.ember.mdx new file mode 100644 index 0000000000000..eff4e4097fbc5 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.ember.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/ember'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/ember'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.gatsby.mdx b/platform-includes/configuration/flagsmith/javascript.gatsby.mdx new file mode 100644 index 0000000000000..fb7561c01c7c5 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.gatsby.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/gatsby'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/gatsby'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.mdx b/platform-includes/configuration/flagsmith/javascript.mdx new file mode 100644 index 0000000000000..ba797820a1e91 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/browser'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/browser'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.nextjs.mdx b/platform-includes/configuration/flagsmith/javascript.nextjs.mdx new file mode 100644 index 0000000000000..71ea20d24e352 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.nextjs.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/nextjs'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/nextjs'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.nuxt.mdx b/platform-includes/configuration/flagsmith/javascript.nuxt.mdx new file mode 100644 index 0000000000000..04eeacca87577 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.nuxt.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/nuxt'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/nuxt'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.react.mdx b/platform-includes/configuration/flagsmith/javascript.react.mdx new file mode 100644 index 0000000000000..bcd59201b56f5 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.react.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/react'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/react'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.remix.mdx b/platform-includes/configuration/flagsmith/javascript.remix.mdx new file mode 100644 index 0000000000000..978e63a448df7 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.remix.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/remix'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/remix'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.solid.mdx b/platform-includes/configuration/flagsmith/javascript.solid.mdx new file mode 100644 index 0000000000000..95581bcc61445 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.solid.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/solid'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/solid'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.solidstart.mdx b/platform-includes/configuration/flagsmith/javascript.solidstart.mdx new file mode 100644 index 0000000000000..9abbd7ba76a74 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.solidstart.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/solidstart'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/solidstart'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.svelte.mdx b/platform-includes/configuration/flagsmith/javascript.svelte.mdx new file mode 100644 index 0000000000000..b7eb11e5bf6e9 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.svelte.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/svelte'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/svelte'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.sveltekit.mdx b/platform-includes/configuration/flagsmith/javascript.sveltekit.mdx new file mode 100644 index 0000000000000..bf88d27081986 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.sveltekit.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/sveltekit'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/sveltekit'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` diff --git a/platform-includes/configuration/flagsmith/javascript.vue.mdx b/platform-includes/configuration/flagsmith/javascript.vue.mdx new file mode 100644 index 0000000000000..874dd67c370d6 --- /dev/null +++ b/platform-includes/configuration/flagsmith/javascript.vue.mdx @@ -0,0 +1,45 @@ +Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). + +```javascript {tabTitle: JavaScript (Track All Evals)} +import * as Sentry from '@sentry/vue'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const client = OpenFeature.getClient(); +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` + +```javascript {tabTitle: JavaScript (Track One Client)} +import * as Sentry from '@sentry/vue'; +import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; +import { OpenFeature } from '@openfeature/web-sdk'; + +Sentry.init({ + dsn: '___PUBLIC_DSN___', + integrations: [Sentry.openFeatureIntegration()] +}); + +const flagsmithClientProvider = new FlagsmithClientProvider({ + environmentID: '' +}); +OpenFeature.setProvider(flagsmithClientProvider); + +const client = OpenFeature.getClient(); +client.addHooks(new Sentry.OpenFeatureIntegrationHook()); + +const result = client.getBooleanValue('test-flag', false); // evaluate with a default value +Sentry.captureException(new Error('Something went wrong!')); +``` From 723e5bbc08baaf3ecc2a93e90f15f4a0e6329ebb Mon Sep 17 00:00:00 2001 From: Evandro Myller <22429+emyller@users.noreply.github.com> Date: Tue, 1 Jul 2025 17:45:12 -0300 Subject: [PATCH 3/9] Fix outdated path Co-authored-by: Andrew Liu <159852527+aliu39@users.noreply.github.com> --- docs/organization/integrations/feature-flag/flagsmith/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/organization/integrations/feature-flag/flagsmith/index.mdx b/docs/organization/integrations/feature-flag/flagsmith/index.mdx index cfed292bd954c..08a0ce8114f20 100644 --- a/docs/organization/integrations/feature-flag/flagsmith/index.mdx +++ b/docs/organization/integrations/feature-flag/flagsmith/index.mdx @@ -12,7 +12,7 @@ Sentry can track flag evaluations as they happen within your application. Flag To set up evaluation tracking, visit one of our supported languages pages: * [JavaScript](/platforms/javascript/configuration/integrations/flagsmith/) -* [Python](/platforms/python/integrations/feature-flags/flagsmith/) +* [Python](/platforms/python/integrations/flagsmith/) ## Change Tracking From 97868b5054a63ed3f3b07c5a31553349f2bbc99b Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Tue, 1 Jul 2025 18:14:10 -0300 Subject: [PATCH 4/9] Improve wording --- docs/organization/integrations/feature-flag/flagsmith/index.mdx | 2 +- docs/organization/integrations/feature-flag/generic/index.mdx | 2 +- .../integrations/feature-flag/launchdarkly/index.mdx | 2 +- docs/organization/integrations/feature-flag/unleash/index.mdx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/organization/integrations/feature-flag/flagsmith/index.mdx b/docs/organization/integrations/feature-flag/flagsmith/index.mdx index 08a0ce8114f20..d2645936c3e0d 100644 --- a/docs/organization/integrations/feature-flag/flagsmith/index.mdx +++ b/docs/organization/integrations/feature-flag/flagsmith/index.mdx @@ -30,7 +30,7 @@ Enabling Change Tracking is a three-step process. To get started, visit the [fea - Go to your Flagsmith project dashboard and navigate to the `/project/:projectid/integrations` page, which can be found by clicking "Integrations" on the top navigation bar. - Find the Sentry option, and click "Add Integration", which will open a modal. - Select the Environment from which flag change events will trigger. - - Copy the provided Sentry webhook URL and paste it into "Webhook URL" in the Flagsmith "Sentry Integration" modal. + - Copy the webhook URL from Sentry settings and paste it into "Webhook URL" in the Flagsmith "Sentry Integration" modal. 3. **Set the Signing Secret**. - Still in the Flagsmith "Sentry Integration" modal, type in any string between 10 and 60 characters to use as your authorization token ("secret"). - Copy the authorization token from the previous step and paste it into the input box next to "Secret" in Sentry settings. diff --git a/docs/organization/integrations/feature-flag/generic/index.mdx b/docs/organization/integrations/feature-flag/generic/index.mdx index 053e436e4fff6..fd9ecb77d13d4 100644 --- a/docs/organization/integrations/feature-flag/generic/index.mdx +++ b/docs/organization/integrations/feature-flag/generic/index.mdx @@ -30,7 +30,7 @@ Enabling Change Tracking is a four step process. To get started, visit the [feat - One webhook secret can be registered per provider type. - Select Generic in the dropdown that says "Select a provider". 2. **Save the webhook URL**. - - Copy the provided Sentry webhook URL and save it for step 4. + - Copy the webhook URL from Sentry settings and save it for step 4. 3. **Set the Signing Secret**. - In your feature flagging system's UI, find the "Signing Secret". - Copy the signing secret and paste it into the input box next to "Secret" in Sentry settings. diff --git a/docs/organization/integrations/feature-flag/launchdarkly/index.mdx b/docs/organization/integrations/feature-flag/launchdarkly/index.mdx index d8fd38bf04e5a..cda091ee1f33d 100644 --- a/docs/organization/integrations/feature-flag/launchdarkly/index.mdx +++ b/docs/organization/integrations/feature-flag/launchdarkly/index.mdx @@ -26,7 +26,7 @@ Enabling Change Tracking is a three step process. To get started, visit the [fea - One webhook secret can be registered per provider type. - Select LaunchDarkly in the dropdown that says "Select a provider". 2. **Register the webhook URL**. - - Copy the provided Sentry webhook URL and paste it into LaunchDarkly within their [webhook integration UI](https://app.launchdarkly.com/settings/integrations/webhooks/new). + - Copy the webhook URL from Sentry settings and paste it into LaunchDarkly within their [webhook integration UI](https://app.launchdarkly.com/settings/integrations/webhooks/new). 3. **Set the Signing Secret**. - In the LaunchDarkly webhook UI, check the box that says "Sign this webhook". - Copy the signing secret in the revealed input box and paste it into the input box next to "Secret" in Sentry settings. diff --git a/docs/organization/integrations/feature-flag/unleash/index.mdx b/docs/organization/integrations/feature-flag/unleash/index.mdx index dc08f1255b234..e87f0b1e9025e 100644 --- a/docs/organization/integrations/feature-flag/unleash/index.mdx +++ b/docs/organization/integrations/feature-flag/unleash/index.mdx @@ -28,7 +28,7 @@ Enabling Change Tracking is a three-step process. To get started, visit the [fea 2. **Register the webhook URL**. - Go to your Unleash homepage and navigate to the `/integrations/` page, which can be found by clicking Integrations on the left-hand sidebar navigation, under the Configure heading. - Select the Webhook option. You should be on the `/integrations/create/webhook/` page. - - Copy the provided Sentry webhook URL in settings and paste it into Unleash within their webhook integration UI. + - Copy the webhook URL from Sentry settings and paste it into Unleash within their webhook integration UI. - Make sure the integration is toggled to Enabled. 3. **Set the Signing Secret**. - In the Unleash webhook UI, under the Authorization input box, type in any 32-character string to use as your authorization token ("secret"). Keep this string safe and note it down somewhere in case you need it in the future; Unleash will not show you the token once you save the webhook. We recommend not using any sensitive tokens. From 3bacab06f8a85ae42981723447e752247fca8c63 Mon Sep 17 00:00:00 2001 From: Andrew Liu <159852527+aliu39@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:15:22 -0700 Subject: [PATCH 5/9] proposed updates to flagsmith integration docs --- .../feature-flag/flagsmith/index.mdx | 39 +++++++++++++++++++ .../feature-flag/generic/index.mdx | 2 +- .../change-tracking-list/_default.mdx | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 docs/organization/integrations/feature-flag/flagsmith/index.mdx diff --git a/docs/organization/integrations/feature-flag/flagsmith/index.mdx b/docs/organization/integrations/feature-flag/flagsmith/index.mdx new file mode 100644 index 0000000000000..a8bdc38c936cd --- /dev/null +++ b/docs/organization/integrations/feature-flag/flagsmith/index.mdx @@ -0,0 +1,39 @@ + +--- +title: Flagsmith +sidebar_order: 1 +description: Learn about Sentry's Flagsmith integrations. +--- + +## Evaluation Tracking + +Sentry can track flag evaluations as they happen within your application. Flag evaluations will appear in the "Feature Flag" section of the Issue Details page as a table, with "suspect" flag predictions highlighted in yellow. Learn more about how to interact with feature flag insights within the Sentry UI by reading the [Issue Details page documentation](/product/issues/issue-details/#feature-flags). + +### Set Up Evaluation Tracking + +Flagsmith recommends using a OpenFeature SDK and [Flagsmith Provider](https://openfeature.dev/ecosystem?instant_search%5Bquery%5D=flagsmith&instant_search%5BrefinementList%5D%5Btype%5D%5B0%5D=Provider) to evaluate feature flags. To track these evaluations, visit one of our supported languages pages for OpenFeature: +* [JavaScript](/platforms/javascript/configuration/integrations/openfeature/) +* [Python](/platforms/python/integrations/openfeature/) + +## Change Tracking + +Sentry can track changes to feature flag definitions and report suspicious feature flag edits. + +### Set Up Change Tracking + +Enabling Change Tracking is a three-step process. To get started, visit the [feature flags settings page](https://sentry.io/orgredirect/organizations/:orgslug/settings/feature-flags/change-tracking/) in a new tab. Then follow the steps listed below. + +1. **Click the "Add New Provider" button.** + - One webhook secret can be registered per provider type. + - Select Generic in the dropdown that says "Select a provider". +2. **Register the webhook URL**. + ![Flagsmith Sentry Webhook Modal](./img/flagsmith-sentry-webhook-modal.png) + - Go to your Flagsmith project dashboard and navigate to the `/project/:projectid/integrations` page, which can be found by clicking "Integrations" on the top navigation bar. + - Find the Sentry option, and click "Add Integration", which will open a modal. + - Select the Environment from which flag change events will trigger. + - Copy the provided Sentry webhook URL and paste it into "Webhook URL" in the Flagsmith "Sentry Integration" modal. +3. **Set the Signing Secret**. + - Still in the Flagsmith "Sentry Integration" modal, type in any string between 10 and 60 characters to use as your authorization token ("secret"). + - Copy the authorization token from the previous step and paste it into the input box next to "Secret" in Sentry settings. + +Once saved, Sentry will now accept and authenticate all inbound hooks to your organization's feature flag webhook endpoint. diff --git a/docs/organization/integrations/feature-flag/generic/index.mdx b/docs/organization/integrations/feature-flag/generic/index.mdx index 053e436e4fff6..57c1f3e7d0af6 100644 --- a/docs/organization/integrations/feature-flag/generic/index.mdx +++ b/docs/organization/integrations/feature-flag/generic/index.mdx @@ -1,6 +1,6 @@ --- title: Generic -sidebar_order: 1 +sidebar_order: 6 description: Learn about Sentry's generic feature-flag integrations. --- diff --git a/platform-includes/feature-flags/change-tracking-list/_default.mdx b/platform-includes/feature-flags/change-tracking-list/_default.mdx index de0f724315b0a..84613fdeb4817 100644 --- a/platform-includes/feature-flags/change-tracking-list/_default.mdx +++ b/platform-includes/feature-flags/change-tracking-list/_default.mdx @@ -1,4 +1,5 @@ Change tracking requires registering a Sentry webhook with a feature flag provider. For set up instructions, visit the documentation for your provider: +* [Flagsmith](/organization/integrations/feature-flag/flagsmith/#change-tracking) * [LaunchDarkly](/organization/integrations/feature-flag/launchdarkly/#change-tracking) * [Statsig](/organization/integrations/feature-flag/statsig/#change-tracking) * [Unleash](/organization/integrations/feature-flag/unleash/#change-tracking) From dd8de3773ab83043819eef4656480c1e124ec8f2 Mon Sep 17 00:00:00 2001 From: Andrew Liu <159852527+aliu39@users.noreply.github.com> Date: Tue, 1 Jul 2025 14:22:58 -0700 Subject: [PATCH 6/9] proposed updates to flagsmith integration docs --- .../organization/integrations/feature-flag/flagsmith/index.mdx | 2 -- docs/organization/integrations/feature-flag/index.mdx | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/organization/integrations/feature-flag/flagsmith/index.mdx b/docs/organization/integrations/feature-flag/flagsmith/index.mdx index a8bdc38c936cd..70e1df6505250 100644 --- a/docs/organization/integrations/feature-flag/flagsmith/index.mdx +++ b/docs/organization/integrations/feature-flag/flagsmith/index.mdx @@ -1,4 +1,3 @@ - --- title: Flagsmith sidebar_order: 1 @@ -27,7 +26,6 @@ Enabling Change Tracking is a three-step process. To get started, visit the [fea - One webhook secret can be registered per provider type. - Select Generic in the dropdown that says "Select a provider". 2. **Register the webhook URL**. - ![Flagsmith Sentry Webhook Modal](./img/flagsmith-sentry-webhook-modal.png) - Go to your Flagsmith project dashboard and navigate to the `/project/:projectid/integrations` page, which can be found by clicking "Integrations" on the top navigation bar. - Find the Sentry option, and click "Add Integration", which will open a modal. - Select the Environment from which flag change events will trigger. diff --git a/docs/organization/integrations/feature-flag/index.mdx b/docs/organization/integrations/feature-flag/index.mdx index 84f2a642da776..04242dcea1bd7 100644 --- a/docs/organization/integrations/feature-flag/index.mdx +++ b/docs/organization/integrations/feature-flag/index.mdx @@ -4,8 +4,9 @@ sidebar_order: 90 description: "Learn more about Sentry's feature flag integrations." --- -- [Generic](/organization/integrations/feature-flag/generic/) +- [Flagsmith](/organization/integrations/feature-flag/flagsmith/) - [LaunchDarkly](/organization/integrations/feature-flag/launchdarkly/) - [Statsig](/organization/integrations/feature-flag/statsig/) - [Split](/organization/integrations/feature-flag/split/) - [Unleash](/organization/integrations/feature-flag/unleash/) +- [Generic](/organization/integrations/feature-flag/generic/) From 156b6f4c04bd7392a63062c8b8d43816fb9058a0 Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Tue, 1 Jul 2025 19:18:18 -0300 Subject: [PATCH 7/9] Revert platform docs --- .../configuration/integrations/flagsmith.mdx | 42 ----------- docs/platforms/python/feature-flags/index.mdx | 1 - .../python/integrations/flagsmith/index.mdx | 75 ------------------- .../flagsmith/javascript.angular.mdx | 45 ----------- .../flagsmith/javascript.astro.mdx | 45 ----------- .../flagsmith/javascript.ember.mdx | 45 ----------- .../flagsmith/javascript.gatsby.mdx | 45 ----------- .../configuration/flagsmith/javascript.mdx | 45 ----------- .../flagsmith/javascript.nextjs.mdx | 45 ----------- .../flagsmith/javascript.nuxt.mdx | 45 ----------- .../flagsmith/javascript.react.mdx | 45 ----------- .../flagsmith/javascript.remix.mdx | 45 ----------- .../flagsmith/javascript.solid.mdx | 45 ----------- .../flagsmith/javascript.solidstart.mdx | 45 ----------- .../flagsmith/javascript.svelte.mdx | 45 ----------- .../flagsmith/javascript.sveltekit.mdx | 45 ----------- .../flagsmith/javascript.vue.mdx | 45 ----------- 17 files changed, 748 deletions(-) delete mode 100644 docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx delete mode 100644 docs/platforms/python/integrations/flagsmith/index.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.angular.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.astro.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.ember.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.gatsby.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.nextjs.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.nuxt.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.react.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.remix.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.solid.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.solidstart.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.svelte.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.sveltekit.mdx delete mode 100644 platform-includes/configuration/flagsmith/javascript.vue.mdx diff --git a/docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx b/docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx deleted file mode 100644 index 5586d3d060c08..0000000000000 --- a/docs/platforms/javascript/common/configuration/integrations/flagsmith.mdx +++ /dev/null @@ -1,42 +0,0 @@ ---- -title: Flagsmith -description: "Learn how to use Sentry with Flagsmith." -notSupported: - - javascript.aws-lambda - - javascript.azure-functions - - javascript.bun - - javascript.capacitor - - javascript.cloudflare - - javascript.connect - - javascript.cordova - - javascript.deno - - javascript.electron - - javascript.express - - javascript.fastify - - javascript.gcp-functions - - javascript.hapi - - javascript.hono - - javascript.koa - - javascript.nestjs - - javascript.node - - javascript.wasm - - javascript.tanstackstart-react ---- - - - - - -This integration only works inside a browser environment. It is only available from a package-based install (e.g. `npm` or `yarn`). - - - -[Flagsmith](https://flagsmith.com/) relies on the [OpenFeature](https://openfeature.dev/) integration to track feature flag evaluations produced by the OpenFeature SDK. These evaluations are held in memory, and in the event an error occurs, sent to Sentry for review and analysis. **At the moment, we only support boolean flag evaluations.** This integration is available in Sentry SDK **versions 8.43.0 or higher.** - -_Import name: `Sentry.openFeatureIntegration` and `Sentry.OpenFeatureIntegrationHook`_ - - - -Visit the Sentry website and confirm that your error event has recorded the feature flag "test-flag" and its value "false". - - diff --git a/docs/platforms/python/feature-flags/index.mdx b/docs/platforms/python/feature-flags/index.mdx index 3aa7ad0ec79aa..c9b4a76bb6046 100644 --- a/docs/platforms/python/feature-flags/index.mdx +++ b/docs/platforms/python/feature-flags/index.mdx @@ -15,7 +15,6 @@ description: With Feature Flags, Sentry tracks feature flag evaluations in your If you use a third-party SDK to evaluate feature flags, you can enable a Sentry SDK integration to track those evaluations. Integrations are provider specific. Documentation for supported SDKs is listed below. -- [Flagsmith](/platforms/python/integrations/flagsmith/) - [LaunchDarkly](/platforms/python/integrations/launchdarkly/) - [OpenFeature](/platforms/python/integrations/openfeature/) - [Statsig](/platforms/python/integrations/statsig/) diff --git a/docs/platforms/python/integrations/flagsmith/index.mdx b/docs/platforms/python/integrations/flagsmith/index.mdx deleted file mode 100644 index ccf39780cf4c3..0000000000000 --- a/docs/platforms/python/integrations/flagsmith/index.mdx +++ /dev/null @@ -1,75 +0,0 @@ ---- -title: Flagsmith -description: "Learn how to use Sentry with Flagsmith." ---- - - - -[Flagsmith](https://flagsmith.com/) relies on the [OpenFeature](https://openfeature.dev/) integration to track feature flag evaluations produced by the OpenFeature SDK. These evaluations are held in memory and sent to Sentry for review and analysis if an error occurs. **At the moment, we only support boolean flag evaluations.** - -## Install - -Install `sentry-sdk` from PyPI with the `openfeature` extra. - -```bash {tabTitle:pip} -pip install "sentry-sdk[openfeature]" openfeature-provider-flagsmith -``` -```bash {tabTitle:uv} -uv add "sentry-sdk[openfeature]" openfeature-provider-flagsmith -``` - -## Configure - -Set `FlagsmithProvider()` as the provider for the OpenFeature client, then add `OpenFeatureIntegration()` to your `integrations` list: - -```python -import flagsmith -import sentry_sdk -from openfeature import api -from openfeature_flagsmith.provider import FlagsmithProvider -from sentry_sdk.integrations.openfeature import OpenFeatureIntegration - -flagsmith_client = flagsmith.Flagsmith( - environment_key='', -) - -flagsmith_provider = FlagsmithProvider( - client=flagsmith_client, -) - -api.set_provider(flagsmith_provider) - -sentry_sdk.init( - dsn="___PUBLIC_DSN___", - # Add data like request headers and IP for users, if applicable; - # see https://docs.sentry.io/platforms/python/data-management/data-collected/ for more info - send_default_pii=True, - integrations=[ - OpenFeatureIntegration(), - ], -) -``` - -## Verify - -The integration is tested by evaluating a feature flag using your OpenFeature SDK before capturing an exception. - -```python -from openfeature import api -import sentry_sdk - -client = api.get_client() -client.get_boolean_value("hello", default_value=False) - -sentry_sdk.capture_exception(Exception("Something went wrong!")) -``` - -Visit the Sentry website and confirm that your error event has recorded the feature flag "hello" and its value "false". - -## Supported Versions - -- openfeature-sdk >= 0.7.1 -- sentry-sdk >= 2.19.2 -- python >= 3.9 - - diff --git a/platform-includes/configuration/flagsmith/javascript.angular.mdx b/platform-includes/configuration/flagsmith/javascript.angular.mdx deleted file mode 100644 index b74a49c9ceafb..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.angular.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/angular'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/angular'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.astro.mdx b/platform-includes/configuration/flagsmith/javascript.astro.mdx deleted file mode 100644 index 86a0738957edd..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.astro.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/astro'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/astro'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.ember.mdx b/platform-includes/configuration/flagsmith/javascript.ember.mdx deleted file mode 100644 index eff4e4097fbc5..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.ember.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/ember'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/ember'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.gatsby.mdx b/platform-includes/configuration/flagsmith/javascript.gatsby.mdx deleted file mode 100644 index fb7561c01c7c5..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.gatsby.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/gatsby'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/gatsby'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.mdx b/platform-includes/configuration/flagsmith/javascript.mdx deleted file mode 100644 index ba797820a1e91..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/browser'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/browser'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.nextjs.mdx b/platform-includes/configuration/flagsmith/javascript.nextjs.mdx deleted file mode 100644 index 71ea20d24e352..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.nextjs.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/nextjs'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/nextjs'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.nuxt.mdx b/platform-includes/configuration/flagsmith/javascript.nuxt.mdx deleted file mode 100644 index 04eeacca87577..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.nuxt.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/nuxt'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/nuxt'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.react.mdx b/platform-includes/configuration/flagsmith/javascript.react.mdx deleted file mode 100644 index bcd59201b56f5..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.react.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/react'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/react'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.remix.mdx b/platform-includes/configuration/flagsmith/javascript.remix.mdx deleted file mode 100644 index 978e63a448df7..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.remix.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/remix'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/remix'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.solid.mdx b/platform-includes/configuration/flagsmith/javascript.solid.mdx deleted file mode 100644 index 95581bcc61445..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.solid.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/solid'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/solid'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.solidstart.mdx b/platform-includes/configuration/flagsmith/javascript.solidstart.mdx deleted file mode 100644 index 9abbd7ba76a74..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.solidstart.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/solidstart'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/solidstart'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.svelte.mdx b/platform-includes/configuration/flagsmith/javascript.svelte.mdx deleted file mode 100644 index b7eb11e5bf6e9..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.svelte.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/svelte'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/svelte'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.sveltekit.mdx b/platform-includes/configuration/flagsmith/javascript.sveltekit.mdx deleted file mode 100644 index bf88d27081986..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.sveltekit.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/sveltekit'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/sveltekit'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` diff --git a/platform-includes/configuration/flagsmith/javascript.vue.mdx b/platform-includes/configuration/flagsmith/javascript.vue.mdx deleted file mode 100644 index 874dd67c370d6..0000000000000 --- a/platform-includes/configuration/flagsmith/javascript.vue.mdx +++ /dev/null @@ -1,45 +0,0 @@ -Before using this integration, you need to install and instrument both the [OpenFeature SDK](https://www.npmjs.com/package/@openfeature/web-sdk) and the [OpenFeature Flagsmith provider](https://www.npmjs.com/package/@openfeature/flagsmith-client-provider) in your app. Learn more by reading OpenFeature's [SDK docs](https://openfeature.dev/docs/reference/technologies/client/web/) and [provider docs](https://openfeature.dev/docs/reference/concepts/provider). - -```javascript {tabTitle: JavaScript (Track All Evals)} -import * as Sentry from '@sentry/vue'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -OpenFeature.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const client = OpenFeature.getClient(); -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` - -```javascript {tabTitle: JavaScript (Track One Client)} -import * as Sentry from '@sentry/vue'; -import { FlagsmithClientProvider } from '@openfeature/flagsmith-client-provider'; -import { OpenFeature } from '@openfeature/web-sdk'; - -Sentry.init({ - dsn: '___PUBLIC_DSN___', - integrations: [Sentry.openFeatureIntegration()] -}); - -const flagsmithClientProvider = new FlagsmithClientProvider({ - environmentID: '' -}); -OpenFeature.setProvider(flagsmithClientProvider); - -const client = OpenFeature.getClient(); -client.addHooks(new Sentry.OpenFeatureIntegrationHook()); - -const result = client.getBooleanValue('test-flag', false); // evaluate with a default value -Sentry.captureException(new Error('Something went wrong!')); -``` From 8ad04c0f029fd5f7936916ff9f5bf8e1d0256ddc Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Wed, 2 Jul 2025 14:48:04 -0300 Subject: [PATCH 8/9] Link to Flagsmith docs for more info --- .../integrations/feature-flag/flagsmith/index.mdx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/organization/integrations/feature-flag/flagsmith/index.mdx b/docs/organization/integrations/feature-flag/flagsmith/index.mdx index 5abc09069154e..351516b34a250 100644 --- a/docs/organization/integrations/feature-flag/flagsmith/index.mdx +++ b/docs/organization/integrations/feature-flag/flagsmith/index.mdx @@ -10,10 +10,12 @@ Sentry can track flag evaluations as they happen within your application. Flag e ### Set Up Evaluation Tracking -Flagsmith recommends using an OpenFeature SDK and [Flagsmith Provider](https://openfeature.dev/ecosystem?instant_search%5Bquery%5D=flagsmith&instant_search%5BrefinementList%5D%5Btype%5D%5B0%5D=Provider) to evaluate feature flags. To track these evaluations, visit one of our supported languages pages for OpenFeature: +Flagsmith recommends using an OpenFeature SDK combined with a [Flagsmith provider](https://openfeature.dev/ecosystem?instant_search%5Bquery%5D=flagsmith&instant_search%5BrefinementList%5D%5Btype%5D%5B0%5D=Provider) to evaluate feature flags. To track these evaluations, visit one of our supported languages pages for OpenFeature: * [JavaScript](/platforms/javascript/configuration/integrations/openfeature/) * [Python](/platforms/python/integrations/openfeature/) +Visit the [Flagsmith documentation](https://docs.flagsmith.com/integrations/apm/sentry#evaluation-tracking-example) for specific instructions on how to set up the OpenFeature SDK with the Flagsmith provider. + ## Change Tracking Sentry can track changes to feature flag definitions and report suspicious feature flag edits. From 6e586326ddbf25d94df1fd423a29cedf1a7949ab Mon Sep 17 00:00:00 2001 From: Evandro Myller Date: Wed, 2 Jul 2025 15:39:23 -0300 Subject: [PATCH 9/9] Update URL --- docs/organization/integrations/feature-flag/flagsmith/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/organization/integrations/feature-flag/flagsmith/index.mdx b/docs/organization/integrations/feature-flag/flagsmith/index.mdx index 351516b34a250..33626a3f9064a 100644 --- a/docs/organization/integrations/feature-flag/flagsmith/index.mdx +++ b/docs/organization/integrations/feature-flag/flagsmith/index.mdx @@ -14,7 +14,7 @@ Flagsmith recommends using an OpenFeature SDK combined with a [Flagsmith provide * [JavaScript](/platforms/javascript/configuration/integrations/openfeature/) * [Python](/platforms/python/integrations/openfeature/) -Visit the [Flagsmith documentation](https://docs.flagsmith.com/integrations/apm/sentry#evaluation-tracking-example) for specific instructions on how to set up the OpenFeature SDK with the Flagsmith provider. +Visit the [Flagsmith documentation](https://docs.flagsmith.com/integrations/apm/sentry#evaluation-tracking-setup) for specific instructions on how to set up the OpenFeature SDK with the Flagsmith provider. ## Change Tracking