From 6e0470b9ddcb6bc5168da4d96489b1599c5e7c88 Mon Sep 17 00:00:00 2001 From: Roberto Miranda Date: Tue, 20 Aug 2024 10:15:47 +0100 Subject: [PATCH 1/7] Add Memory Stats --- lib/promenade/pitchfork/mem_stats.rb | 37 ++++++++++++++++++++++ lib/promenade/pitchfork/middleware.rb | 12 +++++-- spec/promenade/pitchfork/mem_stats_spec.rb | 34 ++++++++++++++++++++ 3 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 lib/promenade/pitchfork/mem_stats.rb create mode 100644 spec/promenade/pitchfork/mem_stats_spec.rb diff --git a/lib/promenade/pitchfork/mem_stats.rb b/lib/promenade/pitchfork/mem_stats.rb new file mode 100644 index 0000000..ad4d0d5 --- /dev/null +++ b/lib/promenade/pitchfork/mem_stats.rb @@ -0,0 +1,37 @@ +begin + require "pitchfork/mem_info" +rescue LoadError + # No pitchfork available, dont do anything +end + +module Promenade + module Pitchfork + class MemStats + + Promenade.gauge :pitchfork_mem_rss do + doc "Resident Set Size of the pitchfork process, Total memory used by the process." + end + + Promenade.gauge :pitchfork_shared_mem do + doc "Shared memory of the pitchfork process, memory that is shared between multiple processes." + end + + def initialize + return unless defined?(::Pitchfork) && defined?(::Pitchfork::MemInfo) + + @mem_info = ::Pitchfork::MemInfo.new(Process.pid) + @parent_mem_info = ::Pitchfork::MemInfo.new(Process.ppid) + end + + def instrument + Promenade.metric(:pitchfork_mem_rss).set({}, @mem_info.rss) + Promenade.metric(:pitchfork_shared_mem).set({}, @mem_info.shared_memory) + end + + def self.instrument + new.instrument + rescue StandardError => e + end + end + end +end diff --git a/lib/promenade/pitchfork/middleware.rb b/lib/promenade/pitchfork/middleware.rb index dfea0b3..a829663 100644 --- a/lib/promenade/pitchfork/middleware.rb +++ b/lib/promenade/pitchfork/middleware.rb @@ -1,4 +1,5 @@ require "promenade/pitchfork/stats" +require "promenade/pitchfork/mem_stats" module Promenade module Pitchfork @@ -11,12 +12,17 @@ def initialize(app) def call(env) if env.key?(RACK_AFTER_REPLY) - env[RACK_AFTER_REPLY] << -> { - ::Promenade::Pitchfork::Stats.instrument - } + env[RACK_AFTER_REPLY] << -> { instrument } end @app.call(env) end + + private + + def instrument + Promenade::Pitchfork::Stats.instrument + Promenade::Pitchfork::MemStats.instrument + end end end end diff --git a/spec/promenade/pitchfork/mem_stats_spec.rb b/spec/promenade/pitchfork/mem_stats_spec.rb new file mode 100644 index 0000000..5e1df91 --- /dev/null +++ b/spec/promenade/pitchfork/mem_stats_spec.rb @@ -0,0 +1,34 @@ +require "spec_helper" +require "promenade/pitchfork/mem_stats" + +RSpec.describe Promenade::Pitchfork::MemStats do + let(:pitfork_mem_info) { class_double("Pitchfork::MemInfo") } + + before do + stub_const("Pitchfork::MemInfo", pitfork_mem_info) + allow(pitfork_mem_info).to receive(:new).and_return(pitfork_mem_info) + allow(pitfork_mem_info).to receive(:rss).and_return(100) + allow(pitfork_mem_info).to receive(:shared_memory).and_return(50) + end + + describe "#instrument" do + let(:metric) { instance_double("Promenade::Metric") } + + before do + allow(Promenade).to receive(:metric).and_return(metric) + allow(metric).to receive(:set) + end + + it "sets the metrics correctly" do + stats = Promenade::Pitchfork::MemStats.new + + expect(Promenade).to receive(:metric).with(:pitchfork_mem_rss).and_return(metric) + expect(Promenade).to receive(:metric).with(:pitchfork_shared_mem).and_return(metric) + + expect(metric).to receive(:set).with({}, 100) + expect(metric).to receive(:set).with({}, 50) + + stats.instrument + end + end +end From 69abfb09f86f1e39fac102109cfe4cbe8e13c78c Mon Sep 17 00:00:00 2001 From: Roberto Miranda Date: Thu, 22 Aug 2024 15:37:33 +0100 Subject: [PATCH 2/7] Conditionally use rack middlewares --- lib/promenade/configuration.rb | 3 ++- lib/promenade/railtie.rb | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/promenade/configuration.rb b/lib/promenade/configuration.rb index a0b436b..ed6d7fc 100644 --- a/lib/promenade/configuration.rb +++ b/lib/promenade/configuration.rb @@ -1,6 +1,6 @@ module Promenade class Configuration - attr_accessor :queue_time_buckets, :rack_latency_buckets + attr_accessor :queue_time_buckets, :rack_latency_buckets, :pitchfork_stats_enabled DEFAULT_RACK_LATENCY_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10].freeze @@ -9,6 +9,7 @@ class Configuration def initialize @rack_latency_buckets = DEFAULT_RACK_LATENCY_BUCKETS @queue_time_buckets = DEFAULT_QUEUE_TIME_BUCKETS + @pitchfork_stats_enabled = false end end end diff --git a/lib/promenade/railtie.rb b/lib/promenade/railtie.rb index 3835a85..410f477 100644 --- a/lib/promenade/railtie.rb +++ b/lib/promenade/railtie.rb @@ -13,13 +13,17 @@ class Railtie < ::Rails::Railtie Promenade::Client::Rack::HTTPRequestDurationCollector Rails.application.config.middleware.insert 0, Promenade::Client::Rack::HTTPRequestQueueTimeCollector + end + + initializer "promenade.configure_middlewares", after: :load_config_initializers do + pitchfork_stats_enabled = Promenade.configuration.pitchfork_stats_enabled - if defined?(::Raindrops) + if pitchfork_stats_enabled && defined?(::Raindrops) require "promenade/raindrops/middleware" Rails.application.config.middleware.use Promenade::Raindrops::Middleware end - if defined?(::Pitchfork) + if pitchfork_stats_enabled &&defined?(::Pitchfork) require "promenade/pitchfork/middleware" Rails.application.config.middleware.use Promenade::Pitchfork::Middleware end From 047c0c954aea7ad01dc533b08d6340b7dfc78cd8 Mon Sep 17 00:00:00 2001 From: Roberto Miranda Date: Fri, 23 Aug 2024 10:17:10 +0100 Subject: [PATCH 3/7] =?UTF-8?q?=F0=9F=92=87=E2=80=8D=E2=99=80=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/promenade/pitchfork/mem_stats.rb | 3 +-- lib/promenade/railtie.rb | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/promenade/pitchfork/mem_stats.rb b/lib/promenade/pitchfork/mem_stats.rb index ad4d0d5..11bb977 100644 --- a/lib/promenade/pitchfork/mem_stats.rb +++ b/lib/promenade/pitchfork/mem_stats.rb @@ -7,7 +7,6 @@ module Promenade module Pitchfork class MemStats - Promenade.gauge :pitchfork_mem_rss do doc "Resident Set Size of the pitchfork process, Total memory used by the process." end @@ -30,7 +29,7 @@ def instrument def self.instrument new.instrument - rescue StandardError => e + rescue StandardError end end end diff --git a/lib/promenade/railtie.rb b/lib/promenade/railtie.rb index 410f477..88fe43b 100644 --- a/lib/promenade/railtie.rb +++ b/lib/promenade/railtie.rb @@ -23,7 +23,7 @@ class Railtie < ::Rails::Railtie Rails.application.config.middleware.use Promenade::Raindrops::Middleware end - if pitchfork_stats_enabled &&defined?(::Pitchfork) + if pitchfork_stats_enabled && defined?(::Pitchfork) require "promenade/pitchfork/middleware" Rails.application.config.middleware.use Promenade::Pitchfork::Middleware end From 58c9d9c1f4b17e9e7c116ae40c65503e7ad7f8fc Mon Sep 17 00:00:00 2001 From: Roberto Miranda Date: Fri, 30 Aug 2024 14:54:37 +0100 Subject: [PATCH 4/7] Remove after: :load_config_initializers block --- lib/promenade/configuration.rb | 3 +-- lib/promenade/railtie.rb | 8 ++------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/promenade/configuration.rb b/lib/promenade/configuration.rb index ed6d7fc..a0b436b 100644 --- a/lib/promenade/configuration.rb +++ b/lib/promenade/configuration.rb @@ -1,6 +1,6 @@ module Promenade class Configuration - attr_accessor :queue_time_buckets, :rack_latency_buckets, :pitchfork_stats_enabled + attr_accessor :queue_time_buckets, :rack_latency_buckets DEFAULT_RACK_LATENCY_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10].freeze @@ -9,7 +9,6 @@ class Configuration def initialize @rack_latency_buckets = DEFAULT_RACK_LATENCY_BUCKETS @queue_time_buckets = DEFAULT_QUEUE_TIME_BUCKETS - @pitchfork_stats_enabled = false end end end diff --git a/lib/promenade/railtie.rb b/lib/promenade/railtie.rb index 88fe43b..3835a85 100644 --- a/lib/promenade/railtie.rb +++ b/lib/promenade/railtie.rb @@ -13,17 +13,13 @@ class Railtie < ::Rails::Railtie Promenade::Client::Rack::HTTPRequestDurationCollector Rails.application.config.middleware.insert 0, Promenade::Client::Rack::HTTPRequestQueueTimeCollector - end - - initializer "promenade.configure_middlewares", after: :load_config_initializers do - pitchfork_stats_enabled = Promenade.configuration.pitchfork_stats_enabled - if pitchfork_stats_enabled && defined?(::Raindrops) + if defined?(::Raindrops) require "promenade/raindrops/middleware" Rails.application.config.middleware.use Promenade::Raindrops::Middleware end - if pitchfork_stats_enabled && defined?(::Pitchfork) + if defined?(::Pitchfork) require "promenade/pitchfork/middleware" Rails.application.config.middleware.use Promenade::Pitchfork::Middleware end From 180253c2bfc1a8cae227f7ae81064596a62a914d Mon Sep 17 00:00:00 2001 From: Roberto Miranda Date: Fri, 30 Aug 2024 16:18:38 +0100 Subject: [PATCH 5/7] Revert "Remove after: :load_config_initializers block" This reverts commit 58c9d9c1f4b17e9e7c116ae40c65503e7ad7f8fc. --- lib/promenade/configuration.rb | 3 ++- lib/promenade/railtie.rb | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/promenade/configuration.rb b/lib/promenade/configuration.rb index a0b436b..ed6d7fc 100644 --- a/lib/promenade/configuration.rb +++ b/lib/promenade/configuration.rb @@ -1,6 +1,6 @@ module Promenade class Configuration - attr_accessor :queue_time_buckets, :rack_latency_buckets + attr_accessor :queue_time_buckets, :rack_latency_buckets, :pitchfork_stats_enabled DEFAULT_RACK_LATENCY_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10].freeze @@ -9,6 +9,7 @@ class Configuration def initialize @rack_latency_buckets = DEFAULT_RACK_LATENCY_BUCKETS @queue_time_buckets = DEFAULT_QUEUE_TIME_BUCKETS + @pitchfork_stats_enabled = false end end end diff --git a/lib/promenade/railtie.rb b/lib/promenade/railtie.rb index 3835a85..88fe43b 100644 --- a/lib/promenade/railtie.rb +++ b/lib/promenade/railtie.rb @@ -13,13 +13,17 @@ class Railtie < ::Rails::Railtie Promenade::Client::Rack::HTTPRequestDurationCollector Rails.application.config.middleware.insert 0, Promenade::Client::Rack::HTTPRequestQueueTimeCollector + end + + initializer "promenade.configure_middlewares", after: :load_config_initializers do + pitchfork_stats_enabled = Promenade.configuration.pitchfork_stats_enabled - if defined?(::Raindrops) + if pitchfork_stats_enabled && defined?(::Raindrops) require "promenade/raindrops/middleware" Rails.application.config.middleware.use Promenade::Raindrops::Middleware end - if defined?(::Pitchfork) + if pitchfork_stats_enabled && defined?(::Pitchfork) require "promenade/pitchfork/middleware" Rails.application.config.middleware.use Promenade::Pitchfork::Middleware end From 6b1ddff0f6d3e33ce546e85ea9f03ba9ecd32b6a Mon Sep 17 00:00:00 2001 From: Roberto Miranda Date: Fri, 30 Aug 2024 16:19:10 +0100 Subject: [PATCH 6/7] Disable metrics --- lib/promenade/railtie.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/promenade/railtie.rb b/lib/promenade/railtie.rb index 88fe43b..c04c46e 100644 --- a/lib/promenade/railtie.rb +++ b/lib/promenade/railtie.rb @@ -16,7 +16,7 @@ class Railtie < ::Rails::Railtie end initializer "promenade.configure_middlewares", after: :load_config_initializers do - pitchfork_stats_enabled = Promenade.configuration.pitchfork_stats_enabled + pitchfork_stats_enabled = false if pitchfork_stats_enabled && defined?(::Raindrops) require "promenade/raindrops/middleware" From c4d5adca2d9e3ceb6ddcefaa21b227266f6297b3 Mon Sep 17 00:00:00 2001 From: Roberto Miranda Date: Tue, 10 Sep 2024 13:36:12 +0100 Subject: [PATCH 7/7] Use single block of initialization --- lib/promenade/configuration.rb | 3 +-- lib/promenade/railtie.rb | 8 ++------ 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/lib/promenade/configuration.rb b/lib/promenade/configuration.rb index ed6d7fc..a0b436b 100644 --- a/lib/promenade/configuration.rb +++ b/lib/promenade/configuration.rb @@ -1,6 +1,6 @@ module Promenade class Configuration - attr_accessor :queue_time_buckets, :rack_latency_buckets, :pitchfork_stats_enabled + attr_accessor :queue_time_buckets, :rack_latency_buckets DEFAULT_RACK_LATENCY_BUCKETS = [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10].freeze @@ -9,7 +9,6 @@ class Configuration def initialize @rack_latency_buckets = DEFAULT_RACK_LATENCY_BUCKETS @queue_time_buckets = DEFAULT_QUEUE_TIME_BUCKETS - @pitchfork_stats_enabled = false end end end diff --git a/lib/promenade/railtie.rb b/lib/promenade/railtie.rb index c04c46e..3835a85 100644 --- a/lib/promenade/railtie.rb +++ b/lib/promenade/railtie.rb @@ -13,17 +13,13 @@ class Railtie < ::Rails::Railtie Promenade::Client::Rack::HTTPRequestDurationCollector Rails.application.config.middleware.insert 0, Promenade::Client::Rack::HTTPRequestQueueTimeCollector - end - - initializer "promenade.configure_middlewares", after: :load_config_initializers do - pitchfork_stats_enabled = false - if pitchfork_stats_enabled && defined?(::Raindrops) + if defined?(::Raindrops) require "promenade/raindrops/middleware" Rails.application.config.middleware.use Promenade::Raindrops::Middleware end - if pitchfork_stats_enabled && defined?(::Pitchfork) + if defined?(::Pitchfork) require "promenade/pitchfork/middleware" Rails.application.config.middleware.use Promenade::Pitchfork::Middleware end