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