uptrace 1.0.0.rc1 → 1.0.2
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 +16 -0
- data/README.md +19 -14
- data/lib/uptrace/client.rb +3 -14
- data/lib/uptrace/dsn.rb +25 -7
- data/lib/uptrace/version.rb +1 -1
- data/lib/uptrace.rb +21 -3
- metadata +29 -39
- data/lib/uptrace/metric.rb +0 -7
- data/lib/uptrace/trace/exporter.rb +0 -224
- data/lib/uptrace/trace.rb +0 -9
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6666340ea7b7556a09c06a41878efdd58bb10b4d05cdc711654189e01eec4011
|
|
4
|
+
data.tar.gz: 78c26e6a6f6e59e2ac01fd14a872a5c9c164e72431238d5c8d79322201fd1a20
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b3780a0f3fa9841f4883618f0a7b28f1ec86e046e0f99c90ab6a5ffc0bd7a6c3e2ab3a004c2c3f7f848a62afbea5c9d699ecb07105f4f398c4594c6ce52099bf
|
|
7
|
+
data.tar.gz: '08270a500502c272d6eda9f96eab25909ea26a834e070ba8d6c4cb7ab7ccfee428d2094c63a353402c1a720b03d11fe7a3f95dad8e09171ad879df96eb2e3466'
|
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.0.1 - 2021-11-08
|
|
4
|
+
|
|
5
|
+
- Updated OpenTelemetry to
|
|
6
|
+
[v1.0.1](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/sdk/CHANGELOG.md#v101--2021-10-29).
|
|
7
|
+
|
|
8
|
+
## v1.0.0 - 2021-10-06
|
|
9
|
+
|
|
10
|
+
- Updated OpenTelemetry to
|
|
11
|
+
[v1.0.0](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/api/CHANGELOG.md#v100--2021-09-29).
|
|
12
|
+
|
|
13
|
+
## v1.0.0.rc3 - 2021-08-17
|
|
14
|
+
|
|
15
|
+
- Updated OpenTelemetry to
|
|
16
|
+
[v1.0.0.rc3](https://github.com/open-telemetry/opentelemetry-ruby/blob/main/api/CHANGELOG.md#v100rc3--2021-08-12).
|
|
17
|
+
- Switched to using OTLP protocol.
|
|
18
|
+
|
|
3
19
|
## v1.0.0.rc1 - 2021-05-22
|
|
4
20
|
|
|
5
21
|
- Updated OpenTelemetry to
|
data/README.md
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
# Uptrace Ruby exporter for OpenTelemetry
|
|
2
2
|
|
|
3
3
|

|
|
4
|
-
[](https://docs.uptrace.dev/ruby
|
|
4
|
+
[](https://docs.uptrace.dev/guide/ruby.html)
|
|
5
5
|
|
|
6
|
-
<a href="https://docs.uptrace.dev/ruby
|
|
6
|
+
<a href="https://docs.uptrace.dev/guide/ruby.html">
|
|
7
7
|
<img src="https://docs.uptrace.dev/devicon/ruby-original.svg" height="200px" />
|
|
8
8
|
</a>
|
|
9
9
|
|
|
10
10
|
## Introduction
|
|
11
11
|
|
|
12
12
|
uptrace-ruby is an OpenTelemery distribution configured to export
|
|
13
|
-
[traces](https://
|
|
13
|
+
[traces](https://opentelemetry.uptrace.dev/guide/distributed-tracing.html) to Uptrace.
|
|
14
14
|
|
|
15
15
|
## Quickstart
|
|
16
16
|
|
|
@@ -30,33 +30,38 @@ require 'rubygems'
|
|
|
30
30
|
require 'bundler/setup'
|
|
31
31
|
require 'uptrace'
|
|
32
32
|
|
|
33
|
-
OpenTelemetry
|
|
33
|
+
# Configure OpenTelemetry with sensible defaults.
|
|
34
|
+
# Copy your project DSN here or use UPTRACE_DSN env var.
|
|
35
|
+
Uptrace.configure_opentelemetry(dsn: '') do |c|
|
|
36
|
+
# c is OpenTelemetry::SDK::Configurator
|
|
34
37
|
c.service_name = 'myservice'
|
|
35
38
|
c.service_version = '1.0.0'
|
|
36
|
-
|
|
37
|
-
# Configure OpenTelemetry to export data to Uptrace.
|
|
38
|
-
# Copy your project DSN here or use UPTRACE_DSN env var.
|
|
39
|
-
Uptrace.configure_opentelemetry(c, dsn: '')
|
|
40
39
|
end
|
|
41
40
|
|
|
41
|
+
# Create a tracer. Usually, tracer is a global variable.
|
|
42
42
|
tracer = OpenTelemetry.tracer_provider.tracer('my_app_or_gem', '0.1.0')
|
|
43
43
|
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
# Create a root span (a trace) to measure some operation.
|
|
45
|
+
tracer.in_span('main-operation') do |main|
|
|
46
|
+
tracer.in_span('child1-of-main') do |child1|
|
|
46
47
|
child1.set_attribute('key1', 'value1')
|
|
47
48
|
child1.record_exception(ArgumentError.new('error1'))
|
|
48
49
|
end
|
|
49
50
|
|
|
50
|
-
tracer.in_span('child2') do |child2|
|
|
51
|
+
tracer.in_span('child2-of-main') do |child2|
|
|
51
52
|
child2.set_attribute('key2', '24')
|
|
52
53
|
child2.set_attribute('key3', 123.456)
|
|
53
54
|
end
|
|
54
55
|
|
|
55
|
-
puts("trace URL: #{Uptrace.trace_url(
|
|
56
|
+
puts("trace URL: #{Uptrace.trace_url(main)}")
|
|
56
57
|
end
|
|
57
58
|
|
|
58
|
-
# Send buffered spans.
|
|
59
|
+
# Send buffered spans and free resources.
|
|
59
60
|
OpenTelemetry.tracer_provider.shutdown
|
|
60
61
|
```
|
|
61
62
|
|
|
62
|
-
|
|
63
|
+
## Links
|
|
64
|
+
|
|
65
|
+
- [Examples](example)
|
|
66
|
+
- [Documentation](https://docs.uptrace.dev/guide/ruby.html)
|
|
67
|
+
- [Instrumentations](https://opentelemetry.uptrace.dev/instrumentations.html?lang=ruby)
|
data/lib/uptrace/client.rb
CHANGED
|
@@ -5,6 +5,8 @@ require 'opentelemetry/sdk'
|
|
|
5
5
|
module Uptrace
|
|
6
6
|
# Uptrace client that configures OpenTelemetry SDK to use Uptrace exporter.
|
|
7
7
|
class Client
|
|
8
|
+
attr_reader :dsn
|
|
9
|
+
|
|
8
10
|
# @param [string] dsn
|
|
9
11
|
def initialize(dsn: '')
|
|
10
12
|
dsn = ENV.fetch('UPTRACE_DSN', '') if dsn.empty?
|
|
@@ -27,21 +29,8 @@ module Uptrace
|
|
|
27
29
|
# @return [String]
|
|
28
30
|
def trace_url(span = nil)
|
|
29
31
|
span = OpenTelemetry::Trace.current_span if span.nil?
|
|
30
|
-
|
|
31
|
-
host = @dsn.host.delete_prefix('api.')
|
|
32
32
|
trace_id = span.context.hex_trace_id
|
|
33
|
-
"#{@dsn.
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# @return [OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor]
|
|
37
|
-
def span_processor
|
|
38
|
-
exp = Uptrace::Trace::Exporter.new(@dsn)
|
|
39
|
-
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
|
|
40
|
-
exp,
|
|
41
|
-
max_queue_size: 1000,
|
|
42
|
-
max_export_batch_size: 1000,
|
|
43
|
-
schedule_delay: 5_000
|
|
44
|
-
)
|
|
33
|
+
"#{@dsn.app_addr}/traces/#{trace_id}"
|
|
45
34
|
end
|
|
46
35
|
end
|
|
47
36
|
end
|
data/lib/uptrace/dsn.rb
CHANGED
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
module Uptrace
|
|
4
4
|
# Uptrace DSN
|
|
5
5
|
class DSN
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
attr_reader :dsn, :port, *KEYS
|
|
6
|
+
attr_reader :dsn, :scheme, :host, :port, :project_id, :token
|
|
9
7
|
|
|
10
8
|
def initialize(dsn)
|
|
11
9
|
raise ArgumentError, "DSN can't be empty" if dsn.empty?
|
|
@@ -17,13 +15,21 @@ module Uptrace
|
|
|
17
15
|
end
|
|
18
16
|
|
|
19
17
|
@dsn = dsn
|
|
20
|
-
@
|
|
21
|
-
@token = uri.user
|
|
18
|
+
@scheme = uri.scheme
|
|
22
19
|
@host = uri.host
|
|
23
20
|
@port = uri.port
|
|
24
|
-
@
|
|
21
|
+
@project_id = uri.path.delete_prefix('/')
|
|
22
|
+
@token = uri.user
|
|
23
|
+
|
|
24
|
+
%w[scheme host].each do |k|
|
|
25
|
+
v = public_send(k)
|
|
26
|
+
raise ArgumentError, %(DSN=#{dsn.inspect} does not have a #{k}) if v.nil? || v.empty?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
@host = 'uptrace.dev' if @host == 'api.uptrace.dev'
|
|
30
|
+
return if @host != 'uptrace.dev'
|
|
25
31
|
|
|
26
|
-
|
|
32
|
+
%w[project_id token].each do |k|
|
|
27
33
|
v = public_send(k)
|
|
28
34
|
raise ArgumentError, %(DSN=#{dsn.inspect} does not have a #{k}) if v.nil? || v.empty?
|
|
29
35
|
end
|
|
@@ -32,5 +38,17 @@ module Uptrace
|
|
|
32
38
|
def to_s
|
|
33
39
|
@dsn
|
|
34
40
|
end
|
|
41
|
+
|
|
42
|
+
def app_addr
|
|
43
|
+
return 'https://app.uptrace.dev' if @host == 'uptrace.dev'
|
|
44
|
+
|
|
45
|
+
"#{@scheme}://#{@host}:#{@port}"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def otlp_addr
|
|
49
|
+
return 'https://otlp.uptrace.dev' if @host == 'uptrace.dev'
|
|
50
|
+
|
|
51
|
+
"#{@scheme}://#{@host}:#{@port}"
|
|
52
|
+
end
|
|
35
53
|
end
|
|
36
54
|
end
|
data/lib/uptrace/version.rb
CHANGED
data/lib/uptrace.rb
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
require 'logger'
|
|
4
4
|
|
|
5
|
+
require 'opentelemetry/exporter/otlp'
|
|
6
|
+
|
|
5
7
|
# Uptrace provides Uptrace exporters for OpenTelemetry.
|
|
6
8
|
module Uptrace
|
|
7
9
|
extend self
|
|
@@ -19,7 +21,7 @@ module Uptrace
|
|
|
19
21
|
# @param [optional OpenTelemetry::Trace::Span] span
|
|
20
22
|
# @return [String]
|
|
21
23
|
def trace_url(span = nil)
|
|
22
|
-
client.trace_url(span)
|
|
24
|
+
@client.trace_url(span)
|
|
23
25
|
end
|
|
24
26
|
|
|
25
27
|
# ConfigureOpentelemetry configures OpenTelemetry to export data to Uptrace.
|
|
@@ -31,14 +33,30 @@ module Uptrace
|
|
|
31
33
|
def configure_opentelemetry(dsn: '')
|
|
32
34
|
OpenTelemetry::SDK.configure do |c|
|
|
33
35
|
@client = Client.new(dsn: dsn) unless dsn.empty?
|
|
34
|
-
c.add_span_processor(client.
|
|
36
|
+
c.add_span_processor(span_processor(@client.dsn)) unless client.disabled?
|
|
35
37
|
|
|
36
38
|
yield c if block_given?
|
|
37
39
|
end
|
|
38
40
|
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def span_processor(dsn)
|
|
45
|
+
exporter = OpenTelemetry::Exporter::OTLP::Exporter.new(
|
|
46
|
+
endpoint: "#{dsn.otlp_addr}/v1/traces",
|
|
47
|
+
# Set the Uptrace DSN here or use UPTRACE_DSN env var.
|
|
48
|
+
headers: { 'uptrace-dsn': dsn.to_s },
|
|
49
|
+
compression: 'gzip'
|
|
50
|
+
)
|
|
51
|
+
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
|
|
52
|
+
exporter,
|
|
53
|
+
max_queue_size: 1000,
|
|
54
|
+
max_export_batch_size: 1000,
|
|
55
|
+
schedule_delay: 5_000
|
|
56
|
+
)
|
|
57
|
+
end
|
|
39
58
|
end
|
|
40
59
|
|
|
41
60
|
require 'uptrace/version'
|
|
42
61
|
require 'uptrace/dsn'
|
|
43
62
|
require 'uptrace/client'
|
|
44
|
-
require 'uptrace/trace'
|
metadata
CHANGED
|
@@ -1,71 +1,63 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: uptrace
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.0.
|
|
4
|
+
version: 1.0.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Uptrace Authors
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-12-24 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
|
-
name:
|
|
14
|
+
name: opentelemetry-exporter-otlp
|
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
|
16
16
|
requirements:
|
|
17
|
-
- - "
|
|
18
|
-
- !ruby/object:Gem::Version
|
|
19
|
-
version: 1.4.2
|
|
20
|
-
type: :runtime
|
|
21
|
-
prerelease: false
|
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
-
requirements:
|
|
24
|
-
- - "~>"
|
|
17
|
+
- - ">="
|
|
25
18
|
- !ruby/object:Gem::Version
|
|
26
|
-
version:
|
|
27
|
-
-
|
|
28
|
-
name: opentelemetry-sdk
|
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
|
30
|
-
requirements:
|
|
31
|
-
- - "~>"
|
|
19
|
+
version: 0.20.5
|
|
20
|
+
- - "<"
|
|
32
21
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
22
|
+
version: 0.22.0
|
|
34
23
|
type: :runtime
|
|
35
24
|
prerelease: false
|
|
36
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
26
|
requirements:
|
|
38
|
-
- - "
|
|
27
|
+
- - ">="
|
|
28
|
+
- !ruby/object:Gem::Version
|
|
29
|
+
version: 0.20.5
|
|
30
|
+
- - "<"
|
|
39
31
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
32
|
+
version: 0.22.0
|
|
41
33
|
- !ruby/object:Gem::Dependency
|
|
42
|
-
name:
|
|
34
|
+
name: opentelemetry-sdk
|
|
43
35
|
requirement: !ruby/object:Gem::Requirement
|
|
44
36
|
requirements:
|
|
45
37
|
- - "~>"
|
|
46
38
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 1.
|
|
39
|
+
version: 1.0.2
|
|
48
40
|
type: :runtime
|
|
49
41
|
prerelease: false
|
|
50
42
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
43
|
requirements:
|
|
52
44
|
- - "~>"
|
|
53
45
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 1.
|
|
46
|
+
version: 1.0.2
|
|
55
47
|
- !ruby/object:Gem::Dependency
|
|
56
48
|
name: bundler
|
|
57
49
|
requirement: !ruby/object:Gem::Requirement
|
|
58
50
|
requirements:
|
|
59
51
|
- - "~>"
|
|
60
52
|
- !ruby/object:Gem::Version
|
|
61
|
-
version: 2.
|
|
53
|
+
version: '2.2'
|
|
62
54
|
type: :development
|
|
63
55
|
prerelease: false
|
|
64
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
65
57
|
requirements:
|
|
66
58
|
- - "~>"
|
|
67
59
|
- !ruby/object:Gem::Version
|
|
68
|
-
version: 2.
|
|
60
|
+
version: '2.2'
|
|
69
61
|
- !ruby/object:Gem::Dependency
|
|
70
62
|
name: minitest
|
|
71
63
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -86,56 +78,56 @@ dependencies:
|
|
|
86
78
|
requirements:
|
|
87
79
|
- - "~>"
|
|
88
80
|
- !ruby/object:Gem::Version
|
|
89
|
-
version: '
|
|
81
|
+
version: '13.0'
|
|
90
82
|
type: :development
|
|
91
83
|
prerelease: false
|
|
92
84
|
version_requirements: !ruby/object:Gem::Requirement
|
|
93
85
|
requirements:
|
|
94
86
|
- - "~>"
|
|
95
87
|
- !ruby/object:Gem::Version
|
|
96
|
-
version: '
|
|
88
|
+
version: '13.0'
|
|
97
89
|
- !ruby/object:Gem::Dependency
|
|
98
90
|
name: rubocop
|
|
99
91
|
requirement: !ruby/object:Gem::Requirement
|
|
100
92
|
requirements:
|
|
101
93
|
- - "~>"
|
|
102
94
|
- !ruby/object:Gem::Version
|
|
103
|
-
version: 1.
|
|
95
|
+
version: 1.23.0
|
|
104
96
|
type: :development
|
|
105
97
|
prerelease: false
|
|
106
98
|
version_requirements: !ruby/object:Gem::Requirement
|
|
107
99
|
requirements:
|
|
108
100
|
- - "~>"
|
|
109
101
|
- !ruby/object:Gem::Version
|
|
110
|
-
version: 1.
|
|
102
|
+
version: 1.23.0
|
|
111
103
|
- !ruby/object:Gem::Dependency
|
|
112
104
|
name: rubocop-minitest
|
|
113
105
|
requirement: !ruby/object:Gem::Requirement
|
|
114
106
|
requirements:
|
|
115
107
|
- - "~>"
|
|
116
108
|
- !ruby/object:Gem::Version
|
|
117
|
-
version: 0.
|
|
109
|
+
version: 0.17.0
|
|
118
110
|
type: :development
|
|
119
111
|
prerelease: false
|
|
120
112
|
version_requirements: !ruby/object:Gem::Requirement
|
|
121
113
|
requirements:
|
|
122
114
|
- - "~>"
|
|
123
115
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: 0.
|
|
116
|
+
version: 0.17.0
|
|
125
117
|
- !ruby/object:Gem::Dependency
|
|
126
118
|
name: rubocop-rake
|
|
127
119
|
requirement: !ruby/object:Gem::Requirement
|
|
128
120
|
requirements:
|
|
129
121
|
- - "~>"
|
|
130
122
|
- !ruby/object:Gem::Version
|
|
131
|
-
version: 0.
|
|
123
|
+
version: 0.6.0
|
|
132
124
|
type: :development
|
|
133
125
|
prerelease: false
|
|
134
126
|
version_requirements: !ruby/object:Gem::Requirement
|
|
135
127
|
requirements:
|
|
136
128
|
- - "~>"
|
|
137
129
|
- !ruby/object:Gem::Version
|
|
138
|
-
version: 0.
|
|
130
|
+
version: 0.6.0
|
|
139
131
|
- !ruby/object:Gem::Dependency
|
|
140
132
|
name: yard
|
|
141
133
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -179,14 +171,12 @@ files:
|
|
|
179
171
|
- lib/uptrace.rb
|
|
180
172
|
- lib/uptrace/client.rb
|
|
181
173
|
- lib/uptrace/dsn.rb
|
|
182
|
-
- lib/uptrace/metric.rb
|
|
183
|
-
- lib/uptrace/trace.rb
|
|
184
|
-
- lib/uptrace/trace/exporter.rb
|
|
185
174
|
- lib/uptrace/version.rb
|
|
186
175
|
homepage: https://github.com/uptrace/uptrace-ruby
|
|
187
176
|
licenses:
|
|
188
177
|
- BSD-2-Clause
|
|
189
|
-
metadata:
|
|
178
|
+
metadata:
|
|
179
|
+
rubygems_mfa_required: 'true'
|
|
190
180
|
post_install_message:
|
|
191
181
|
rdoc_options: []
|
|
192
182
|
require_paths:
|
|
@@ -198,9 +188,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
198
188
|
version: 2.5.0
|
|
199
189
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
190
|
requirements:
|
|
201
|
-
- - "
|
|
191
|
+
- - ">="
|
|
202
192
|
- !ruby/object:Gem::Version
|
|
203
|
-
version:
|
|
193
|
+
version: '0'
|
|
204
194
|
requirements: []
|
|
205
195
|
rubygems_version: 3.1.4
|
|
206
196
|
signing_key:
|
data/lib/uptrace/metric.rb
DELETED
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'uri'
|
|
4
|
-
require 'net/http'
|
|
5
|
-
require 'json'
|
|
6
|
-
|
|
7
|
-
require 'opentelemetry/sdk'
|
|
8
|
-
require 'msgpack'
|
|
9
|
-
require 'zstd-ruby'
|
|
10
|
-
|
|
11
|
-
module Uptrace
|
|
12
|
-
module Trace
|
|
13
|
-
# Exporter is a span exporter for OpenTelemetry.
|
|
14
|
-
class Exporter
|
|
15
|
-
SUCCESS = OpenTelemetry::SDK::Trace::Export::SUCCESS
|
|
16
|
-
FAILURE = OpenTelemetry::SDK::Trace::Export::FAILURE
|
|
17
|
-
TIMEOUT = OpenTelemetry::SDK::Trace::Export::TIMEOUT
|
|
18
|
-
private_constant(:SUCCESS, :FAILURE, :TIMEOUT)
|
|
19
|
-
|
|
20
|
-
##
|
|
21
|
-
# @param [Config] cfg
|
|
22
|
-
#
|
|
23
|
-
def initialize(dsn)
|
|
24
|
-
@dsn = dsn
|
|
25
|
-
@endpoint = "/api/v1/tracing/#{@dsn.project_id}/spans"
|
|
26
|
-
|
|
27
|
-
@http = Net::HTTP.new(@dsn.host, 443)
|
|
28
|
-
@http.use_ssl = true
|
|
29
|
-
@http.open_timeout = 5
|
|
30
|
-
@http.read_timeout = 5
|
|
31
|
-
@http.keep_alive_timeout = 30
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# Called to export sampled {OpenTelemetry::SDK::Trace::SpanData} structs.
|
|
35
|
-
#
|
|
36
|
-
# @param [Enumerable<OpenTelemetry::SDK::Trace::SpanData>] spans the
|
|
37
|
-
# list of recorded {OpenTelemetry::SDK::Trace::SpanData} structs to be
|
|
38
|
-
# exported.
|
|
39
|
-
# @param [optional Numeric] timeout An optional timeout in seconds.
|
|
40
|
-
# @return [Integer] the result of the export.
|
|
41
|
-
def export(spans, timeout: nil)
|
|
42
|
-
return SUCCESS if @disabled
|
|
43
|
-
return FAILURE if @shutdown
|
|
44
|
-
|
|
45
|
-
out = []
|
|
46
|
-
|
|
47
|
-
spans.each do |span|
|
|
48
|
-
out.push(uptrace_span(span))
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
send({ spans: out }, timeout: timeout)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# Called when {OpenTelemetry::SDK::Trace::TracerProvider#force_flush} is called, if
|
|
55
|
-
# this exporter is registered to a {OpenTelemetry::SDK::Trace::TracerProvider}
|
|
56
|
-
# object.
|
|
57
|
-
#
|
|
58
|
-
# @param [optional Numeric] timeout An optional timeout in seconds.
|
|
59
|
-
def force_flush(timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
|
|
60
|
-
SUCCESS
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Called when {OpenTelemetry::SDK::Trace::Tracer#shutdown} is called, if
|
|
64
|
-
# this exporter is registered to a {OpenTelemetry::SDK::Trace::Tracer}
|
|
65
|
-
# object.
|
|
66
|
-
#
|
|
67
|
-
# @param [optional Numeric] timeout An optional timeout in seconds.
|
|
68
|
-
def shutdown(timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
|
|
69
|
-
@shutdown = true
|
|
70
|
-
@http.finish if @http.started?
|
|
71
|
-
SUCCESS
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
private
|
|
75
|
-
|
|
76
|
-
##
|
|
77
|
-
# @return [hash]
|
|
78
|
-
#
|
|
79
|
-
def uptrace_span(span)
|
|
80
|
-
out = {
|
|
81
|
-
id: span.span_id.unpack1('Q'),
|
|
82
|
-
traceId: span.trace_id,
|
|
83
|
-
|
|
84
|
-
name: span.name,
|
|
85
|
-
kind: kind_as_str(span.kind),
|
|
86
|
-
startTime: span.start_timestamp,
|
|
87
|
-
endTime: span.end_timestamp,
|
|
88
|
-
|
|
89
|
-
resource: uptrace_resource(span.resource),
|
|
90
|
-
attrs: span.attributes
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
out[:parentId] = span.parent_span_id.unpack1('Q') if span.parent_span_id
|
|
94
|
-
|
|
95
|
-
out[:events] = uptrace_events(span.events) unless span.events.nil?
|
|
96
|
-
out[:links] = uptrace_links(span.links) unless span.links.nil?
|
|
97
|
-
|
|
98
|
-
status = span.status
|
|
99
|
-
out[:statusCode] = status_code_as_str(status.code)
|
|
100
|
-
out[:statusMessage] = status.description unless status.description.empty?
|
|
101
|
-
|
|
102
|
-
il = span.instrumentation_library
|
|
103
|
-
out[:tracerName] = il.name
|
|
104
|
-
out[:tracerVersion] = il.name unless il.version.empty?
|
|
105
|
-
|
|
106
|
-
out
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def send(data, timeout: nil) # rubocop:disable Lint/UnusedMethodArgument
|
|
110
|
-
req = build_request(data)
|
|
111
|
-
|
|
112
|
-
begin
|
|
113
|
-
resp = @http.request(req)
|
|
114
|
-
rescue Net::OpenTimeout, Net::ReadTimeout
|
|
115
|
-
return FAILURE
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
case resp
|
|
119
|
-
when Net::HTTPOK
|
|
120
|
-
resp.body # Read and discard body
|
|
121
|
-
SUCCESS
|
|
122
|
-
when Net::HTTPBadRequest
|
|
123
|
-
data = JSON.parse(resp.body)
|
|
124
|
-
Uptrace.logger.error("status=#{data['status']}: #{data['message']}")
|
|
125
|
-
FAILURE
|
|
126
|
-
when Net::HTTPInternalServerError
|
|
127
|
-
resp.body
|
|
128
|
-
FAILURE
|
|
129
|
-
else
|
|
130
|
-
@http.finish
|
|
131
|
-
FAILURE
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
##
|
|
136
|
-
# @param [Hash] data
|
|
137
|
-
# @return [Net::HTTP::Post]
|
|
138
|
-
#
|
|
139
|
-
def build_request(data)
|
|
140
|
-
data = MessagePack.pack(data)
|
|
141
|
-
data = Zstd.compress(data, 3)
|
|
142
|
-
|
|
143
|
-
req = Net::HTTP::Post.new(@endpoint)
|
|
144
|
-
req.add_field('Authorization', "Bearer #{@dsn.token}")
|
|
145
|
-
req.add_field('Content-Type', 'application/msgpack')
|
|
146
|
-
req.add_field('Content-Encoding', 'zstd')
|
|
147
|
-
req.add_field('Connection', 'keep-alive')
|
|
148
|
-
req.body = data
|
|
149
|
-
|
|
150
|
-
req
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
# @param [SpanKind] kind
|
|
154
|
-
# @return [String]
|
|
155
|
-
def kind_as_str(kind)
|
|
156
|
-
case kind
|
|
157
|
-
when OpenTelemetry::Trace::SpanKind::SERVER
|
|
158
|
-
'server'
|
|
159
|
-
when OpenTelemetry::Trace::SpanKind::CLIENT
|
|
160
|
-
'client'
|
|
161
|
-
when OpenTelemetry::Trace::SpanKind::PRODUCER
|
|
162
|
-
'producer'
|
|
163
|
-
when OpenTelemetry::Trace::SpanKind::CONSUMER
|
|
164
|
-
'consumer'
|
|
165
|
-
else
|
|
166
|
-
'internal'
|
|
167
|
-
end
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
##
|
|
171
|
-
# @param [Integer] code
|
|
172
|
-
# @return [String]
|
|
173
|
-
#
|
|
174
|
-
def status_code_as_str(code)
|
|
175
|
-
case code
|
|
176
|
-
when OpenTelemetry::Trace::Status::OK
|
|
177
|
-
'ok'
|
|
178
|
-
when OpenTelemetry::Trace::Status::ERROR
|
|
179
|
-
'error'
|
|
180
|
-
else
|
|
181
|
-
'unset'
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
|
|
185
|
-
##
|
|
186
|
-
# @param [OpenTelemetry::SDK::Resources::Resource] resource
|
|
187
|
-
# @return [Hash]
|
|
188
|
-
#
|
|
189
|
-
def uptrace_resource(resource)
|
|
190
|
-
out = {}
|
|
191
|
-
resource.attribute_enumerator.map { |key, value| out[key] = value }
|
|
192
|
-
out
|
|
193
|
-
end
|
|
194
|
-
|
|
195
|
-
def uptrace_events(events)
|
|
196
|
-
out = []
|
|
197
|
-
events.each do |event|
|
|
198
|
-
out.push(
|
|
199
|
-
{
|
|
200
|
-
name: event.name,
|
|
201
|
-
attrs: event.attributes,
|
|
202
|
-
time: event.timestamp
|
|
203
|
-
}
|
|
204
|
-
)
|
|
205
|
-
end
|
|
206
|
-
out
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
def uptrace_links(links)
|
|
210
|
-
out = []
|
|
211
|
-
links.each do |link|
|
|
212
|
-
out.push(
|
|
213
|
-
{
|
|
214
|
-
trace_id => link.span_context.trace_id,
|
|
215
|
-
span_id => link.span_context.span_id.unpack1('Q'),
|
|
216
|
-
attrs => link.attributes
|
|
217
|
-
}
|
|
218
|
-
)
|
|
219
|
-
end
|
|
220
|
-
out
|
|
221
|
-
end
|
|
222
|
-
end
|
|
223
|
-
end
|
|
224
|
-
end
|