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:
parent
f41b535ced
commit
35b501f30a
6 changed files with 41 additions and 25 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue