opentelemetry-exporter-otlp 0.8.0 → 0.12.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce3f4d8c613bf9c9d54c562aed35d26602363974fc101c161d33dd3f4241da95
4
- data.tar.gz: 9ebdf5eab072b7854da5f722d3ae9dde312a025c67ac16ffd809f408e3a2cf90
3
+ metadata.gz: d2e42d5832a5e55dd263643260de2a092d8143b3c575ce1dbb413d6deffefef3
4
+ data.tar.gz: 62dca89af13815894f58d9a8732bae13bba9bad76743a53cecd18eaa327a2e55
5
5
  SHA512:
6
- metadata.gz: c584f93fbf7059a26991b44a51767f49c08f192f45b6328d68fc44531939d4a2cd3286885a62cd325ea5274e1c50341bb6c26a8ea89da87fb8cb4b0c9ef851ca
7
- data.tar.gz: 2777bbadf94ca8e325ca3466b291f6d9c0e4ece9807963a4adc4d8328d059c783ae5d54a9f4fb81ce99a122c2f8931ad8ffea8dbd996f3b58aba64f966b3efb0
6
+ metadata.gz: 6c6c87c2f2d9c29ac6820724416eb5719069a9d77feb5610b1f35164e1a832163cc5f732434bd9936a44b9c03405fbdcf9e130badb61d4bf2f96ee6fa3404024
7
+ data.tar.gz: f8cb8d266ef97c6a7b51c8d08afa93df0632ecbe5f6ca82ec44e27b0904c2a8bfacf213536084ce6fb0ee390ee78012d3915bb685efb5f672f7a7d7ca99e9319
@@ -1,5 +1,32 @@
1
1
  # Release History: opentelemetry-exporter-otlp
2
2
 
3
+ ### v0.12.1 / 2021-01-13
4
+
5
+ * FIXED: Updated protobuf version dependency
6
+
7
+ ### v0.12.0 / 2020-12-24
8
+
9
+ * (No significant changes)
10
+
11
+ ### v0.11.0 / 2020-12-11
12
+
13
+ * BREAKING CHANGE: Implement tracestate
14
+
15
+ * ADDED: Implement tracestate
16
+ * ADDED: Metrics reporting from trace export
17
+ * FIXED: Copyright comments to not reference year
18
+
19
+ ### v0.10.0 / 2020-12-03
20
+
21
+ * (No significant changes)
22
+
23
+ ### v0.9.0 / 2020-11-27
24
+
25
+ * BREAKING CHANGE: Add timeout for force_flush and shutdown
26
+
27
+ * ADDED: Add timeout for force_flush and shutdown
28
+ * FIXED: Remove unused kwarg from otlp exporter retry
29
+
3
30
  ### v0.8.0 / 2020-10-27
4
31
 
5
32
  * BREAKING CHANGE: Move context/span methods to Trace module
data/LICENSE CHANGED
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2020 OpenTelemetry Authors
189
+ Copyright The OpenTelemetry Authors
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
@@ -4,6 +4,7 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
+ require 'opentelemetry/common'
7
8
  require 'opentelemetry/sdk'
8
9
  require 'net/http'
9
10
  require 'csv'
@@ -21,21 +22,22 @@ module OpenTelemetry
21
22
  class Exporter # rubocop:disable Metrics/ClassLength
22
23
  SUCCESS = OpenTelemetry::SDK::Trace::Export::SUCCESS
23
24
  FAILURE = OpenTelemetry::SDK::Trace::Export::FAILURE
24
- private_constant(:SUCCESS, :FAILURE)
25
+ TIMEOUT = OpenTelemetry::SDK::Trace::Export::TIMEOUT
26
+ private_constant(:SUCCESS, :FAILURE, :TIMEOUT)
25
27
 
26
28
  # Default timeouts in seconds.
27
29
  KEEP_ALIVE_TIMEOUT = 30
28
- OPEN_TIMEOUT = 5
29
- READ_TIMEOUT = 5
30
30
  RETRY_COUNT = 5
31
- private_constant(:KEEP_ALIVE_TIMEOUT, :OPEN_TIMEOUT, :READ_TIMEOUT, :RETRY_COUNT)
31
+ WRITE_TIMEOUT_SUPPORTED = Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.6')
32
+ private_constant(:KEEP_ALIVE_TIMEOUT, :RETRY_COUNT, :WRITE_TIMEOUT_SUPPORTED)
32
33
 
33
- def initialize(endpoint: config_opt('OTEL_EXPORTER_OTLP_SPAN_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT', default: 'localhost:55681/v1/trace'), # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
34
+ def initialize(endpoint: config_opt('OTEL_EXPORTER_OTLP_SPAN_ENDPOINT', 'OTEL_EXPORTER_OTLP_ENDPOINT', default: 'localhost:55681/v1/trace'), # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
34
35
  insecure: config_opt('OTEL_EXPORTER_OTLP_SPAN_INSECURE', 'OTEL_EXPORTER_OTLP_INSECURE', default: false),
35
36
  certificate_file: config_opt('OTEL_EXPORTER_OTLP_SPAN_CERTIFICATE', 'OTEL_EXPORTER_OTLP_CERTIFICATE'),
36
37
  headers: config_opt('OTEL_EXPORTER_OTLP_SPAN_HEADERS', 'OTEL_EXPORTER_OTLP_HEADERS'), # TODO: what format is expected here?
37
38
  compression: config_opt('OTEL_EXPORTER_OTLP_SPAN_COMPRESSION', 'OTEL_EXPORTER_OTLP_COMPRESSION'),
38
- timeout: config_opt('OTEL_EXPORTER_OTLP_SPAN_TIMEOUT', 'OTEL_EXPORTER_OTLP_TIMEOUT', default: 10))
39
+ timeout: config_opt('OTEL_EXPORTER_OTLP_SPAN_TIMEOUT', 'OTEL_EXPORTER_OTLP_TIMEOUT', default: 10),
40
+ metrics_reporter: nil)
39
41
  raise ArgumentError, "invalid url for OTLP::Exporter #{endpoint}" if invalid_url?("http://#{endpoint}")
40
42
  raise ArgumentError, "unsupported compression key #{compression}" unless compression.nil? || compression == 'gzip'
41
43
  raise ArgumentError, 'headers must be comma-separated k:v pairs or a Hash' unless valid_headers?(headers)
@@ -45,8 +47,6 @@ module OpenTelemetry
45
47
  @http.use_ssl = insecure.to_s.downcase == 'false'
46
48
  @http.ca_file = certificate_file unless certificate_file.nil?
47
49
  @http.keep_alive_timeout = KEEP_ALIVE_TIMEOUT
48
- @http.open_timeout = OPEN_TIMEOUT
49
- @http.read_timeout = READ_TIMEOUT
50
50
 
51
51
  @path = uri.path
52
52
  @headers = case headers
@@ -55,6 +55,7 @@ module OpenTelemetry
55
55
  end
56
56
  @timeout = timeout.to_f # TODO: use this as a default timeout when we implement timeouts in https://github.com/open-telemetry/opentelemetry-ruby/pull/341
57
57
  @compression = compression
58
+ @metrics_reporter = metrics_reporter || OpenTelemetry::SDK::Trace::Export::MetricsReporter
58
59
 
59
60
  @shutdown = false
60
61
  end
@@ -64,17 +65,20 @@ module OpenTelemetry
64
65
  # @param [Enumerable<OpenTelemetry::SDK::Trace::SpanData>] span_data the
65
66
  # list of recorded {OpenTelemetry::SDK::Trace::SpanData} structs to be
66
67
  # exported.
68
+ # @param [optional Numeric] timeout An optional timeout in seconds.
67
69
  # @return [Integer] the result of the export.
68
- def export(span_data)
70
+ def export(span_data, timeout: nil)
69
71
  return FAILURE if @shutdown
70
72
 
71
- send_bytes(encode(span_data))
73
+ send_bytes(encode(span_data), timeout: timeout)
72
74
  end
73
75
 
74
76
  # Called when {OpenTelemetry::SDK::Trace::Tracer#shutdown} is called, if
75
77
  # this exporter is registered to a {OpenTelemetry::SDK::Trace::Tracer}
76
78
  # object.
77
- def shutdown
79
+ #
80
+ # @param [optional Numeric] timeout An optional timeout in seconds.
81
+ def shutdown(timeout: nil)
78
82
  @shutdown = true
79
83
  @http.finish if @http.started?
80
84
  end
@@ -108,8 +112,10 @@ module OpenTelemetry
108
112
  true
109
113
  end
110
114
 
111
- def send_bytes(bytes) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
115
+ def send_bytes(bytes, timeout:) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
112
116
  retry_count = 0
117
+ timeout ||= @timeout
118
+ start_time = Time.now
113
119
  untraced do # rubocop:disable Metrics/BlockLength
114
120
  request = Net::HTTP::Post.new(@path)
115
121
  request.body = if @compression == 'gzip'
@@ -121,8 +127,14 @@ module OpenTelemetry
121
127
  request.add_field('Content-Type', 'application/x-protobuf')
122
128
  @headers&.each { |key, value| request.add_field(key, value) }
123
129
 
130
+ remaining_timeout = OpenTelemetry::Common::Utilities.maybe_timeout(timeout, start_time)
131
+ return TIMEOUT if remaining_timeout.zero?
132
+
133
+ @http.open_timeout = remaining_timeout
134
+ @http.read_timeout = remaining_timeout
135
+ @http.write_timeout = remaining_timeout if WRITE_TIMEOUT_SUPPORTED
124
136
  @http.start unless @http.started?
125
- response = @http.request(request)
137
+ response = measure_request_duration { @http.request(request) }
126
138
 
127
139
  case response
128
140
  when Net::HTTPOK
@@ -130,11 +142,11 @@ module OpenTelemetry
130
142
  SUCCESS
131
143
  when Net::HTTPServiceUnavailable, Net::HTTPTooManyRequests
132
144
  response.body # Read and discard body
133
- redo if backoff?(retry_after: response['Retry-After'], retry_count: retry_count += 1)
145
+ redo if backoff?(retry_after: response['Retry-After'], retry_count: retry_count += 1, reason: response.code)
134
146
  FAILURE
135
147
  when Net::HTTPRequestTimeOut, Net::HTTPGatewayTimeOut, Net::HTTPBadGateway
136
148
  response.body # Read and discard body
137
- redo if backoff?(retry_count: retry_count += 1)
149
+ redo if backoff?(retry_count: retry_count += 1, reason: response.code)
138
150
  FAILURE
139
151
  when Net::HTTPBadRequest, Net::HTTPClientError, Net::HTTPServerError
140
152
  # TODO: decode the body as a google.rpc.Status Protobuf-encoded message when https://github.com/open-telemetry/opentelemetry-collector/issues/1357 is fixed.
@@ -143,15 +155,20 @@ module OpenTelemetry
143
155
  when Net::HTTPRedirection
144
156
  @http.finish
145
157
  handle_redirect(response['location'])
146
- redo if backoff?(retry_after: 0, retry_count: retry_count += 1)
158
+ redo if backoff?(retry_after: 0, retry_count: retry_count += 1, reason: response.code)
147
159
  else
148
160
  @http.finish
149
161
  FAILURE
150
162
  end
151
163
  rescue Net::OpenTimeout, Net::ReadTimeout
152
- retry if backoff?(retry_count: retry_count += 1)
164
+ retry if backoff?(retry_count: retry_count += 1, reason: 'timeout')
153
165
  return FAILURE
154
166
  end
167
+ ensure
168
+ # Reset timeouts to defaults for the next call.
169
+ @http.open_timeout = @timeout
170
+ @http.read_timeout = @timeout
171
+ @http.write_timeout = @timeout if WRITE_TIMEOUT_SUPPORTED
155
172
  end
156
173
 
157
174
  def handle_redirect(location)
@@ -162,9 +179,24 @@ module OpenTelemetry
162
179
  OpenTelemetry::Trace.with_span(OpenTelemetry::Trace::Span.new) { yield }
163
180
  end
164
181
 
182
+ def measure_request_duration
183
+ start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
184
+ begin
185
+ response = yield
186
+ ensure
187
+ stop = Process.clock_gettime(Process::CLOCK_MONOTONIC)
188
+ duration_ms = 1000.0 * (stop - start)
189
+ @metrics_reporter.record_value('otel.otlp_exporter.request_duration',
190
+ value: duration_ms,
191
+ labels: { 'status' => response&.code || 'unknown' })
192
+ end
193
+ end
194
+
165
195
  def backoff?(retry_after: nil, retry_count:, reason:)
166
196
  return false if retry_count > RETRY_COUNT
167
197
 
198
+ @metrics_reporter.add_to_counter('otel.otlp_exporter.failure', labels: { 'reason' => reason })
199
+
168
200
  sleep_interval = nil
169
201
  unless retry_after.nil?
170
202
  sleep_interval =
@@ -218,7 +250,7 @@ module OpenTelemetry
218
250
  Opentelemetry::Proto::Trace::V1::Span.new(
219
251
  trace_id: span_data.trace_id,
220
252
  span_id: span_data.span_id,
221
- trace_state: span_data.tracestate,
253
+ trace_state: span_data.tracestate.to_s,
222
254
  parent_span_id: span_data.parent_span_id == OpenTelemetry::Trace::INVALID_SPAN_ID ? nil : span_data.parent_span_id,
223
255
  name: span_data.name,
224
256
  kind: as_otlp_span_kind(span_data.kind),
@@ -239,7 +271,7 @@ module OpenTelemetry
239
271
  Opentelemetry::Proto::Trace::V1::Span::Link.new(
240
272
  trace_id: link.span_context.trace_id,
241
273
  span_id: link.span_context.span_id,
242
- trace_state: link.span_context.tracestate,
274
+ trace_state: link.span_context.tracestate.to_s,
243
275
  attributes: link.attributes&.map { |k, v| as_otlp_key_value(k, v) }
244
276
  # TODO: track dropped_attributes_count in Span#trim_links
245
277
  )
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright The OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
@@ -8,7 +8,7 @@ module OpenTelemetry
8
8
  module Exporter
9
9
  module OTLP
10
10
  ## Current OpenTelemetry OTLP exporter version
11
- VERSION = '0.8.0'
11
+ VERSION = '0.12.1'
12
12
  end
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,49 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-exporter-otlp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-27 00:00:00.000000000 Z
11
+ date: 2021-01-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 3.4.1.1
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '4'
19
+ version: '3.7'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: 3.4.1.1
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: '4'
26
+ version: '3.7'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: opentelemetry-api
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - "~>"
38
32
  - !ruby/object:Gem::Version
39
- version: 0.8.0
33
+ version: 0.12.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.12.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: opentelemetry-common
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.12.0
40
48
  type: :runtime
41
49
  prerelease: false
42
50
  version_requirements: !ruby/object:Gem::Requirement
43
51
  requirements:
44
52
  - - "~>"
45
53
  - !ruby/object:Gem::Version
46
- version: 0.8.0
54
+ version: 0.12.0
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: bundler
49
57
  requirement: !ruby/object:Gem::Requirement
@@ -193,10 +201,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
193
201
  licenses:
194
202
  - Apache-2.0
195
203
  metadata:
196
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.8.0/file.CHANGELOG.html
204
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.12.1/file.CHANGELOG.html
197
205
  source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/master/exporter/otlp
198
206
  bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
199
- documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.8.0
207
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.12.1
200
208
  post_install_message:
201
209
  rdoc_options: []
202
210
  require_paths: