flare 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ require_relative "client_headers"
12
12
  require_relative "sampler"
13
13
  require_relative "trace_blob"
14
14
  require_relative "http_transport"
15
+ require_relative "deadline"
15
16
 
16
17
  module Flare
17
18
  # Custom OTel exporter. For each batch FilteringSpanProcessor hands over:
@@ -33,6 +34,7 @@ module Flare
33
34
  class TraceExporter
34
35
  SUCCESS = OpenTelemetry::SDK::Trace::Export::SUCCESS
35
36
  FAILURE = OpenTelemetry::SDK::Trace::Export::FAILURE
37
+ TIMEOUT = OpenTelemetry::SDK::Trace::Export::TIMEOUT
36
38
 
37
39
  PUT_HEADERS = {
38
40
  "Content-Type" => "application/json",
@@ -58,16 +60,22 @@ module Flare
58
60
  end
59
61
 
60
62
  def export(spans, timeout: nil)
63
+ deadline = Deadline.new(timeout)
61
64
  grouped = spans.group_by(&:trace_id)
62
65
  return SUCCESS if grouped.empty?
63
66
 
64
67
  overall = SUCCESS
65
68
  grouped.each do |trace_id, group|
66
- result = ship(TraceBlob.build(trace_id: trace_id, spans: group))
69
+ return TIMEOUT if deadline.expired?
70
+
71
+ result = ship(TraceBlob.build(trace_id: trace_id, spans: group), deadline: deadline)
72
+ return TIMEOUT if result == TIMEOUT || deadline.expired?
67
73
  overall = FAILURE if result == FAILURE
68
74
  end
69
75
  overall
70
76
  rescue StandardError => e
77
+ return TIMEOUT if deadline&.expired? || e.is_a?(HttpTransport::DeadlineExceeded)
78
+
71
79
  @exception_count.increment
72
80
  @logger.warn("[Flare::TraceExporter] export raised: #{e.class}: #{e.message}")
73
81
  FAILURE
@@ -83,8 +91,9 @@ module Flare
83
91
 
84
92
  private
85
93
 
86
- def ship(blob, retried: false)
94
+ def ship(blob, deadline:, retried: false)
87
95
  return FAILURE if blob.nil?
96
+ return TIMEOUT if deadline.expired?
88
97
 
89
98
  entry = @pool.checkout
90
99
  if entry.nil?
@@ -93,29 +102,55 @@ module Flare
93
102
  end
94
103
 
95
104
  body = gzip(JSON.generate(blob.to_h))
96
- response = @transport.put(entry[:put_url], body, PUT_HEADERS)
105
+ response = transport_request(:put, entry[:put_url], body, PUT_HEADERS, timeout: deadline.remaining)
106
+ return TIMEOUT if deadline.expired?
97
107
 
98
108
  case response.code
99
109
  when "200", "204"
100
- notify(entry[:key])
101
- SUCCESS
110
+ notify(entry[:key], deadline: deadline)
102
111
  when "403"
103
112
  # Presigned URL probably expired; try once more with the next one.
104
- retried ? record_put_failure(response) : ship(blob, retried: true)
113
+ retried ? record_put_failure(response) : ship(blob, deadline: deadline, retried: true)
105
114
  else
106
115
  record_put_failure(response)
107
116
  end
108
117
  end
109
118
 
110
- def notify(key)
111
- response = @transport.post(@notify_url, JSON.generate(key: key), notify_headers)
112
- return if response.code == "202"
119
+ def notify(key, deadline:)
120
+ return TIMEOUT if deadline.expired?
121
+
122
+ response = transport_request(
123
+ :post,
124
+ @notify_url,
125
+ JSON.generate(key: key),
126
+ notify_headers,
127
+ timeout: deadline.remaining
128
+ )
129
+ return TIMEOUT if deadline.expired?
130
+ return SUCCESS if response.code == "202"
113
131
 
114
132
  @notify_failure_count.increment
115
133
  @logger.warn("[Flare::TraceExporter] notify failed: HTTP #{response.code}")
134
+ SUCCESS
116
135
  rescue StandardError => e
136
+ return TIMEOUT if deadline.expired? || e.is_a?(HttpTransport::DeadlineExceeded)
137
+
117
138
  @notify_failure_count.increment
118
139
  @logger.warn("[Flare::TraceExporter] notify exception: #{e.class}: #{e.message}")
140
+ SUCCESS
141
+ end
142
+
143
+ def transport_request(method, *args, timeout:)
144
+ parameters = @transport.method(method).parameters
145
+ accepts_timeout = parameters.any? do |type, name|
146
+ type == :keyrest || ([:key, :keyreq].include?(type) && name == :timeout)
147
+ end
148
+
149
+ if accepts_timeout
150
+ @transport.public_send(method, *args, timeout: timeout)
151
+ else
152
+ @transport.public_send(method, *args)
153
+ end
119
154
  end
120
155
 
121
156
  # Identifies the client on the Flare-API notify POST. The presigned R2
data/lib/flare/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Flare
4
- VERSION = "0.3.1"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/flare.rb CHANGED
@@ -13,6 +13,8 @@ require_relative "flare/metric_span_processor"
13
13
  require_relative "flare/metric_flusher"
14
14
  require_relative "flare/backoff_policy"
15
15
  require_relative "flare/metric_submitter"
16
+ require_relative "flare/recording_batch_span_processor"
17
+ require_relative "flare/lifecycle"
16
18
 
17
19
  require_relative "flare/sampler"
18
20
  require_relative "flare/marker"
@@ -88,7 +90,7 @@ module Flare
88
90
  end
89
91
 
90
92
  def span_processor
91
- @span_processor ||= OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
93
+ @span_processor ||= RecordingBatchSpanProcessor.new(
92
94
  exporter,
93
95
  max_queue_size: 1000,
94
96
  max_export_batch_size: 100,
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flare
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John Nunemaker
@@ -198,10 +198,12 @@ files:
198
198
  - lib/flare/cli/status_command.rb
199
199
  - lib/flare/client_headers.rb
200
200
  - lib/flare/configuration.rb
201
+ - lib/flare/deadline.rb
201
202
  - lib/flare/engine.rb
202
203
  - lib/flare/filtering_span_processor.rb
203
204
  - lib/flare/http_metrics_config.rb
204
205
  - lib/flare/http_transport.rb
206
+ - lib/flare/lifecycle.rb
205
207
  - lib/flare/marker.rb
206
208
  - lib/flare/metric_counter.rb
207
209
  - lib/flare/metric_flusher.rb
@@ -209,6 +211,7 @@ files:
209
211
  - lib/flare/metric_span_processor.rb
210
212
  - lib/flare/metric_storage.rb
211
213
  - lib/flare/metric_submitter.rb
214
+ - lib/flare/recording_batch_span_processor.rb
212
215
  - lib/flare/rule_manager.rb
213
216
  - lib/flare/sampler.rb
214
217
  - lib/flare/source_location.rb
@@ -245,7 +248,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
245
248
  - !ruby/object:Gem::Version
246
249
  version: '0'
247
250
  requirements: []
248
- rubygems_version: 4.0.7
251
+ rubygems_version: 4.0.18
249
252
  specification_version: 4
250
253
  summary: Light up what's slowing you down
251
254
  test_files: []