Este producto no es compatible con el sitio Datadog seleccionado. ().
La compatibilidad de Datadog Feature Flags es experimental y requiere habilitar una indicador experimental en el rastreador. Consulta la sección Configuración para obtener más información.
Información general
En esta página se describe cómo instrumentar tu aplicación de Java con el SDK de Datadog Feature Flags. Los indicadores de características de Datadog ofrecen una forma unificada de controlar de forma remota la disponibilidad de características en tu aplicación, experimentar de forma segura y ofrecer nuevas experiencias con confianza.
El kit de desarrollo de software (SDK) de Java integra indicadores de características directamente en el rastreador de Datadog APM e implementa el estándar de OpenFeature para ofrecer la máxima flexibilidad y compatibilidad.
Si utilizas Datadog APM y tu aplicación ya tiene activados el rastreador de Datadog Java y Remote Configuration, ve directamente a Inicializar el proveedor OpenFeature. Solo tienes que añadir las dependencias de OpenFeature e inicializar el proveedor.
Requisitos de compatibilidad
El SDK de Datadog Feature Flags para Java requiere:
Java 11 o posterior
Rastreador de APM de Datadog Java: versión 2.4.0 o posterior
El marcado de características está integrado en el rastreador de APM de Datadog Java. Necesitas el JAR del rastreador y las dependencias del SDK de OpenFeature.
Añade las siguientes dependencias a tu build.gradle:
build.gradle
dependencies{// OpenFeature SDK for flag evaluation
implementation'dev.openfeature:sdk:1.18.2'// Datadog OpenFeature Provider
implementation'com.datadoghq:dd-openfeature:1.57.0'}
Añade las siguientes dependencias a tu build.gradle.kts:
build.gradle.kts
dependencies{// OpenFeature SDK for flag evaluation
implementation("dev.openfeature:sdk:1.18.2")// Datadog OpenFeature Provider
implementation("com.datadoghq:dd-openfeature:1.57.0")}
Añade las siguientes dependencias a tu pom.xml:
pom.xml
<dependencies><!-- OpenFeature SDK for flag evaluation --><dependency><groupId>dev.openfeature</groupId><artifactId>sdk</artifactId><version>1.18.2</version></dependency><!-- Datadog OpenFeature Provider --><dependency><groupId>com.datadoghq</groupId><artifactId>dd-openfeature</artifactId><version>1.57.0</version></dependency></dependencies>
Configuración
Si tu Datadog Agent ya tiene activado Remote Configuration para otras funciones (como Dynamic Instrumentation o Application Security), puedes omitir la configuración del Agent e ir directamente a Configuración de aplicaciones.
Configuración del Agent
Configura tu Datadog Agent para activar Remote Configuration:
datadog.yaml
# Activar la configuración remotaremote_configuration:enabled:true# Set your API keyapi_key:<YOUR_API_KEY>
Configuración de la aplicación
Si tu aplicación ya se ejecuta con -javaagent:dd-java-agent.jar y tiene habilitada Remote Configuration (DD_REMOTE_CONFIG_ENABLED=true), solo necesitas añadir el indicador de característica experimental (DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true). Omite los pasos de descarga del rastreador y configuración de la JVM.
Configura tu aplicación Java con las variables de entorno o propiedades del sistema necesarias:
# Required: Enable Remote Configuration in the tracerexportDD_REMOTE_CONFIG_ENABLED=true# Required: Enable experimental feature flagging supportexportDD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true# Required: Your Datadog API keyexportDD_API_KEY=<YOUR_API_KEY>
# Required: Service nameexportDD_SERVICE=<YOUR_SERVICE_NAME>
# Required: Environment (e.g., prod, staging, dev)exportDD_ENV=<YOUR_ENVIRONMENT>
# Optional: VersionexportDD_VERSION=<YOUR_APP_VERSION>
# Start your application with the tracerjava -javaagent:path/to/dd-java-agent.jar -jar your-application.jar
El sistema de marcado de características de Datadog se inicia automáticamente cuando se inicializa el rastreador con Remote Configuration y el proveedor de marcado experimental activados. No se requiere ningún código de inicialización adicional en tu aplicación.
El marcado de características requiere DD_REMOTE_CONFIG_ENABLED=true y DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED=true. Sin el indicador experimental, el sistema de marcado de características no se inicia y el proveedor devuelve el valor programático predeterminado.
Añadir el rastreador de Java a la JVM
Para obtener instrucciones sobre cómo añadir el argumento -javaagent a tu servidor de aplicaciones o framework, consulta Add the Java Tracer to the JVM.
Asegúrate de incluir los indicadores de configuración del marcado de características:
-Ddd.remote.config.enabled=true
-Ddd.experimental.flagging.provider.enabled=true
Inicializar el proveedor OpenFeature
Inicializa el proveedor Datadog OpenFeature en el código de inicio de tu aplicación. El proveedor se conecta al sistema de marcado de características que se ejecuta en el rastreador de Datadog.
importdev.openfeature.sdk.OpenFeatureAPI;importdev.openfeature.sdk.Client;importdatadog.trace.api.openfeature.Provider;importdev.openfeature.sdk.exceptions.ProviderNotReadyError;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassApp{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(App.class);privatestaticClientclient;publicstaticvoidmain(String[]args)throwsException{// Initialize the Datadog providerlogger.info("Initializing Datadog OpenFeature Provider...");OpenFeatureAPIapi=OpenFeatureAPI.getInstance();try{// Set provider and wait for initial configuration (recommended)api.setProviderAndWait(newProvider());client=api.getClient("my-app");logger.info("OpenFeature provider initialized successfully");}catch(ProviderNotReadyErrore){// Handle gracefully - app will use default flag valueslogger.warn("Provider not ready (no tracer/config available), continuing with defaults",e);client=api.getClient("my-app");logger.info("App will use default flag values until provider is ready");}catch(Exceptione){logger.error("Failed to initialize OpenFeature provider",e);throwe;}// Your application code here}}
Utiliza setProviderAndWait() para bloquear la evaluación hasta que se reciba la configuración inicial del indicador desde Remote Configuration. Esto asegura que los indicadores estén listos antes de que la aplicación comience a atender tráfico. El tiempo de espera por defecto es de 30 segundos.
ProviderNotReadyError es una excepción del SDK de OpenFeature que se lanza cuando se agota el tiempo de espera del proveedor durante la inicialización. Su captura permite que la aplicación se inicie con los valores por defecto del indicador si Remote Configuration no está disponible. Si no se captura, la excepción se propaga y puede impedir el inicio de la aplicación. Gestiona esto basándote en tus requisitos de disponibilidad.
Inicialización asíncrona
Para una inicialización no bloqueante, utiliza setProvider() y escuche los eventos del proveedor:
importdev.openfeature.sdk.ProviderEvent;OpenFeatureAPIapi=OpenFeatureAPI.getInstance();Clientclient=api.getClient();// Listen for provider state changesclient.on(ProviderEvent.PROVIDER_READY,(event)->{logger.info("Feature flags ready!");});client.on(ProviderEvent.PROVIDER_ERROR,(event)->{logger.error("Provider error: {}",event.getMessage());});client.on(ProviderEvent.PROVIDER_STALE,(event)->{logger.warn("Provider configuration is stale");});// Set provider asynchronouslyapi.setProvider(newProvider());
Definir el contexto de evaluación
El contexto de evaluación define el sujeto (usuario, dispositivo, sesión) para la evaluación del indicador. Determina qué variaciones del indicador se devuelven en función de las reglas de orientación.
importdev.openfeature.sdk.EvaluationContext;importdev.openfeature.sdk.MutableContext;// Create an evaluation context with a targeting key and attributesEvaluationContextcontext=newMutableContext("user-123").add("email","user@example.com").add("tier","premium");//Usethecontextforflagevaluations(seenextsection)
El targetingKey (por ejemplo, user-123) es el identificador principal utilizado para las evaluaciones de indicadores coherentes y las implantaciones basadas en porcentajes. Suele ser un identificador de usuario, de sesión o de dispositivo.
Evaluar indicadores
Evalúa los indicadores de características con el cliente OpenFeature. Se admiten todos los tipos de indicadores: booleano, cadena, entero, doble y objeto.
// Simple Boolean evaluationbooleanenabled=client.getBooleanValue("checkout.new",false,context);if(enabled){// New checkout flow}else{// Old checkout flow}// Get detailed evaluation resultimportdev.openfeature.sdk.FlagEvaluationDetails;FlagEvaluationDetails<Boolean>details=client.getBooleanDetails("checkout.new",false,context);logger.info("Value: {}",details.getValue());logger.info("Variant: {}",details.getVariant());logger.info("Reason: {}",details.getReason());
// Evaluate string flags (e.g., UI themes, API endpoints)Stringtheme=client.getStringValue("ui.theme","light",context);StringapiEndpoint=client.getStringValue("payment.api.endpoint","https://api.example.com/v1",context);
importdev.openfeature.sdk.Value;// Evaluate object/JSON flags for complex configurationValueconfig=client.getObjectValue("ui.config",newValue(),context);// Access structured dataif(config.isStructure()){Valuetimeout=config.asStructure().getValue("timeout");Valueendpoint=config.asStructure().getValue("endpoint");}
Tratamiento de errores
El SDK de OpenFeature utiliza un patrón de valores por defecto. Si la evaluación falla por cualquier motivo, se devuelve el valor predeterminado que proporciones.
importdev.openfeature.sdk.ErrorCode;// Check evaluation details for errorsFlagEvaluationDetails<Boolean>details=client.getBooleanDetails("checkout.new",false,context);if(details.getErrorCode()!=null){switch(details.getErrorCode()){caseFLAG_NOT_FOUND:logger.warn("Flag does not exist: {}","checkout.new");break;casePROVIDER_NOT_READY:logger.warn("Provider not initialized yet");break;caseTARGETING_KEY_MISSING:logger.warn("Evaluation context missing targeting key");break;caseTYPE_MISMATCH:logger.error("Flag value type doesn't match requested type");break;default:logger.error("Evaluation error for flag: {}","checkout.new",details.getErrorCode());}}
Códigos de error habituales
Código de error
Descripción
Resolución
PROVIDER_NOT_READY
Configuración inicial no recibida
Espere a la inicialización del proveedor o utilice setProviderAndWait()
FLAG_NOT_FOUND
El indicador no existe en la configuración
Comprueba la clave del indicador o crea un indicador en la interfaz de usuario de Datadog
TARGETING_KEY_MISSING
Ninguna clave de orientación en el contexto de la evaluación
Proporcionar una clave de orientación al crear el contexto
TYPE_MISMATCH
El valor del indicador no se puede convertir al tipo solicitado
Utilizar el método de evaluación correcto para el tipo de indicador
INVALID_CONTEXT
El contexto de evaluación es nulo
Proporcionar un contexto de evaluación válido
Configuración avanzada
Tiempo de espera de inicialización personalizado
Configura cuánto tiempo espera el proveedor para la configuración inicial:
PROVIDER_CONFIGURATION_CHANGED es un evento opcional de OpenFeature. Consulta la documentación del proveedor de Datadog para comprobar si tu versión admite este evento.
Múltiples clientes
Utiliza clientes con nombre para organizar el contexto y los indicadores por dominio o equipo:
// Named clients share the same provider instance but can have different contextsClientcheckoutClient=api.getClient("checkout");ClientanalyticsClient=api.getClient("analytics");// Each client can have its own evaluation contextEvaluationContextcheckoutContext=newMutableContext("session-abc");EvaluationContextanalyticsContext=newMutableContext("user-123");booleannewCheckout=checkoutClient.getBooleanValue("checkout.ui.new",false,checkoutContext);booleanenhancedAnalytics=analyticsClient.getBooleanValue("analytics.enhanced",false,analyticsContext);
La instancia Provider se comparte globalmente. Los nombres de los clientes solo tienen fines organizativos y no crean instancias de proveedores independientes. Todos los clientes utilizan el mismo proveedor subyacente de Datadog y las mismas configuraciones de indicadores.
Prácticas recomendadas
Inicialización temprana
Inicializa el proveedor OpenFeature lo antes posible en el ciclo de vida de tu aplicación (por ejemplo, en main() o al iniciar la aplicación). Esto garantiza que los indicadores estén listos antes de que se ejecute la lógica empresarial.
Utilizar valores por defecto significativos
Proporciona siempre valores por defecto razonables que mantengan un comportamiento seguro si falla la evaluación del indicador:
// Good: Safe default that maintains current behaviorbooleanuseNewAlgorithm=client.getBooleanValue("algorithm.new",false,context);// Good: Conservative default for limitsintrateLimit=client.getIntegerValue("rate.limit",100,context);
Crear contexto una vez
Crea el contexto de evaluación una vez por solicitud/usuario/sesión y reutilízalo para todas las evaluaciones de indicadores:
// In a web filter or request handlerEvaluationContextuserContext=newMutableContext(userId).add("email",user.getEmail()).add("tier",user.getTier());// Reuse context for all flags in this requestbooleanfeatureA=client.getBooleanValue("feature.a",false,userContext);booleanfeatureB=client.getBooleanValue("feature.b",false,userContext);
Reconstruir el contexto de evaluación para cada evaluación de indicador añade una sobrecarga innecesaria. Crea el contexto una vez al inicio del ciclo de vida de la solicitud y, a continuación, pásalo a todas las evaluaciones de indicadores posteriores.
Gestión de fallos de inicialización (opcional)
Considera gestionar los fallos de inicialización si tu aplicación puede funcionar con valores de indicador predeterminados:
try{api.setProviderAndWait(newProvider());}catch(ProviderNotReadyErrore){// Log error and continue with defaultslogger.warn("Feature flags not ready, using defaults",e);// Application will use default values for all flags}
Si los indicadores de características son críticos para que tu aplicación funcione, deja que la excepción se propague para evitar el inicio.
Utilizar claves de orientación coherentes
Utilizar identificadores coherentes y estables como claves de orientación:
Bueno: ID de usuario, ID de sesión, ID de dispositivo
Evitar: marcas de tiempo, valores aleatorios, IDs que cambian frecuentemente
Monitorizar la evaluación del indicador
Utiliza los resultados detallados de la evaluación para el registro y la depuración: