From cc8d93289baff78f4a07c996efd1380bd6bb3542 Mon Sep 17 00:00:00 2001 From: Andrew Dryga Date: Tue, 18 Oct 2022 18:31:45 -0500 Subject: [PATCH] Do not override span_id with otel value by default This is done to prevent breaking of behavior for people that have both set and already rely for regular span_id to be logged to DD. --- lib/logger_json/formatters/datadog_logger.ex | 16 ++++++++-------- .../formatters/datadog_logger_test.exs | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/lib/logger_json/formatters/datadog_logger.ex b/lib/logger_json/formatters/datadog_logger.ex index 80a0550..00d6be4 100644 --- a/lib/logger_json/formatters/datadog_logger.ex +++ b/lib/logger_json/formatters/datadog_logger.ex @@ -72,14 +72,14 @@ defmodule LoggerJSON.Formatters.DatadogLogger do # To connect logs and traces, span_id and trace_id keys are respectively dd.span_id and dd.trace_id # https://docs.datadoghq.com/tracing/faq/why-cant-i-see-my-correlated-logs-in-the-trace-id-panel/?tab=jsonlogs defp convert_tracing_keys(output, md) do - fields = %{ - span_id: ["dd.span_id", & &1], - trace_id: ["dd.trace_id", & &1], - otel_span_id: ["dd.span_id", &convert_otel_field/1], - otel_trace_id: ["dd.trace_id", &convert_otel_field/1] - } - - Enum.reduce(fields, output, fn {key, [new_key, transformer]}, acc -> + # Notice: transformers can override each others but the last one in this list wins + [ + otel_span_id: {"dd.span_id", &convert_otel_field/1}, + otel_trace_id: {"dd.trace_id", &convert_otel_field/1}, + span_id: {"dd.span_id", & &1}, + trace_id: {"dd.trace_id", & &1} + ] + |> Enum.reduce(output, fn {key, {new_key, transformer}}, acc -> if Keyword.has_key?(md, key) do new_value = transformer.(Keyword.get(md, key)) Map.put(acc, new_key, new_value) diff --git a/test/unit/logger_json/formatters/datadog_logger_test.exs b/test/unit/logger_json/formatters/datadog_logger_test.exs index 689b964..a2ef055 100644 --- a/test/unit/logger_json/formatters/datadog_logger_test.exs +++ b/test/unit/logger_json/formatters/datadog_logger_test.exs @@ -224,6 +224,25 @@ defmodule LoggerJSONDatadogTest do assert Map.has_key?(log, "span_id") == false end + test "trace_id/span_id has greater priority than otel_trace_id/otel_span_id" do + Logger.configure_backend(LoggerJSON, metadata: :all) + + otel_id = + <<98, 56, 49, 48, 100, 98, 97, 50, 57, 56, 48, 51, 101, 101, 54, 49, 101, 55, 99, 55, 49, 102, 102, 48, 99, 50, + 99, 57, 53, 97, 57, 100>> + + Logger.metadata(otel_trace_id: otel_id, trace_id: "1", span_id: "2", otel_span_id: otel_id) + + log = + fn -> Logger.debug("hello") end + |> capture_log() + |> Jason.decode!() + + assert %{"dd.trace_id" => "1", "dd.span_id" => "2"} = log + assert Map.has_key?(log, "trace_id") == false + assert Map.has_key?(log, "span_id") == false + end + test "convert otel_trace_id/otel_span_id binary to expected datadog keys" do Logger.configure_backend(LoggerJSON, metadata: :all)