uptrace 1.8.0 → 1.10.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: 971f276de0abbfd5a5b4e505927b12a92f206a47f857c7d2a1f55106e1739dde
4
- data.tar.gz: ed4e4cb6f17964dc4819dca13b998a69fba3ac20ccea4ba54b14701d069d584e
3
+ metadata.gz: 9b521f2dba9f5817cfbdd7f91a93717ec0ad35b01ea29ac07a43b4590ba3ab83
4
+ data.tar.gz: '048dbe5ff7fb1585c6ebf526f14f3335f95ab3f4ec514481ddfbbd2eec46baa8'
5
5
  SHA512:
6
- metadata.gz: a4c60178f506bb083dc4fe13fedfac8f440feebac8a23c6dfd4040388448c2c20dee1977cdd65df69237dfd6626ed2604877fd418a699a4de58d91ffa844864b
7
- data.tar.gz: edb380d1fabc98cfd62b667dc3cdb8b343398a97e6ef89a1769057d6c6e6f91548ba1e37b65af7e475d31ee66c12c9ae52947c77437c1de5eafe28191b797fed
6
+ metadata.gz: 21413cdec77a15a9e608482d51b9c306ad2c362db790c4feff8b1aa0faa08429f8a93d84d90ea85c193f2ad9f9821d75803f259112d9a8f46f8aebddfe21149c
7
+ data.tar.gz: a2a8aac82c6dc0d7d4d5329607a31934f0f896adc76326bebe5f7985cb666fdc03917af934ce3ab36f056a276d07bf74e444850ee41f0d1fa1db584ea7f89819
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Uptrace Ruby exporter for OpenTelemetry
1
+ # OpenTelemetry Ruby distro for Uptrace
2
2
 
3
3
  ![build workflow](https://github.com/uptrace/uptrace-ruby/actions/workflows/build.yml/badge.svg)
4
4
  [![Documentation](https://img.shields.io/badge/uptrace-documentation-informational)](https://uptrace.dev/get/opentelemetry-ruby)
@@ -10,8 +10,11 @@
10
10
 
11
11
  ## Introduction
12
12
 
13
- uptrace-ruby is an OpenTelemery distribution configured to export
14
- [traces](https://uptrace.dev/opentelemetry/distributed-tracing) to Uptrace.
13
+ `uptrace-ruby` is a preconfigured [OpenTelemetry](https://opentelemetry.io)
14
+ distribution for Ruby that exports **traces, logs, and metrics** to
15
+ [Uptrace](https://uptrace.dev). It builds on top of
16
+ [opentelemetry-ruby](https://github.com/open-telemetry/opentelemetry-ruby) and
17
+ makes connecting your application to Uptrace fast and easy.
15
18
 
16
19
  ## Quickstart
17
20
 
@@ -21,7 +24,8 @@ Install uptrace-ruby:
21
24
  gem install uptrace
22
25
  ```
23
26
 
24
- Run the [basic example](example/basic) below using the DSN from the Uptrace project settings page.
27
+ Run the [traces example](example/traces) below using the DSN from the Uptrace
28
+ project settings page.
25
29
 
26
30
  ```ruby
27
31
  #!/usr/bin/env ruby
@@ -32,42 +36,52 @@ require 'bundler/setup'
32
36
  require 'uptrace'
33
37
 
34
38
  # Configure OpenTelemetry with sensible defaults.
35
- # Copy your project DSN here or use UPTRACE_DSN env var.
39
+ # DSN can be set via UPTRACE_DSN environment variable.
40
+ # Example: export UPTRACE_DSN="https://<project_secret>@uptrace.dev?grpc=4317"
36
41
  Uptrace.configure_opentelemetry(dsn: '') do |c|
37
- # c is OpenTelemetry::SDK::Configurator
42
+ # c is an instance of OpenTelemetry::SDK::Configurator
43
+
44
+ # Configure service metadata (helps identify this service in Uptrace).
38
45
  c.service_name = 'myservice'
39
46
  c.service_version = '1.0.0'
40
47
 
48
+ # Add environment information
41
49
  c.resource = OpenTelemetry::SDK::Resources::Resource.create(
42
- 'deployment.environment' => 'production'
50
+ 'deployment.environment.name' => ENV.fetch('RACK_ENV', 'development')
43
51
  )
44
52
  end
45
53
 
46
- # Create a tracer. Usually, tracer is a global variable.
47
- tracer = OpenTelemetry.tracer_provider.tracer('my_app_or_gem', '0.1.0')
48
-
49
- # Create a root span (a trace) to measure some operation.
50
- tracer.in_span('main-operation', kind: :client) do |main|
51
- tracer.in_span('GET /posts/:id') do |child1|
52
- child1.set_attribute('http.method', 'GET')
53
- child1.set_attribute('http.route', '/posts/:id')
54
- child1.set_attribute('http.url', 'http://localhost:8080/posts/123')
55
- child1.set_attribute('http.status_code', 200)
56
- child1.record_exception(ArgumentError.new('error1'))
54
+ # Ensure spans are flushed even if the program exits unexpectedly.
55
+ at_exit { OpenTelemetry.tracer_provider.shutdown }
56
+
57
+ # Register a tracer (usually stored globally).
58
+ TRACER = OpenTelemetry.tracer_provider.tracer('my_app', '0.1.0')
59
+
60
+ # Example trace with nested spans.
61
+ TRACER.in_span('main-operation', kind: :server) do |main_span|
62
+ # Simulate an HTTP request span.
63
+ TRACER.in_span('GET /posts/:id', kind: :client) do |http_span|
64
+ http_span.set_attribute('http.method', 'GET')
65
+ http_span.set_attribute('http.route', '/posts/:id')
66
+ http_span.set_attribute('http.url', 'http://localhost:8080/posts/123')
67
+ http_span.set_attribute('http.status_code', 200)
68
+ http_span.record_exception(ArgumentError.new('Invalid parameter'))
57
69
  end
58
70
 
59
- tracer.in_span('SELECT') do |child2|
60
- child2.set_attribute('db.system', 'mysql')
61
- child2.set_attribute('db.statement', 'SELECT * FROM posts LIMIT 100')
71
+ # Simulate a database query span.
72
+ TRACER.in_span('SELECT posts', kind: :client) do |db_span|
73
+ db_span.set_attribute('db.system', 'mysql')
74
+ db_span.set_attribute('db.statement', 'SELECT * FROM posts LIMIT 100')
62
75
  end
63
76
 
64
- puts("trace URL: #{Uptrace.trace_url(main)}")
77
+ # Print the trace URL (clickable in console).
78
+ puts "Trace URL: #{Uptrace.trace_url(main_span)}"
65
79
  end
66
-
67
- # Send buffered spans and free resources.
68
- OpenTelemetry.tracer_provider.shutdown
69
80
  ```
70
81
 
82
+ Additional examples are available for [logs](example/logs) and
83
+ [metrics](example/metrics).
84
+
71
85
  ## Links
72
86
 
73
87
  - [Examples](example)
data/RELEASING.md ADDED
@@ -0,0 +1,83 @@
1
+ # Releasing
2
+
3
+ This guide explains how to release a new version of the uptrace-ruby gem to
4
+ RubyGems.
5
+
6
+ ## Install Ruby
7
+
8
+ On Ubuntu, install Ruby with rbenv:
9
+
10
+ ```shell
11
+ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
12
+ git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
13
+ rbenv init
14
+ rbenv install -l
15
+ rbenv install 3.4.8
16
+ rbenv global 3.4.8
17
+ ```
18
+
19
+ ## Managing Dependencies
20
+
21
+ ### Checking for outdated dependencies
22
+
23
+ To view outdated dependencies:
24
+
25
+ ```shell
26
+ bundle outdated
27
+ ```
28
+
29
+ ### Updating dependencies
30
+
31
+ Edit the `Gemfile` to update dependency versions, then update the
32
+ `Gemfile.lock`:
33
+
34
+ ```shell
35
+ bundle update
36
+ ```
37
+
38
+ ### Installing dependencies
39
+
40
+ To install all dependencies:
41
+
42
+ ```shell
43
+ bundle install
44
+ ```
45
+
46
+ ## Running Tests
47
+
48
+ Before releasing, ensure all tests pass:
49
+
50
+ ```shell
51
+ rake test
52
+ ```
53
+
54
+ ## Running linter
55
+
56
+ To run linter:
57
+
58
+ ```shell
59
+ bundle exec rake
60
+ ```
61
+
62
+ To auto-correct issues:
63
+
64
+ ```shell
65
+ bundle exec rubocop -A
66
+ ```
67
+
68
+ ## Publishing a Release
69
+
70
+ 1. **Update the version**: Bump the version number in `lib/uptrace/version.rb`
71
+
72
+ 2. **Build and publish the gem**:
73
+
74
+ ```shell
75
+ gem build uptrace.gemspec
76
+ bundle install
77
+ gem push uptrace-X.Y.Z.gem
78
+ ```
79
+
80
+ Replace `X.Y.Z` with the actual version number you specified in step 1.
81
+
82
+ **Note**: Make sure you have the necessary permissions to push to the uptrace
83
+ gem on RubyGems before attempting to publish.
@@ -9,7 +9,7 @@ module Uptrace
9
9
 
10
10
  # @param [string] dsn
11
11
  def initialize(dsn: '')
12
- dsn = ENV.fetch('UPTRACE_DSN', '') if dsn.empty?
12
+ dsn = ENV.fetch('UPTRACE_DSN', '') if dsn.empty? || dsn == '<FIXME>'
13
13
 
14
14
  begin
15
15
  @dsn = DSN.new(dsn)
@@ -17,7 +17,7 @@ module Uptrace
17
17
  Uptrace.logger.error("Uptrace is disabled: #{e.message}")
18
18
  @disabled = true
19
19
 
20
- @dsn = DSN.new('https://TOKEN@uptrace.dev')
20
+ @dsn = DSN.new('https://project_secret@api.uptrace.dev?grpc=4317')
21
21
  end
22
22
  end
23
23
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Uptrace
4
- VERSION = '1.8.0'
4
+ VERSION = '1.10.0'
5
5
  end
data/lib/uptrace.rb CHANGED
@@ -2,24 +2,23 @@
2
2
 
3
3
  require 'logger'
4
4
 
5
+ require 'opentelemetry/sdk'
5
6
  require 'opentelemetry/exporter/otlp'
7
+
6
8
  require 'opentelemetry-metrics-sdk'
7
9
  require 'opentelemetry-exporter-otlp-metrics'
8
10
 
11
+ require 'opentelemetry-logs-sdk'
12
+ require 'opentelemetry/exporter/otlp_logs'
13
+
9
14
  # Uptrace provides Uptrace exporters for OpenTelemetry.
10
15
  module Uptrace
11
16
  extend self
12
17
 
13
18
  attr_accessor :logger
14
- attr_writer :client
15
19
 
16
20
  self.logger = Logger.new($stdout)
17
21
 
18
- # @return [Object, Client] registered client or a default no-op implementation of the client.
19
- def client
20
- @client ||= Client.new
21
- end
22
-
23
22
  # @param [optional OpenTelemetry::Trace::Span] span
24
23
  # @return [String]
25
24
  def trace_url(span = nil)
@@ -33,15 +32,32 @@ module Uptrace
33
32
  # @yieldparam [OpenTelemetry::SDK::Configurator] c Yields a configurator to the
34
33
  # provided block
35
34
  def configure_opentelemetry(dsn: '')
35
+ @client = Client.new(dsn: dsn)
36
+ return if @client.disabled?
37
+
36
38
  OpenTelemetry::SDK.configure do |c|
37
- @client = Client.new(dsn: dsn) unless dsn.empty?
38
- c.add_span_processor(span_processor(@client.dsn)) unless client.disabled?
39
+ # Set default IdGenerator and let users override
39
40
  c.id_generator = Uptrace::IdGenerator
41
+ c.add_span_processor(span_processor(@client.dsn))
40
42
 
41
43
  yield c if block_given?
44
+
45
+ # Merge resource
46
+ current_resource = c.instance_variable_get(:@resource)
47
+ current_resource ||= OpenTelemetry::SDK::Resources::Resource.create
48
+
49
+ host_resource = OpenTelemetry::SDK::Resources::Resource.create(
50
+ 'host.name' => Socket.gethostname
51
+ )
52
+ c.resource = current_resource.merge(host_resource)
42
53
  end
43
54
 
44
- OpenTelemetry.meter_provider.add_metric_reader(metric_exporter(@client.dsn))
55
+ me = metric_exporter(@client.dsn)
56
+ OpenTelemetry.meter_provider.add_metric_reader(me)
57
+
58
+ le = log_exporter(@client.dsn)
59
+ processor = OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(le)
60
+ OpenTelemetry.logger_provider.add_log_record_processor(processor)
45
61
  end
46
62
 
47
63
  private
@@ -67,6 +83,14 @@ module Uptrace
67
83
  compression: 'gzip'
68
84
  )
69
85
  end
86
+
87
+ def log_exporter(dsn)
88
+ OpenTelemetry::Exporter::OTLP::Logs::LogsExporter.new(
89
+ endpoint: "#{dsn.otlp_http_endpoint}/v1/logs",
90
+ headers: { 'uptrace-dsn': dsn.to_s },
91
+ compression: 'gzip'
92
+ )
93
+ end
70
94
  end
71
95
 
72
96
  require 'uptrace/version'
metadata CHANGED
@@ -1,70 +1,112 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uptrace
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0
4
+ version: 1.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Uptrace Authors
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-17 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: logger
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 1.7.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: 1.7.0
12
26
  - !ruby/object:Gem::Dependency
13
27
  name: opentelemetry-exporter-otlp
14
28
  requirement: !ruby/object:Gem::Requirement
15
29
  requirements:
16
30
  - - "~>"
17
31
  - !ruby/object:Gem::Version
18
- version: 0.30.0
32
+ version: 0.31.1
19
33
  type: :runtime
20
34
  prerelease: false
21
35
  version_requirements: !ruby/object:Gem::Requirement
22
36
  requirements:
23
37
  - - "~>"
24
38
  - !ruby/object:Gem::Version
25
- version: 0.30.0
39
+ version: 0.31.1
26
40
  - !ruby/object:Gem::Dependency
27
41
  name: opentelemetry-sdk
28
42
  requirement: !ruby/object:Gem::Requirement
29
43
  requirements:
30
44
  - - "~>"
31
45
  - !ruby/object:Gem::Version
32
- version: 1.8.0
46
+ version: 1.10.0
33
47
  type: :runtime
34
48
  prerelease: false
35
49
  version_requirements: !ruby/object:Gem::Requirement
36
50
  requirements:
37
51
  - - "~>"
38
52
  - !ruby/object:Gem::Version
39
- version: 1.8.0
53
+ version: 1.10.0
40
54
  - !ruby/object:Gem::Dependency
41
55
  name: opentelemetry-exporter-otlp-metrics
42
56
  requirement: !ruby/object:Gem::Requirement
43
57
  requirements:
44
58
  - - "~>"
45
59
  - !ruby/object:Gem::Version
46
- version: 0.4.0
60
+ version: 0.6.1
47
61
  type: :runtime
48
62
  prerelease: false
49
63
  version_requirements: !ruby/object:Gem::Requirement
50
64
  requirements:
51
65
  - - "~>"
52
66
  - !ruby/object:Gem::Version
53
- version: 0.4.0
67
+ version: 0.6.1
54
68
  - !ruby/object:Gem::Dependency
55
69
  name: opentelemetry-metrics-sdk
56
70
  requirement: !ruby/object:Gem::Requirement
57
71
  requirements:
58
72
  - - "~>"
59
73
  - !ruby/object:Gem::Version
60
- version: 0.6.0
74
+ version: 0.11.2
61
75
  type: :runtime
62
76
  prerelease: false
63
77
  version_requirements: !ruby/object:Gem::Requirement
64
78
  requirements:
65
79
  - - "~>"
66
80
  - !ruby/object:Gem::Version
67
- version: 0.6.0
81
+ version: 0.11.2
82
+ - !ruby/object:Gem::Dependency
83
+ name: opentelemetry-exporter-otlp-logs
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: 0.2.2
89
+ type: :runtime
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: 0.2.2
96
+ - !ruby/object:Gem::Dependency
97
+ name: opentelemetry-logs-sdk
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: 0.4.0
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: 0.4.0
68
110
  - !ruby/object:Gem::Dependency
69
111
  name: bundler
70
112
  requirement: !ruby/object:Gem::Requirement
@@ -99,56 +141,56 @@ dependencies:
99
141
  requirements:
100
142
  - - "~>"
101
143
  - !ruby/object:Gem::Version
102
- version: '13.0'
144
+ version: '13.3'
103
145
  type: :development
104
146
  prerelease: false
105
147
  version_requirements: !ruby/object:Gem::Requirement
106
148
  requirements:
107
149
  - - "~>"
108
150
  - !ruby/object:Gem::Version
109
- version: '13.0'
151
+ version: '13.3'
110
152
  - !ruby/object:Gem::Dependency
111
153
  name: rubocop
112
154
  requirement: !ruby/object:Gem::Requirement
113
155
  requirements:
114
156
  - - "~>"
115
157
  - !ruby/object:Gem::Version
116
- version: 1.60.2
158
+ version: '1.82'
117
159
  type: :development
118
160
  prerelease: false
119
161
  version_requirements: !ruby/object:Gem::Requirement
120
162
  requirements:
121
163
  - - "~>"
122
164
  - !ruby/object:Gem::Version
123
- version: 1.60.2
165
+ version: '1.82'
124
166
  - !ruby/object:Gem::Dependency
125
167
  name: rubocop-minitest
126
168
  requirement: !ruby/object:Gem::Requirement
127
169
  requirements:
128
170
  - - "~>"
129
171
  - !ruby/object:Gem::Version
130
- version: 0.34.5
172
+ version: '0.34'
131
173
  type: :development
132
174
  prerelease: false
133
175
  version_requirements: !ruby/object:Gem::Requirement
134
176
  requirements:
135
177
  - - "~>"
136
178
  - !ruby/object:Gem::Version
137
- version: 0.34.5
179
+ version: '0.34'
138
180
  - !ruby/object:Gem::Dependency
139
181
  name: rubocop-rake
140
182
  requirement: !ruby/object:Gem::Requirement
141
183
  requirements:
142
184
  - - "~>"
143
185
  - !ruby/object:Gem::Version
144
- version: 0.6.0
186
+ version: '0.6'
145
187
  type: :development
146
188
  prerelease: false
147
189
  version_requirements: !ruby/object:Gem::Requirement
148
190
  requirements:
149
191
  - - "~>"
150
192
  - !ruby/object:Gem::Version
151
- version: 0.6.0
193
+ version: '0.6'
152
194
  - !ruby/object:Gem::Dependency
153
195
  name: yard
154
196
  requirement: !ruby/object:Gem::Requirement
@@ -177,7 +219,7 @@ dependencies:
177
219
  - - "~>"
178
220
  - !ruby/object:Gem::Version
179
221
  version: 0.1.6
180
- description: Uptrace Ruby exporter for OpenTelemetry
222
+ description: Configures OpenTelemetry Ruby to export data to Uptrace
181
223
  email:
182
224
  - support@uptrace.dev
183
225
  executables: []
@@ -187,7 +229,7 @@ files:
187
229
  - ".yardopts"
188
230
  - LICENSE
189
231
  - README.md
190
- - RELEASE.md
232
+ - RELEASING.md
191
233
  - TODO.md
192
234
  - lib/uptrace.rb
193
235
  - lib/uptrace/client.rb
@@ -213,7 +255,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
213
255
  - !ruby/object:Gem::Version
214
256
  version: '0'
215
257
  requirements: []
216
- rubygems_version: 3.6.2
258
+ rubygems_version: 3.6.9
217
259
  specification_version: 4
218
- summary: Uptrace Ruby exporter for OpenTelemetry
260
+ summary: Uptrace wrapper for OpenTelemetry Ruby
219
261
  test_files: []
data/RELEASE.md DELETED
@@ -1,13 +0,0 @@
1
- Update dependencies:
2
-
3
- ```
4
- bundle update
5
- ```
6
-
7
- Bump version in `lib/uptrace/version.rb` and then run:
8
-
9
- ```shell
10
- gem build uptrace.gemspec
11
- bundle install
12
- gem push uptrace-0.2.0.gem
13
- ```