opentelemetry-exporter-otlp 0.6.0 → 0.11.0

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