Module: Datadog::Core::Environment::Identity

Extended by:
Utils::Forking
Defined in:
lib/datadog/core/environment/identity.rb

Overview

For runtime identity

Constant Summary collapse

ENV_ROOT_SESSION_ID =
"_DD_ROOT_RB_SESSION_ID"
ENV_PARENT_SESSION_ID =
"_DD_PARENT_RB_SESSION_ID"

Class Method Summary collapse

Methods included from Utils::Forking

after_fork!, extended, fork_pid, forked?, included, update_fork_pid!

Class Method Details

.gem_datadog_versionObject

Returns datadog gem version, rubygems-style



75
76
77
# File 'lib/datadog/core/environment/identity.rb', line 75

def gem_datadog_version
  Core::Environment::Ext::GEM_DATADOG_VERSION
end

.gem_datadog_version_semver2Object

Returns the tracer version in SemVer-2 form (https://semver.org/spec/v2.0.0.html).

Converts the RubyGems-style version returned by gem_datadog_version (dot-separated prerelease/build segments, e.g. "2.34.0.dev") into the SemVer-2 form expected by cross-language Datadog consumers (hyphen-separated prerelease, "+" build metadata, e.g. "2.34.0-dev").

Called by reporters that emit a tracer version on the wire and must match the format used by other-language tracers:

  • process discovery memfd (Core::ProcessDiscovery.get_metadatatracer_version)
  • telemetry payloads (Core::Telemetry::Request#application)
  • remote configuration client identification (Core::Remote::Client#tracer_version)

Use gem_datadog_version (not this method) when a RubyGems-style string is required (e.g. gem-internal contexts, gemspec interop).



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/datadog/core/environment/identity.rb', line 94

def gem_datadog_version_semver2
  major, minor, patch, rest = gem_datadog_version.split(".", 4)

  semver = "#{major}.#{minor}.#{patch}"

  return semver unless rest

  pre = ""
  build = ""

  rest.split(".").tap do |segments|
    if segments.length >= 4
      pre = "-#{segments.shift}"
      build = "+#{segments.join(".")}"
    elsif segments.length == 1
      pre = "-#{segments.shift}"
    else
      build = "+#{segments.join(".")}"
    end
  end

  semver + pre + build
end

.idObject



25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/datadog/core/environment/identity.rb', line 25

def id
  @id ||= ::SecureRandom.uuid.freeze

  after_fork! do
    # Order matters: capture @id before overwriting
    @parent_runtime_id = @id
    @root_runtime_id ||= @id
    @id = ::SecureRandom.uuid.freeze
  end

  @id
end

.langObject



54
55
56
# File 'lib/datadog/core/environment/identity.rb', line 54

def lang
  Core::Environment::Ext::LANG
end

.lang_engineObject



58
59
60
# File 'lib/datadog/core/environment/identity.rb', line 58

def lang_engine
  Core::Environment::Ext::LANG_ENGINE
end

.lang_interpreterObject



62
63
64
# File 'lib/datadog/core/environment/identity.rb', line 62

def lang_interpreter
  Core::Environment::Ext::LANG_INTERPRETER
end

.lang_platformObject



66
67
68
# File 'lib/datadog/core/environment/identity.rb', line 66

def lang_platform
  Core::Environment::Ext::LANG_PLATFORM
end

.lang_versionObject



70
71
72
# File 'lib/datadog/core/environment/identity.rb', line 70

def lang_version
  Core::Environment::Ext::LANG_VERSION
end

.parent_runtime_idObject



42
43
44
# File 'lib/datadog/core/environment/identity.rb', line 42

def parent_runtime_id
  @parent_runtime_id
end

.pidObject



50
51
52
# File 'lib/datadog/core/environment/identity.rb', line 50

def pid
  ::Process.pid
end

.root_runtime_idObject



38
39
40
# File 'lib/datadog/core/environment/identity.rb', line 38

def root_runtime_id
  @root_runtime_id
end

.runtime_propagation_envsObject



46
47
48
# File 'lib/datadog/core/environment/identity.rb', line 46

def runtime_propagation_envs
  {ENV_ROOT_SESSION_ID => root_runtime_id || id, ENV_PARENT_SESSION_ID => id}.freeze
end