Skip to main content

DIAL Analytics Enrichment Runner security and observability

This reference covers security and observability for platform engineers operating DIAL Analytics Enrichment Runner. It assumes the service connections are configured.

Defaults​

Defaults come from the application.yml and configuration documentation. — means no configured value. Actual defaults containing localhost are reproduced unchanged; container deployments need reachable service names.

Warning

SECURITY_MODE=none disables authentication and authorization. Use oidc before exposing the service on a shared network.

Logging​

Source: configuration reference.

VariableDefaultDescription
APP_LOG_LEVELINFOLog level for the application package (TRACE/DEBUG/INFO/WARN/ERROR).
LOGGER_STATUS_LOG_LEVELWARNLevel of Log4j2's own internal status logger (configuration diagnostics).
LOG_CONFIG_PATH/app/log-config/logging.levels.jsonRuntime level file (below). A file that never existed changes nothing; removing an applied file reverts its loggers to their baseline.
LOG_CONFIG_INTERVAL10sHow often the level file is re-read; at least 1s.
EXECUTION_TRACE_ENABLEDtrueCall tracing for @LogExecution classes, active only while a class's logger is at TRACE.
STATUS_REPORT_INTERVAL5mHow often each pipeline logs its status line.

API documentation​

Source: configuration reference.

VariableDefaultDescription
API_DOCS_ENABLEDtrueServe the OpenAPI document at /v3/api-docs; false also disables the UI, which is rendered from it.
SWAGGER_UI_ENABLEDtrueServe the Swagger UI at /swagger-ui.html, keeping the OpenAPI JSON available.
DISABLE_SWAGGER_AUTHORIZATIONfalseServe the OpenAPI document and Swagger UI without a credential in oidc mode. They map every functional endpoint, so leave it false wherever the runner is broadly reachable.

OpenTelemetry​

Source: configuration reference.

VariableDefaultDescription
OTEL_EXPORT_ENABLEDfalseMaster switch for OTLP export of traces, logs and metrics.
OTEL_TRACES_EXPORT_ENABLEDOTEL_EXPORT_ENABLEDExport spans over OTLP.
OTEL_LOGS_EXPORT_ENABLEDOTEL_EXPORT_ENABLEDExport application logs over OTLP.
OTEL_METRICS_EXPORT_ENABLEDOTEL_EXPORT_ENABLEDExport metrics over OTLP, additively to the Prometheus endpoint.
OTEL_EXPORTER_OTLP_ENDPOINThttp://localhost:4318Required if any export is enabled. Collector base URL, no trailing slash. The default points at localhost.
OTEL_EXPORTER_OTLP_TRACES_ENDPOINTbase + /v1/tracesFull traces URL; overrides the base for this signal.
OTEL_EXPORTER_OTLP_LOGS_ENDPOINTbase + /v1/logsFull logs URL; overrides the base for this signal.
OTEL_EXPORTER_OTLP_METRICS_ENDPOINTbase + /v1/metricsFull metrics URL; overrides the base for this signal.
OTEL_EXPORTER_OTLP_PROTOCOLhttpTransport for all three signals: http or grpc.
OTEL_TRACES_SAMPLING_PROBABILITY1.0Probability (0.0–1.0) that a new trace is sampled.
OTEL_METRICS_EXPORT_INTERVAL60sHow often accumulated metrics are flushed. Traces and logs are batched by the SDK's own defaults and have no equivalent knob.
OTEL_SERVICE_NAMEanalytics-enrichment-runnerservice.name resource attribute reported to telemetry backends.

Authentication​

Source: configuration reference.

VariableDefaultDescription
SECURITY_MODEnoneRequired if the service is exposed. oidc enforces authentication and role-based authorization; none permits every request. Must be exactly one of those two, lowercase.
SECURITY_REQUIRE_EMAILfalseReject a caller whose identity carries no resolvable email claim. A DIAL project key is exempt, being a service identity Core returns no email for. oidc only.
SECURITY_ROLES_MAPPING{"ConfigAdmin":["FULL_ADMIN"],"admin":["FULL_ADMIN"]}Default JSON mapping of provider role names to application roles (FULL_ADMIN / READ_ONLY_ADMIN), merged under each provider's own mapping. Also used for JWT-rooted API keys. A role with no entry is dropped. oidc only.
SECURITY_EMAIL_CLAIMunique_nameDefault claim to read the caller's email from when a provider sets none. oidc only.
SECURITY_USER_CLAIMoidDefault claim used as the authenticated principal name when a provider sets none. Note the name mismatch between variable and property. oidc only.

Identity provider properties​

These map entries have no fixed environment-variable names. See Provider configuration.

Source: configuration reference.

PropertyDefaultDescription
providers.<name>.issuer—Required for JWT providers. Expected iss claim (a URL), or a tenant id when aliases is set.
providers.<name>.jwk-set-uri—Required for JWT providers. JWKS endpoint for the provider's signing keys. With issuer, marks the provider as a JWT provider.
providers.<name>.user-info-endpoint—Required for opaque providers. OIDC userinfo endpoint introspected for opaque tokens. Marks the provider as an opaque provider.
providers.<name>.audiences—Required for JWT providers. Accepted aud values; an api://-prefixed variant of each is also accepted. Not applicable to opaque providers.
providers.<name>.role-claims—Required for deployment. Dotted claim paths to read provider role names from (roles, resource_access.roles). For opaque providers these read the userinfo response. A single fn:-prefixed entry selects a role converter instead.
providers.<name>.email-claims—Claim names to read the caller's email from, tried in order; falls back to SECURITY_EMAIL_CLAIM.
providers.<name>.principal-claim—Claim used as the principal name; falls back to SECURITY_USER_CLAIM.
providers.<name>.roles-mapping—JSON mapping of this provider's role names to application roles, merged over SECURITY_ROLES_MAPPING.
providers.<name>.aliases—Host aliases used to expand Azure v1/v2 issuer URLs from a tenant id in issuer. JWT providers.

Opaque token introspection​

Source: configuration reference.

VariableDefaultDescription
OPAQUE_TOKEN_CACHE_TTL_SECONDS60TTL for cached successful introspections, and the worst-case revocation window. 0 disables caching; must not be negative.
OPAQUE_TOKEN_CACHE_MAX_SIZE10000Maximum cached introspection entries. Must not be negative.
OPAQUE_TOKEN_REQUEST_TIMEOUT_MS3000Connect and read timeout for the userinfo call. Must be greater than zero—startup fails otherwise, because 0 means no timeout rather than the fastest one.

API-key authentication​

Source: configuration reference.

VariableDefaultDescription
API_KEY_ENABLEDfalseMaster switch. Only takes effect in oidc mode.
API_KEY_CORE_URL—Required if API_KEY_ENABLED is true. DIAL Core base URL, for example http://core:8080. Keys are introspected against <core-url>/v1/user/info.
API_KEY_ROLES_MAPPING—Required for project-key callers. JSON mapping of Core project-key role names to application roles, for example {"admin":["FULL_ADMIN"]}. There is no fallback: unset, a project key authenticates and is then refused 403. Startup fails only when neither this nor SECURITY_ROLES_MAPPING maps any role.
API_KEY_CACHE_TTL_SECONDS60TTL for cached successful introspections. Also bounds how long a key revoked in Core keeps working.
API_KEY_CACHE_MAX_SIZE10000Maximum cached introspection entries.
API_KEY_REQUEST_TIMEOUT_MS3000Connect and read timeout for the Core introspection call.
API_KEY_STARTUP_PROBEfalseProbe Core reachability at startup and fail fast if unreachable, catching a wrong API_KEY_CORE_URL at once. Off by default so an unreachable Core does not stop the runner starting; enable it only with generous startup-probe headroom, or a Core outage surfaces as a CrashLoopBackOff.

Provider configuration​

Providers are configured in an external YAML file through SPRING_CONFIG_ADDITIONAL_LOCATION. Every provider needs role claims. JWT providers also need an issuer, JWKS URL, and accepted audiences. Opaque providers use a userinfo endpoint. JWT-shaped tokens require a JWT provider; there is no opaque-token fallback.

providers:
keycloak:
issuer: https://<KEYCLOAK_HOST>/realms/dial
jwk-set-uri: https://<KEYCLOAK_HOST>/realms/dial/protocol/openid-connect/certs
audiences: [dial-admin-console]
role-claims: [roles]
email-claims: [email]
principal-claim: sub
roles-mapping: '{"admin":["FULL_ADMIN"]}'

The issuer and audience must match the access token presented by DIAL Admin. Provider mappings override matching entries in SECURITY_ROLES_MAPPING. Environment binding removes property-name dashes: PROVIDERS_KEYCLOAK_JWKSETURI, rather than PROVIDERS_KEYCLOAK_JWK_SET_URI.

fn:getGoogleWorkspaceGroups can replace the role-claim paths as a single entry, only on a provider with a user-info-endpoint; on any other provider, startup fails. It requires Cloud Identity API access, a resolvable email, and a token permitting group-membership reads. Only direct memberships on the first result page are read; nested groups do not grant access.

Credentials and endpoint exposure​

API_KEY_ENABLED applies only in oidc mode and still requires a configured identity provider. It validates inbound Api-Key headers against Core's /v1/user/info. Project keys use API_KEY_ROLES_MAPPING; JWT-rooted keys use the default role mapping and claim names. Only successful key introspections are cached. The cache TTL also bounds the revocation delay.

Health, info, and Prometheus endpoints remain unauthenticated, including full health details. OpenAPI and Swagger require the FULL_ADMIN authority in oidc mode unless DISABLE_SWAGGER_AUTHORIZATION=true.

Every /v1 endpoint requires FULL_ADMIN, including reads. READ_ONLY_ADMIN can be a mapping target but grants no access to the runner API. At least one usable identity provider is required. Every provider must have role claims, and JWT providers must also have accepted audiences.

Opaque-token and API-key cache misses each have a fixed concurrency limit of 16. Opaque-token overflow returns 401; API-key overflow returns 503. Only successful introspections are cached. Tokens are offered to each configured opaque provider, so those providers must trust each other.

Keep the runner's control plane internal. Backfills and dead-letter requeues (POST /v1/dlq/{id}/requeue, POST /v1/dlq/requeue, and POST /v1/pipelines/{name}/groups/{groupKey}/requeue) can trigger paid model calls. ADAS_API_KEY and DIAL_API_KEY authenticate outgoing requests; neither protects incoming requests.

Logging and telemetry behavior​

OTLP export is off by default. Per-signal switches override OTEL_EXPORT_ENABLED. Signal endpoint overrides take precedence over the base collector URL; Prometheus remains available independently. The log-level file supports runtime changes without a restart. A file that never existed leaves levels unchanged; removing an applied file reverts its loggers to their baseline. Mount its directory in Kubernetes, because subPath mounts do not receive updates. validTill sets an expiry in epoch milliseconds. Without it, a debug level persists until the file changes and logs a warning. This behavior comes from the log-level updater's missing-file handling and expiry handling.

HTTP-body and SQL-value loggers are pinned at INFO; the runtime file cannot lower their levels. The exact names are in log4j2-spring.xml.

{
"loggerLevels": {
"<LOGGER_NAME>": {
"defaultLevel": "INFO",
"configuredLevel": "DEBUG",
"validTill": 1799999999999
}
}
}

All three signals use one SDK resource. Boot's separate Micrometer OTLP exporter is disabled to avoid duplicate metrics.

Further reading​