Skip to content

Commit dbcef1d

Browse files
authored
fix: move env mapping from ignore_missing_datadog_fields=true to false block (#724)
## Summary - Fixes environment mapping logic that created a false choice between env field mapping and service/operation name mapping - Moves OTEL deployment.environment → Datadog env field mapping to work alongside service/operation name mapping when DD_OTLP_CONFIG_IGNORE_MISSING_DATADOG_FIELDS=false (default) - Resolves issue where spans show env="none" despite correct OTEL resource attributes ## Background Previously, environment mapping from OTEL `deployment.environment` to Datadog `env` field only worked when `DD_OTLP_CONFIG_IGNORE_MISSING_DATADOG_FIELDS=true`, but service/operation name mapping only worked when this flag was false (default). This created a false choice where users had to choose between environment mapping OR service/operation name mapping. ## Changes - Moved environment mapping logic from the `config.otlp_config_ignore_missing_datadog_fields = true` block to the `= false` block in `bottlecap/src/otlp/transform.rs` - Now all OTEL semantic convention mappings work together when the flag is false (default behavior) ## Test Plan - [x] All existing tests pass (341 tests via cargo nextest) - [x] Clippy linting passes - [x] Code formatting verified Fixes #723
1 parent 1c53127 commit dbcef1d

1 file changed

Lines changed: 34 additions & 22 deletions

File tree

bottlecap/src/otlp/transform.rs

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,12 @@ use opentelemetry_proto::tonic::trace::v1::{
1313
Span as OtelSpan,
1414
};
1515
use opentelemetry_semantic_conventions::attribute::{
16-
DB_QUERY_TEXT, DB_STATEMENT, DB_SYSTEM_NAME, DEPLOYMENT_ENVIRONMENT, FAAS_INVOKED_NAME,
17-
FAAS_INVOKED_PROVIDER, FAAS_TRIGGER, GRAPHQL_OPERATION_NAME, GRAPHQL_OPERATION_TYPE,
18-
HTTP_ROUTE, HTTP_STATUS_CODE, MESSAGING_DESTINATION_NAME, MESSAGING_OPERATION,
19-
MESSAGING_SYSTEM, OTEL_LIBRARY_NAME, OTEL_LIBRARY_VERSION, OTEL_STATUS_CODE,
20-
OTEL_STATUS_DESCRIPTION, RPC_METHOD, RPC_SERVICE, RPC_SYSTEM,
16+
DB_QUERY_TEXT, DB_STATEMENT, DB_SYSTEM_NAME, DEPLOYMENT_ENVIRONMENT,
17+
DEPLOYMENT_ENVIRONMENT_NAME, FAAS_INVOKED_NAME, FAAS_INVOKED_PROVIDER, FAAS_TRIGGER,
18+
GRAPHQL_OPERATION_NAME, GRAPHQL_OPERATION_TYPE, HTTP_ROUTE, HTTP_STATUS_CODE,
19+
MESSAGING_DESTINATION_NAME, MESSAGING_OPERATION, MESSAGING_SYSTEM, OTEL_LIBRARY_NAME,
20+
OTEL_LIBRARY_VERSION, OTEL_STATUS_CODE, OTEL_STATUS_DESCRIPTION, RPC_METHOD, RPC_SERVICE,
21+
RPC_SYSTEM,
2122
};
2223
use opentelemetry_semantic_conventions::resource::{SERVICE_NAME, SERVICE_VERSION}; // CONTAINER_ID, SERVICE_VERSION, TELEMETRY_SDK_LANGUAGE, TELEMETRY_SDK_VERSION,
2324
use opentelemetry_semantic_conventions::trace::{
@@ -872,6 +873,29 @@ pub fn otel_span_to_dd_span(
872873
.metrics
873874
.insert("http.status_code".to_string(), f64::from(http_status_code));
874875
}
876+
877+
// Map OTEL deployment.environment to Datadog env field with fallback
878+
if !dd_span.meta.contains_key("env") {
879+
// Try new standard first: deployment.environment.name
880+
let mut env = get_otel_attribute_value_as_string(
881+
&otel_res.attributes,
882+
DEPLOYMENT_ENVIRONMENT_NAME,
883+
true,
884+
);
885+
886+
// Fallback to deprecated deployment.environment if new standard not found
887+
if env.is_empty() {
888+
env = get_otel_attribute_value_as_string(
889+
&otel_res.attributes,
890+
DEPLOYMENT_ENVIRONMENT,
891+
true,
892+
);
893+
}
894+
895+
if !env.is_empty() {
896+
dd_span.meta.insert("env".to_string(), env);
897+
}
898+
}
875899
}
876900

877901
let top_level_by_kind = config
@@ -1014,24 +1038,12 @@ pub fn otel_span_to_dd_span(
10141038
.insert(OTEL_STATUS_DESCRIPTION.to_string(), status.message.clone());
10151039
}
10161040

1017-
if config.otlp_config_ignore_missing_datadog_fields {
1018-
if !dd_span.meta.contains_key("error.msg")
1041+
if config.otlp_config_ignore_missing_datadog_fields
1042+
&& (!dd_span.meta.contains_key("error.msg")
10191043
|| !dd_span.meta.contains_key("error.type")
1020-
|| !dd_span.meta.contains_key("error.stack")
1021-
{
1022-
set_span_error_from_otel_span(&mut dd_span, otel_span);
1023-
}
1024-
1025-
if !dd_span.meta.contains_key("env") {
1026-
let env = get_otel_attribute_value_as_string(
1027-
&otel_res.attributes,
1028-
DEPLOYMENT_ENVIRONMENT,
1029-
true,
1030-
);
1031-
if !env.is_empty() {
1032-
dd_span.meta.insert("env".to_string(), env);
1033-
}
1034-
}
1044+
|| !dd_span.meta.contains_key("error.stack"))
1045+
{
1046+
set_span_error_from_otel_span(&mut dd_span, otel_span);
10351047
}
10361048

10371049
dd_span

0 commit comments

Comments
 (0)