102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
require 'spec_helper'
 | 
						|
 | 
						|
describe Gitlab::SidekiqLogging::StructuredLogger do
 | 
						|
  describe '#call' do
 | 
						|
    let(:timestamp) { Time.new('2018-01-01 12:00:00').utc }
 | 
						|
    let(:job) do
 | 
						|
      {
 | 
						|
        "class" => "TestWorker",
 | 
						|
        "args" => [1234, 'hello'],
 | 
						|
        "retry" => false,
 | 
						|
        "queue" => "cronjob:test_queue",
 | 
						|
        "queue_namespace" => "cronjob",
 | 
						|
        "jid" => "da883554ee4fe414012f5f42",
 | 
						|
        "created_at" => timestamp.to_f,
 | 
						|
        "enqueued_at" => timestamp.to_f
 | 
						|
      }
 | 
						|
    end
 | 
						|
    let(:logger) { double() }
 | 
						|
    let(:start_payload) do
 | 
						|
      job.merge(
 | 
						|
        'message' => 'TestWorker JID-da883554ee4fe414012f5f42: start',
 | 
						|
        'job_status' => 'start',
 | 
						|
        'pid' => Process.pid,
 | 
						|
        'created_at' => timestamp.iso8601(3),
 | 
						|
        'enqueued_at' => timestamp.iso8601(3)
 | 
						|
      )
 | 
						|
    end
 | 
						|
    let(:end_payload) do
 | 
						|
      start_payload.merge(
 | 
						|
        'message' => 'TestWorker JID-da883554ee4fe414012f5f42: done: 0.0 sec',
 | 
						|
        'job_status' => 'done',
 | 
						|
        'duration' => 0.0,
 | 
						|
        "completed_at" => timestamp.iso8601(3)
 | 
						|
      )
 | 
						|
    end
 | 
						|
    let(:exception_payload) do
 | 
						|
      end_payload.merge(
 | 
						|
        'message' => 'TestWorker JID-da883554ee4fe414012f5f42: fail: 0.0 sec',
 | 
						|
        'job_status' => 'fail',
 | 
						|
        'error' => ArgumentError,
 | 
						|
        'error_message' => 'some exception'
 | 
						|
      )
 | 
						|
    end
 | 
						|
 | 
						|
    before do
 | 
						|
      allow(Sidekiq).to receive(:logger).and_return(logger)
 | 
						|
 | 
						|
      allow(subject).to receive(:current_time).and_return(timestamp.to_f)
 | 
						|
    end
 | 
						|
 | 
						|
    subject { described_class.new }
 | 
						|
 | 
						|
    context 'with SIDEKIQ_LOG_ARGUMENTS enabled' do
 | 
						|
      before do
 | 
						|
        stub_env('SIDEKIQ_LOG_ARGUMENTS', '1')
 | 
						|
      end
 | 
						|
 | 
						|
      it 'logs start and end of job' do
 | 
						|
        Timecop.freeze(timestamp) do
 | 
						|
          expect(logger).to receive(:info).with(start_payload).ordered
 | 
						|
          expect(logger).to receive(:info).with(end_payload).ordered
 | 
						|
          expect(subject).to receive(:log_job_start).and_call_original
 | 
						|
          expect(subject).to receive(:log_job_done).and_call_original
 | 
						|
 | 
						|
          subject.call(job, 'test_queue') { }
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      it 'logs an exception in job' do
 | 
						|
        Timecop.freeze(timestamp) do
 | 
						|
          expect(logger).to receive(:info).with(start_payload)
 | 
						|
          # This excludes the exception_backtrace
 | 
						|
          expect(logger).to receive(:warn).with(hash_including(exception_payload))
 | 
						|
          expect(subject).to receive(:log_job_start).and_call_original
 | 
						|
          expect(subject).to receive(:log_job_done).and_call_original
 | 
						|
 | 
						|
          expect do
 | 
						|
            subject.call(job, 'test_queue') do
 | 
						|
              raise ArgumentError, 'some exception'
 | 
						|
            end
 | 
						|
          end.to raise_error(ArgumentError)
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    context 'with SIDEKIQ_LOG_ARGUMENTS disabled' do
 | 
						|
      it 'logs start and end of job' do
 | 
						|
        Timecop.freeze(timestamp) do
 | 
						|
          start_payload.delete('args')
 | 
						|
 | 
						|
          expect(logger).to receive(:info).with(start_payload).ordered
 | 
						|
          expect(logger).to receive(:info).with(end_payload).ordered
 | 
						|
          expect(subject).to receive(:log_job_start).and_call_original
 | 
						|
          expect(subject).to receive(:log_job_done).and_call_original
 | 
						|
 | 
						|
          subject.call(job, 'test_queue') { }
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 |