From 37abd0fa4a2b07d6758b94c7139cb9a310a86f21 Mon Sep 17 00:00:00 2001 From: wan <26727996+wantsui@users.noreply.github.com> Date: Tue, 9 Dec 2025 16:56:35 -0500 Subject: [PATCH] Add process tags to dynamic instrumentation. --- lib/datadog/di/probe_notification_builder.rb | 15 +++++++- sig/datadog/di/probe_notification_builder.rbs | 2 ++ .../di/probe_notification_builder_spec.rb | 36 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/lib/datadog/di/probe_notification_builder.rb b/lib/datadog/di/probe_notification_builder.rb index 3c6ac7981af..579d5c22db6 100644 --- a/lib/datadog/di/probe_notification_builder.rb +++ b/lib/datadog/di/probe_notification_builder.rb @@ -134,7 +134,7 @@ def build_snapshot_base(context, evaluation_errors: [], captures: nil, message: format_caller_locations(caller_locations) end - { + payload = { service: settings.service, debugger: { type: 'snapshot', @@ -189,6 +189,10 @@ def build_snapshot_base(context, evaluation_errors: [], captures: nil, message: message: message, timestamp: timestamp, } + + tag_process_tags!(payload, settings) + + payload end def build_status(probe, message:, status:) @@ -236,6 +240,15 @@ def evaluate_template(template_segments, context) [message, evaluation_errors] end + def tag_process_tags!(payload, settings) + return unless settings.experimental_propagate_process_tags_enabled + + process_tags = Core::Environment::Process.serialized + return if process_tags.empty? + + payload[:process_tags] = process_tags + end + def timestamp_now (Core::Utils::Time.now.to_f * MILLISECONDS).to_i end diff --git a/sig/datadog/di/probe_notification_builder.rbs b/sig/datadog/di/probe_notification_builder.rbs index 30ec3871bcd..9c88b0339cb 100644 --- a/sig/datadog/di/probe_notification_builder.rbs +++ b/sig/datadog/di/probe_notification_builder.rbs @@ -32,6 +32,8 @@ module Datadog def evaluate_template: (untyped template, Context context) -> [String, Array[String]] + def tag_process_tags!: (Hash[Symbol | String, untyped] payload, Core::Configuration::Settings settings) -> void + def timestamp_now: () -> Integer def get_local_variables: (TracePoint trace_point) -> Hash[Symbol,untyped] diff --git a/spec/datadog/di/probe_notification_builder_spec.rb b/spec/datadog/di/probe_notification_builder_spec.rb index 509045ff5c3..7271383fa6b 100644 --- a/spec/datadog/di/probe_notification_builder_spec.rb +++ b/spec/datadog/di/probe_notification_builder_spec.rb @@ -20,6 +20,7 @@ allow(settings).to receive(:env).and_return('test env') allow(settings).to receive(:version).and_return('test version') allow(settings).to receive(:tags).and_return({}) + allow(settings).to receive(:experimental_propagate_process_tags_enabled).and_return(false) end end @@ -384,4 +385,39 @@ end end end + + describe 'process tags' do + let(:probe) do + Datadog::DI::Probe.new(id: '123', type: :log, file: 'X', line_no: 1) + end + + let(:context) do + Datadog::DI::Context.new( + settings: settings, serializer: serializer, + probe: probe + ) + end + + context 'when process tags propagation is enabled' do + before do + allow(settings).to receive(:experimental_propagate_process_tags_enabled).and_return(true) + end + + it 'includes process tags in the payload' do + payload = builder.build_executed(context) + expect(payload[:process_tags]).to eq(Datadog::Core::Environment::Process.serialized) + expect(payload[:process_tags]).to include('entrypoint.workdir') + expect(payload[:process_tags]).to include('entrypoint.name') + expect(payload[:process_tags]).to include('entrypoint.basedir') + expect(payload[:process_tags]).to include('entrypoint.type') + end + end + + context 'when process tags propagation is not enabled' do + it 'excludes process tags in the payload' do + payload = builder.build_executed(context) + expect(payload).not_to include(:process_tags) + end + end + end end