opentelemetry-exporter-otlp 0.20.0 → 0.20.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a47b849e776e7b540e9f6cbc9ef084d477e36afcb5b3a14c59266982118760d5
4
- data.tar.gz: 30eec237cdd6289b7fba2cdfe29fc081638e70fe3a4dfa548e1b33caaa3ee1c9
3
+ metadata.gz: ce1df6a570727c17754406f2bd2e89ea360fe1bef7520f49479cd27648f2f1ae
4
+ data.tar.gz: ed250da5a1ceb7b87ace908400cb26be946690b2f8de989c733af64dedb61b85
5
5
  SHA512:
6
- metadata.gz: 6a921db90201deec6715ec76d99d4c1fc06a746a2cc25a891824e9716a17452017a0e9f82dbcec492745573a6ae4ec943aab536d871fc67d9177d249c50fe03a
7
- data.tar.gz: b7d7708e915bdcb782047b560ab4b9a553d13f02faa25230ac805f8556287f435eb6597ef6ccfa30d26848522aa8a8cdc7fca98508bf239204fc0aa8f3a42133
6
+ metadata.gz: 4b51248fe75502f4c4108e00ad9adbbadc12bcff3511f13216f95baacd9e2bc59941bc855b324e5ddf2c475f291bb6efa98c1e0493a6094a388e6765dca1f3ab
7
+ data.tar.gz: e12faa4a6a12a4159184ca11aab1174828104132a179450a7f51811cbeba57d20ccea87568df915146d652fe3e26344e1b54faeab1528bff3d631e52a0f94042
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Release History: opentelemetry-exporter-otlp
2
2
 
3
+ ### v0.20.4 / 2021-09-29
4
+
5
+ * FIXED: OTLP Export Header Format
6
+
7
+ ### v0.20.3 / 2021-08-19
8
+
9
+ * FIXED: OTLP exporter missing failure metrics
10
+
11
+ ### v0.20.2 / 2021-08-12
12
+
13
+ * FIXED: Add rescue for OpenSSL errors during export
14
+ * DOCS: Update docs to rely more on environment variable configuration
15
+
16
+ ### v0.20.1 / 2021-06-29
17
+
18
+ * FIXED: Otlp encoding exceptions again
19
+
3
20
  ### v0.20.0 / 2021-06-23
4
21
 
5
22
  * BREAKING CHANGE: Total order constraint on span.status=
data/README.md CHANGED
@@ -35,16 +35,15 @@ Then, configure the SDK to use the OTLP exporter as a span processor, and use th
35
35
  require 'opentelemetry/sdk'
36
36
  require 'opentelemetry/exporter/otlp'
37
37
 
38
- # Configure the sdk with custom export
39
- OpenTelemetry::SDK.configure do |c|
40
- c.add_span_processor(
41
- OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
42
- OpenTelemetry::Exporter::OTLP::Exporter.new(
43
- compression: 'gzip'
44
- )
45
- )
46
- )
47
- end
38
+ # The OTLP exporter is the default, so no configuration is needed.
39
+ # However, it could be manually selected via an environment variable if required:
40
+ #
41
+ # ENV['OTEL_TRACES_EXPORTER'] = 'otlp'
42
+ #
43
+ # You may also configure various settings via environment variables:
44
+ # ENV['OTEL_EXPORTER_OTLP_COMPRESSION'] = 'gzip'
45
+
46
+ OpenTelemetry::SDK.configure
48
47
 
49
48
  # To start a trace you need to get a Tracer from the TracerProvider
50
49
  tracer = OpenTelemetry.tracer_provider.tracer('my_app_or_gem', '0.1.0')
@@ -67,7 +66,7 @@ For additional examples, see the [examples on github][examples-github].
67
66
 
68
67
  ## How can I configure the OTLP exporter?
69
68
 
70
- The collector exporter can be configured explicitly in code, as shown above, or via environment variables. The configuration parameters, environment variables, and defaults are shown below.
69
+ The collector exporter can be configured explicitly in code, or via environment variables as shown above. The configuration parameters, environment variables, and defaults are shown below.
71
70
 
72
71
  | Parameter | Environment variable | Default |
73
72
  | ------------------- | -------------------------------------------- | ----------------------------------- |
@@ -31,6 +31,9 @@ module OpenTelemetry
31
31
  WRITE_TIMEOUT_SUPPORTED = Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.6')
32
32
  private_constant(:KEEP_ALIVE_TIMEOUT, :RETRY_COUNT, :WRITE_TIMEOUT_SUPPORTED)
33
33
 
34
+ ERROR_MESSAGE_INVALID_HEADERS = 'headers must be a String with comma-separated URL Encoded UTF-8 k=v pairs or a Hash'
35
+ private_constant(:ERROR_MESSAGE_INVALID_HEADERS)
36
+
34
37
  def self.ssl_verify_mode
35
38
  if ENV.key?('OTEL_RUBY_EXPORTER_OTLP_SSL_VERIFY_PEER')
36
39
  OpenSSL::SSL::VERIFY_PEER
@@ -41,16 +44,15 @@ module OpenTelemetry
41
44
  end
42
45
  end
43
46
 
44
- def initialize(endpoint: config_opt('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT', default: 'https://localhost:4317/v1/traces'), # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
47
+ def initialize(endpoint: config_opt('OTEL_EXPORTER_OTLP_TRACES_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT', default: 'https://localhost:4317/v1/traces'), # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
45
48
  certificate_file: config_opt('OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE', 'OTEL_EXPORTER_OTLP_CERTIFICATE'),
46
49
  ssl_verify_mode: Exporter.ssl_verify_mode,
47
- headers: config_opt('OTEL_EXPORTER_OTLP_TRACES_HEADERS', 'OTEL_EXPORTER_OTLP_HEADERS'),
50
+ headers: config_opt('OTEL_EXPORTER_OTLP_TRACES_HEADERS', 'OTEL_EXPORTER_OTLP_HEADERS', default: {}),
48
51
  compression: config_opt('OTEL_EXPORTER_OTLP_TRACES_COMPRESSION', 'OTEL_EXPORTER_OTLP_COMPRESSION'),
49
52
  timeout: config_opt('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT', 'OTEL_EXPORTER_OTLP_TIMEOUT', default: 10),
50
53
  metrics_reporter: nil)
51
54
  raise ArgumentError, "invalid url for OTLP::Exporter #{endpoint}" if invalid_url?(endpoint)
52
55
  raise ArgumentError, "unsupported compression key #{compression}" unless compression.nil? || compression == 'gzip'
53
- raise ArgumentError, 'headers must be comma-separated k=v pairs or a Hash' unless valid_headers?(headers)
54
56
 
55
57
  @uri = if endpoint == ENV['OTEL_EXPORTER_OTLP_ENDPOINT']
56
58
  URI("#{endpoint}/v1/traces")
@@ -66,8 +68,10 @@ module OpenTelemetry
66
68
 
67
69
  @path = @uri.path
68
70
  @headers = case headers
69
- when String then CSV.parse(headers, col_sep: '=', row_sep: ',').to_h
71
+ when String then parse_headers(headers)
70
72
  when Hash then headers
73
+ else
74
+ raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS
71
75
  end
72
76
  @timeout = timeout.to_f
73
77
  @compression = compression
@@ -118,16 +122,6 @@ module OpenTelemetry
118
122
  default
119
123
  end
120
124
 
121
- def valid_headers?(headers)
122
- return true if headers.nil? || headers.is_a?(Hash)
123
- return false unless headers.is_a?(String)
124
-
125
- CSV.parse(headers, col_sep: '=', row_sep: ',').to_h
126
- true
127
- rescue ArgumentError
128
- false
129
- end
130
-
131
125
  def invalid_url?(url)
132
126
  return true if url.nil? || url.strip.empty?
133
127
 
@@ -161,7 +155,7 @@ module OpenTelemetry
161
155
  bytes
162
156
  end
163
157
  request.add_field('Content-Type', 'application/x-protobuf')
164
- @headers&.each { |key, value| request.add_field(key, value) }
158
+ @headers.each { |key, value| request.add_field(key, value) }
165
159
 
166
160
  remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time)
167
161
  return TIMEOUT if remaining_timeout.zero?
@@ -187,6 +181,7 @@ module OpenTelemetry
187
181
  when Net::HTTPBadRequest, Net::HTTPClientError, Net::HTTPServerError
188
182
  # TODO: decode the body as a google.rpc.Status Protobuf-encoded message when https://github.com/open-telemetry/opentelemetry-collector/issues/1357 is fixed.
189
183
  response.body # Read and discard body
184
+ @metrics_reporter.add_to_counter('otel.otlp_exporter.failure', labels: { 'reason' => response.code })
190
185
  FAILURE
191
186
  when Net::HTTPRedirection
192
187
  @http.finish
@@ -199,6 +194,9 @@ module OpenTelemetry
199
194
  rescue Net::OpenTimeout, Net::ReadTimeout
200
195
  retry if backoff?(retry_count: retry_count += 1, reason: 'timeout')
201
196
  return FAILURE
197
+ rescue OpenSSL::SSL::SSLError
198
+ retry if backoff?(retry_count: retry_count += 1, reason: 'openssl_error')
199
+ return FAILURE
202
200
  rescue SocketError
203
201
  retry if backoff?(retry_count: retry_count += 1, reason: 'socket_error')
204
202
  return FAILURE
@@ -234,9 +232,8 @@ module OpenTelemetry
234
232
  end
235
233
 
236
234
  def backoff?(retry_after: nil, retry_count:, reason:)
237
- return false if retry_count > RETRY_COUNT
238
-
239
235
  @metrics_reporter.add_to_counter('otel.otlp_exporter.failure', labels: { 'reason' => reason })
236
+ return false if retry_count > RETRY_COUNT
240
237
 
241
238
  sleep_interval = nil
242
239
  unless retry_after.nil?
@@ -342,7 +339,8 @@ module OpenTelemetry
342
339
  def as_otlp_key_value(key, value)
343
340
  Opentelemetry::Proto::Common::V1::KeyValue.new(key: key, value: as_otlp_any_value(value))
344
341
  rescue Encoding::UndefinedConversionError => e
345
- OpenTelemetry.handle_error(exception: e, message: "encoding error for key #{key} and value #{value}")
342
+ encoded_value = value.encode('UTF-8', invalid: :replace, undef: :replace, replace: '�')
343
+ OpenTelemetry.handle_error(exception: e, message: "encoding error for key #{key} and value #{encoded_value}")
346
344
  Opentelemetry::Proto::Common::V1::KeyValue.new(key: key, value: as_otlp_any_value('Encoding Error'))
347
345
  end
348
346
 
@@ -363,6 +361,24 @@ module OpenTelemetry
363
361
  end
364
362
  result
365
363
  end
364
+
365
+ def parse_headers(raw)
366
+ entries = raw.split(',')
367
+ raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS if entries.empty?
368
+
369
+ entries.each_with_object({}) do |entry, headers|
370
+ k, v = entry.split('=', 2).map(&CGI.method(:unescape))
371
+ begin
372
+ k = k.to_s.strip
373
+ v = v.to_s.strip
374
+ rescue ArgumentError => e
375
+ raise e, ERROR_MESSAGE_INVALID_HEADERS
376
+ end
377
+ raise ArgumentError, ERROR_MESSAGE_INVALID_HEADERS if k.empty? || v.empty?
378
+
379
+ headers[k] = v
380
+ end
381
+ end
366
382
  end
367
383
  end
368
384
  end
@@ -8,7 +8,7 @@ module OpenTelemetry
8
8
  module Exporter
9
9
  module OTLP
10
10
  ## Current OpenTelemetry OTLP exporter version
11
- VERSION = '0.20.0'
11
+ VERSION = '0.20.4'
12
12
  end
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-exporter-otlp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.20.0
4
+ version: 0.20.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-24 00:00:00.000000000 Z
11
+ date: 2021-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -30,28 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 1.0.0.rc2
33
+ version: 1.0.0.rc3
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 1.0.0.rc2
40
+ version: 1.0.0.rc3
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: opentelemetry-common
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 0.19.0
47
+ version: 0.19.1
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 0.19.0
54
+ version: 0.19.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: opentelemetry-sdk
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +108,20 @@ dependencies:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
110
  version: '5.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rake
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -215,10 +229,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
215
229
  licenses:
216
230
  - Apache-2.0
217
231
  metadata:
218
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.20.0/file.CHANGELOG.html
232
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.20.4/file.CHANGELOG.html
219
233
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/exporter/otlp
220
234
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
221
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.20.0
235
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.20.4
222
236
  post_install_message:
223
237
  rdoc_options: []
224
238
  require_paths: