highlight_io 0.4.0 → 0.5.1

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: 92d68b8ab3821bca22f10aac336705ea4bb272f9a62572334715dbab501c5940
4
- data.tar.gz: 9175f4a419f534ff297eb9ad907385a0dcf1b4e2366b738ceb438d947cef4876
3
+ metadata.gz: 3ad24593b8967d78ebfde045dfa62cc8cec035d749d0a8ac6519235ba93dca48
4
+ data.tar.gz: 99812349e8cf1768432f03eeee493c44897a257e71a19295845f1607ed29e128
5
5
  SHA512:
6
- metadata.gz: 2c5032942516a6269fab88a89104cceba40b3279603a362142f12cd4340d080b5d484d3314f12076eb2e10c1e7fd8b9d24f7a6a21936665c827c0957139d5a2a
7
- data.tar.gz: b89a5c22d6a8a9709c13831e535c38b68d3b10fdc48ca0577809978a57b65eccc374964632e7d0c3e8cf4feafe4f4c9676a6811b6d9ffdf2bedd5e2883023298
6
+ metadata.gz: b95ccd4ac96b1e247b83471cfbcfe72b94404ad96150998503f3062aaa7decdfe2af702912e22fce9addaf864d48bf9a355e3bc7899fb77e80d764a7febee4a5
7
+ data.tar.gz: bfc55d53ba492eab3b5298f6629ff2c5a5f6ddd79de3954f57454c20ae1e8cd05593284ec40b65674fc01183919fe4d4fa5daf86e00ec688bb4181b2dea444f8
data/.rubocop.yml CHANGED
@@ -1,5 +1,21 @@
1
1
  AllCops:
2
2
  TargetRubyVersion: 3.0
3
+ EnabledByDefault: true
4
+
5
+ Bundler/GemComment:
6
+ Enabled: false
7
+
8
+ Bundler/GemVersion:
9
+ Enabled: false
10
+
11
+ Lint/ConstantResolution:
12
+ Enabled: false
13
+
14
+ Style/ConstantVisibility:
15
+ Enabled: false
16
+
17
+ Style/Copyright:
18
+ Enabled: false
3
19
 
4
20
  Style/FrozenStringLiteralComment:
5
21
  Enabled: false
@@ -7,11 +23,32 @@ Style/FrozenStringLiteralComment:
7
23
  Style/Documentation:
8
24
  Enabled: false
9
25
 
26
+ Style/DocumentationMethod:
27
+ Enabled: false
28
+
29
+ Style/ImplicitRuntimeError:
30
+ Enabled: false
31
+
32
+ Style/InlineComment:
33
+ Enabled: false
34
+
35
+ Style/MissingElse:
36
+ Enabled: false
37
+
38
+ Style/OpenStructUse:
39
+ Enabled: false
40
+
41
+ Style/StringHashKeys:
42
+ Enabled: false
43
+
10
44
  Metrics/MethodLength:
11
45
  Enabled: false
12
46
 
13
47
  Metrics/CyclomaticComplexity:
14
- Max: 8
48
+ Enabled: false
49
+
50
+ Metrics/PerceivedComplexity:
51
+ Enabled: false
15
52
 
16
53
  Naming/MethodParameterName:
17
54
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,27 +1,40 @@
1
- ## 0.1.2
1
+ ## 0.5.1
2
2
 
3
- - Add ability to set `service_name` and `service_version`
3
+ - Fix bug with SDK controller instrumentation
4
+ - Fix `Highlight::VERSION` error
4
5
 
5
- ## 0.1.4
6
+ ## 0.5.0
6
7
 
7
- - Tune settings of opentelemetry SDK to reduce memory usage.
8
- - Enable GZIP compression of exported data.
8
+ - Fix bug with SDK initialization
9
+ - Fix bug with `service.name` and `deployment.environment` not being set
10
+ - Adds `telemetry.distro.*` attributes as resource spans
11
+ - Add `highlight_traceparent_meta` Rails tag helper
12
+ - Fixes up the Rubocop configs and addresses new issues reported
9
13
 
10
- ## 0.2.0
14
+ ## 0.4.0
11
15
 
12
- - Support setting `environment` attribute to SDK initialization.
13
- - `otlp_endpoint` updated to keyword parameter when initializing.
16
+ - Add `H.init` alias
17
+ - Auto instrument Rails requests and eliminate need for `around_action`
18
+ - Fix warning about incompatibility with `ActiveSupport::LoggerSilence`
19
+
20
+ ## 0.2.2
21
+
22
+ - Fix duplicate errors recorded on traces.
14
23
 
15
24
  ## 0.2.1
16
25
 
17
26
  - Ensure `message` on logs is always a string.
18
27
 
19
- ## 0.2.2
28
+ ## 0.2.0
20
29
 
21
- - Fix duplicate errors recorded on traces.
30
+ - Support setting `environment` attribute to SDK initialization.
31
+ - `otlp_endpoint` updated to keyword parameter when initializing.
22
32
 
23
- ## 0.4.0
33
+ ## 0.1.4
24
34
 
25
- - Add `H.init` alias
26
- - Auto instrument Rails requests and eliminate need for `around_action`
27
- - Fix warning about incompatibility with `ActiveSupport::LoggerSilence`
35
+ - Tune settings of opentelemetry SDK to reduce memory usage.
36
+ - Enable GZIP compression of exported data.
37
+
38
+ ## 0.1.2
39
+
40
+ - Add ability to set `service_name` and `service_version`
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- highlight_io (0.4.0)
5
- grpc (~> 1.65)
4
+ highlight_io (0.5.1)
5
+ grpc (~> 1.66)
6
6
  opentelemetry-exporter-otlp (~> 0.28.1)
7
7
  opentelemetry-instrumentation-all (~> 0.62.1)
8
8
  opentelemetry-sdk (~> 1.5.0)
@@ -14,18 +14,18 @@ GEM
14
14
  ast (2.4.2)
15
15
  google-protobuf (3.25.4-arm64-darwin)
16
16
  google-protobuf (3.25.4-x86_64-linux)
17
- googleapis-common-protos-types (1.15.0)
17
+ googleapis-common-protos-types (1.16.0)
18
18
  google-protobuf (>= 3.18, < 5.a)
19
- grpc (1.65.2-arm64-darwin)
19
+ grpc (1.66.0-arm64-darwin)
20
20
  google-protobuf (>= 3.25, < 5.0)
21
21
  googleapis-common-protos-types (~> 1.0)
22
- grpc (1.65.2-x86_64-linux)
22
+ grpc (1.66.0-x86_64-linux)
23
23
  google-protobuf (>= 3.25, < 5.0)
24
24
  googleapis-common-protos-types (~> 1.0)
25
25
  json (2.6.3)
26
26
  language_server-protocol (3.17.0.3)
27
27
  minitest (5.18.0)
28
- opentelemetry-api (1.3.0)
28
+ opentelemetry-api (1.4.0)
29
29
  opentelemetry-common (0.21.0)
30
30
  opentelemetry-api (~> 1.0)
31
31
  opentelemetry-exporter-otlp (0.28.1)
@@ -48,9 +48,9 @@ GEM
48
48
  opentelemetry-api (~> 1.0)
49
49
  opentelemetry-instrumentation-base (~> 0.22.1)
50
50
  opentelemetry-instrumentation-rack (~> 0.21)
51
- opentelemetry-instrumentation-action_view (0.7.2)
51
+ opentelemetry-instrumentation-action_view (0.7.3)
52
52
  opentelemetry-api (~> 1.0)
53
- opentelemetry-instrumentation-active_support (~> 0.1)
53
+ opentelemetry-instrumentation-active_support (~> 0.6)
54
54
  opentelemetry-instrumentation-base (~> 0.22.1)
55
55
  opentelemetry-instrumentation-active_job (0.7.7)
56
56
  opentelemetry-api (~> 1.0)
data/highlight.gemspec CHANGED
@@ -15,16 +15,18 @@ Gem::Specification.new do |spec|
15
15
 
16
16
  # Specify which files should be added to the gem when it is released.
17
17
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
18
- spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
- end
18
+ spec.files =
19
+ Dir.chdir(File.expand_path(__dir__)) do
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ end
21
22
  spec.bindir = 'exe'
22
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
24
  spec.require_paths = ['lib']
24
25
 
25
- spec.add_runtime_dependency 'grpc', '~> 1.65'
26
- spec.add_runtime_dependency 'opentelemetry-exporter-otlp', '~> 0.28.1'
27
- spec.add_runtime_dependency 'opentelemetry-instrumentation-all', '~> 0.62.1'
28
- spec.add_runtime_dependency 'opentelemetry-sdk', '~> 1.5.0'
29
- spec.add_runtime_dependency 'opentelemetry-semantic_conventions', '~> 1.10.1'
26
+ spec.add_dependency('grpc', '~> 1.66')
27
+ spec.add_dependency('opentelemetry-exporter-otlp', '~> 0.28.1')
28
+ spec.add_dependency('opentelemetry-instrumentation-all', '~> 0.62.1')
29
+ spec.add_dependency('opentelemetry-sdk', '~> 1.5.0')
30
+ spec.add_dependency('opentelemetry-semantic_conventions', '~> 1.10.1')
31
+ spec.metadata['rubygems_mfa_required'] = 'true'
30
32
  end
@@ -1,3 +1,3 @@
1
1
  module Highlight
2
- VERSION = '0.4.0'.freeze
2
+ VERSION = '0.5.1'.freeze
3
3
  end
data/lib/highlight.rb CHANGED
@@ -1,10 +1,11 @@
1
- require 'opentelemetry/sdk'
2
- require 'opentelemetry/exporter/otlp'
3
- require 'opentelemetry/instrumentation/all'
4
- require 'opentelemetry/semantic_conventions'
5
1
  require 'date'
2
+ require 'highlight/version'
6
3
  require 'json'
7
4
  require 'logger'
5
+ require 'opentelemetry/exporter/otlp'
6
+ require 'opentelemetry/instrumentation/all'
7
+ require 'opentelemetry/sdk'
8
+ require 'opentelemetry/semantic_conventions'
8
9
  require 'securerandom'
9
10
 
10
11
  module Highlight
@@ -18,33 +19,58 @@ module Highlight
18
19
  end
19
20
  end
20
21
 
21
- def self.init(project_id, environment: '', otlp_endpoint: OTLP_HTTP, &block)
22
+ def self.init(project_id, environment: '', otlp_endpoint: H::OTLP_HTTP, &block)
22
23
  H.new(project_id, environment: environment, otlp_endpoint: otlp_endpoint, &block)
23
24
  end
24
25
 
25
26
  def self.start_span(name, attrs = {}, &block)
26
- if block_given?
27
+ if H.initialized?
27
28
  H.instance.start_span(name, attrs, &block)
28
- else
29
- H.instance.start_span(name, attrs) { |_| }
29
+ elsif block_given?
30
+ yield(OpenTelemetry::Trace::Span::INVALID)
30
31
  end
31
32
  end
32
33
 
33
34
  def self.log(level, message, attrs = {})
34
- H.instance.record_log(nil, nil, level, message, attrs)
35
+ return unless H.initialized?
36
+
37
+ H.instance&.record_log(nil, nil, level, message, attrs)
35
38
  end
36
39
 
37
40
  def self.exception(error, attrs = {})
38
- H.instance.record_exception(error, attrs)
41
+ return unless H.initialized?
42
+
43
+ H.instance&.record_exception(error, attrs)
39
44
  end
40
45
 
41
46
  def self.traceparent_meta
47
+ return unless H.initialized?
48
+
42
49
  Helpers.traceparent_meta
43
50
  end
44
51
 
52
+ def self.traceparent_meta_tag
53
+ return unless H.initialized?
54
+
55
+ Helpers.traceparent_meta_tag
56
+ end
57
+
58
+ def self.flush
59
+ return unless H.initialized?
60
+
61
+ H.instance.flush
62
+ end
63
+
64
+ def self.shutdown
65
+ return unless H.initialized?
66
+
67
+ H.instance.shutdown
68
+ end
69
+
45
70
  class H
46
- HIGHLIGHT_REQUEST_HEADER = 'X-Highlight-Request'.freeze
71
+ SDK_NAME = 'highlight-ruby'.freeze
47
72
  OTLP_HTTP = 'https://otel.highlight.io:4318'.freeze
73
+ HIGHLIGHT_REQUEST_HEADER = 'X-Highlight-Request'.freeze
48
74
  HIGHLIGHT_PROJECT_ATTRIBUTE = 'highlight.project_id'.freeze
49
75
  HIGHLIGHT_SESSION_ATTRIBUTE = 'highlight.session_id'.freeze
50
76
  HIGHLIGHT_TRACE_ATTRIBUTE = 'highlight.trace_id'.freeze
@@ -54,147 +80,149 @@ module Highlight
54
80
  CODE_FILEPATH = OpenTelemetry::SemanticConventions::Trace::CODE_FILEPATH
55
81
  CODE_LINENO = OpenTelemetry::SemanticConventions::Trace::CODE_LINENO
56
82
  CODE_FUNCTION = OpenTelemetry::SemanticConventions::Trace::CODE_FUNCTION
83
+ DEPLOYMENT_ENVIRONMENT_ATTRIBUTE = OpenTelemetry::SemanticConventions::Resource::DEPLOYMENT_ENVIRONMENT
84
+ HIGHLIGHT_SDK_VERSION_ATTRIBUTE = 'telemetry.distro.version'.freeze
85
+ HIGHLIGHT_SDK_NAME_ATTRIBUTE = 'telemetry.distro.name'.freeze
57
86
 
58
- def self.instance
59
- @@instance
87
+ class << self
88
+ attr_reader :instance
60
89
  end
61
90
 
62
- def initialize(project_id, environment: '', otlp_endpoint: OTLP_HTTP)
63
- @@instance = self # rubocop:disable Style/ClassVars
91
+ def self.initialized?
92
+ !@instance.nil?
93
+ end
64
94
 
65
- @project_id = project_id
66
- @otlp_endpoint = otlp_endpoint
95
+ def self.parse_headers(headers)
96
+ return HighlightHeaders.new(nil, nil) if headers.nil? || !headers.key?(HIGHLIGHT_REQUEST_HEADER)
67
97
 
68
- OpenTelemetry::SDK.configure do |c|
69
- c.add_span_processor(Highlight::Tracing::BaggageSpanProcessor.new)
98
+ session_id, request_id = headers[HIGHLIGHT_REQUEST_HEADER].split('/')
99
+ traceparent = headers['traceparent']
100
+ trace_id = traceparent&.split('-')&.[](1) || request_id
101
+ HighlightHeaders.new(session_id, trace_id)
102
+ end
70
103
 
71
- c.add_span_processor(
72
- OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
73
- OpenTelemetry::Exporter::OTLP::Exporter.new(
74
- endpoint: "#{@otlp_endpoint}/v1/traces",
75
- compression: 'gzip'
76
- ),
77
- schedule_delay: 1000,
78
- max_export_batch_size: 128,
79
- max_queue_size: 1024
80
- )
81
- )
104
+ def self.log_level_string(level)
105
+ case level
106
+ when Logger::FATAL then 'FATAL'
107
+ when Logger::ERROR then 'ERROR'
108
+ when Logger::WARN then 'WARN'
109
+ when Logger::INFO then 'INFO'
110
+ when Logger::DEBUG then 'DEBUG'
111
+ else 'UNKNOWN'
112
+ end
113
+ end
82
114
 
83
- c.resource = OpenTelemetry::SDK::Resources::Resource.create(
84
- HIGHLIGHT_PROJECT_ATTRIBUTE => @project_id,
85
- OpenTelemetry::SemanticConventions::Resource::SERVICE_NAME => environment,
86
- OpenTelemetry::SemanticConventions::Resource::DEPLOYMENT_ENVIRONMENT => environment
87
- )
115
+ def initialize(project_id, environment: '', otlp_endpoint: OTLP_HTTP, &block)
116
+ self.class.instance_variable_set(:@instance, self)
88
117
 
89
- c.use_all
118
+ @project_id = project_id
119
+ @otlp_endpoint = otlp_endpoint
120
+ @environment = environment
90
121
 
91
- yield c if block_given?
92
- end
122
+ configure_opentelemetry(&block)
93
123
 
94
124
  @tracer_provider = OpenTelemetry.tracer_provider
95
125
  @tracer = @tracer_provider.tracer('highlight-tracer')
96
126
  end
97
127
 
98
128
  def initialized?
99
- defined?(@tracer_provider)
129
+ !@tracer_provider.nil?
100
130
  end
101
131
 
102
132
  def flush
103
- return unless initialized?
133
+ @tracer_provider&.force_flush
134
+ end
104
135
 
105
- @tracer_provider.force_flush
136
+ def shutdown
137
+ @tracer_provider&.shutdown
106
138
  end
107
139
 
108
140
  def trace(session_id, request_id, attrs = {}, name: 'highlight.span', &block)
109
141
  return unless initialized?
110
142
 
111
- # Passed along by the BaggageSpanProcessor to child spans as attributes.
112
143
  ctx = OpenTelemetry::Baggage.set_value(HIGHLIGHT_SESSION_ATTRIBUTE, session_id || '')
113
144
  ctx = OpenTelemetry::Baggage.set_value(HIGHLIGHT_TRACE_ATTRIBUTE, request_id || '', context: ctx)
114
-
115
- OpenTelemetry::Context.with_current(ctx) do
116
- start_span(name, attrs, &block)
117
- end
145
+ OpenTelemetry::Context.with_current(ctx) { start_span(name, attrs, &block) }
118
146
  end
119
147
 
120
- def start_span(name, attrs = {}, &block)
148
+ def start_span(name, attrs = {})
121
149
  return unless initialized?
122
150
 
123
- if block_given?
124
- @tracer.in_span(name, attributes: attrs, &block)
125
- else
126
- @tracer.in_span(name, attributes: attrs) { |_| }
127
- end
151
+ @tracer.in_span(name, attributes: attrs.transform_keys(&:to_s)) { |span| yield(span) if block_given? }
128
152
  end
129
153
 
130
154
  def record_exception(e, attrs = {})
131
155
  return unless initialized?
132
156
 
133
- span = OpenTelemetry::Trace.current_span
134
- return unless span
135
-
136
- span.record_exception(e, attributes: attrs)
157
+ OpenTelemetry::Trace.current_span&.record_exception(e, attributes: attrs.transform_keys(&:to_s))
137
158
  end
138
159
 
139
160
  def record_log(session_id, request_id, level, message, attrs = {})
140
161
  return unless initialized?
141
162
 
142
- caller_info = caller[0].split(':', 3)
143
- function = caller_info[2]
144
- if function
145
- # format: "in `<function_name>""
146
- function.delete_prefix!('in `')
147
- function.delete_suffix!('"')
148
- end
163
+ log_attributes = create_log_attributes(level, message, attrs)
149
164
 
150
- @tracer.in_span('highlight.log', attributes: {
151
- HIGHLIGHT_SESSION_ATTRIBUTE => session_id,
152
- HIGHLIGHT_TRACE_ATTRIBUTE => request_id
153
- }.compact) do |span|
165
+ @tracer.in_span(
166
+ 'highlight.log',
167
+ attributes: {
168
+ HIGHLIGHT_SESSION_ATTRIBUTE => session_id || '',
169
+ HIGHLIGHT_TRACE_ATTRIBUTE => request_id || ''
170
+ }.compact
171
+ ) do |span|
154
172
  span.status = OpenTelemetry::Trace::Status.error(message) if [Logger::ERROR, Logger::FATAL].include?(level)
155
- span.add_event(LOG_EVENT, attributes: {
156
- LOG_SEVERITY_ATTRIBUTE => H.log_level_string(level),
157
- LOG_MESSAGE_ATTRIBUTE => message.to_s,
158
- CODE_FILEPATH => caller_info[0],
159
- CODE_LINENO => caller_info[1],
160
- CODE_FUNCTION => function
161
- }.merge(attrs))
173
+ span.add_event(LOG_EVENT, attributes: log_attributes)
162
174
  end
163
175
  end
164
176
 
165
- def self.parse_headers(headers)
166
- if headers && headers[HIGHLIGHT_REQUEST_HEADER]
167
- session_id, request_id = headers[HIGHLIGHT_REQUEST_HEADER].split('/')
168
- traceparent = headers['traceparent']
169
- trace_id = traceparent&.split('-')&.second || request_id
170
- return HighlightHeaders.new(session_id, trace_id)
177
+ private
178
+
179
+ def configure_opentelemetry
180
+ OpenTelemetry::SDK.configure do |c|
181
+ c.add_span_processor(Highlight::Tracing::BaggageSpanProcessor.new)
182
+ c.add_span_processor(create_batch_span_processor)
183
+ c.resource = create_resource
184
+ c.use_all
185
+ yield(c) if block_given?
171
186
  end
172
- HighlightHeaders.new(nil, nil)
173
187
  end
174
188
 
175
- def self.log_level_string(level)
176
- case level
177
- when Logger::UNKNOWN
178
- 'UNKNOWN'
179
- when Logger::FATAL
180
- 'FATAL'
181
- when Logger::ERROR
182
- 'ERROR'
183
- when Logger::WARN
184
- 'WARN'
185
- when Logger::INFO
186
- 'INFO'
187
- when Logger::DEBUG
188
- 'DEBUG'
189
- else
190
- 'UNKNOWN'
191
- end
189
+ def create_batch_span_processor
190
+ OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
191
+ OpenTelemetry::Exporter::OTLP::Exporter.new(
192
+ endpoint: "#{@otlp_endpoint}/v1/traces",
193
+ compression: 'gzip'
194
+ ),
195
+ schedule_delay: 1000,
196
+ max_export_batch_size: 128,
197
+ max_queue_size: 1024
198
+ )
192
199
  end
193
200
 
194
- private
201
+ def create_resource
202
+ OpenTelemetry::SDK::Resources::Resource.create(
203
+ HIGHLIGHT_PROJECT_ATTRIBUTE => @project_id,
204
+ HIGHLIGHT_SDK_VERSION_ATTRIBUTE => Highlight::VERSION,
205
+ HIGHLIGHT_SDK_NAME_ATTRIBUTE => SDK_NAME,
206
+ DEPLOYMENT_ENVIRONMENT_ATTRIBUTE => @environment
207
+ )
208
+ end
209
+
210
+ def create_log_attributes(level, message, attrs)
211
+ caller_info = parse_caller_info
212
+
213
+ {
214
+ LOG_SEVERITY_ATTRIBUTE => self.class.log_level_string(level),
215
+ LOG_MESSAGE_ATTRIBUTE => message.to_s,
216
+ CODE_FILEPATH => caller_info.first,
217
+ CODE_LINENO => caller_info[1],
218
+ CODE_FUNCTION => caller_info[2]
219
+ }.merge(attrs).transform_keys(&:to_s)
220
+ end
195
221
 
196
- def trace_id_from_headers(headers)
197
- headers.traceparent&.split('-')&.first
222
+ def parse_caller_info
223
+ caller_info = caller.first.split(':', 3)
224
+ function = caller_info[2]&.gsub(/^in `|'$/, '')
225
+ [caller_info.first, caller_info[1], function]
198
226
  end
199
227
  end
200
228
 
@@ -207,20 +235,15 @@ module Highlight
207
235
  end
208
236
 
209
237
  def add(severity, message = nil, progname = nil, &block)
210
- severity ||= UNKNOWN
238
+ severity ||= ::Logger::UNKNOWN
211
239
  return true if @logdev.nil? || severity < level
212
240
 
213
- progname = @progname if progname.nil?
214
- if message.nil?
215
- if block_given?
216
- message = yield
217
- else
218
- message = progname
219
- progname = @progname
220
- end
221
- end
222
- super(severity, message, progname, &block)
223
- H.instance.record_log(nil, nil, severity, message)
241
+ progname ||= @progname
242
+ message = yield if message.nil? && block_given?
243
+ message = progname if message.nil?
244
+
245
+ super
246
+ H.instance&.record_log(nil, nil, severity, message)
224
247
  end
225
248
  end
226
249
 
@@ -230,11 +253,13 @@ module Highlight
230
253
  base.extend(ClassMethods)
231
254
  base.helper_method(:highlight_headers)
232
255
  base.around_action(:with_highlight_context)
256
+ base.helper(ViewHelpers)
233
257
  end
234
258
 
235
259
  def with_highlight_context(&block)
236
- set_highlight_headers
260
+ return yield unless H.initialized?
237
261
 
262
+ set_highlight_headers
238
263
  H.instance.trace(
239
264
  highlight_headers.session_id,
240
265
  highlight_headers.request_id,
@@ -247,29 +272,31 @@ module Highlight
247
272
 
248
273
  def set_highlight_headers
249
274
  @highlight_headers = H.parse_headers(request.headers)
250
- return unless @highlight_headers.session_id.nil?
275
+ return if @highlight_headers.session_id
251
276
 
252
277
  session_id = request.cookies['sessionID'].presence || SecureRandom.alphanumeric(28)
253
-
254
278
  session_data_key = "sessionData_#{session_id}"
255
- @session_data = request.cookies[session_data_key] || {
279
+ @session_data = request.cookies[session_data_key] || create_session_data(session_id)
280
+
281
+ set_cookies(session_id, session_data_key)
282
+ @highlight_headers = HighlightHeaders.new(session_id, nil)
283
+ end
284
+
285
+ def create_session_data(session_id)
286
+ {
256
287
  sessionSecureID: session_id,
257
288
  projectID: @project_id,
258
289
  payloadID: 1,
259
- sessionStartTime: DateTime.now.strftime('%Q'),
260
- lastPushTime: DateTime.now.strftime('%Q')
290
+ sessionStartTime: Time.now.strftime('%Q'),
291
+ lastPushTime: Time.now.strftime('%Q')
261
292
  }
293
+ end
262
294
 
263
- cookies[:sessionID] = {
264
- value: session_id,
265
- expires: 15.minutes.from_now
266
- }
267
- cookies[session_data_key] = {
268
- value: @session_data.to_json,
269
- expires: 15.minutes.from_now
270
- }
295
+ def set_cookies(session_id, session_data_key)
296
+ expiration = 15.minutes.from_now
271
297
 
272
- @highlight_headers = HighlightHeaders.new(session_id, nil)
298
+ cookies[:sessionID] = { value: session_id, expires: expiration }
299
+ cookies[session_data_key] = { value: @session_data.to_json, expires: expiration }
273
300
  end
274
301
 
275
302
  def highlight_headers
@@ -278,6 +305,12 @@ module Highlight
278
305
 
279
306
  module ClassMethods
280
307
  end
308
+
309
+ module ViewHelpers
310
+ def highlight_traceparent_meta
311
+ tag.meta(name: 'traceparent', content: Helpers.traceparent_meta)
312
+ end
313
+ end
281
314
  end
282
315
  end
283
316
 
@@ -291,10 +324,14 @@ module Highlight
291
324
  current_trace = OpenTelemetry::Trace.current_span
292
325
  trace_id = current_trace&.context&.trace_id
293
326
  span_id = current_trace&.context&.span_id
294
- hex_trace_id = trace_id&.unpack1('H*') || '00000000000000000000000000000000'
295
- hex_span_id = span_id&.unpack1('H*') || '0000000000000000'
327
+ hex_trace_id = trace_id&.unpack1('H*') || ('0' * 32)
328
+ hex_span_id = span_id&.unpack1('H*') || ('0' * 16)
329
+
330
+ "00-#{hex_trace_id}-#{hex_span_id}-01"
331
+ end
296
332
 
297
- tag(:meta, name: 'traceparent', content: "00-#{hex_trace_id}-#{hex_span_id}-01")
333
+ def self.traceparent_meta_tag
334
+ "<meta name=\"traceparent\" content=\"#{traceparent_meta}\">"
298
335
  end
299
336
  end
300
337
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: highlight_io
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Highlight
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-08-22 00:00:00.000000000 Z
11
+ date: 2024-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grpc
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.65'
19
+ version: '1.66'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.65'
26
+ version: '1.66'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: opentelemetry-exporter-otlp
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -106,6 +106,7 @@ licenses:
106
106
  - MIT
107
107
  metadata:
108
108
  homepage_uri: https://www.highlight.io
109
+ rubygems_mfa_required: 'true'
109
110
  post_install_message:
110
111
  rdoc_options: []
111
112
  require_paths:
@@ -121,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
122
  - !ruby/object:Gem::Version
122
123
  version: '0'
123
124
  requirements: []
124
- rubygems_version: 3.5.11
125
+ rubygems_version: 3.5.16
125
126
  signing_key:
126
127
  specification_version: 4
127
128
  summary: The Highlight SDK for Ruby