Skip to content

Commit 29f1a36

Browse files
gh-worker-dd-mergequeue-cf854d[bot]p-datadogkhanayan123
authored
Merge pull request #5531 from DataDog/ayan.khan/add-extended-heartbeat
feat(telemetry): implement app-extended-heartbeat event Co-authored-by: p-datadog <156273877+p-datadog@users.noreply.github.com> Co-authored-by: khanayan123 <khanayan_123@hotmail.com> Co-authored-by: ayan.khan <ayan.khan@datadoghq.com>
2 parents 44949fc + d1ab17a commit 29f1a36

14 files changed

Lines changed: 220 additions & 1 deletion

File tree

lib/datadog/core/configuration/settings.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,19 @@ def initialize(*_)
914914
o.default 60.0
915915
end
916916

917+
# The interval in seconds when extended heartbeat must be sent.
918+
#
919+
# This method is used internally, for testing purposes only.
920+
#
921+
# @default `DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL` environment variable, otherwise `86400`.
922+
# @return [Integer]
923+
# @!visibility private
924+
option :extended_heartbeat_interval_seconds do |o|
925+
o.type :int
926+
o.env Core::Telemetry::Ext::ENV_EXTENDED_HEARTBEAT_INTERVAL
927+
o.default 86400
928+
end
929+
917930
# The interval in seconds when telemetry metrics are aggregated.
918931
# Should be a denominator of `heartbeat_interval_seconds`.
919932
#

lib/datadog/core/configuration/supported_configurations.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ module Configuration
107107
"DD_TAGS",
108108
"DD_TELEMETRY_AGENTLESS_URL",
109109
"DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED",
110+
"DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL",
110111
"DD_TELEMETRY_HEARTBEAT_INTERVAL",
111112
"DD_TELEMETRY_LOG_COLLECTION_ENABLED",
112113
"DD_TELEMETRY_METRICS_AGGREGATION_INTERVAL",

lib/datadog/core/telemetry/component.rb

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ def initialize( # standard:disable Metrics/MethodLength
9999
@worker = Telemetry::Worker.new(
100100
enabled: @enabled,
101101
heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds,
102+
extended_heartbeat_interval_seconds: settings.telemetry.extended_heartbeat_interval_seconds,
102103
metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds,
103104
emitter: Emitter.new(
104105
@transport,
@@ -108,6 +109,8 @@ def initialize( # standard:disable Metrics/MethodLength
108109
metrics_manager: @metrics_manager,
109110
dependency_collection: settings.telemetry.dependency_collection,
110111
logger: logger,
112+
settings: settings,
113+
agent_settings: agent_settings,
111114
shutdown_timeout: settings.telemetry.shutdown_timeout_seconds,
112115
)
113116

lib/datadog/core/telemetry/event.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ module Event
1818
require_relative 'event/base'
1919
require_relative 'event/app_client_configuration_change'
2020
require_relative 'event/app_closing'
21+
require_relative 'event/app_extended_heartbeat'
2122
require_relative 'event/app_dependencies_loaded'
2223
require_relative 'event/app_endpoints_loaded'
2324
require_relative 'event/app_heartbeat'
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# frozen_string_literal: true
2+
3+
require_relative 'app_started'
4+
5+
module Datadog
6+
module Core
7+
module Telemetry
8+
module Event
9+
# Telemetry class for the 'app-extended-heartbeat' event
10+
class AppExtendedHeartbeat < AppStarted
11+
def initialize(settings:, agent_settings:)
12+
@configuration = configuration(settings, agent_settings)
13+
end
14+
15+
def type
16+
'app-extended-heartbeat'
17+
end
18+
19+
def payload
20+
{
21+
configuration: @configuration,
22+
}
23+
end
24+
25+
def app_started?
26+
false
27+
end
28+
end
29+
end
30+
end
31+
end
32+
end

lib/datadog/core/telemetry/ext.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ module Ext
77
ENV_ENABLED = 'DD_INSTRUMENTATION_TELEMETRY_ENABLED'
88
ENV_METRICS_ENABLED = 'DD_TELEMETRY_METRICS_ENABLED'
99
ENV_HEARTBEAT_INTERVAL = 'DD_TELEMETRY_HEARTBEAT_INTERVAL'
10+
ENV_EXTENDED_HEARTBEAT_INTERVAL = 'DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL'
1011
ENV_METRICS_AGGREGATION_INTERVAL = 'DD_TELEMETRY_METRICS_AGGREGATION_INTERVAL'
1112
ENV_DEPENDENCY_COLLECTION = 'DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED'
1213
ENV_INSTALL_ID = 'DD_INSTRUMENTATION_INSTALL_ID'

lib/datadog/core/telemetry/worker.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ def initialize(
2727
metrics_manager:,
2828
dependency_collection:,
2929
logger:,
30+
settings:,
31+
agent_settings:,
32+
extended_heartbeat_interval_seconds:,
3033
enabled: true,
3134
shutdown_timeout: Workers::Polling::DEFAULT_SHUTDOWN_TIMEOUT,
3235
buffer_size: DEFAULT_BUFFER_MAX_SIZE
@@ -35,8 +38,11 @@ def initialize(
3538
@metrics_manager = metrics_manager
3639
@dependency_collection = dependency_collection
3740
@logger = logger
41+
@settings = settings
42+
@agent_settings = agent_settings
3843

3944
@ticks_per_heartbeat = (heartbeat_interval_seconds / metrics_aggregation_interval_seconds).to_i
45+
@ticks_per_extended_heartbeat = (extended_heartbeat_interval_seconds / metrics_aggregation_interval_seconds).to_i
4046
@current_ticks = 0
4147

4248
# Workers::Polling settings
@@ -63,6 +69,7 @@ def initialize(
6369
self.buffer = buffer_klass.new(@buffer_size)
6470

6571
@initial_event_once = Utils::OnlyOnceSuccessful.new(APP_STARTED_EVENT_RETRIES)
72+
@extended_heartbeat_ticks = 0
6673
end
6774

6875
attr_reader :logger
@@ -151,6 +158,13 @@ def perform(*events)
151158
end
152159

153160
@current_ticks += 1
161+
@extended_heartbeat_ticks += 1
162+
163+
if @extended_heartbeat_ticks >= @ticks_per_extended_heartbeat
164+
@extended_heartbeat_ticks = 0
165+
extended_heartbeat!
166+
end
167+
154168
return if @current_ticks < @ticks_per_heartbeat
155169

156170
@current_ticks = 0
@@ -170,6 +184,12 @@ def heartbeat!
170184
send_event(Event::AppHeartbeat.new)
171185
end
172186

187+
def extended_heartbeat!
188+
return if !enabled? || !sent_initial_event?
189+
190+
send_event(Event::AppExtendedHeartbeat.new(settings: @settings, agent_settings: @agent_settings))
191+
end
192+
173193
def started!
174194
return unless enabled?
175195

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
module Datadog
2+
module Core
3+
module Telemetry
4+
module Event
5+
class AppExtendedHeartbeat < AppStarted
6+
@configuration: ::Array[telemetry_configuration]
7+
8+
def initialize: (settings: untyped, agent_settings: Core::Configuration::AgentSettings) -> void
9+
def type: () -> "app-extended-heartbeat"
10+
def payload: () -> { configuration: ::Array[telemetry_configuration] }
11+
def app_started?: () -> false
12+
end
13+
end
14+
end
15+
end
16+
end

sig/datadog/core/telemetry/ext.rbs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module Datadog
66
ENV_ENABLED: ::String
77
ENV_LOG_COLLECTION: ::String
88
ENV_METRICS_ENABLED: ::String
9+
ENV_EXTENDED_HEARTBEAT_INTERVAL: ::String
910
ENV_HEARTBEAT_INTERVAL: ::String
1011
ENV_METRICS_AGGREGATION_INTERVAL: ::String
1112
ENV_INSTALL_ID: ::String

sig/datadog/core/telemetry/worker.rbs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,18 @@ module Datadog
1818
@buffer_size: Integer
1919
@dependency_collection: bool
2020
@ticks_per_heartbeat: Integer
21+
@ticks_per_extended_heartbeat: Integer
2122
@current_ticks: Integer
23+
@extended_heartbeat_ticks: Integer
2224
@logger: ::Logger
25+
@settings: untyped
26+
@agent_settings: Core::Configuration::AgentSettings
2327

2428
attr_reader logger: ::Logger
2529
attr_reader initial_event: Telemetry::Event::AppStarted
2630
attr_reader initial_event_once: Datadog::Core::Utils::OnlyOnceSuccessful
2731

28-
def initialize: (?enabled: bool, heartbeat_interval_seconds: Float, metrics_aggregation_interval_seconds: Float, emitter: Emitter, metrics_manager: MetricsManager, ?shutdown_timeout: Float | Integer, ?buffer_size: Integer, dependency_collection: bool, logger: ::Logger) -> void
32+
def initialize: (?enabled: bool, heartbeat_interval_seconds: Float, extended_heartbeat_interval_seconds: Integer, metrics_aggregation_interval_seconds: Float, emitter: Emitter, metrics_manager: MetricsManager, settings: untyped, agent_settings: Core::Configuration::AgentSettings, ?shutdown_timeout: Float | Integer, ?buffer_size: Integer, dependency_collection: bool, logger: ::Logger) -> void
2933
def initialize_state: -> void
3034

3135
def start: (Telemetry::Event::AppStarted initial_event) -> void
@@ -48,6 +52,8 @@ module Datadog
4852

4953
def heartbeat!: () -> void
5054

55+
def extended_heartbeat!: () -> void
56+
5157
def started!: () -> void
5258

5359
def flush_events: (Array[Event::Base] events) -> void

0 commit comments

Comments
 (0)