diff --git a/lib/datadog/core/telemetry/request.rb b/lib/datadog/core/telemetry/request.rb index 213831e02d7..a093a90d4fe 100644 --- a/lib/datadog/core/telemetry/request.rb +++ b/lib/datadog/core/telemetry/request.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require_relative '../environment/platform' +require_relative '../environment/process' require_relative '../utils/hash' module Datadog @@ -43,7 +44,7 @@ def application tracer_version = "#{tracer_version}-ci-#{::Datadog::CI::VERSION::STRING}" end - { + app = { env: config.env, language_name: Core::Environment::Ext::LANG, language_version: Core::Environment::Ext::LANG_VERSION, @@ -53,6 +54,10 @@ def application service_version: config.version, tracer_version: tracer_version } + + tag_process_tags!(app, config) + + app end def host @@ -64,6 +69,15 @@ def host kernel_version: Core::Environment::Platform.kernel_version } end + + def tag_process_tags!(app, config) + return unless config.experimental_propagate_process_tags_enabled + + process_tags = Core::Environment::Process.serialized + return if process_tags.empty? + + app[:process_tags] = process_tags + end end end end diff --git a/sig/datadog/core/configuration/settings.rbs b/sig/datadog/core/configuration/settings.rbs index 573d8ee3feb..f320a5189cf 100644 --- a/sig/datadog/core/configuration/settings.rbs +++ b/sig/datadog/core/configuration/settings.rbs @@ -132,6 +132,10 @@ module Datadog def tags: -> ::Hash[::String, ::String] + def experimental_propagate_process_tags_enabled: () -> bool + + def experimental_propagate_process_tags_enabled=: (bool value) -> bool + def logger=: (untyped logger) -> untyped def runtime_metrics: (?untyped? options) -> untyped diff --git a/sig/datadog/core/telemetry/request.rbs b/sig/datadog/core/telemetry/request.rbs index 3828e1e4515..b6575625e32 100644 --- a/sig/datadog/core/telemetry/request.rbs +++ b/sig/datadog/core/telemetry/request.rbs @@ -8,6 +8,7 @@ module Datadog def self.application: -> ::Hash[Symbol, untyped] def self.host: -> ::Hash[Symbol, untyped] + def self.tag_process_tags!: (Hash[Symbol, untyped] app, Core::Configuration::Settings config) -> void end end end diff --git a/spec/datadog/core/telemetry/integration/telemetry_spec.rb b/spec/datadog/core/telemetry/integration/telemetry_spec.rb index fdc640605fe..dc279efdecd 100644 --- a/spec/datadog/core/telemetry/integration/telemetry_spec.rb +++ b/spec/datadog/core/telemetry/integration/telemetry_spec.rb @@ -296,6 +296,59 @@ ) end end + + describe 'process tags' do + include_context 'disable profiling' + + before do + settings.telemetry.dependency_collection = true + end + + context 'when process tags propagation is enabled' do + let(:expected_application_hash) do + super().merge('process_tags' => String) + end + + it 'includes process tags in the payload when the process tags have values' do + allow(Datadog.configuration).to receive(:experimental_propagate_process_tags_enabled).and_return(true) + + component.start(false, components: Datadog.send(:components)) + component.flush + expect(sent_payloads.length).to eq 2 + + payload = sent_payloads[0] + expect(payload.fetch(:payload)).to match( + 'api_version' => 'v2', + 'application' => expected_application_hash, + 'debug' => false, + 'host' => expected_host_hash, + 'payload' => Hash, + 'request_type' => 'app-started', + 'runtime_id' => String, + 'seq_id' => Integer, + 'tracer_time' => Integer, + ) + + expect(payload.dig(:payload, 'application', 'process_tags')).to include('entrypoint.workdir') + expect(payload.dig(:payload, 'application', 'process_tags')).to include('entrypoint.basedir') + expect(payload.dig(:payload, 'application', 'process_tags')).to include('entrypoint.type') + expect(payload.dig(:payload, 'application', 'process_tags')).to include('entrypoint.name') + end + end + + context 'when process tags propagation is disabled' do + it 'does not include process_tags in the payload' do + allow(Datadog.configuration).to receive(:experimental_propagate_process_tags_enabled).and_return(false) + + component.start(false, components: Datadog.send(:components)) + component.flush + expect(sent_payloads.length).to eq 2 + + payload = sent_payloads[0] + expect(payload.dig(:payload, 'application')).not_to have_key('process_tags') + end + end + end end let(:handler_proc) do diff --git a/spec/datadog/core/telemetry/request_spec.rb b/spec/datadog/core/telemetry/request_spec.rb index 3da9dacce31..57609b20ba7 100644 --- a/spec/datadog/core/telemetry/request_spec.rb +++ b/spec/datadog/core/telemetry/request_spec.rb @@ -85,7 +85,8 @@ ci: double('ci', enabled: true), env: env, service: service_name, - version: service_version + version: service_version, + experimental_propagate_process_tags_enabled: false ) ) end