class Datadog::Diagnostics::EnvironmentCollector

Collects environment information for diagnostic logging

Public Instance Methods

agent_error(transport_responses) click to toggle source

Error returned by Datadog agent during a tracer flush attempt @return [String] concatenated list of transport errors

# File lib/ddtrace/diagnostics/environment_logger.rb, line 116
def agent_error(transport_responses)
  error_responses = transport_responses.reject(&:ok?)

  return nil if error_responses.empty?

  error_responses.map(&:inspect).join(','.freeze)
end
agent_url() click to toggle source

@return [String] target agent URL for trace flushing

# File lib/ddtrace/diagnostics/environment_logger.rb, line 107
def agent_url
  # Retrieve the effect agent URL, regardless of how it was configured
  transport = Datadog.tracer.writer.transport
  adapter = transport.client.api.adapter
  adapter.url
end
analytics_enabled() click to toggle source

@return [Boolean, nil] analytics enabled in configuration

# File lib/ddtrace/diagnostics/environment_logger.rb, line 130
def analytics_enabled
  !!Datadog.configuration.analytics.enabled
end
collect!(transport_responses) click to toggle source

@return [Hash] environment information available at call time

# File lib/ddtrace/diagnostics/environment_logger.rb, line 225
def collect!(transport_responses)
  {
    date: date,
    os_name: os_name,
    version: version,
    lang: lang,
    lang_version: lang_version,
    env: env,
    enabled: enabled,
    service: service,
    dd_version: dd_version,
    agent_url: agent_url,
    agent_error: agent_error(transport_responses),
    debug: debug,
    analytics_enabled: analytics_enabled,
    sample_rate: sample_rate,
    sampling_rules: sampling_rules,
    tags: tags,
    runtime_metrics_enabled: runtime_metrics_enabled,
    integrations_loaded: integrations_loaded,
    vm: vm,
    partial_flushing_enabled: partial_flushing_enabled,
    priority_sampling_enabled: priority_sampling_enabled,
    health_metrics_enabled: health_metrics_enabled,
    **instrumented_integrations_settings
  }
end
date() click to toggle source

@return [String] current time in ISO8601 format

# File lib/ddtrace/diagnostics/environment_logger.rb, line 59
def date
  DateTime.now.iso8601
end
dd_version() click to toggle source

@return [String] configured application version

# File lib/ddtrace/diagnostics/environment_logger.rb, line 102
def dd_version
  Datadog.configuration.version
end
debug() click to toggle source

@return [Boolean, nil] debug mode enabled in configuration

# File lib/ddtrace/diagnostics/environment_logger.rb, line 125
def debug
  !!Datadog.configuration.diagnostics.debug
end
enabled() click to toggle source

@return [Boolean, nil]

# File lib/ddtrace/diagnostics/environment_logger.rb, line 92
def enabled
  Datadog.configuration.tracer.enabled
end
env() click to toggle source

@return [String] configured application environment

# File lib/ddtrace/diagnostics/environment_logger.rb, line 87
def env
  Datadog.configuration.env
end
health_metrics_enabled() click to toggle source

@return [Boolean, nil] health metrics enabled in configuration

# File lib/ddtrace/diagnostics/environment_logger.rb, line 212
def health_metrics_enabled
  !!Datadog.configuration.diagnostics.health_metrics.enabled
end
integrations_loaded() click to toggle source

Concatenated list of integrations activated, with their gem version. Example: “rails@6.0.3,rack@2.2.3”

@return [String, nil]

# File lib/ddtrace/diagnostics/environment_logger.rb, line 180
def integrations_loaded
  integrations = instrumented_integrations
  return if integrations.empty?

  integrations.map { |name, integration| "#{name}@#{integration.class.version}" }.join(','.freeze)
end
lang() click to toggle source

@return [String] “ruby”

# File lib/ddtrace/diagnostics/environment_logger.rb, line 75
def lang
  Ext::Runtime::LANG
end
lang_version() click to toggle source

Supported Ruby language version. Will be distinct from VM version for non-MRI environments. @return [String]

# File lib/ddtrace/diagnostics/environment_logger.rb, line 82
def lang_version
  Ext::Runtime::LANG_VERSION
end
os_name() click to toggle source

Best portable guess of OS information. @return [String] platform string

# File lib/ddtrace/diagnostics/environment_logger.rb, line 65
def os_name
  RbConfig::CONFIG['host'.freeze]
end
partial_flushing_enabled() click to toggle source

@return [Boolean, nil] partial flushing enabled in configuration

# File lib/ddtrace/diagnostics/environment_logger.rb, line 202
def partial_flushing_enabled
  !!Datadog.configuration.tracer.partial_flush.enabled
end
priority_sampling_enabled() click to toggle source

@return [Boolean, nil] priority sampling enabled in configuration

# File lib/ddtrace/diagnostics/environment_logger.rb, line 207
def priority_sampling_enabled
  !!Datadog.configuration.tracer.priority_sampling
end
runtime_metrics_enabled() click to toggle source

@return [Boolean, nil] runtime metrics enabled in configuration

# File lib/ddtrace/diagnostics/environment_logger.rb, line 172
def runtime_metrics_enabled
  Datadog.configuration.runtime_metrics.enabled
end
sample_rate() click to toggle source

@return [Numeric, nil] tracer sample rate configured

# File lib/ddtrace/diagnostics/environment_logger.rb, line 135
def sample_rate
  sampler = Datadog.configuration.tracer.sampler
  return nil unless sampler

  sampler.sample_rate(nil) rescue nil
end
sampling_rules() click to toggle source

DEV: We currently only support SimpleRule instances. DEV: These are the most commonly used rules. DEV: We should expand support for other rules in the future, DEV: although it is tricky to serialize arbitrary rules.

@return [Hash, nil] sample rules configured

# File lib/ddtrace/diagnostics/environment_logger.rb, line 148
def sampling_rules
  sampler = Datadog.configuration.tracer.sampler
  return nil unless sampler.is_a?(Datadog::PrioritySampler) &&
                    sampler.priority_sampler.is_a?(Datadog::Sampling::RuleSampler)

  sampler.priority_sampler.rules.map do |rule|
    next unless rule.is_a?(Datadog::Sampling::SimpleRule)

    {
      name: rule.matcher.name,
      service: rule.matcher.service,
      sample_rate: rule.sampler.sample_rate(nil)
    }
  end.compact
end
service() click to toggle source

@return [String] configured application service name

# File lib/ddtrace/diagnostics/environment_logger.rb, line 97
def service
  Datadog.configuration.service
end
tags() click to toggle source

@return [Hash, nil] concatenated list of global tracer tags configured

# File lib/ddtrace/diagnostics/environment_logger.rb, line 165
def tags
  tags = Datadog.configuration.tags
  return nil if tags.empty?
  hash_serializer(tags)
end
version() click to toggle source

@return [String] ddtrace version

# File lib/ddtrace/diagnostics/environment_logger.rb, line 70
def version
  VERSION::STRING
end
vm() click to toggle source

Ruby VM name and version. Examples: “ruby-2.7.1”, “jruby-9.2.11.1”, “truffleruby-20.1.0” @return [String, nil]

# File lib/ddtrace/diagnostics/environment_logger.rb, line 190
def vm
  # RUBY_ENGINE_VERSION returns the VM version, which
  # will differ from RUBY_VERSION for non-mri VMs.
  if defined?(RUBY_ENGINE_VERSION)
    "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}"
  else
    # Ruby < 2.3 doesn't support RUBY_ENGINE_VERSION
    "#{RUBY_ENGINE}-#{RUBY_VERSION}"
  end
end

Private Instance Methods

hash_serializer(h) click to toggle source

Outputs “k1:v1,k2:v2,…”

# File lib/ddtrace/diagnostics/environment_logger.rb, line 273
def hash_serializer(h)
  h.map { |k, v| "#{k}:#{v}" }.join(','.freeze)
end
instrumented_integrations() click to toggle source
# File lib/ddtrace/diagnostics/environment_logger.rb, line 255
def instrumented_integrations
  Datadog.configuration.instrumented_integrations
end
instrumented_integrations_settings() click to toggle source

Capture all active integration settings into “integrationName_settingName: value” entries.

# File lib/ddtrace/diagnostics/environment_logger.rb, line 260
def instrumented_integrations_settings
  Hash[instrumented_integrations.flat_map do |name, integration|
    integration.configuration.to_h.flat_map do |setting, value|
      next [] if setting == :tracer # Skip internal Ruby objects

      # Convert value to a string to avoid custom #to_json
      # handlers possibly causing errors.
      [[:"integration_#{name}_#{setting}", value.to_s]]
    end
  end]
end