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

#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.



13
14
15
16
17
18
19
# File 'lib/ddtrace/runtime/metrics.rb', line 13

def initialize(options = {})
  super

  # Initialize service list
  @services = Set.new
  @service_tags = nil
end

Instance Method Details

#associate_with_span(span) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/ddtrace/runtime/metrics.rb', line 21

def associate_with_span(span)
  return if 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
  span.set_tag(Ext::Runtime::TAG_LANG, Runtime::Identity.lang)
end

#default_metric_optionsObject



69
70
71
72
73
74
75
76
77
78
# File 'lib/ddtrace/runtime/metrics.rb', line 69

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



47
48
49
50
51
52
53
# File 'lib/ddtrace/runtime/metrics.rb', line 47

def flush
  return unless enabled?

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

#gc_metricsObject



55
56
57
58
59
60
61
# File 'lib/ddtrace/runtime/metrics.rb', line 55

def gc_metrics
  Hash[
    GC.stat.map do |k, v|
      ["#{Ext::Runtime::Metrics::METRIC_GC_PREFIX}.#{k}", v]
    end
  ]
end

#register_service(service) ⇒ Object

Associate service with runtime metrics



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/ddtrace/runtime/metrics.rb', line 32

def register_service(service)
  return if 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



63
64
65
66
67
# File 'lib/ddtrace/runtime/metrics.rb', line 63

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