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 +4 -4
- data/CHANGELOG.md +27 -0
- data/LICENSE +1 -1
- data/lib/opentelemetry/exporter/otlp/exporter.rb +51 -19
- data/lib/opentelemetry/exporter/otlp/version.rb +2 -2
- metadata +24 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2e42d5832a5e55dd263643260de2a092d8143b3c575ce1dbb413d6deffefef3
|
4
|
+
data.tar.gz: 62dca89af13815894f58d9a8732bae13bba9bad76743a53cecd18eaa327a2e55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c6c87c2f2d9c29ac6820724416eb5719069a9d77feb5610b1f35164e1a832163cc5f732434bd9936a44b9c03405fbdcf9e130badb61d4bf2f96ee6fa3404024
|
7
|
+
data.tar.gz: f8cb8d266ef97c6a7b51c8d08afa93df0632ecbe5f6ca82ec44e27b0904c2a8bfacf213536084ce6fb0ee390ee78012d3915bb685efb5f672f7a7d7ca99e9319
|
data/CHANGELOG.md
CHANGED
@@ -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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
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.
|
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.
|
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:
|
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: '
|
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: '
|
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.
|
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.
|
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.
|
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.
|
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:
|