Class: Datadog::Runtime::Metrics

Inherits:
Metrics
  • Object
show all
Defined in:
lib/ddtrace/runtime/metrics.rb

Overview

For generating runtime metrics

Constant Summary

Constants included from Metrics::Options

Metrics::Options::DEFAULT

Instance Attribute Summary

Attributes inherited from Metrics

#statsd

Instance Method Summary collapse

Methods inherited from Metrics

#close, #configure, #count, #default_hostname, #default_port, #default_statsd_client, #distribution, #enabled=, #enabled?, #gauge, #increment, #send_metrics, #send_stats?, #supported?, #time

Methods included from Metrics::Options

#metric_options

Constructor Details

#initialize(**options) ⇒ Metrics

Returns a new instance of Metrics.



15
16
17
18
19
20
21
22
# File 'lib/ddtrace/runtime/metrics.rb', line 15

def initialize(**options)
  super

  # Initialize service list
  @services = Set.new(options.fetch(:services, []))
  @service_tags = nil
  compile_service_tags!
end

Instance Method Details

#associate_with_span(span) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/ddtrace/runtime/metrics.rb', line 24

def associate_with_span(span)
  return if !enabled? || span.nil?

  # Register service as associated with metrics
  register_service(span.service) unless span.service.nil?

  # Tag span with language and runtime ID for association with metrics.
  # We only tag spans that performed internal application work.
  unless span.get_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE)
    span.set_tag(Ext::Runtime::TAG_LANG, Core::Environment::Identity.lang)
  end
end

#default_metric_optionsObject



81
82
83
84
85
86
87
88
89
90
# File 'lib/ddtrace/runtime/metrics.rb', line 81

def default_metric_options
  # Return dupes, so that the constant isn't modified,
  # and defaults are unfrozen for mutation in Statsd.
  super.tap do |options|
    options[:tags] = options[:tags].dup

    # Add services dynamically because they might change during runtime.
    options[:tags].concat(service_tags) unless service_tags.nil?
  end
end

#flushObject

Flush all runtime metrics to Statsd client



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/ddtrace/runtime/metrics.rb', line 53

def flush
  return unless enabled?

  try_flush do
    if Core::Environment::ClassCount.available?
      gauge(Ext::Runtime::Metrics::METRIC_CLASS_COUNT, Core::Environment::ClassCount.value)
    end
  end
  try_flush do
    if Core::Environment::ThreadCount.available?
      gauge(Ext::Runtime::Metrics::METRIC_THREAD_COUNT, Core::Environment::ThreadCount.value)
    end
  end
  try_flush { gc_metrics.each { |metric, value| gauge(metric, value) } if Core::Environment::GC.available? }
end

#gc_metricsObject



69
70
71
72
73
# File 'lib/ddtrace/runtime/metrics.rb', line 69

def gc_metrics
  Core::Environment::GC.stat.flat_map do |k, v|
    nested_gc_metric(Ext::Runtime::Metrics::METRIC_GC_PREFIX, k, v)
  end.to_h
end

#register_service(service) ⇒ Object

Associate service with runtime metrics



38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/ddtrace/runtime/metrics.rb', line 38

def register_service(service)
  return if !enabled? || service.nil?

  service = service.to_s

  unless @services.include?(service)
    # Add service to list and update services tag
    services << service

    # Recompile the service tags
    compile_service_tags!
  end
end

#try_flushObject



75
76
77
78
79
# File 'lib/ddtrace/runtime/metrics.rb', line 75

def try_flush
  yield
rescue StandardError => e
  Datadog.logger.error("Error while sending runtime metric. Cause: #{e.message}")
end