opentelemetry-exporter-otlp 0.6.0 → 0.11.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7fb2bdcf07cb323140c330bf581d3fcd1a7202371a0be2d8ebe6df453b9ef880
4
- data.tar.gz: 381a17d0a1428c56fde01fa1096b5716ab069d030ff0c9311a9a151ddac7ffb9
3
+ metadata.gz: d07dd6897e62a261598a0ca5319d678e6d996b800f3fc73f2467bcc0c6fa899b
4
+ data.tar.gz: b0dbee8a937d627bc025c650dfe8013cac4e92a78a382523cc796ca996b20676
5
5
  SHA512:
6
- metadata.gz: 38a72e4e1112f5b0d4e706f0316e72d73ba6ae40301358843f51ba11938e6fed069a33598de3f8974f19168b4bfea9b8a90dd0d8354740f88b4e1de985a3551b
7
- data.tar.gz: 2819b77a20f46dd9a7aaa872ff17487963bbcf5005b539a9092d1a7c21aef752028220fc3bf7f80178e6ee93266f46120c2f7f02bc9f8a7fdafe90e151204855
6
+ metadata.gz: b847b754f84f5c488b9cf0dde660f4f4fc8c14938f07ae0eadc420b95691a4c7fe304cfb7cc43e56a57c496882167cb1b53136ea64b203bfbb7ed072a9e8ad24
7
+ data.tar.gz: 67654cd2493a263bf804a30ff4edba3834ba312d27c003baa93e630b59f004b355668af65d687849ff395380183af0b70c918e628789eec3e80f290fe2fbd9ae
data/.yardopts CHANGED
@@ -1,9 +1,9 @@
1
1
  --no-private
2
2
  --title=OpenTelemetry OTLP Exporter
3
3
  --markup=markdown
4
- --main=OVERVIEW.md
4
+ --main=README.md
5
5
  ./lib/opentelemetry/exporter/otlp/**/*.rb
6
6
  ./lib/opentelemetry/exporter/otlp.rb
7
7
  -
8
- OVERVIEW.md
8
+ README.md
9
9
  CHANGELOG.md
@@ -1,5 +1,42 @@
1
1
  # Release History: opentelemetry-exporter-otlp
2
2
 
3
+ ### v0.11.0 / 2020-12-11
4
+
5
+ * BREAKING CHANGE: Implement tracestate
6
+
7
+ * ADDED: Implement tracestate
8
+ * ADDED: Metrics reporting from trace export
9
+ * FIXED: Copyright comments to not reference year
10
+
11
+ ### v0.10.0 / 2020-12-03
12
+
13
+ * (No significant changes)
14
+
15
+ ### v0.9.0 / 2020-11-27
16
+
17
+ * BREAKING CHANGE: Add timeout for force_flush and shutdown
18
+
19
+ * ADDED: Add timeout for force_flush and shutdown
20
+ * FIXED: Remove unused kwarg from otlp exporter retry
21
+
22
+ ### v0.8.0 / 2020-10-27
23
+
24
+ * BREAKING CHANGE: Move context/span methods to Trace module
25
+ * BREAKING CHANGE: Remove 'canonical' from status codes
26
+ * BREAKING CHANGE: Assorted SpanContext fixes
27
+
28
+ * FIXED: Move context/span methods to Trace module
29
+ * FIXED: Remove 'canonical' from status codes
30
+ * FIXED: Add gzip support to OTLP exporter
31
+ * FIXED: Assorted SpanContext fixes
32
+
33
+ ### v0.7.0 / 2020-10-07
34
+
35
+ * FIXED: OTLP parent_span_id should be nil for root
36
+ * DOCS: Fix use of add_event in OTLP doc
37
+ * DOCS: Standardize toplevel docs structure and readme
38
+ * DOCS: Use BatchSpanProcessor in examples
39
+
3
40
  ### v0.6.0 / 2020-09-10
4
41
 
5
42
  * Initial release.
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.
data/README.md CHANGED
@@ -38,8 +38,8 @@ require 'opentelemetry/exporter/otlp'
38
38
  # Configure the sdk with custom export
39
39
  OpenTelemetry::SDK.configure do |c|
40
40
  c.add_span_processor(
41
- OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(
42
- OpenTelemetry::Exporter::OTLP::Exporter.new(
41
+ OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
42
+ exporter: OpenTelemetry::Exporter::OTLP::Exporter.new(
43
43
  host: 'localhost', port: 55680
44
44
  )
45
45
  )
@@ -54,7 +54,7 @@ tracer.in_span('foo') do |span|
54
54
  # set an attribute
55
55
  span.set_attribute('platform', 'osx')
56
56
  # add an event
57
- span.add_event(name: 'event in bar')
57
+ span.add_event('event in bar')
58
58
  # create bar as child of foo
59
59
  tracer.in_span('bar') do |child_span|
60
60
  # inspect the span
@@ -4,9 +4,11 @@
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'
11
+ require 'zlib'
10
12
 
11
13
  require 'opentelemetry/proto/common/v1/common_pb'
12
14
  require 'opentelemetry/proto/resource/v1/resource_pb'
@@ -20,23 +22,24 @@ module OpenTelemetry
20
22
  class Exporter # rubocop:disable Metrics/ClassLength
21
23
  SUCCESS = OpenTelemetry::SDK::Trace::Export::SUCCESS
22
24
  FAILURE = OpenTelemetry::SDK::Trace::Export::FAILURE
23
- private_constant(:SUCCESS, :FAILURE)
25
+ TIMEOUT = OpenTelemetry::SDK::Trace::Export::TIMEOUT
26
+ private_constant(:SUCCESS, :FAILURE, :TIMEOUT)
24
27
 
25
28
  # Default timeouts in seconds.
26
29
  KEEP_ALIVE_TIMEOUT = 30
27
- OPEN_TIMEOUT = 5
28
- READ_TIMEOUT = 5
29
30
  RETRY_COUNT = 5
30
- 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)
31
33
 
32
- 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
33
35
  insecure: config_opt('OTEL_EXPORTER_OTLP_SPAN_INSECURE', 'OTEL_EXPORTER_OTLP_INSECURE', default: false),
34
36
  certificate_file: config_opt('OTEL_EXPORTER_OTLP_SPAN_CERTIFICATE', 'OTEL_EXPORTER_OTLP_CERTIFICATE'),
35
37
  headers: config_opt('OTEL_EXPORTER_OTLP_SPAN_HEADERS', 'OTEL_EXPORTER_OTLP_HEADERS'), # TODO: what format is expected here?
36
38
  compression: config_opt('OTEL_EXPORTER_OTLP_SPAN_COMPRESSION', 'OTEL_EXPORTER_OTLP_COMPRESSION'),
37
- 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)
38
41
  raise ArgumentError, "invalid url for OTLP::Exporter #{endpoint}" if invalid_url?("http://#{endpoint}")
39
- raise ArgumentError, "unsupported compression key #{compression}" unless compression.nil?
42
+ raise ArgumentError, "unsupported compression key #{compression}" unless compression.nil? || compression == 'gzip'
40
43
  raise ArgumentError, 'headers must be comma-separated k:v pairs or a Hash' unless valid_headers?(headers)
41
44
 
42
45
  uri = URI "http://#{endpoint}"
@@ -44,8 +47,6 @@ module OpenTelemetry
44
47
  @http.use_ssl = insecure.to_s.downcase == 'false'
45
48
  @http.ca_file = certificate_file unless certificate_file.nil?
46
49
  @http.keep_alive_timeout = KEEP_ALIVE_TIMEOUT
47
- @http.open_timeout = OPEN_TIMEOUT
48
- @http.read_timeout = READ_TIMEOUT
49
50
 
50
51
  @path = uri.path
51
52
  @headers = case headers
@@ -53,7 +54,8 @@ module OpenTelemetry
53
54
  when Hash then headers
54
55
  end
55
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
56
- @tracer = OpenTelemetry.tracer_provider.tracer
57
+ @compression = compression
58
+ @metrics_reporter = metrics_reporter || OpenTelemetry::SDK::Trace::Export::MetricsReporter
57
59
 
58
60
  @shutdown = false
59
61
  end
@@ -63,17 +65,20 @@ module OpenTelemetry
63
65
  # @param [Enumerable<OpenTelemetry::SDK::Trace::SpanData>] span_data the
64
66
  # list of recorded {OpenTelemetry::SDK::Trace::SpanData} structs to be
65
67
  # exported.
68
+ # @param [optional Numeric] timeout An optional timeout in seconds.
66
69
  # @return [Integer] the result of the export.
67
- def export(span_data)
70
+ def export(span_data, timeout: nil)
68
71
  return FAILURE if @shutdown
69
72
 
70
- send_bytes(encode(span_data))
73
+ send_bytes(encode(span_data), timeout: timeout)
71
74
  end
72
75
 
73
76
  # Called when {OpenTelemetry::SDK::Trace::Tracer#shutdown} is called, if
74
77
  # this exporter is registered to a {OpenTelemetry::SDK::Trace::Tracer}
75
78
  # object.
76
- def shutdown
79
+ #
80
+ # @param [optional Numeric] timeout An optional timeout in seconds.
81
+ def shutdown(timeout: nil)
77
82
  @shutdown = true
78
83
  @http.finish if @http.started?
79
84
  end
@@ -107,18 +112,29 @@ module OpenTelemetry
107
112
  true
108
113
  end
109
114
 
110
- 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
111
116
  retry_count = 0
117
+ timeout ||= @timeout
118
+ start_time = Time.now
112
119
  untraced do # rubocop:disable Metrics/BlockLength
113
120
  request = Net::HTTP::Post.new(@path)
114
- request.body = bytes
121
+ request.body = if @compression == 'gzip'
122
+ request.add_field('Content-Encoding', 'gzip')
123
+ Zlib.gzip(bytes)
124
+ else
125
+ bytes
126
+ end
115
127
  request.add_field('Content-Type', 'application/x-protobuf')
116
128
  @headers&.each { |key, value| request.add_field(key, value) }
117
- # TODO: enable gzip when https://github.com/open-telemetry/opentelemetry-collector/issues/1344 is fixed.
118
- # request.add_field('Content-Encoding', 'gzip')
119
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
120
136
  @http.start unless @http.started?
121
- response = @http.request(request)
137
+ response = measure_request_duration { @http.request(request) }
122
138
 
123
139
  case response
124
140
  when Net::HTTPOK
@@ -126,11 +142,11 @@ module OpenTelemetry
126
142
  SUCCESS
127
143
  when Net::HTTPServiceUnavailable, Net::HTTPTooManyRequests
128
144
  response.body # Read and discard body
129
- 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)
130
146
  FAILURE
131
147
  when Net::HTTPRequestTimeOut, Net::HTTPGatewayTimeOut, Net::HTTPBadGateway
132
148
  response.body # Read and discard body
133
- redo if backoff?(retry_count: retry_count += 1)
149
+ redo if backoff?(retry_count: retry_count += 1, reason: response.code)
134
150
  FAILURE
135
151
  when Net::HTTPBadRequest, Net::HTTPClientError, Net::HTTPServerError
136
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.
@@ -139,15 +155,20 @@ module OpenTelemetry
139
155
  when Net::HTTPRedirection
140
156
  @http.finish
141
157
  handle_redirect(response['location'])
142
- 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)
143
159
  else
144
160
  @http.finish
145
161
  FAILURE
146
162
  end
147
163
  rescue Net::OpenTimeout, Net::ReadTimeout
148
- retry if backoff?(retry_count: retry_count += 1)
164
+ retry if backoff?(retry_count: retry_count += 1, reason: 'timeout')
149
165
  return FAILURE
150
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
151
172
  end
152
173
 
153
174
  def handle_redirect(location)
@@ -155,12 +176,27 @@ module OpenTelemetry
155
176
  end
156
177
 
157
178
  def untraced
158
- @tracer.with_span(OpenTelemetry::Trace::Span.new) { yield }
179
+ OpenTelemetry::Trace.with_span(OpenTelemetry::Trace::Span.new) { yield }
180
+ end
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
159
193
  end
160
194
 
161
195
  def backoff?(retry_after: nil, retry_count:, reason:)
162
196
  return false if retry_count > RETRY_COUNT
163
197
 
198
+ @metrics_reporter.add_to_counter('otel.otlp_exporter.failure', labels: { 'reason' => reason })
199
+
164
200
  sleep_interval = nil
165
201
  unless retry_after.nil?
166
202
  sleep_interval =
@@ -214,8 +250,8 @@ module OpenTelemetry
214
250
  Opentelemetry::Proto::Trace::V1::Span.new(
215
251
  trace_id: span_data.trace_id,
216
252
  span_id: span_data.span_id,
217
- trace_state: span_data.tracestate,
218
- parent_span_id: span_data.parent_span_id,
253
+ trace_state: span_data.tracestate.to_s,
254
+ parent_span_id: span_data.parent_span_id == OpenTelemetry::Trace::INVALID_SPAN_ID ? nil : span_data.parent_span_id,
219
255
  name: span_data.name,
220
256
  kind: as_otlp_span_kind(span_data.kind),
221
257
  start_time_unix_nano: as_otlp_timestamp(span_data.start_timestamp),
@@ -233,17 +269,18 @@ module OpenTelemetry
233
269
  dropped_events_count: span_data.total_recorded_events - span_data.events&.size.to_i,
234
270
  links: span_data.links&.map do |link|
235
271
  Opentelemetry::Proto::Trace::V1::Span::Link.new(
236
- trace_id: link.context.trace_id,
237
- span_id: link.context.span_id,
238
- trace_state: link.context.tracestate,
272
+ trace_id: link.span_context.trace_id,
273
+ span_id: link.span_context.span_id,
274
+ trace_state: link.span_context.tracestate.to_s,
239
275
  attributes: link.attributes&.map { |k, v| as_otlp_key_value(k, v) }
240
276
  # TODO: track dropped_attributes_count in Span#trim_links
241
277
  )
242
278
  end,
243
279
  dropped_links_count: span_data.total_recorded_links - span_data.links&.size.to_i,
244
280
  status: span_data.status&.yield_self do |status|
281
+ # TODO: fix this based on spec update.
245
282
  Opentelemetry::Proto::Trace::V1::Status.new(
246
- code: status.canonical_code,
283
+ code: status.code == OpenTelemetry::Trace::Status::ERROR ? Opentelemetry::Proto::Trace::V1::Status::StatusCode::UnknownError : Opentelemetry::Proto::Trace::V1::Status::StatusCode::Ok,
247
284
  message: status.description
248
285
  )
249
286
  end
@@ -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.6.0'
11
+ VERSION = '0.11.0'
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.6.0
4
+ version: 0.11.0
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-09-11 00:00:00.000000000 Z
11
+ date: 2020-12-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -36,14 +36,28 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 0.6.0
39
+ version: 0.11.0
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 0.6.0
46
+ version: 0.11.0
47
+ - !ruby/object:Gem::Dependency
48
+ name: opentelemetry-common
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.11.0
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.11.0
47
61
  - !ruby/object:Gem::Dependency
48
62
  name: bundler
49
63
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +206,11 @@ files:
192
206
  homepage: https://github.com/open-telemetry/opentelemetry-ruby
193
207
  licenses:
194
208
  - Apache-2.0
195
- metadata: {}
209
+ metadata:
210
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.11.0/file.CHANGELOG.html
211
+ source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/master/exporter/otlp
212
+ bug_tracker_uri: https://github.com/open-telemetry/opentelemetry-ruby/issues
213
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.11.0
196
214
  post_install_message:
197
215
  rdoc_options: []
198
216
  require_paths:
@@ -208,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
208
226
  - !ruby/object:Gem::Version
209
227
  version: '0'
210
228
  requirements: []
211
- rubygems_version: 3.1.2
229
+ rubygems_version: 3.1.4
212
230
  signing_key:
213
231
  specification_version: 4
214
232
  summary: OTLP exporter for the OpenTelemetry framework