Loading lib/labkit/covered_experience.rb +4 −3 Original line number Diff line number Diff line Loading @@ -85,10 +85,11 @@ module Labkit end def find_current(experience_id) definition = registry[experience_id] data = Current.experiences[experience_id.to_s] || {} xp = Current.active_experiences[experience_id.to_s] return xp unless xp.nil? Experience.new(definition).rehydrate(data) if definition definition = registry[experience_id] Experience.new(definition) if definition end end end Loading lib/labkit/covered_experience/current.rb +5 −5 Original line number Diff line number Diff line Loading @@ -13,20 +13,20 @@ module Labkit # store and access experiences throughout the request and background job lifecycle. # # Example usage: # Labkit::CoveredExperience::Current.experiences << my_experience # Labkit::CoveredExperience::Current.active_experiences << my_experience # Labkit::CoveredExperience::Current.rehydrate("create_merge_request", "start_time" => "2025-08-22T10:02:15.237Z") class Current < ActiveSupport::CurrentAttributes AGGREGATION_KEY = 'labkit_covered_experiences' attribute :_experiences attribute :_active_experiences def experiences self._experiences ||= {} def active_experiences self._active_experiences ||= {} end def rehydrate(experience_id, **data) instance = Labkit::CoveredExperience.get(experience_id).rehydrate(data) experiences.merge!(instance.to_h) active_experiences[instance.id] = instance instance end end Loading lib/labkit/covered_experience/experience.rb +2 −2 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ module Labkit checkpoint_counter.increment(checkpoint: "start", **base_labels) log_event("start", **extra) Labkit::CoveredExperience::Current.experiences.merge!(to_h) Labkit::CoveredExperience::Current.active_experiences[id] = self return self unless block_given? Loading Loading @@ -132,7 +132,7 @@ module Labkit total_counter.increment(error: has_error?, **base_labels) apdex_counter.increment(success: apdex_success?, **base_labels) unless has_error? log_event("end", **extra) Labkit::CoveredExperience::Current.experiences.delete(id) Labkit::CoveredExperience::Current.active_experiences.delete(id) end self Loading lib/labkit/middleware/sidekiq/covered_experience/client.rb +3 −6 Original line number Diff line number Diff line Loading @@ -11,14 +11,11 @@ module Labkit # populates the job with them. class Client def call(worker_class, job, _queue, _redis_pool) Labkit::CoveredExperience::Current.experiences.each do |experience_id, data| Labkit::CoveredExperience .get(experience_id) .rehydrate(data) .checkpoint(checkpoint_action: "sidekiq_job_scheduled", worker: worker_class.to_s) data = Labkit::CoveredExperience::Current.active_experiences.inject({}) do |data, (_, xp)| xp.checkpoint(checkpoint_action: "sidekiq_job_scheduled", worker: worker_class.to_s) data.merge!(xp.to_h) end data = Labkit::CoveredExperience::Current.experiences job[Labkit::CoveredExperience::Current::AGGREGATION_KEY] = data unless data.empty? yield Loading spec/labkit/covered_experience/current_spec.rb +9 −10 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ RSpec.describe Labkit::CoveredExperience::Current do let(:experience_id) { definition.covered_experience } let(:experience_data) { { 'start_time' => '2023-01-01T12:00:00.000Z' } } it { expect(described_class.experiences).to be_a(Hash) } it { expect(described_class.active_experiences).to be_a(Hash) } describe '#rehydrate' do context 'when experience exists in registry' do Loading @@ -26,12 +26,13 @@ RSpec.describe Labkit::CoveredExperience::Current do end it 'adds the rehydrated experience to the experiences set' do expect(described_class.experiences).to be_empty expect(described_class.active_experiences).to be_empty result = described_class.rehydrate(experience_id, **experience_data) described_class.rehydrate(experience_id, **experience_data) expect(described_class.experiences).to include(result.to_h) expect(described_class.experiences.size).to eq(1) expect(described_class.active_experiences).to have_key(experience_id) expect(described_class.active_experiences[experience_id]).to be_a(Labkit::CoveredExperience::Experience) expect(described_class.active_experiences.size).to eq(1) end context 'when multiple experiences are rehydrated' do Loading Loading @@ -61,10 +62,8 @@ RSpec.describe Labkit::CoveredExperience::Current do described_class.rehydrate(experience_id, **experience_data) described_class.rehydrate(second_experience_id, **second_experience_data) expect(described_class.experiences).to match( experience_id => experience_data, second_experience_id => second_experience_data ) expect(described_class.active_experiences).to have_key(experience_id) expect(described_class.active_experiences).to have_key(second_experience_id) end end end Loading Loading @@ -95,7 +94,7 @@ RSpec.describe Labkit::CoveredExperience::Current do result = described_class.rehydrate(nonexistent_experience_id, **experience_data) expect(result).to be(Labkit::CoveredExperience::Null.instance) expect(described_class.experiences).to be_empty expect(described_class.active_experiences).to have_key("null") end end end Loading Loading
lib/labkit/covered_experience.rb +4 −3 Original line number Diff line number Diff line Loading @@ -85,10 +85,11 @@ module Labkit end def find_current(experience_id) definition = registry[experience_id] data = Current.experiences[experience_id.to_s] || {} xp = Current.active_experiences[experience_id.to_s] return xp unless xp.nil? Experience.new(definition).rehydrate(data) if definition definition = registry[experience_id] Experience.new(definition) if definition end end end Loading
lib/labkit/covered_experience/current.rb +5 −5 Original line number Diff line number Diff line Loading @@ -13,20 +13,20 @@ module Labkit # store and access experiences throughout the request and background job lifecycle. # # Example usage: # Labkit::CoveredExperience::Current.experiences << my_experience # Labkit::CoveredExperience::Current.active_experiences << my_experience # Labkit::CoveredExperience::Current.rehydrate("create_merge_request", "start_time" => "2025-08-22T10:02:15.237Z") class Current < ActiveSupport::CurrentAttributes AGGREGATION_KEY = 'labkit_covered_experiences' attribute :_experiences attribute :_active_experiences def experiences self._experiences ||= {} def active_experiences self._active_experiences ||= {} end def rehydrate(experience_id, **data) instance = Labkit::CoveredExperience.get(experience_id).rehydrate(data) experiences.merge!(instance.to_h) active_experiences[instance.id] = instance instance end end Loading
lib/labkit/covered_experience/experience.rb +2 −2 Original line number Diff line number Diff line Loading @@ -80,7 +80,7 @@ module Labkit checkpoint_counter.increment(checkpoint: "start", **base_labels) log_event("start", **extra) Labkit::CoveredExperience::Current.experiences.merge!(to_h) Labkit::CoveredExperience::Current.active_experiences[id] = self return self unless block_given? Loading Loading @@ -132,7 +132,7 @@ module Labkit total_counter.increment(error: has_error?, **base_labels) apdex_counter.increment(success: apdex_success?, **base_labels) unless has_error? log_event("end", **extra) Labkit::CoveredExperience::Current.experiences.delete(id) Labkit::CoveredExperience::Current.active_experiences.delete(id) end self Loading
lib/labkit/middleware/sidekiq/covered_experience/client.rb +3 −6 Original line number Diff line number Diff line Loading @@ -11,14 +11,11 @@ module Labkit # populates the job with them. class Client def call(worker_class, job, _queue, _redis_pool) Labkit::CoveredExperience::Current.experiences.each do |experience_id, data| Labkit::CoveredExperience .get(experience_id) .rehydrate(data) .checkpoint(checkpoint_action: "sidekiq_job_scheduled", worker: worker_class.to_s) data = Labkit::CoveredExperience::Current.active_experiences.inject({}) do |data, (_, xp)| xp.checkpoint(checkpoint_action: "sidekiq_job_scheduled", worker: worker_class.to_s) data.merge!(xp.to_h) end data = Labkit::CoveredExperience::Current.experiences job[Labkit::CoveredExperience::Current::AGGREGATION_KEY] = data unless data.empty? yield Loading
spec/labkit/covered_experience/current_spec.rb +9 −10 Original line number Diff line number Diff line Loading @@ -13,7 +13,7 @@ RSpec.describe Labkit::CoveredExperience::Current do let(:experience_id) { definition.covered_experience } let(:experience_data) { { 'start_time' => '2023-01-01T12:00:00.000Z' } } it { expect(described_class.experiences).to be_a(Hash) } it { expect(described_class.active_experiences).to be_a(Hash) } describe '#rehydrate' do context 'when experience exists in registry' do Loading @@ -26,12 +26,13 @@ RSpec.describe Labkit::CoveredExperience::Current do end it 'adds the rehydrated experience to the experiences set' do expect(described_class.experiences).to be_empty expect(described_class.active_experiences).to be_empty result = described_class.rehydrate(experience_id, **experience_data) described_class.rehydrate(experience_id, **experience_data) expect(described_class.experiences).to include(result.to_h) expect(described_class.experiences.size).to eq(1) expect(described_class.active_experiences).to have_key(experience_id) expect(described_class.active_experiences[experience_id]).to be_a(Labkit::CoveredExperience::Experience) expect(described_class.active_experiences.size).to eq(1) end context 'when multiple experiences are rehydrated' do Loading Loading @@ -61,10 +62,8 @@ RSpec.describe Labkit::CoveredExperience::Current do described_class.rehydrate(experience_id, **experience_data) described_class.rehydrate(second_experience_id, **second_experience_data) expect(described_class.experiences).to match( experience_id => experience_data, second_experience_id => second_experience_data ) expect(described_class.active_experiences).to have_key(experience_id) expect(described_class.active_experiences).to have_key(second_experience_id) end end end Loading Loading @@ -95,7 +94,7 @@ RSpec.describe Labkit::CoveredExperience::Current do result = described_class.rehydrate(nonexistent_experience_id, **experience_data) expect(result).to be(Labkit::CoveredExperience::Null.instance) expect(described_class.experiences).to be_empty expect(described_class.active_experiences).to have_key("null") end end end Loading