@@ -106,48 +106,50 @@ def _to_transport_format(item: "StreamedSpan") -> "Any":
106106
107107 def _flush (self ) -> None :
108108 with self ._lock :
109- if len (self ._span_buffer ) == 0 :
110- return
111-
112109 envelopes = []
113- for spans in self ._span_buffer .values ():
114- if spans :
115- dsc = spans [0 ].dynamic_sampling_context ()
116-
117- # Max per envelope is 1000, so if we happen to have more than
118- # 1000 spans in one bucket, we'll need to separate them.
119- for start in range (0 , len (spans ), self .MAX_ENVELOPE_SIZE ):
120- end = min (start + self .MAX_ENVELOPE_SIZE , len (spans ))
121-
122- envelope = Envelope (
110+ flushed_trace_ids = []
111+ for trace_id , spans in self ._span_buffer .items ():
112+ if len (spans ) < self .MAX_BEFORE_FLUSH :
113+ continue
114+
115+ flushed_trace_ids .append (trace_id )
116+ dsc = spans [0 ].dynamic_sampling_context ()
117+
118+ # Max per envelope is 1000, so if we happen to have more than
119+ # 1000 spans in one bucket, we'll need to separate them.
120+ for start in range (0 , len (spans ), self .MAX_ENVELOPE_SIZE ):
121+ end = min (start + self .MAX_ENVELOPE_SIZE , len (spans ))
122+
123+ envelope = Envelope (
124+ headers = {
125+ "sent_at" : format_timestamp (datetime .now (timezone .utc )),
126+ "trace" : dsc ,
127+ }
128+ )
129+
130+ envelope .add_item (
131+ Item (
132+ type = self .TYPE ,
133+ content_type = self .CONTENT_TYPE ,
123134 headers = {
124- "sent_at" : format_timestamp (datetime .now (timezone .utc )),
125- "trace" : dsc ,
126- }
127- )
128-
129- envelope .add_item (
130- Item (
131- type = "span" ,
132- content_type = "application/vnd.sentry.items.span.v2+json" ,
133- headers = {
134- "item_count" : end - start ,
135- },
136- payload = PayloadRef (
137- json = {
138- "items" : [
139- self ._to_transport_format (spans [j ])
140- for j in range (start , end )
141- ]
142- }
143- ),
144- )
135+ "item_count" : end - start ,
136+ },
137+ payload = PayloadRef (
138+ json = {
139+ "items" : [
140+ self ._to_transport_format (spans [j ])
141+ for j in range (start , end )
142+ ]
143+ }
144+ ),
145145 )
146+ )
146147
147- envelopes .append (envelope )
148+ envelopes .append (envelope )
148149
149- self ._span_buffer .clear ()
150- self ._running_size .clear ()
150+ for trace_id in flushed_trace_ids :
151+ del self ._span_buffer [trace_id ]
152+ del self ._running_size [trace_id ]
151153
152154 for envelope in envelopes :
153155 self ._capture_func (envelope )
0 commit comments