85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
# frozen_string_literal: true
 | 
						|
 | 
						|
require 'spec_helper'
 | 
						|
 | 
						|
RSpec.describe Gitlab::Instrumentation::Redis do
 | 
						|
  def stub_storages(method, value)
 | 
						|
    described_class::STORAGES.each do |storage|
 | 
						|
      allow(storage).to receive(method) { value }
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  shared_examples 'aggregation of redis storage data' do |method|
 | 
						|
    describe "#{method} sum" do
 | 
						|
      it "sums data from all Redis storages" do
 | 
						|
        amount = 0.3
 | 
						|
 | 
						|
        stub_storages(method, amount)
 | 
						|
 | 
						|
        expect(described_class.public_send(method)).to eq(described_class::STORAGES.size * amount)
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  it_behaves_like 'aggregation of redis storage data', :get_request_count
 | 
						|
  it_behaves_like 'aggregation of redis storage data', :query_time
 | 
						|
  it_behaves_like 'aggregation of redis storage data', :read_bytes
 | 
						|
  it_behaves_like 'aggregation of redis storage data', :write_bytes
 | 
						|
 | 
						|
  describe '.payload', :request_store do
 | 
						|
    before do
 | 
						|
      # If this is the first spec in a spec run that uses Redis, there
 | 
						|
      # will be an extra SELECT command to choose the right database. We
 | 
						|
      # don't want to make the spec less precise, so we force that to
 | 
						|
      # happen (if needed) first, then clear the counts.
 | 
						|
      Gitlab::Redis::Cache.with { |redis| redis.info }
 | 
						|
      RequestStore.clear!
 | 
						|
 | 
						|
      Gitlab::Redis::Cache.with { |redis| redis.set('cache-test', 321) }
 | 
						|
      Gitlab::Redis::SharedState.with { |redis| redis.set('shared-state-test', 123) }
 | 
						|
    end
 | 
						|
 | 
						|
    it 'returns payload filtering out zeroed values' do
 | 
						|
      expected_payload = {
 | 
						|
        # Aggregated results
 | 
						|
        redis_calls: 2,
 | 
						|
        redis_duration_s: be >= 0,
 | 
						|
        redis_read_bytes: be >= 0,
 | 
						|
        redis_write_bytes: be >= 0,
 | 
						|
 | 
						|
        # Cache results
 | 
						|
        redis_cache_calls: 1,
 | 
						|
        redis_cache_duration_s: be >= 0,
 | 
						|
        redis_cache_read_bytes: be >= 0,
 | 
						|
        redis_cache_write_bytes: be >= 0,
 | 
						|
 | 
						|
        # Shared state results
 | 
						|
        redis_shared_state_calls: 1,
 | 
						|
        redis_shared_state_duration_s: be >= 0,
 | 
						|
        redis_shared_state_read_bytes: be >= 0,
 | 
						|
        redis_shared_state_write_bytes: be >= 0
 | 
						|
      }
 | 
						|
 | 
						|
      expect(described_class.payload).to include(expected_payload)
 | 
						|
      expect(described_class.payload.keys).to match_array(expected_payload.keys)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  describe '.detail_store' do
 | 
						|
    it 'returns a flat array of detail stores with the storage name added to each item' do
 | 
						|
      details_row = { cmd: 'GET foo', duration: 1 }
 | 
						|
 | 
						|
      stub_storages(:detail_store, [details_row])
 | 
						|
 | 
						|
      expect(described_class.detail_store)
 | 
						|
        .to contain_exactly(details_row.merge(storage: 'ActionCable'),
 | 
						|
                            details_row.merge(storage: 'Cache'),
 | 
						|
                            details_row.merge(storage: 'Queues'),
 | 
						|
                            details_row.merge(storage: 'SharedState'),
 | 
						|
                            details_row.merge(storage: 'TraceChunks'),
 | 
						|
                            details_row.merge(storage: 'RateLimiting'),
 | 
						|
                            details_row.merge(storage: 'Sessions'))
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |