This product is not supported for your selected Datadog site. ().
Overview
You can add Datadog Feature Flags to an application that uses OpenTelemetry (OTel) for tracing. Datadog supports two integration options. In both cases, feature flags evaluate correctly and your existing OpenTelemetry API instrumentation code remains the same.
Choose an integration option based on whether you can change your tracing provider initialization:
Option A: Register the Datadog SDK as the TracerProvider
Option B: Run the Datadog SDK alongside OpenTelemetry
If you can change your tracing provider initialization, Option A is recommended. If you cannot change your tracing provider, use Option B to adopt feature flags without changing your OTel trace pipeline.
Option A: Register the Datadog SDK as the TracerProvider
In this option, the Datadog SDK replaces the OTel SDK as the TracerProvider. Your existing OpenTelemetry API instrumentation code — spans, attributes, events, and context propagation — stays the same.
Remove any existing OpenTelemetry TracerProvider and exporter initialization to avoid duplicate traces.
usingOpenFeature;usingDatadog.FeatureFlags.OpenFeature;// Register the Datadog OpenFeature providervarffProvider=newDatadogProvider();awaitApi.Instance.SetProviderAsync(ffProvider);varclient=Api.Instance.GetClient("my-service");// Your existing OpenTelemetry API calls continue to work unchanged
import("log"ddotel"github.com/DataDog/dd-trace-go/v2/ddtrace/opentelemetry""github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"ddopenfeature"github.com/DataDog/dd-trace-go/v2/openfeature""github.com/open-feature/go-sdk/openfeature""go.opentelemetry.io/otel")funcmain(){tracer.Start()defertracer.Stop()// Register the Datadog SDK as the OpenTelemetry TracerProviderotelProvider:=ddotel.NewTracerProvider()deferotelProvider.Shutdown()otel.SetTracerProvider(otelProvider)// Register the Datadog OpenFeature providerflagProvider,err:=ddopenfeature.NewDatadogProvider(ddopenfeature.ProviderConfig{})iferr!=nil{log.Fatalf("Failed to create provider: %v",err)}deferflagProvider.Shutdown()iferr:=openfeature.SetProviderAndWait(flagProvider);err!=nil{log.Fatalf("Failed to set provider: %v",err)}client:=openfeature.NewClient("my-service")// Your existing OpenTelemetry API calls continue to work unchanged}
importdev.openfeature.sdk.OpenFeatureAPI;importdev.openfeature.sdk.Client;importdatadog.trace.api.openfeature.Provider;// Register the Datadog OpenFeature providerOpenFeatureAPIapi=OpenFeatureAPI.getInstance();api.setProviderAndWait(newProvider());Clientclient=api.getClient("my-app");/* Your existing OpenTelemetry API calls continue to work unchanged */
Note: For tracing, depend only on the OpenTelemetry API, not the OpenTelemetry SDK. For more detail, see OpenTelemetry API Support for Java. To emit flag evaluation metrics, you also need the OpenTelemetry SDK metrics and OTLP exporter dependencies; see [Set Up Server-Side Flag Evaluation Metrics][3].
importtracerfrom'dd-trace';import{OpenFeature}from'@openfeature/server-sdk';import*asotelfrom'@opentelemetry/api';tracer.init({experimental:{flaggingProvider:{enabled:true,},},});// Register the Datadog SDK as the OpenTelemetry TracerProvider
constprovider=newtracer.TracerProvider();provider.register();// Register the Datadog OpenFeature provider
OpenFeature.setProvider(tracer.openfeature);// Your existing @opentelemetry/api calls continue to work unchanged:
constotelTracer=otel.trace.getTracer('my-service');otelTracer.startActiveSpan('my-operation',(span)=>{...});
fromddtraceimporttracerfromopenfeatureimportapifromddtrace.openfeatureimportDataDogProvidertracer.configure()# Register the Datadog OpenFeature providerprovider=DataDogProvider()api.set_provider(provider)client=api.get_client()# Your existing OpenTelemetry API calls continue to work unchanged
require'datadog'require'opentelemetry/sdk'require'datadog/opentelemetry'require'open_feature/sdk'require'datadog/open_feature/provider'# Enable remote configuration and OpenFeature integrationDatadog.configuredo|c|c.remote.enabled=truec.open_feature.enabled=trueend# Register the Datadog OpenFeature providerOpenFeature::SDK.configuredo|c|c.set_provider_and_wait(Datadog::OpenFeature::Provider.new)endclient=OpenFeature::SDK.build_client# Your existing OpenTelemetry API calls continue to work unchanged
<?phprequire_once__DIR__.'/vendor/autoload.php';useDDTrace\OpenFeature\DataDogProvider;useOpenFeature\OpenFeatureAPI;// Register the Datadog OpenFeature provider
$api=OpenFeatureAPI::getInstance();$api->setProvider(newDataDogProvider());$client=$api->getClient('my-service');// Your existing OpenTelemetry API calls continue to work unchanged
Option B: Run the Datadog SDK alongside OpenTelemetry
In this option, your existing OTel SDK remains the TracerProvider for tracing. Add the Datadog SDK only for feature flag delivery through Remote Configuration. Your OTel SDK initialization, exporters, and instrumentation stay unchanged.
import("log""github.com/DataDog/dd-trace-go/v2/ddtrace/tracer"ddopenfeature"github.com/DataDog/dd-trace-go/v2/openfeature""github.com/open-feature/go-sdk/openfeature")funcmain(){tracer.Start()defertracer.Stop()// Register the Datadog OpenFeature providerflagProvider,err:=ddopenfeature.NewDatadogProvider(ddopenfeature.ProviderConfig{})iferr!=nil{log.Fatalf("Failed to create provider: %v",err)}deferflagProvider.Shutdown()iferr:=openfeature.SetProviderAndWait(flagProvider);err!=nil{log.Fatalf("Failed to set provider: %v",err)}client:=openfeature.NewClient("my-service")// Your existing OpenTelemetry SDK initialization stays unchanged}
Note: To emit flag evaluation metrics, add the OpenTelemetry SDK metrics and OTLP exporter dependencies; see [Set Up Server-Side Flag Evaluation Metrics][3].
Main.java
importdev.openfeature.sdk.OpenFeatureAPI;importdev.openfeature.sdk.Client;importdatadog.trace.api.openfeature.Provider;// Register the Datadog OpenFeature providerOpenFeatureAPIapi=OpenFeatureAPI.getInstance();api.setProviderAndWait(newProvider());Clientclient=api.getClient("my-app");/* Your existing OpenTelemetry SDK initialization stays unchanged */
<?phprequire_once__DIR__.'/vendor/autoload.php';useDDTrace\OpenFeature\DataDogProvider;useOpenFeature\OpenFeatureAPI;// Register the Datadog OpenFeature provider
$api=OpenFeatureAPI::getInstance();$api->setProvider(newDataDogProvider());$client=$api->getClient('my-service');// Your existing OpenTelemetry SDK initialization stays unchanged
Evaluate feature flags
After you initialize the provider, evaluate flags with the OpenFeature client. Flag evaluation uses locally cached configuration, so evaluations do not make network requests.
In both integration options, feature flags evaluate the same way. Flag configurations are delivered through the same Remote Configuration channel.
For complete setup instructions, typed getters, evaluation context requirements, and testing patterns, see your language’s server-side SDK documentation.
Further reading
Additional helpful documentation, links, and articles: