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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +46 -0
  3. data/README.md +37 -8
  4. data/contracts/apm-batch-v1.schema.json +35 -0
  5. data/contracts/event-v1.schema.json +1 -1
  6. data/contracts/sidekiq-job-v1.schema.json +21 -0
  7. data/docs/adr/ADR-014-sidekiq-envelope-context.md +27 -0
  8. data/docs/adr/ADR-015-bounded-apm-aggregation.md +27 -0
  9. data/docs/architecture.md +10 -1
  10. data/docs/compatibility.md +8 -0
  11. data/docs/configuration.md +18 -1
  12. data/docs/data-collected.md +16 -2
  13. data/docs/modules/apm-aggregation.md +57 -0
  14. data/docs/modules/configuration.md +2 -0
  15. data/docs/modules/rails-legacy.md +1 -1
  16. data/docs/modules/sidekiq-legacy.md +23 -0
  17. data/docs/modules/telemetry-events.md +1 -1
  18. data/docs/performance.md +25 -1
  19. data/docs/privacy-lgpd.md +13 -3
  20. data/docs/troubleshooting.md +20 -0
  21. data/lib/chronos/agent.rb +40 -0
  22. data/lib/chronos/application/apm_aggregator.rb +273 -0
  23. data/lib/chronos/application/capture_telemetry.rb +45 -5
  24. data/lib/chronos/application/delivery_pipeline.rb +7 -0
  25. data/lib/chronos/application/remote_configuration.rb +6 -1
  26. data/lib/chronos/configuration/apm_validation.rb +60 -0
  27. data/lib/chronos/configuration.rb +22 -2
  28. data/lib/chronos/core/metric_aggregate.rb +113 -0
  29. data/lib/chronos/core/sql_normalizer.rb +114 -0
  30. data/lib/chronos/core/telemetry_event.rb +1 -1
  31. data/lib/chronos/integrations/job_payload.rb +72 -0
  32. data/lib/chronos/integrations/rack/middleware.rb +19 -1
  33. data/lib/chronos/integrations/sidekiq.rb +260 -0
  34. data/lib/chronos/internal/worker_pool.rb +19 -2
  35. data/lib/chronos/rails/notifications_subscriber.rb +36 -4
  36. data/lib/chronos/sidekiq.rb +12 -0
  37. data/lib/chronos/version.rb +1 -1
  38. data/lib/chronos.rb +25 -0
  39. 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
- @notifier.record_event("request", data)
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
- data = {
121
- "name" => value(payload, :name).to_s, "cached" => value(payload, :cached) == true,
122
- "duration_ms" => duration
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
@@ -0,0 +1,12 @@
1
+ require "chronos"
2
+
3
+ sidekiq_available = begin
4
+ require "sidekiq"
5
+ true
6
+ rescue LoadError
7
+ false
8
+ end
9
+
10
+ require "chronos/integrations/sidekiq"
11
+
12
+ Chronos::Integrations::Sidekiq.install if sidekiq_available && defined?(::Sidekiq)
@@ -1,4 +1,4 @@
1
1
  module Chronos
2
2
  # Current version of the legacy Chronos Ruby agent.
3
- VERSION = "0.5.0.pre.1".freeze
3
+ VERSION = "0.7.0.pre.1".freeze
4
4
  end
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.5.0.pre.1
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-20 00:00:00.000000000 Z
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