Tag all transaction metrics with an "action" tag

Without this it's impossible to find out what methods/views/queries are
executed by a certain controller or Sidekiq worker. While this will
increase the total number of series it should stay within reasonable
limits due to the amount of "actions" being small enough.
This commit is contained in:
Yorick Peterse 2016-01-11 16:51:01 +01:00
parent f41b535ced
commit 35b501f30a
6 changed files with 41 additions and 25 deletions

View file

@ -39,10 +39,8 @@ module Gitlab
end
def tag_controller(trans, env)
controller = env[CONTROLLER_KEY]
label = "#{controller.class.name}##{controller.action_name}"
trans.add_tag(:action, label)
controller = env[CONTROLLER_KEY]
trans.action = "#{controller.class.name}##{controller.action_name}"
end
end
end

View file

@ -5,19 +5,14 @@ module Gitlab
# This middleware is intended to be used as a server-side middleware.
class SidekiqMiddleware
def call(worker, message, queue)
trans = Transaction.new
trans = Transaction.new("#{worker.class.name}#perform")
begin
trans.run { yield }
ensure
tag_worker(trans, worker)
trans.finish
end
end
def tag_worker(trans, worker)
trans.add_tag(:action, "#{worker.class.name}#perform")
end
end
end
end

View file

@ -6,11 +6,15 @@ module Gitlab
attr_reader :tags, :values
attr_accessor :action
def self.current
Thread.current[THREAD_KEY]
end
def initialize
# action - A String describing the action performed, usually the class
# plus method name.
def initialize(action = nil)
@metrics = []
@started_at = nil
@ -18,6 +22,7 @@ module Gitlab
@values = Hash.new(0)
@tags = {}
@action = action
end
def duration
@ -70,7 +75,15 @@ module Gitlab
end
def submit
Metrics.submit_metrics(@metrics.map(&:to_hash))
metrics = @metrics.map do |metric|
hash = metric.to_hash
hash[:tags][:action] ||= @action if @action
hash
end
Metrics.submit_metrics(metrics)
end
def sidekiq?

View file

@ -57,7 +57,7 @@ describe Gitlab::Metrics::RackMiddleware do
middleware.tag_controller(transaction, env)
expect(transaction.tags[:action]).to eq('TestController#show')
expect(transaction.action).to eq('TestController#show')
end
end
end

View file

@ -5,22 +5,15 @@ describe Gitlab::Metrics::SidekiqMiddleware do
describe '#call' do
it 'tracks the transaction' do
worker = Class.new.new
worker = double(:worker, class: double(:class, name: 'TestWorker'))
expect(Gitlab::Metrics::Transaction).to receive(:new).
with('TestWorker#perform').
and_call_original
expect_any_instance_of(Gitlab::Metrics::Transaction).to receive(:finish)
middleware.call(worker, 'test', :test) { nil }
end
end
describe '#tag_worker' do
it 'adds the worker class and action to the transaction' do
trans = Gitlab::Metrics::Transaction.new
worker = double(:worker, class: double(:class, name: 'TestWorker'))
expect(trans).to receive(:add_tag).with(:action, 'TestWorker#perform')
middleware.tag_worker(trans, worker)
end
end
end

View file

@ -96,5 +96,22 @@ describe Gitlab::Metrics::Transaction do
transaction.submit
end
it 'adds the action as a tag for every metric' do
transaction.action = 'Foo#bar'
transaction.track_self
hash = {
series: 'rails_transactions',
tags: { action: 'Foo#bar' },
values: { duration: 0.0 },
timestamp: an_instance_of(Fixnum)
}
expect(Gitlab::Metrics).to receive(:submit_metrics).
with([hash])
transaction.submit
end
end
end