Commit 35b501f3 authored by Yorick Peterse's avatar Yorick Peterse

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.
parent f41b535c
...@@ -39,10 +39,8 @@ module Gitlab ...@@ -39,10 +39,8 @@ module Gitlab
end end
def tag_controller(trans, env) def tag_controller(trans, env)
controller = env[CONTROLLER_KEY] controller = env[CONTROLLER_KEY]
label = "#{controller.class.name}##{controller.action_name}" trans.action = "#{controller.class.name}##{controller.action_name}"
trans.add_tag(:action, label)
end end
end end
end end
......
...@@ -5,19 +5,14 @@ module Gitlab ...@@ -5,19 +5,14 @@ module Gitlab
# This middleware is intended to be used as a server-side middleware. # This middleware is intended to be used as a server-side middleware.
class SidekiqMiddleware class SidekiqMiddleware
def call(worker, message, queue) def call(worker, message, queue)
trans = Transaction.new trans = Transaction.new("#{worker.class.name}#perform")
begin begin
trans.run { yield } trans.run { yield }
ensure ensure
tag_worker(trans, worker)
trans.finish trans.finish
end end
end end
def tag_worker(trans, worker)
trans.add_tag(:action, "#{worker.class.name}#perform")
end
end end
end end
end end
...@@ -6,11 +6,15 @@ module Gitlab ...@@ -6,11 +6,15 @@ module Gitlab
attr_reader :tags, :values attr_reader :tags, :values
attr_accessor :action
def self.current def self.current
Thread.current[THREAD_KEY] Thread.current[THREAD_KEY]
end end
def initialize # action - A String describing the action performed, usually the class
# plus method name.
def initialize(action = nil)
@metrics = [] @metrics = []
@started_at = nil @started_at = nil
...@@ -18,6 +22,7 @@ module Gitlab ...@@ -18,6 +22,7 @@ module Gitlab
@values = Hash.new(0) @values = Hash.new(0)
@tags = {} @tags = {}
@action = action
end end
def duration def duration
...@@ -70,7 +75,15 @@ module Gitlab ...@@ -70,7 +75,15 @@ module Gitlab
end end
def submit 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 end
def sidekiq? def sidekiq?
......
...@@ -57,7 +57,7 @@ describe Gitlab::Metrics::RackMiddleware do ...@@ -57,7 +57,7 @@ describe Gitlab::Metrics::RackMiddleware do
middleware.tag_controller(transaction, env) middleware.tag_controller(transaction, env)
expect(transaction.tags[:action]).to eq('TestController#show') expect(transaction.action).to eq('TestController#show')
end end
end end
end end
...@@ -5,22 +5,15 @@ describe Gitlab::Metrics::SidekiqMiddleware do ...@@ -5,22 +5,15 @@ describe Gitlab::Metrics::SidekiqMiddleware do
describe '#call' do describe '#call' do
it 'tracks the transaction' 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) expect_any_instance_of(Gitlab::Metrics::Transaction).to receive(:finish)
middleware.call(worker, 'test', :test) { nil } middleware.call(worker, 'test', :test) { nil }
end end
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 end
...@@ -96,5 +96,22 @@ describe Gitlab::Metrics::Transaction do ...@@ -96,5 +96,22 @@ describe Gitlab::Metrics::Transaction do
transaction.submit transaction.submit
end 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
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment