opentelemetry-exporter-otlp 0.9.0 → 0.13.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: 7422364466e3ef80afdaf0e64bce127f2b6c282b926521d44c5a92a41ab7af8e
4
- data.tar.gz: 4ade3413f85673da608dc9e0ecc5a083edc2991751121d91f19d3b0025d37020
3
+ metadata.gz: 9fbf898ad6ec63bdad04f4d2d16831be09d77c0b623c68b57db924853c193d3c
4
+ data.tar.gz: 6546ffa54907ff60781d1c4b2e51ceb0e3bf62046e813e820e0de1f807b32a37
5
5
  SHA512:
6
- metadata.gz: bed0bf05f7c85a78ea08d0c7a7920396fdf8619b50bde257908eb0bbb9139bb6883ac858153032e10c19408319a200ff2127a0589ed22f4055f97cb1ff7f425e
7
- data.tar.gz: 0ecfe8df94c4838736fd6a84a5a9672f470973b6c3c5941403dd1ce3975ed6ec3eac6b3f78609aed9995a3f6a301c133be7880f7e2b6223ac364fd51f3d1e73a
6
+ metadata.gz: fc956ce9f389366057f4dc13bc1de3a66bdde83c2238ee0aa4a87fd362d2834b6e2e6dcf73e95f1218328a49404b4e19fd6aff9b18ef46a2369b9b6db3a3d2af
7
+ data.tar.gz: ff4058399c35eb0092fb707a34c8cf189a135da3a0d7cc038be243413cd8c9a8100203e614b8a31042b461f961b29ab3a7558af9693c488f41606bb27af16895
@@ -1,5 +1,35 @@
1
1
  # Release History: opentelemetry-exporter-otlp
2
2
 
3
+ ### v0.13.0 / 2021-01-29
4
+
5
+ * BREAKING CHANGE: Spec compliance for OTLP exporter
6
+
7
+ * ADDED: Add untraced wrapper to common utils
8
+ * FIXED: Spec compliance for OTLP exporter
9
+ * FIXED: Conditionally append path to collector endpoint
10
+ * FIXED: OTLP path should be /v1/traces
11
+ * FIXED: Rename OTLP env vars SPAN -> TRACES
12
+
13
+ ### v0.12.1 / 2021-01-13
14
+
15
+ * FIXED: Updated protobuf version dependency
16
+
17
+ ### v0.12.0 / 2020-12-24
18
+
19
+ * (No significant changes)
20
+
21
+ ### v0.11.0 / 2020-12-11
22
+
23
+ * BREAKING CHANGE: Implement tracestate
24
+
25
+ * ADDED: Implement tracestate
26
+ * ADDED: Metrics reporting from trace export
27
+ * FIXED: Copyright comments to not reference year
28
+
29
+ ### v0.10.0 / 2020-12-03
30
+
31
+ * (No significant changes)
32
+
3
33
  ### v0.9.0 / 2020-11-27
4
34
 
5
35
  * BREAKING CHANGE: Add timeout for force_flush and shutdown
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
@@ -40,7 +40,7 @@ OpenTelemetry::SDK.configure do |c|
40
40
  c.add_span_processor(
41
41
  OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
42
42
  exporter: OpenTelemetry::Exporter::OTLP::Exporter.new(
43
- host: 'localhost', port: 55680
43
+ endpoint: 'http://localhost:55680'
44
44
  )
45
45
  )
46
46
  )
@@ -80,8 +80,8 @@ The `opentelemetry-exporter-otlp` gem is distributed under the Apache 2.0 licens
80
80
  [opentelemetry-home]: https://opentelemetry.io
81
81
  [bundler-home]: https://bundler.io
82
82
  [repo-github]: https://github.com/open-telemetry/opentelemetry-ruby
83
- [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/master/LICENSE
84
- [examples-github]: https://github.com/open-telemetry/opentelemetry-ruby/tree/master/examples
83
+ [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/main/LICENSE
84
+ [examples-github]: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/examples
85
85
  [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
86
86
  [community-meetings]: https://github.com/open-telemetry/community#community-meetings
87
87
  [ruby-gitter]: https://gitter.im/open-telemetry/opentelemetry-ruby
@@ -31,29 +31,35 @@ 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
- 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
35
- insecure: config_opt('OTEL_EXPORTER_OTLP_SPAN_INSECURE', 'OTEL_EXPORTER_OTLP_INSECURE', default: false),
36
- certificate_file: config_opt('OTEL_EXPORTER_OTLP_SPAN_CERTIFICATE', 'OTEL_EXPORTER_OTLP_CERTIFICATE'),
37
- headers: config_opt('OTEL_EXPORTER_OTLP_SPAN_HEADERS', 'OTEL_EXPORTER_OTLP_HEADERS'), # TODO: what format is expected here?
38
- compression: config_opt('OTEL_EXPORTER_OTLP_SPAN_COMPRESSION', 'OTEL_EXPORTER_OTLP_COMPRESSION'),
39
- timeout: config_opt('OTEL_EXPORTER_OTLP_SPAN_TIMEOUT', 'OTEL_EXPORTER_OTLP_TIMEOUT', default: 10))
40
- raise ArgumentError, "invalid url for OTLP::Exporter #{endpoint}" if invalid_url?("http://#{endpoint}")
34
+ 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
35
+ certificate_file: config_opt('OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE', 'OTEL_EXPORTER_OTLP_CERTIFICATE'),
36
+ headers: config_opt('OTEL_EXPORTER_OTLP_TRACES_HEADERS', 'OTEL_EXPORTER_OTLP_HEADERS'),
37
+ compression: config_opt('OTEL_EXPORTER_OTLP_TRACES_COMPRESSION', 'OTEL_EXPORTER_OTLP_COMPRESSION'),
38
+ timeout: config_opt('OTEL_EXPORTER_OTLP_TRACES_TIMEOUT', 'OTEL_EXPORTER_OTLP_TIMEOUT', default: 10),
39
+ metrics_reporter: nil)
40
+ raise ArgumentError, "invalid url for OTLP::Exporter #{endpoint}" if invalid_url?(endpoint)
41
41
  raise ArgumentError, "unsupported compression key #{compression}" unless compression.nil? || compression == 'gzip'
42
- raise ArgumentError, 'headers must be comma-separated k:v pairs or a Hash' unless valid_headers?(headers)
42
+ raise ArgumentError, 'headers must be comma-separated k=v pairs or a Hash' unless valid_headers?(headers)
43
+
44
+ uri = if endpoint == ENV['OTEL_EXPORTER_OTLP_ENDPOINT']
45
+ URI("#{endpoint}/v1/traces")
46
+ else
47
+ URI(endpoint)
48
+ end
43
49
 
44
- uri = URI "http://#{endpoint}"
45
50
  @http = Net::HTTP.new(uri.host, uri.port)
46
- @http.use_ssl = insecure.to_s.downcase == 'false'
51
+ @http.use_ssl = uri.scheme == 'https'
47
52
  @http.ca_file = certificate_file unless certificate_file.nil?
48
53
  @http.keep_alive_timeout = KEEP_ALIVE_TIMEOUT
49
54
 
50
55
  @path = uri.path
51
56
  @headers = case headers
52
- when String then CSV.parse(headers, col_sep: ':', row_sep: ',').to_h
57
+ when String then CSV.parse(headers, col_sep: '=', row_sep: ',').to_h
53
58
  when Hash then headers
54
59
  end
55
- @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
60
+ @timeout = timeout.to_f
56
61
  @compression = compression
62
+ @metrics_reporter = metrics_reporter || OpenTelemetry::SDK::Trace::Export::MetricsReporter
57
63
 
58
64
  @shutdown = false
59
65
  end
@@ -95,7 +101,7 @@ module OpenTelemetry
95
101
  return true if headers.nil? || headers.is_a?(Hash)
96
102
  return false unless headers.is_a?(String)
97
103
 
98
- CSV.parse(headers, col_sep: ':', row_sep: ',').to_h
104
+ CSV.parse(headers, col_sep: '=', row_sep: ',').to_h
99
105
  true
100
106
  rescue ArgumentError
101
107
  false
@@ -104,8 +110,8 @@ module OpenTelemetry
104
110
  def invalid_url?(url)
105
111
  return true if url.nil? || url.strip.empty?
106
112
 
107
- uri = URI(url)
108
- uri.path.nil? || uri.path.empty?
113
+ URI(url)
114
+ false
109
115
  rescue URI::InvalidURIError
110
116
  true
111
117
  end
@@ -114,7 +120,7 @@ module OpenTelemetry
114
120
  retry_count = 0
115
121
  timeout ||= @timeout
116
122
  start_time = Time.now
117
- untraced do # rubocop:disable Metrics/BlockLength
123
+ OpenTelemetry::Common::Utilities.untraced do # rubocop:disable Metrics/BlockLength
118
124
  request = Net::HTTP::Post.new(@path)
119
125
  request.body = if @compression == 'gzip'
120
126
  request.add_field('Content-Encoding', 'gzip')
@@ -132,7 +138,7 @@ module OpenTelemetry
132
138
  @http.read_timeout = remaining_timeout
133
139
  @http.write_timeout = remaining_timeout if WRITE_TIMEOUT_SUPPORTED
134
140
  @http.start unless @http.started?
135
- response = @http.request(request)
141
+ response = measure_request_duration { @http.request(request) }
136
142
 
137
143
  case response
138
144
  when Net::HTTPOK
@@ -140,11 +146,11 @@ module OpenTelemetry
140
146
  SUCCESS
141
147
  when Net::HTTPServiceUnavailable, Net::HTTPTooManyRequests
142
148
  response.body # Read and discard body
143
- redo if backoff?(retry_after: response['Retry-After'], retry_count: retry_count += 1)
149
+ redo if backoff?(retry_after: response['Retry-After'], retry_count: retry_count += 1, reason: response.code)
144
150
  FAILURE
145
151
  when Net::HTTPRequestTimeOut, Net::HTTPGatewayTimeOut, Net::HTTPBadGateway
146
152
  response.body # Read and discard body
147
- redo if backoff?(retry_count: retry_count += 1)
153
+ redo if backoff?(retry_count: retry_count += 1, reason: response.code)
148
154
  FAILURE
149
155
  when Net::HTTPBadRequest, Net::HTTPClientError, Net::HTTPServerError
150
156
  # TODO: decode the body as a google.rpc.Status Protobuf-encoded message when https://github.com/open-telemetry/opentelemetry-collector/issues/1357 is fixed.
@@ -153,13 +159,13 @@ module OpenTelemetry
153
159
  when Net::HTTPRedirection
154
160
  @http.finish
155
161
  handle_redirect(response['location'])
156
- redo if backoff?(retry_after: 0, retry_count: retry_count += 1)
162
+ redo if backoff?(retry_after: 0, retry_count: retry_count += 1, reason: response.code)
157
163
  else
158
164
  @http.finish
159
165
  FAILURE
160
166
  end
161
167
  rescue Net::OpenTimeout, Net::ReadTimeout
162
- retry if backoff?(retry_count: retry_count += 1)
168
+ retry if backoff?(retry_count: retry_count += 1, reason: 'timeout')
163
169
  return FAILURE
164
170
  end
165
171
  ensure
@@ -173,13 +179,24 @@ module OpenTelemetry
173
179
  # TODO: figure out destination and reinitialize @http and @path
174
180
  end
175
181
 
176
- def untraced
177
- OpenTelemetry::Trace.with_span(OpenTelemetry::Trace::Span.new) { yield }
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
178
193
  end
179
194
 
180
- def backoff?(retry_after: nil, retry_count:)
195
+ def backoff?(retry_after: nil, retry_count:, reason:)
181
196
  return false if retry_count > RETRY_COUNT
182
197
 
198
+ @metrics_reporter.add_to_counter('otel.otlp_exporter.failure', labels: { 'reason' => reason })
199
+
183
200
  sleep_interval = nil
184
201
  unless retry_after.nil?
185
202
  sleep_interval =
@@ -233,7 +250,7 @@ module OpenTelemetry
233
250
  Opentelemetry::Proto::Trace::V1::Span.new(
234
251
  trace_id: span_data.trace_id,
235
252
  span_id: span_data.span_id,
236
- trace_state: span_data.tracestate,
253
+ trace_state: span_data.tracestate.to_s,
237
254
  parent_span_id: span_data.parent_span_id == OpenTelemetry::Trace::INVALID_SPAN_ID ? nil : span_data.parent_span_id,
238
255
  name: span_data.name,
239
256
  kind: as_otlp_span_kind(span_data.kind),
@@ -254,7 +271,7 @@ module OpenTelemetry
254
271
  Opentelemetry::Proto::Trace::V1::Span::Link.new(
255
272
  trace_id: link.span_context.trace_id,
256
273
  span_id: link.span_context.span_id,
257
- trace_state: link.span_context.tracestate,
274
+ trace_state: link.span_context.tracestate.to_s,
258
275
  attributes: link.attributes&.map { |k, v| as_otlp_key_value(k, v) }
259
276
  # TODO: track dropped_attributes_count in Span#trim_links
260
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.9.0'
11
+ VERSION = '0.13.0'
12
12
  end
13
13
  end
14
14
  end
metadata CHANGED
@@ -1,63 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-exporter-otlp
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.13.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-11-28 00:00:00.000000000 Z
11
+ date: 2021-01-30 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.9.0
33
+ version: 0.13.0
40
34
  type: :runtime
41
35
  prerelease: false
42
36
  version_requirements: !ruby/object:Gem::Requirement
43
37
  requirements:
44
38
  - - "~>"
45
39
  - !ruby/object:Gem::Version
46
- version: 0.9.0
40
+ version: 0.13.0
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: opentelemetry-common
49
43
  requirement: !ruby/object:Gem::Requirement
50
44
  requirements:
51
45
  - - "~>"
52
46
  - !ruby/object:Gem::Version
53
- version: 0.9.0
47
+ version: 0.13.0
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
51
  requirements:
58
52
  - - "~>"
59
53
  - !ruby/object:Gem::Version
60
- version: 0.9.0
54
+ version: 0.13.0
61
55
  - !ruby/object:Gem::Dependency
62
56
  name: bundler
63
57
  requirement: !ruby/object:Gem::Requirement
@@ -207,10 +201,10 @@ homepage: https://github.com/open-telemetry/opentelemetry-ruby
207
201
  licenses:
208
202
  - Apache-2.0
209
203
  metadata:
210
- changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.9.0/file.CHANGELOG.html
211
- source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/master/exporter/otlp
204
+ changelog_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.13.0/file.CHANGELOG.html
205
+ source_code_uri: https://github.com/open-telemetry/opentelemetry-ruby/tree/main/exporter/otlp
212
206
  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.9.0
207
+ documentation_uri: https://open-telemetry.github.io/opentelemetry-ruby/opentelemetry-exporter-otlp/v0.13.0
214
208
  post_install_message:
215
209
  rdoc_options: []
216
210
  require_paths: