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 |
# 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, 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, 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).
225 226 227 228 229 230 231 232 |
# File 'lib/datadog/core/telemetry/component.rb', line 225 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
185 186 187 188 189 190 191 |
# File 'lib/datadog/core/telemetry/component.rb', line 185 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.
178 179 180 181 182 |
# File 'lib/datadog/core/telemetry/component.rb', line 178 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.
199 200 201 |
# File 'lib/datadog/core/telemetry/component.rb', line 199 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.
117 118 119 120 |
# File 'lib/datadog/core/telemetry/component.rb', line 117 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.
214 215 216 |
# File 'lib/datadog/core/telemetry/component.rb', line 214 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.
148 149 150 151 152 |
# File 'lib/datadog/core/telemetry/component.rb', line 148 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.
171 172 173 174 175 |
# File 'lib/datadog/core/telemetry/component.rb', line 171 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.
204 205 206 |
# File 'lib/datadog/core/telemetry/component.rb', line 204 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.
194 195 196 |
# File 'lib/datadog/core/telemetry/component.rb', line 194 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.
154 155 156 157 158 |
# File 'lib/datadog/core/telemetry/component.rb', line 154 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.
160 161 162 163 164 |
# File 'lib/datadog/core/telemetry/component.rb', line 160 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.
209 210 211 |
# File 'lib/datadog/core/telemetry/component.rb', line 209 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.
138 139 140 141 142 143 144 145 146 |
# File 'lib/datadog/core/telemetry/component.rb', line 138 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.
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'lib/datadog/core/telemetry/component.rb', line 122 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 |