opentelemetry-exporter-otlp 0.8.0 → 0.12.1

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: 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: