Class: Datadog::Core::Telemetry::Component Private
- Inherits:
-
Object
- Object
- Datadog::Core::Telemetry::Component
- Includes:
- Logging, Utils::Forking
- Defined in:
- lib/datadog/core/telemetry/component.rb
Overview
This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.
Telemetry entry point, coordinates sending telemetry events at various points in application lifecycle.
Constant Summary collapse
- ENDPOINT_COLLECTION_MESSAGE_LIMIT =
This constant is part of a private API. You should avoid using this constant if possible, as it may be removed or be changed in the future.
300
Instance Attribute Summary collapse
- #agent_settings ⇒ Object readonly private
- #enabled ⇒ Object (also: #enabled?) readonly private
- #logger ⇒ Object readonly private
- #metrics_manager ⇒ Object readonly private
- #settings ⇒ Object readonly private
- #transport ⇒ Object readonly private
- #worker ⇒ Object readonly private
Class Method Summary collapse
Instance Method Summary collapse
-
#after_fork ⇒ Object
private
When a fork happens, we generally need to do two things inside the child proess: 1.
-
#app_endpoints_loaded(endpoints, page_size: ENDPOINT_COLLECTION_MESSAGE_LIMIT) ⇒ Object
private
Report application endpoints.
-
#client_configuration_change!(changes) ⇒ Object
private
Report configuration changes caused by Remote Configuration.
-
#dec(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
private
Decremenets a count metric.
- #disable! ⇒ Object private
-
#distribution(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
private
Tracks distribution metric.
- #emit_closing! ⇒ Object private
-
#flush(timeout: nil) ⇒ Object
private
Wait for the worker to send out all events that have already been queued, up to 15 seconds.
-
#gauge(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
private
Tracks gauge metric.
-
#inc(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
private
Increments a count metric.
-
#initialize(settings:, agent_settings:, logger:, enabled:) ⇒ Component
constructor
private
A new instance of Component.
- #integrations_change! ⇒ Object private
- #log!(event) ⇒ Object private
-
#rate(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
private
Tracks rate metric.
- #shutdown! ⇒ Object private
- #start(initial_event_is_change = false, components:) ⇒ Object private
Methods included from Logging
Methods included from Utils::Forking
#after_fork!, extended, #fork_pid, #forked?, included, #update_fork_pid!
Constructor Details
#initialize(settings:, agent_settings:, logger:, enabled:) ⇒ Component
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Returns a new instance of Component.
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
# File 'lib/datadog/core/telemetry/component.rb', line 57 def initialize( # standard:disable Metrics/MethodLength settings:, agent_settings:, logger:, enabled: ) @enabled = enabled @log_collection_enabled = settings.telemetry.log_collection_enabled @logger = logger @metrics_manager = MetricsManager.new( enabled: @enabled && settings.telemetry.metrics_enabled, aggregation_interval: settings.telemetry.metrics_aggregation_interval_seconds, ) @stopped = false return unless @enabled @transport = if settings.telemetry.agentless_enabled # We don't touch the `agent_settings` since we still want the telemetry payloads to refer to the original # settings, even though the telemetry itself may be using a different path. telemetry_specific_agent_settings = Core::Configuration::AgentlessSettingsResolver.call( settings, host_prefix: "instrumentation-telemetry-intake", url_override: settings.telemetry.agentless_url_override, url_override_source: "c.telemetry.agentless_url_override", logger: logger, ) Telemetry::Transport::HTTP.agentless_telemetry( agent_settings: telemetry_specific_agent_settings, logger: logger, # api_key should have already validated to be # not nil by +build+ method above. api_key: settings.api_key, ) else Telemetry::Transport::HTTP.agent_telemetry( agent_settings: agent_settings, logger: logger, ) end @worker = Telemetry::Worker.new( enabled: @enabled, heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds, extended_heartbeat_interval_seconds: settings.telemetry.extended_heartbeat_interval_seconds, metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds, emitter: Emitter.new( @transport, logger: @logger, debug: settings.telemetry.debug, ), metrics_manager: @metrics_manager, dependency_collection: settings.telemetry.dependency_collection, logger: logger, settings: settings, agent_settings: agent_settings, shutdown_timeout: settings.telemetry.shutdown_timeout_seconds, ) @agent_settings = agent_settings end |
Instance Attribute Details
#agent_settings ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
29 30 31 |
# File 'lib/datadog/core/telemetry/component.rb', line 29 def agent_settings @agent_settings end |
#enabled ⇒ Object (readonly) Also known as: enabled?
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
24 25 26 |
# File 'lib/datadog/core/telemetry/component.rb', line 24 def enabled @enabled end |
#logger ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
25 26 27 |
# File 'lib/datadog/core/telemetry/component.rb', line 25 def logger @logger end |
#metrics_manager ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
30 31 32 |
# File 'lib/datadog/core/telemetry/component.rb', line 30 def metrics_manager @metrics_manager end |
#settings ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
28 29 30 |
# File 'lib/datadog/core/telemetry/component.rb', line 28 def settings @settings end |
#transport ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
26 27 28 |
# File 'lib/datadog/core/telemetry/component.rb', line 26 def transport @transport end |
#worker ⇒ Object (readonly)
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
27 28 29 |
# File 'lib/datadog/core/telemetry/component.rb', line 27 def worker @worker end |
Class Method Details
.build(settings, agent_settings, logger) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/datadog/core/telemetry/component.rb', line 39 def self.build(settings, agent_settings, logger) enabled = settings.telemetry.enabled agentless_enabled = settings.telemetry.agentless_enabled if agentless_enabled && settings.api_key.nil? enabled = false logger.debug { "Telemetry disabled. Agentless telemetry requires a DD_API_KEY variable to be set." } end Telemetry::Component.new( settings: settings, agent_settings: agent_settings, enabled: enabled, logger: logger, ) end |
Instance Method Details
#after_fork ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
When a fork happens, we generally need to do two things inside the child proess:
- Restart the worker.
- Discard any events and metrics that were submitted in the parent process (because they will be sent out in the parent process, sending them in the child would cause duplicate submission).
228 229 230 231 232 233 234 235 |
# File 'lib/datadog/core/telemetry/component.rb', line 228 def after_fork # We cannot simply create a new instance of metrics manager because # it is referenced from other objects (e.g. the worker). # We must reset the existing instance. @metrics_manager.clear worker&.send(:after_fork_monkey_patched) end |
#app_endpoints_loaded(endpoints, page_size: ENDPOINT_COLLECTION_MESSAGE_LIMIT) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Report application endpoints
188 189 190 191 192 193 194 |
# File 'lib/datadog/core/telemetry/component.rb', line 188 def app_endpoints_loaded(endpoints, page_size: ENDPOINT_COLLECTION_MESSAGE_LIMIT) return unless enabled? endpoints.each_slice(page_size).with_index do |endpoints_slice, i| @worker.enqueue(Event::AppEndpointsLoaded.new(endpoints_slice, is_first: i.zero?)) end end |
#client_configuration_change!(changes) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Report configuration changes caused by Remote Configuration.
181 182 183 184 185 |
# File 'lib/datadog/core/telemetry/component.rb', line 181 def client_configuration_change!(changes) return unless enabled? @worker.enqueue(Event::AppClientConfigurationChange.new(changes, "remote_config")) end |
#dec(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Decremenets a count metric.
202 203 204 |
# File 'lib/datadog/core/telemetry/component.rb', line 202 def dec(namespace, metric_name, value, tags: {}, common: true) @metrics_manager.dec(namespace, metric_name, value, tags: , common: common) end |
#disable! ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
120 121 122 123 |
# File 'lib/datadog/core/telemetry/component.rb', line 120 def disable! @enabled = false @worker&.enabled = false end |
#distribution(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Tracks distribution metric.
217 218 219 |
# File 'lib/datadog/core/telemetry/component.rb', line 217 def distribution(namespace, metric_name, value, tags: {}, common: true) @metrics_manager.distribution(namespace, metric_name, value, tags: , common: common) end |
#emit_closing! ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
151 152 153 154 155 |
# File 'lib/datadog/core/telemetry/component.rb', line 151 def emit_closing! return unless enabled? @worker.enqueue(Event::AppClosing.new) end |
#flush(timeout: nil) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Wait for the worker to send out all events that have already been queued, up to 15 seconds. Returns whether all events have been flushed, or nil if telemetry is disabled.
174 175 176 177 178 |
# File 'lib/datadog/core/telemetry/component.rb', line 174 def flush(timeout: nil) return unless enabled? @worker.flush(timeout: timeout) end |
#gauge(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Tracks gauge metric.
207 208 209 |
# File 'lib/datadog/core/telemetry/component.rb', line 207 def gauge(namespace, metric_name, value, tags: {}, common: true) @metrics_manager.gauge(namespace, metric_name, value, tags: , common: common) end |
#inc(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Increments a count metric.
197 198 199 |
# File 'lib/datadog/core/telemetry/component.rb', line 197 def inc(namespace, metric_name, value, tags: {}, common: true) @metrics_manager.inc(namespace, metric_name, value, tags: , common: common) end |
#integrations_change! ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
157 158 159 160 161 |
# File 'lib/datadog/core/telemetry/component.rb', line 157 def integrations_change! return unless enabled? @worker.enqueue(Event::AppIntegrationsChange.new) end |
#log!(event) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
163 164 165 166 167 |
# File 'lib/datadog/core/telemetry/component.rb', line 163 def log!(event) return unless enabled? && @log_collection_enabled @worker.enqueue(event) end |
#rate(namespace, metric_name, value, tags: {}, common: true) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Tracks rate metric.
212 213 214 |
# File 'lib/datadog/core/telemetry/component.rb', line 212 def rate(namespace, metric_name, value, tags: {}, common: true) @metrics_manager.rate(namespace, metric_name, value, tags: , common: common) end |
#shutdown! ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
141 142 143 144 145 146 147 148 149 |
# File 'lib/datadog/core/telemetry/component.rb', line 141 def shutdown! return if @stopped if defined?(@worker) @worker&.stop(true) end @stopped = true end |
#start(initial_event_is_change = false, components:) ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/datadog/core/telemetry/component.rb', line 125 def start(initial_event_is_change = false, components:) return unless enabled? initial_event = if initial_event_is_change Event::SynthAppClientConfigurationChange.new( components: components, ) else Event::AppStarted.new( components: components, ) end @worker.start(initial_event) end |