chronos-ruby 0.5.0.pre.1 → 0.7.0.pre.1
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 +46 -0
- data/README.md +37 -8
- data/contracts/apm-batch-v1.schema.json +35 -0
- data/contracts/event-v1.schema.json +1 -1
- data/contracts/sidekiq-job-v1.schema.json +21 -0
- data/docs/adr/ADR-014-sidekiq-envelope-context.md +27 -0
- data/docs/adr/ADR-015-bounded-apm-aggregation.md +27 -0
- data/docs/architecture.md +10 -1
- data/docs/compatibility.md +8 -0
- data/docs/configuration.md +18 -1
- data/docs/data-collected.md +16 -2
- data/docs/modules/apm-aggregation.md +57 -0
- data/docs/modules/configuration.md +2 -0
- data/docs/modules/rails-legacy.md +1 -1
- data/docs/modules/sidekiq-legacy.md +23 -0
- data/docs/modules/telemetry-events.md +1 -1
- data/docs/performance.md +25 -1
- data/docs/privacy-lgpd.md +13 -3
- data/docs/troubleshooting.md +20 -0
- data/lib/chronos/agent.rb +40 -0
- data/lib/chronos/application/apm_aggregator.rb +273 -0
- data/lib/chronos/application/capture_telemetry.rb +45 -5
- data/lib/chronos/application/delivery_pipeline.rb +7 -0
- data/lib/chronos/application/remote_configuration.rb +6 -1
- data/lib/chronos/configuration/apm_validation.rb +60 -0
- data/lib/chronos/configuration.rb +22 -2
- data/lib/chronos/core/metric_aggregate.rb +113 -0
- data/lib/chronos/core/sql_normalizer.rb +114 -0
- data/lib/chronos/core/telemetry_event.rb +1 -1
- data/lib/chronos/integrations/job_payload.rb +72 -0
- data/lib/chronos/integrations/rack/middleware.rb +19 -1
- data/lib/chronos/integrations/sidekiq.rb +260 -0
- data/lib/chronos/internal/worker_pool.rb +19 -2
- data/lib/chronos/rails/notifications_subscriber.rb +36 -4
- data/lib/chronos/sidekiq.rb +12 -0
- data/lib/chronos/version.rb +1 -1
- data/lib/chronos.rb +25 -0
- metadata +15 -2
|
@@ -29,6 +29,7 @@ module Chronos
|
|
|
29
29
|
def initialize(notifier = Chronos, notifications = nil)
|
|
30
30
|
@notifier = notifier
|
|
31
31
|
@notifications = notifications || active_support_notifications
|
|
32
|
+
@sql_normalizer = Core::SqlNormalizer.new
|
|
32
33
|
end
|
|
33
34
|
|
|
34
35
|
def install
|
|
@@ -105,7 +106,7 @@ module Chronos
|
|
|
105
106
|
"route" => route(payload),
|
|
106
107
|
"duration_ms" => duration, "parameters" => hash(value(payload, :params))
|
|
107
108
|
}
|
|
108
|
-
|
|
109
|
+
record_once("request", "request", data)
|
|
109
110
|
end
|
|
110
111
|
|
|
111
112
|
def render_template(payload, duration)
|
|
@@ -117,10 +118,15 @@ module Chronos
|
|
|
117
118
|
end
|
|
118
119
|
|
|
119
120
|
def sql(payload, duration)
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
metadata = {
|
|
122
|
+
:name => value(payload, :name), :cached => value(payload, :cached),
|
|
123
|
+
:adapter => value(payload, :adapter), :connection => value(payload, :connection),
|
|
124
|
+
:role => value(payload, :connection_role) || value(payload, :role),
|
|
125
|
+
:shard => value(payload, :connection_shard) || value(payload, :shard),
|
|
126
|
+
:exception_object => value(payload, :exception_object), :exception => value(payload, :exception)
|
|
123
127
|
}
|
|
128
|
+
metadata[:source] = sampled_query_source if duration >= slow_query_threshold
|
|
129
|
+
data = @sql_normalizer.call(value(payload, :sql), metadata).merge("duration_ms" => duration)
|
|
124
130
|
@notifier.record_event("query", data)
|
|
125
131
|
end
|
|
126
132
|
|
|
@@ -198,6 +204,32 @@ module Chronos
|
|
|
198
204
|
rescue StandardError
|
|
199
205
|
""
|
|
200
206
|
end
|
|
207
|
+
|
|
208
|
+
def record_once(key, event_type, payload)
|
|
209
|
+
if @notifier.respond_to?(:record_event_once)
|
|
210
|
+
@notifier.record_event_once(key, event_type, payload)
|
|
211
|
+
else
|
|
212
|
+
@notifier.record_event(event_type, payload)
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
def slow_query_threshold
|
|
217
|
+
options = @notifier.respond_to?(:apm_integration_options) ? @notifier.apm_integration_options : {}
|
|
218
|
+
(options[:slow_query_threshold_ms] || 500.0).to_f
|
|
219
|
+
rescue StandardError
|
|
220
|
+
500.0
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def sampled_query_source
|
|
224
|
+
options = @notifier.respond_to?(:apm_integration_options) ? @notifier.apm_integration_options : {}
|
|
225
|
+
root = options[:root_directory].to_s
|
|
226
|
+
frame = caller.find do |line|
|
|
227
|
+
(root.empty? || line.start_with?(root)) && line !~ %r{/lib/chronos/}
|
|
228
|
+
end
|
|
229
|
+
frame.to_s.sub(/:in .*/, "")[0, 256]
|
|
230
|
+
rescue StandardError
|
|
231
|
+
""
|
|
232
|
+
end
|
|
201
233
|
end
|
|
202
234
|
end
|
|
203
235
|
end
|
data/lib/chronos/version.rb
CHANGED
data/lib/chronos.rb
CHANGED
|
@@ -16,6 +16,8 @@ require "chronos/core/sanitizer"
|
|
|
16
16
|
require "chronos/core/safe_serializer"
|
|
17
17
|
require "chronos/core/payload_serializer"
|
|
18
18
|
require "chronos/core/telemetry_event"
|
|
19
|
+
require "chronos/core/sql_normalizer"
|
|
20
|
+
require "chronos/core/metric_aggregate"
|
|
19
21
|
require "chronos/ports/transport"
|
|
20
22
|
require "chronos/ports/context_store"
|
|
21
23
|
require "chronos/internal/safe_logger"
|
|
@@ -30,6 +32,7 @@ require "chronos/application/circuit_breaker"
|
|
|
30
32
|
require "chronos/application/remote_configuration"
|
|
31
33
|
require "chronos/application/delivery_pipeline"
|
|
32
34
|
require "chronos/application/capture_exception"
|
|
35
|
+
require "chronos/application/apm_aggregator"
|
|
33
36
|
require "chronos/application/capture_telemetry"
|
|
34
37
|
require "chronos/agent"
|
|
35
38
|
require "chronos/integrations"
|
|
@@ -104,6 +107,28 @@ module Chronos
|
|
|
104
107
|
false
|
|
105
108
|
end
|
|
106
109
|
|
|
110
|
+
def record_event_once(key, event_type, payload = {}, context = {})
|
|
111
|
+
agent = current_agent
|
|
112
|
+
agent ? agent.record_event_once(key, event_type, payload, context) : false
|
|
113
|
+
rescue StandardError
|
|
114
|
+
false
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def apm_integration_options
|
|
118
|
+
agent = current_agent
|
|
119
|
+
agent ? agent.apm_integration_options : {:enabled => false}
|
|
120
|
+
rescue StandardError
|
|
121
|
+
{:enabled => false}
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Returns only trace/request identifiers for optional process-boundary adapters.
|
|
125
|
+
def propagation_context
|
|
126
|
+
agent = current_agent
|
|
127
|
+
agent ? agent.propagation_context : {}
|
|
128
|
+
rescue StandardError
|
|
129
|
+
{}
|
|
130
|
+
end
|
|
131
|
+
|
|
107
132
|
def notify_once(exception, context = {})
|
|
108
133
|
agent = current_agent
|
|
109
134
|
agent ? agent.notify_once(exception, context) : false
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: chronos-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0.pre.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Antonio Jefferson
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-07-
|
|
11
|
+
date: 2026-07-21 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: bundler
|
|
@@ -86,8 +86,10 @@ files:
|
|
|
86
86
|
- LICENSE.txt
|
|
87
87
|
- README.md
|
|
88
88
|
- SECURITY.md
|
|
89
|
+
- contracts/apm-batch-v1.schema.json
|
|
89
90
|
- contracts/event-v1.schema.json
|
|
90
91
|
- contracts/rack-context-v1.schema.json
|
|
92
|
+
- contracts/sidekiq-job-v1.schema.json
|
|
91
93
|
- docs/adr/ADR-001-core-and-integrations.md
|
|
92
94
|
- docs/adr/ADR-002-version-lines.md
|
|
93
95
|
- docs/adr/ADR-003-net-http-legacy-transport.md
|
|
@@ -97,11 +99,14 @@ files:
|
|
|
97
99
|
- docs/adr/ADR-011-bounded-resilience-and-remote-control.md
|
|
98
100
|
- docs/adr/ADR-012-rack-context-isolation.md
|
|
99
101
|
- docs/adr/ADR-013-legacy-rails-notifications.md
|
|
102
|
+
- docs/adr/ADR-014-sidekiq-envelope-context.md
|
|
103
|
+
- docs/adr/ADR-015-bounded-apm-aggregation.md
|
|
100
104
|
- docs/architecture.md
|
|
101
105
|
- docs/compatibility.md
|
|
102
106
|
- docs/configuration.md
|
|
103
107
|
- docs/data-collected.md
|
|
104
108
|
- docs/examples/plain-ruby.md
|
|
109
|
+
- docs/modules/apm-aggregation.md
|
|
105
110
|
- docs/modules/async-queue.md
|
|
106
111
|
- docs/modules/configuration.md
|
|
107
112
|
- docs/modules/notice-pipeline.md
|
|
@@ -111,6 +116,7 @@ files:
|
|
|
111
116
|
- docs/modules/retry-backlog.md
|
|
112
117
|
- docs/modules/sanitization.md
|
|
113
118
|
- docs/modules/serialization.md
|
|
119
|
+
- docs/modules/sidekiq-legacy.md
|
|
114
120
|
- docs/modules/telemetry-events.md
|
|
115
121
|
- docs/modules/transport.md
|
|
116
122
|
- docs/performance.md
|
|
@@ -122,6 +128,7 @@ files:
|
|
|
122
128
|
- lib/chronos/adapters/thread_local_context_store.rb
|
|
123
129
|
- lib/chronos/agent.rb
|
|
124
130
|
- lib/chronos/application.rb
|
|
131
|
+
- lib/chronos/application/apm_aggregator.rb
|
|
125
132
|
- lib/chronos/application/capture_exception.rb
|
|
126
133
|
- lib/chronos/application/capture_telemetry.rb
|
|
127
134
|
- lib/chronos/application/circuit_breaker.rb
|
|
@@ -129,12 +136,14 @@ files:
|
|
|
129
136
|
- lib/chronos/application/remote_configuration.rb
|
|
130
137
|
- lib/chronos/application/retry_policy.rb
|
|
131
138
|
- lib/chronos/configuration.rb
|
|
139
|
+
- lib/chronos/configuration/apm_validation.rb
|
|
132
140
|
- lib/chronos/configuration/snapshot.rb
|
|
133
141
|
- lib/chronos/configuration/validation.rb
|
|
134
142
|
- lib/chronos/core.rb
|
|
135
143
|
- lib/chronos/core/backtrace_parser.rb
|
|
136
144
|
- lib/chronos/core/breadcrumb.rb
|
|
137
145
|
- lib/chronos/core/exception_cause_collector.rb
|
|
146
|
+
- lib/chronos/core/metric_aggregate.rb
|
|
138
147
|
- lib/chronos/core/notice.rb
|
|
139
148
|
- lib/chronos/core/notice_builder.rb
|
|
140
149
|
- lib/chronos/core/payload_serializer.rb
|
|
@@ -142,11 +151,14 @@ files:
|
|
|
142
151
|
- lib/chronos/core/safe_serializer.rb
|
|
143
152
|
- lib/chronos/core/sanitizer.rb
|
|
144
153
|
- lib/chronos/core/sensitive_value_filter.rb
|
|
154
|
+
- lib/chronos/core/sql_normalizer.rb
|
|
145
155
|
- lib/chronos/core/telemetry_event.rb
|
|
146
156
|
- lib/chronos/errors.rb
|
|
147
157
|
- lib/chronos/integrations.rb
|
|
158
|
+
- lib/chronos/integrations/job_payload.rb
|
|
148
159
|
- lib/chronos/integrations/rack.rb
|
|
149
160
|
- lib/chronos/integrations/rack/middleware.rb
|
|
161
|
+
- lib/chronos/integrations/sidekiq.rb
|
|
150
162
|
- lib/chronos/internal.rb
|
|
151
163
|
- lib/chronos/internal/bounded_queue.rb
|
|
152
164
|
- lib/chronos/internal/memory_backlog.rb
|
|
@@ -161,6 +173,7 @@ files:
|
|
|
161
173
|
- lib/chronos/rails/railtie.rb
|
|
162
174
|
- lib/chronos/ruby.rb
|
|
163
175
|
- lib/chronos/ruby/version.rb
|
|
176
|
+
- lib/chronos/sidekiq.rb
|
|
164
177
|
- lib/chronos/version.rb
|
|
165
178
|
- lib/generators/chronos/install/install_generator.rb
|
|
166
179
|
- lib/generators/chronos/install/templates/chronos.rb
|