Telemetry: Send batched events

What does this merge request do and why?

Prior this commit, flushing events caused GitLab SDK to send events individually using GET requests. This caused delays in the GDK command when it was interrupted (CTRL+C) or before it finished.

This commit increase the buffer size of events which makes GitLab SDK to send batched events using POST to the server.

Overall, this reduces the runtime of sending events from ~9s to ~2s for gdk reconfigure command.

How to set up and validate locally

  1. Enable telemetry via gdk telemetry
  2. Run gdk reconfigure
  3. Verify in "Clickhouse Cloud" that all events are sent to the GDK project

Before

$ rg took: events.log
36:I, [2025-02-07T16:34:27.460141 #143792]  INFO -- : took: 0.14513966599952255
60:I, [2025-02-07T16:34:28.083596 #143893]  INFO -- : took: 0.14891107699986605
84:I, [2025-02-07T16:34:28.634065 #143907]  INFO -- : took: 0.14098936099981074
120:I, [2025-02-07T16:34:29.653434 #143950]  INFO -- : took: 0.13694271799977287
172:I, [2025-02-07T16:34:30.737217 #144355]  INFO -- : took: 0.1367540880000888
176:I, [2025-02-07T16:34:30.748609 #144354]  INFO -- : took: 0.15023922000000312
184:I, [2025-02-07T16:34:30.836347 #144476]  INFO -- : took: 0.14197196799977974
188:I, [2025-02-07T16:34:30.850412 #144478]  INFO -- : took: 0.14362148999862256
645:I, [2025-02-07T16:34:40.624526 #145234]  INFO -- : took: 7.758297200000015
661:I, [2025-02-07T16:34:41.078928 #143346]  INFO -- : took: 0.42740831800074375

$ rg -I -r '$1' -o  'took: (\S+)' events.log  | paste -s -d+  | bc
9.33027510599822518

After

$ rg took: events-parallel.log
27:I, [2025-02-07T16:33:53.056641 #141602]  INFO -- : took: 0.14396146900071471
35:I, [2025-02-07T16:33:53.659878 #141697]  INFO -- : took: 0.14350753399958194
42:I, [2025-02-07T16:33:54.196404 #141707]  INFO -- : took: 0.14932274200145912
49:I, [2025-02-07T16:33:55.211053 #141742]  INFO -- : took: 0.1449820340003498
80:I, [2025-02-07T16:33:56.273942 #142138]  INFO -- : took: 0.14145410300079675
83:I, [2025-02-07T16:33:56.281255 #142141]  INFO -- : took: 0.15049594300035096
86:I, [2025-02-07T16:33:56.393341 #142259]  INFO -- : took: 0.14611662199968123
89:I, [2025-02-07T16:33:56.400132 #142264]  INFO -- : took: 0.1558429940014321
120:I, [2025-02-07T16:33:59.301435 #143018]  INFO -- : took: 0.7170194649988844
127:I, [2025-02-07T16:33:59.459023 #141150]  INFO -- : took: 0.14551586299967312

$ rg -I -r '$1' -o  'took: (\S+)' events-parallel.log  | paste -s -d+  | bc
2.03821876900292413

But how?

Click to expand
diff --git a/lib/gdk/telemetry.rb b/lib/gdk/telemetry.rb
index d2414ede..ee488963 100644
--- a/lib/gdk/telemetry.rb
+++ b/lib/gdk/telemetry.rb
@@ -145,7 +145,12 @@ module GDK
   end
 end
 
+require 'logger'
+logger = Logger.new('events.log', 1)
+GDK::Telemetry.client.instance_variable_get(:@tracker).instance_variable_get(:@emitters).first.instance_variable_set(:@logger, logger)
+
 at_exit do
   # Flush all pending events synchronously before exit.
-  GDK::Telemetry.flush_events
+  took = Benchmark.realtime { GDK::Telemetry.flush_events }
+  logger.info("took: #{took}")
 end

Impacted categories

The following categories relate to this merge request:

Merge request checklist

  • This change is backward compatible. If not, please include steps to communicate to our users.
  • Tests added for new functionality. If not, please raise an issue to follow-up.
  • Documentation added/updated, if needed.
  • Announcement added, if change is notable.
  • gdk doctor test added, if needed.
Edited by Peter Leitzen

Merge request reports

Loading