Track total query/view timings in transactions

This commit is contained in:
Yorick Peterse 2016-01-04 12:14:36 +01:00
parent 96075be6f4
commit 66a997a914
5 changed files with 62 additions and 0 deletions

View File

@ -6,6 +6,7 @@ if Gitlab::Metrics.enabled?
# These are manually require'd so the classes are registered properly with
# ActiveSupport.
require 'gitlab/metrics/subscribers/action_view'
require 'gitlab/metrics/subscribers/active_record'
Gitlab::Application.configure do |config|
config.middleware.use(Gitlab::Metrics::RackMiddleware)

View File

@ -19,6 +19,7 @@ module Gitlab
values = values_for(event)
tags = tags_for(event)
current_transaction.increment(:view_duration, event.duration)
current_transaction.add_metric(SERIES, values, tags)
end

View File

@ -0,0 +1,22 @@
module Gitlab
module Metrics
module Subscribers
# Class for tracking the total query duration of a transaction.
class ActiveRecord < ActiveSupport::Subscriber
attach_to :active_record
def sql(event)
return unless current_transaction
current_transaction.increment(:sql_duration, event.duration)
end
private
def current_transaction
Transaction.current
end
end
end
end
end

View File

@ -28,6 +28,9 @@ describe Gitlab::Metrics::Subscribers::ActionView do
line: 4
}
expect(transaction).to receive(:increment).
with(:view_duration, 2.1)
expect(transaction).to receive(:add_metric).
with(described_class::SERIES, values, tags)

View File

@ -0,0 +1,35 @@
require 'spec_helper'
describe Gitlab::Metrics::Subscribers::ActiveRecord do
let(:transaction) { Gitlab::Metrics::Transaction.new('rspec') }
let(:subscriber) { described_class.new }
let(:event) do
double(:event, duration: 0.2,
payload: { sql: 'SELECT * FROM users WHERE id = 10' })
end
describe '#sql' do
describe 'without a current transaction' do
it 'simply returns' do
expect_any_instance_of(Gitlab::Metrics::Transaction).
to_not receive(:increment)
subscriber.sql(event)
end
end
describe 'with a current transaction' do
it 'increments the :sql_duration value' do
expect(subscriber).to receive(:current_transaction).
at_least(:once).
and_return(transaction)
expect(transaction).to receive(:increment).
with(:sql_duration, 0.2)
subscriber.sql(event)
end
end
end
end