From 893aff2c5483a51e634100745f442126002cf688 Mon Sep 17 00:00:00 2001 From: "Joey@macstudio" Date: Sun, 12 Jul 2026 19:59:59 +0800 Subject: [PATCH] Skip middleware actions for zero-sample profiles --- lib/app_profiler/middleware.rb | 1 + test/app_profiler/middleware_test.rb | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/app_profiler/middleware.rb b/lib/app_profiler/middleware.rb index 138d136..0420ee5 100644 --- a/lib/app_profiler/middleware.rb +++ b/lib/app_profiler/middleware.rb @@ -44,6 +44,7 @@ def profile(env, params) end return response unless profile && after_profile(env, profile) + return response if profile[:samples] == 0 action.call( profile, diff --git a/test/app_profiler/middleware_test.rb b/test/app_profiler/middleware_test.rb index b49ef67..b773444 100644 --- a/test/app_profiler/middleware_test.rb +++ b/test/app_profiler/middleware_test.rb @@ -318,6 +318,16 @@ class MiddlewareTest < TestCase middleware.call(mock_request_env(opt: opt)) end + test "profile without samples will not be uploaded" do + profile = AppProfiler::BaseProfile.from_stackprof(stackprof_profile(samples: 0)) + AppProfiler.expects(:run).returns(profile) + AppProfiler.middleware.any_instance.expects(:after_profile).with { |_env, value| value == profile }.returns(true) + AppProfiler.middleware.action.expects(:call).never + middleware = AppProfiler::Middleware.new(app_env) + opt = { AppProfiler.request_profile_header => "mode=cpu;interval=2000" } + middleware.call(mock_request_env(opt: opt)) + end + test "should not profile if #before_profile returns false" do AppProfiler.expects(:run).never AppProfiler.middleware.any_instance.stubs(:before_profile).returns(false) @@ -482,7 +492,11 @@ def with_otel_instrumentation_enabled end def app_env - ->(_) { [200, {}, ["OK"]] } + lambda do |_env| + # Ensure requests expected to produce profiles run long enough to be sampled. + 1_000_000.times { Object.new } if AppProfiler.running? + [200, {}, ["OK"]] + end end def mock_request_env(path: "/", opt: {})