@@ -5,11 +5,9 @@ defmodule Sentry.Telemetry.Scheduler do
55 The scheduler cycles through category buffers based on priority weights,
66 ensuring critical telemetry gets priority over high-volume data under load.
77
8- Currently, only the `:log` category is managed. The weighted round-robin
9- structure is in place for future expansion to additional categories.
10-
118 ## Weights
129
10+ * `:critical` - weight 5 (errors)
1311 * `:low` - weight 2 (logs)
1412
1513 ## Signal-Based Wake
@@ -35,11 +33,12 @@ defmodule Sentry.Telemetry.Scheduler do
3533 alias __MODULE__
3634
3735 alias Sentry.Telemetry . { Buffer , Category }
38- alias Sentry . { ClientReport , Config , Envelope , LogEvent , Transport }
36+ alias Sentry . { ClientReport , Config , Envelope , Event , LogEvent , Transport }
3937
4038 @ default_capacity 1000
4139
4240 @ type buffers :: % {
41+ error: GenServer . server ( ) ,
4342 log: GenServer . server ( )
4443 }
4544
@@ -78,7 +77,7 @@ defmodule Sentry.Telemetry.Scheduler do
7877 ## Examples
7978
8079 iex> Sentry.Telemetry.Scheduler.build_priority_cycle()
81- [:log, :log]
80+ [:error, :error, :error, :error, :error, : log, :log]
8281
8382 """
8483 @ spec build_priority_cycle ( map ( ) | nil ) :: [ Category . t ( ) ]
@@ -151,7 +150,9 @@ defmodule Sentry.Telemetry.Scheduler do
151150 on_envelope = Keyword . get ( opts , :on_envelope )
152151 capacity = Keyword . get ( opts , :capacity , @ default_capacity )
153152
154- priority_cycle = build_priority_cycle ( weights )
153+ priority_cycle =
154+ build_priority_cycle ( weights )
155+ |> Enum . filter ( fn category -> Map . has_key? ( buffers , category ) end )
155156
156157 state = % Scheduler {
157158 buffers: buffers ,
@@ -232,6 +233,10 @@ defmodule Sentry.Telemetry.Scheduler do
232233 end
233234 end
234235
236+ defp send_items ( state , :error , [ % Event { } = event ] ) do
237+ process_and_send_event ( state , event , & send_envelope / 2 )
238+ end
239+
235240 defp send_items ( state , :log , log_events ) do
236241 process_and_send_logs ( state , log_events , & send_envelope / 2 )
237242 end
@@ -242,14 +247,37 @@ defmodule Sentry.Telemetry.Scheduler do
242247
243248 if items != [ ] do
244249 case category do
245- :log -> process_and_send_logs ( state , items , & send_envelope_direct / 2 )
250+ :error ->
251+ Enum . each ( items , fn event ->
252+ process_and_send_event ( state , event , & send_envelope_direct / 2 )
253+ end )
254+
255+ :log ->
256+ process_and_send_logs ( state , items , & send_envelope_direct / 2 )
246257 end
247258 end
248259 end
249260
250261 state
251262 end
252263
264+ defp process_and_send_event ( % { on_envelope: on_envelope } = state , % Event { } = event , send_fn ) do
265+ # Skip test collection when on_envelope is set (used by unit tests)
266+ if is_nil ( on_envelope ) do
267+ case Sentry.Test . maybe_collect ( event ) do
268+ :collected ->
269+ state
270+
271+ :not_collecting ->
272+ envelope = Envelope . from_event ( event )
273+ send_fn . ( state , envelope )
274+ end
275+ else
276+ envelope = Envelope . from_event ( event )
277+ send_fn . ( state , envelope )
278+ end
279+ end
280+
253281 defp process_and_send_logs ( % { on_envelope: on_envelope } = state , log_events , send_fn ) do
254282 processed_logs = apply_before_send_log_callbacks ( log_events )
255283
@@ -320,7 +348,7 @@ defmodule Sentry.Telemetry.Scheduler do
320348 defp send_envelope ( % Scheduler { on_envelope: nil } = state , envelope ) do
321349 if state . size >= state . capacity do
322350 Logger . warning (
323- "Sentry: transport queue full, dropping #{ Envelope . item_count ( envelope ) } log item(s)"
351+ "Sentry: transport queue full, dropping #{ Envelope . item_count ( envelope ) } item(s)"
324352 )
325353
326354 ClientReport.Sender . record_discarded_events ( :queue_overflow , envelope . items )
@@ -352,7 +380,7 @@ defmodule Sentry.Telemetry.Scheduler do
352380 :ok
353381
354382 { :error , error } ->
355- Logger . warning ( "Sentry: failed to send log envelope: #{ Exception . message ( error ) } " )
383+ Logger . warning ( "Sentry: failed to send envelope: #{ Exception . message ( error ) } " )
356384
357385 { :error , error }
358386 end
@@ -423,12 +451,14 @@ defmodule Sentry.Telemetry.Scheduler do
423451
424452 defp default_weights do
425453 % {
454+ critical: Category . weight ( :critical ) ,
426455 low: Category . weight ( :low )
427456 }
428457 end
429458
430459 defp category_priority_mapping do
431460 [
461+ { :error , :critical } ,
432462 { :log , :low }
433463 ]
434464 end
0 commit comments