From 7b10cb6f0f5758c17dd950587982ff400d7aa971 Mon Sep 17 00:00:00 2001
From: Yorick Peterse <yorickpeterse@gmail.com>
Date: Thu, 7 Jan 2016 13:05:00 +0100
Subject: [PATCH] Store request methods/URIs as values

Since filtering by these values is very rare (they're mostly just
displayed as-is) we don't need to waste any index space by saving them
as tags. By storing them as values we also greatly reduce the number of
series in InfluxDB.
---
 lib/gitlab/metrics/rack_middleware.rb           |  4 ++--
 lib/gitlab/metrics/transaction.rb               |  6 +++++-
 spec/lib/gitlab/metrics/rack_middleware_spec.rb |  6 +++---
 spec/lib/gitlab/metrics/transaction_spec.rb     | 11 +++++++++++
 4 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/lib/gitlab/metrics/rack_middleware.rb b/lib/gitlab/metrics/rack_middleware.rb
index 5c0587c4c513..e7a2f26d48bd 100644
--- a/lib/gitlab/metrics/rack_middleware.rb
+++ b/lib/gitlab/metrics/rack_middleware.rb
@@ -32,8 +32,8 @@ def call(env)
       def transaction_from_env(env)
         trans = Transaction.new
 
-        trans.add_tag(:request_method, env['REQUEST_METHOD'])
-        trans.add_tag(:request_uri, env['REQUEST_URI'])
+        trans.set(:request_uri, env['REQUEST_URI'])
+        trans.set(:request_method, env['REQUEST_METHOD'])
 
         trans
       end
diff --git a/lib/gitlab/metrics/transaction.rb b/lib/gitlab/metrics/transaction.rb
index 306656d30fe9..73131cc6ef25 100644
--- a/lib/gitlab/metrics/transaction.rb
+++ b/lib/gitlab/metrics/transaction.rb
@@ -4,7 +4,7 @@ module Metrics
     class Transaction
       THREAD_KEY = :_gitlab_metrics_transaction
 
-      attr_reader :tags
+      attr_reader :tags, :values
 
       def self.current
         Thread.current[THREAD_KEY]
@@ -46,6 +46,10 @@ def increment(name, value)
         @values[name] += value
       end
 
+      def set(name, value)
+        @values[name] = value
+      end
+
       def add_tag(key, value)
         @tags[key] = value
       end
diff --git a/spec/lib/gitlab/metrics/rack_middleware_spec.rb b/spec/lib/gitlab/metrics/rack_middleware_spec.rb
index a143fe4cfcd6..4e6dfc73df2e 100644
--- a/spec/lib/gitlab/metrics/rack_middleware_spec.rb
+++ b/spec/lib/gitlab/metrics/rack_middleware_spec.rb
@@ -40,9 +40,9 @@
       expect(transaction).to be_an_instance_of(Gitlab::Metrics::Transaction)
     end
 
-    it 'tags the transaction with the request method and URI' do
-      expect(transaction.tags[:request_method]).to eq('GET')
-      expect(transaction.tags[:request_uri]).to eq('/foo')
+    it 'stores the request method and URI in the transaction as values' do
+      expect(transaction.values[:request_method]).to eq('GET')
+      expect(transaction.values[:request_uri]).to eq('/foo')
     end
   end
 
diff --git a/spec/lib/gitlab/metrics/transaction_spec.rb b/spec/lib/gitlab/metrics/transaction_spec.rb
index 0c98b8f01277..3a27f8977352 100644
--- a/spec/lib/gitlab/metrics/transaction_spec.rb
+++ b/spec/lib/gitlab/metrics/transaction_spec.rb
@@ -50,6 +50,17 @@
     end
   end
 
+  describe '#set' do
+    it 'sets a value' do
+      transaction.set(:number, 10)
+
+      expect(transaction).to receive(:add_metric).
+        with('transactions', { duration: 0.0, number: 10 }, {})
+
+      transaction.track_self
+    end
+  end
+
   describe '#add_tag' do
     it 'adds a tag' do
       transaction.add_tag(:foo, 'bar')
-- 
GitLab