highlight_io 0.3.1 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +35 -1
- data/CHANGELOG.md +23 -9
- data/Gemfile.lock +13 -13
- data/highlight.gemspec +10 -8
- data/lib/highlight/version.rb +1 -1
- data/lib/highlight.rb +187 -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,21 +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`
|
14
|
+
|
15
|
+
## 0.2.2
|
16
|
+
|
17
|
+
- Fix duplicate errors recorded on traces.
|
18
|
+
|
19
|
+
## 0.2.1
|
20
|
+
|
21
|
+
- Ensure `message` on logs is always a string.
|
9
22
|
|
10
23
|
## 0.2.0
|
11
24
|
|
12
25
|
- Support setting `environment` attribute to SDK initialization.
|
13
26
|
- `otlp_endpoint` updated to keyword parameter when initializing.
|
14
27
|
|
15
|
-
## 0.
|
28
|
+
## 0.1.4
|
16
29
|
|
17
|
-
-
|
30
|
+
- Tune settings of opentelemetry SDK to reduce memory usage.
|
31
|
+
- Enable GZIP compression of exported data.
|
18
32
|
|
19
|
-
## 0.
|
33
|
+
## 0.1.2
|
20
34
|
|
21
|
-
-
|
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)
|
@@ -12,20 +12,20 @@ GEM
|
|
12
12
|
remote: https://rubygems.org/
|
13
13
|
specs:
|
14
14
|
ast (2.4.2)
|
15
|
-
google-protobuf (3.25.
|
16
|
-
google-protobuf (3.25.
|
15
|
+
google-protobuf (3.25.4-arm64-darwin)
|
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,17 +48,17 @@ 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
|
-
opentelemetry-instrumentation-active_job (0.7.
|
55
|
+
opentelemetry-instrumentation-active_job (0.7.7)
|
56
56
|
opentelemetry-api (~> 1.0)
|
57
57
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
58
58
|
opentelemetry-instrumentation-active_model_serializers (0.20.2)
|
59
59
|
opentelemetry-api (~> 1.0)
|
60
60
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
61
|
-
opentelemetry-instrumentation-active_record (0.7.
|
61
|
+
opentelemetry-instrumentation-active_record (0.7.4)
|
62
62
|
opentelemetry-api (~> 1.0)
|
63
63
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
64
64
|
opentelemetry-instrumentation-active_support (0.6.0)
|
@@ -105,7 +105,7 @@ GEM
|
|
105
105
|
opentelemetry-instrumentation-aws_sdk (0.5.4)
|
106
106
|
opentelemetry-api (~> 1.0)
|
107
107
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
108
|
-
opentelemetry-instrumentation-base (0.22.
|
108
|
+
opentelemetry-instrumentation-base (0.22.6)
|
109
109
|
opentelemetry-api (~> 1.0)
|
110
110
|
opentelemetry-common (~> 0.21)
|
111
111
|
opentelemetry-registry (~> 0.1)
|
@@ -176,7 +176,7 @@ GEM
|
|
176
176
|
opentelemetry-instrumentation-rack (0.24.6)
|
177
177
|
opentelemetry-api (~> 1.0)
|
178
178
|
opentelemetry-instrumentation-base (~> 0.22.1)
|
179
|
-
opentelemetry-instrumentation-rails (0.31.
|
179
|
+
opentelemetry-instrumentation-rails (0.31.2)
|
180
180
|
opentelemetry-api (~> 1.0)
|
181
181
|
opentelemetry-instrumentation-action_mailer (~> 0.1.0)
|
182
182
|
opentelemetry-instrumentation-action_pack (~> 0.9.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,29 +18,58 @@ module Highlight
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
def self.init(project_id, environment: '', otlp_endpoint: H::OTLP_HTTP, &block)
|
22
|
+
H.new(project_id, environment: environment, otlp_endpoint: otlp_endpoint, &block)
|
23
|
+
end
|
24
|
+
|
21
25
|
def self.start_span(name, attrs = {}, &block)
|
22
|
-
if
|
26
|
+
if H.initialized?
|
23
27
|
H.instance.start_span(name, attrs, &block)
|
24
|
-
|
25
|
-
|
28
|
+
elsif block_given?
|
29
|
+
yield(OpenTelemetry::Trace::Span::INVALID)
|
26
30
|
end
|
27
31
|
end
|
28
32
|
|
29
33
|
def self.log(level, message, attrs = {})
|
30
|
-
H.
|
34
|
+
return unless H.initialized?
|
35
|
+
|
36
|
+
H.instance&.record_log(nil, nil, level, message, attrs)
|
31
37
|
end
|
32
38
|
|
33
39
|
def self.exception(error, attrs = {})
|
34
|
-
H.
|
40
|
+
return unless H.initialized?
|
41
|
+
|
42
|
+
H.instance&.record_exception(error, attrs)
|
35
43
|
end
|
36
44
|
|
37
45
|
def self.traceparent_meta
|
46
|
+
return unless H.initialized?
|
47
|
+
|
38
48
|
Helpers.traceparent_meta
|
39
49
|
end
|
40
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
|
+
|
41
69
|
class H
|
42
|
-
|
70
|
+
SDK_NAME = 'highlight-ruby'.freeze
|
43
71
|
OTLP_HTTP = 'https://otel.highlight.io:4318'.freeze
|
72
|
+
HIGHLIGHT_REQUEST_HEADER = 'X-Highlight-Request'.freeze
|
44
73
|
HIGHLIGHT_PROJECT_ATTRIBUTE = 'highlight.project_id'.freeze
|
45
74
|
HIGHLIGHT_SESSION_ATTRIBUTE = 'highlight.session_id'.freeze
|
46
75
|
HIGHLIGHT_TRACE_ATTRIBUTE = 'highlight.trace_id'.freeze
|
@@ -50,171 +79,170 @@ module Highlight
|
|
50
79
|
CODE_FILEPATH = OpenTelemetry::SemanticConventions::Trace::CODE_FILEPATH
|
51
80
|
CODE_LINENO = OpenTelemetry::SemanticConventions::Trace::CODE_LINENO
|
52
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
|
53
85
|
|
54
|
-
|
55
|
-
|
86
|
+
class << self
|
87
|
+
attr_reader :instance
|
56
88
|
end
|
57
89
|
|
58
|
-
def
|
59
|
-
|
90
|
+
def self.initialized?
|
91
|
+
!@instance.nil?
|
92
|
+
end
|
60
93
|
|
61
|
-
|
62
|
-
|
94
|
+
def self.parse_headers(headers)
|
95
|
+
return HighlightHeaders.new(nil, nil) if headers.nil? || !headers.key?(HIGHLIGHT_REQUEST_HEADER)
|
63
96
|
|
64
|
-
|
65
|
-
|
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
|
66
102
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
)
|
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
|
78
113
|
|
79
|
-
|
80
|
-
|
81
|
-
OpenTelemetry::SemanticConventions::Resource::SERVICE_NAME => environment,
|
82
|
-
OpenTelemetry::SemanticConventions::Resource::DEPLOYMENT_ENVIRONMENT => environment
|
83
|
-
)
|
114
|
+
def initialize(project_id, environment: '', otlp_endpoint: OTLP_HTTP, &block)
|
115
|
+
self.class.instance_variable_set(:@instance, self)
|
84
116
|
|
85
|
-
|
117
|
+
@project_id = project_id
|
118
|
+
@otlp_endpoint = otlp_endpoint
|
119
|
+
@environment = environment
|
86
120
|
|
87
|
-
|
88
|
-
end
|
121
|
+
configure_opentelemetry(&block)
|
89
122
|
|
90
123
|
@tracer_provider = OpenTelemetry.tracer_provider
|
91
124
|
@tracer = @tracer_provider.tracer('highlight-tracer')
|
92
125
|
end
|
93
126
|
|
94
127
|
def initialized?
|
95
|
-
|
128
|
+
!@tracer_provider.nil?
|
96
129
|
end
|
97
130
|
|
98
131
|
def flush
|
99
|
-
|
132
|
+
@tracer_provider&.force_flush
|
133
|
+
end
|
100
134
|
|
101
|
-
|
135
|
+
def shutdown
|
136
|
+
@tracer_provider&.shutdown
|
102
137
|
end
|
103
138
|
|
104
139
|
def trace(session_id, request_id, attrs = {}, name: 'highlight.span', &block)
|
105
140
|
return unless initialized?
|
106
141
|
|
107
|
-
# Passed along by the BaggageSpanProcessor to child spans as attributes.
|
108
142
|
ctx = OpenTelemetry::Baggage.set_value(HIGHLIGHT_SESSION_ATTRIBUTE, session_id || '')
|
109
143
|
ctx = OpenTelemetry::Baggage.set_value(HIGHLIGHT_TRACE_ATTRIBUTE, request_id || '', context: ctx)
|
110
|
-
|
111
|
-
OpenTelemetry::Context.with_current(ctx) do
|
112
|
-
start_span(name, attrs, &block)
|
113
|
-
end
|
144
|
+
OpenTelemetry::Context.with_current(ctx) { start_span(name, attrs, &block) }
|
114
145
|
end
|
115
146
|
|
116
|
-
def start_span(name, attrs = {}
|
147
|
+
def start_span(name, attrs = {})
|
117
148
|
return unless initialized?
|
118
149
|
|
119
|
-
if block_given?
|
120
|
-
@tracer.in_span(name, attributes: attrs, &block)
|
121
|
-
else
|
122
|
-
@tracer.in_span(name, attributes: attrs) { |_| }
|
123
|
-
end
|
150
|
+
@tracer.in_span(name, attributes: attrs.transform_keys(&:to_s)) { |span| yield(span) if block_given? }
|
124
151
|
end
|
125
152
|
|
126
153
|
def record_exception(e, attrs = {})
|
127
154
|
return unless initialized?
|
128
155
|
|
129
|
-
|
130
|
-
return unless span
|
131
|
-
|
132
|
-
span.record_exception(e, attributes: attrs)
|
156
|
+
OpenTelemetry::Trace.current_span&.record_exception(e, attributes: attrs.transform_keys(&:to_s))
|
133
157
|
end
|
134
158
|
|
135
159
|
def record_log(session_id, request_id, level, message, attrs = {})
|
136
160
|
return unless initialized?
|
137
161
|
|
138
|
-
|
139
|
-
function = caller_info[2]
|
140
|
-
if function
|
141
|
-
# format: "in `<function_name>""
|
142
|
-
function.delete_prefix!('in `')
|
143
|
-
function.delete_suffix!('"')
|
144
|
-
end
|
162
|
+
log_attributes = create_log_attributes(level, message, attrs)
|
145
163
|
|
146
|
-
@tracer.in_span(
|
147
|
-
|
148
|
-
|
149
|
-
|
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|
|
150
171
|
span.status = OpenTelemetry::Trace::Status.error(message) if [Logger::ERROR, Logger::FATAL].include?(level)
|
151
|
-
span.add_event(LOG_EVENT, attributes:
|
152
|
-
LOG_SEVERITY_ATTRIBUTE => H.log_level_string(level),
|
153
|
-
LOG_MESSAGE_ATTRIBUTE => message.to_s,
|
154
|
-
CODE_FILEPATH => caller_info[0],
|
155
|
-
CODE_LINENO => caller_info[1],
|
156
|
-
CODE_FUNCTION => function
|
157
|
-
}.merge(attrs))
|
172
|
+
span.add_event(LOG_EVENT, attributes: log_attributes)
|
158
173
|
end
|
159
174
|
end
|
160
175
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
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?
|
167
185
|
end
|
168
|
-
HighlightHeaders.new(nil, nil)
|
169
186
|
end
|
170
187
|
|
171
|
-
def
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
when Logger::INFO
|
182
|
-
'INFO'
|
183
|
-
when Logger::DEBUG
|
184
|
-
'DEBUG'
|
185
|
-
else
|
186
|
-
'UNKNOWN'
|
187
|
-
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
|
+
)
|
188
198
|
end
|
189
199
|
|
190
|
-
|
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
|
191
211
|
|
192
|
-
|
193
|
-
|
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
|
220
|
+
|
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]
|
194
225
|
end
|
195
226
|
end
|
196
227
|
|
197
228
|
class Logger < ::Logger
|
229
|
+
include ActiveSupport::LoggerSilence if defined?(::ActiveSupport::LoggerSilence)
|
230
|
+
|
198
231
|
def initialize(*args)
|
199
232
|
super
|
200
233
|
@local_level = nil
|
201
234
|
end
|
202
235
|
|
203
236
|
def add(severity, message = nil, progname = nil, &block)
|
204
|
-
severity ||= UNKNOWN
|
237
|
+
severity ||= ::Logger::UNKNOWN
|
205
238
|
return true if @logdev.nil? || severity < level
|
206
239
|
|
207
|
-
progname
|
208
|
-
if message.nil?
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
progname = @progname
|
214
|
-
end
|
215
|
-
end
|
216
|
-
super(severity, message, progname, &block)
|
217
|
-
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)
|
218
246
|
end
|
219
247
|
end
|
220
248
|
|
@@ -223,41 +251,49 @@ module Highlight
|
|
223
251
|
def self.included(base)
|
224
252
|
base.extend(ClassMethods)
|
225
253
|
base.helper_method(:highlight_headers)
|
254
|
+
base.around_action(:with_highlight_context)
|
255
|
+
base.helper(ViewHelpers)
|
226
256
|
end
|
227
257
|
|
228
258
|
def with_highlight_context(&block)
|
229
259
|
set_highlight_headers
|
230
|
-
H.instance.trace(
|
231
|
-
|
260
|
+
H.instance.trace(
|
261
|
+
highlight_headers.session_id,
|
262
|
+
highlight_headers.request_id,
|
263
|
+
name: "#{request.method.upcase} #{request.path}",
|
264
|
+
&block
|
265
|
+
)
|
232
266
|
end
|
233
267
|
|
234
268
|
private
|
235
269
|
|
236
270
|
def set_highlight_headers
|
237
271
|
@highlight_headers = H.parse_headers(request.headers)
|
238
|
-
return
|
272
|
+
return if @highlight_headers.session_id
|
239
273
|
|
240
274
|
session_id = request.cookies['sessionID'].presence || SecureRandom.alphanumeric(28)
|
241
|
-
|
242
275
|
session_data_key = "sessionData_#{session_id}"
|
243
|
-
@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
|
+
{
|
244
284
|
sessionSecureID: session_id,
|
245
285
|
projectID: @project_id,
|
246
286
|
payloadID: 1,
|
247
|
-
sessionStartTime:
|
248
|
-
lastPushTime:
|
287
|
+
sessionStartTime: Time.now.strftime('%Q'),
|
288
|
+
lastPushTime: Time.now.strftime('%Q')
|
249
289
|
}
|
290
|
+
end
|
250
291
|
|
251
|
-
|
252
|
-
|
253
|
-
expires: 15.minutes.from_now
|
254
|
-
}
|
255
|
-
cookies[session_data_key] = {
|
256
|
-
value: @session_data.to_json,
|
257
|
-
expires: 15.minutes.from_now
|
258
|
-
}
|
292
|
+
def set_cookies(session_id, session_data_key)
|
293
|
+
expiration = 15.minutes.from_now
|
259
294
|
|
260
|
-
|
295
|
+
cookies[:sessionID] = { value: session_id, expires: expiration }
|
296
|
+
cookies[session_data_key] = { value: @session_data.to_json, expires: expiration }
|
261
297
|
end
|
262
298
|
|
263
299
|
def highlight_headers
|
@@ -266,6 +302,12 @@ module Highlight
|
|
266
302
|
|
267
303
|
module ClassMethods
|
268
304
|
end
|
305
|
+
|
306
|
+
module ViewHelpers
|
307
|
+
def highlight_traceparent_meta
|
308
|
+
tag.meta(name: 'traceparent', content: Helpers.traceparent_meta)
|
309
|
+
end
|
310
|
+
end
|
269
311
|
end
|
270
312
|
end
|
271
313
|
|
@@ -279,10 +321,24 @@ module Highlight
|
|
279
321
|
current_trace = OpenTelemetry::Trace.current_span
|
280
322
|
trace_id = current_trace&.context&.trace_id
|
281
323
|
span_id = current_trace&.context&.span_id
|
282
|
-
hex_trace_id = trace_id&.unpack1('H*') || '
|
283
|
-
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
|
284
329
|
|
285
|
-
|
330
|
+
def self.traceparent_meta_tag
|
331
|
+
"<meta name=\"traceparent\" content=\"#{traceparent_meta}\">"
|
332
|
+
end
|
333
|
+
end
|
334
|
+
|
335
|
+
if defined?(::Rails::Railtie)
|
336
|
+
class Railtie < ::Rails::Railtie
|
337
|
+
config.after_initialize do
|
338
|
+
ActiveSupport.on_load(:action_controller) do
|
339
|
+
include ::Highlight::Integrations::Rails
|
340
|
+
end
|
341
|
+
end
|
286
342
|
end
|
287
343
|
end
|
288
344
|
end
|
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
|