diff --git a/lib/collector.rb b/lib/collector.rb index fd29da6..b1e379d 100644 --- a/lib/collector.rb +++ b/lib/collector.rb @@ -13,6 +13,7 @@ def initialize @page_views = nil @http_requests = nil @http_duration_seconds = nil + @http_application_duration_seconds = nil @http_redis_duration_seconds = nil @http_sql_duration_seconds = nil @http_net_duration_seconds = nil @@ -226,12 +227,25 @@ def ensure_web_metrics @http_duration_seconds = Summary.new("http_duration_seconds", "Time spent in HTTP reqs in seconds") + + @http_application_duration_seconds = + Summary.new( + "http_application_duration_seconds", + "Time spent in application code within HTTP reqs in seconds", + ) + @http_redis_duration_seconds = - Summary.new("http_redis_duration_seconds", "Time spent in HTTP reqs in redis seconds") + Summary.new( + "http_redis_duration_seconds", + "Time spent in Redis within HTTP reqs redis seconds", + ) + @http_sql_duration_seconds = - Summary.new("http_sql_duration_seconds", "Time spent in HTTP reqs in SQL in seconds") + Summary.new("http_sql_duration_seconds", "Time spent in SQL within HTTP reqs in seconds") + @http_net_duration_seconds = Summary.new("http_net_duration_seconds", "Time spent in external network requests") + @http_queue_duration_seconds = Summary.new( "http_queue_duration_seconds", @@ -274,7 +288,18 @@ def process_web(metric) labels[:action] = "other" end - @http_duration_seconds.observe(metric.duration, labels) + duration = metric.duration + + @http_duration_seconds.observe(duration, labels) + + if duration + application_duration = duration.dup + application_duration -= metric.sql_duration if metric.sql_duration + application_duration -= metric.redis_duration if metric.redis_duration + application_duration -= metric.net_duration if metric.net_duration + @http_application_duration_seconds.observe(application_duration, labels) + end + @http_sql_duration_seconds.observe(metric.sql_duration, labels) @http_redis_duration_seconds.observe(metric.redis_duration, labels) @http_net_duration_seconds.observe(metric.net_duration, labels) @@ -388,6 +413,7 @@ def web_metrics @page_views, @http_requests, @http_duration_seconds, + @http_application_duration_seconds, @http_redis_duration_seconds, @http_sql_duration_seconds, @http_net_duration_seconds, diff --git a/spec/lib/collector_spec.rb b/spec/lib/collector_spec.rb index 53a5fb7..74387b2 100644 --- a/spec/lib/collector_spec.rb +++ b/spec/lib/collector_spec.rb @@ -253,10 +253,10 @@ module DiscoursePrometheus metrics << InternalMetric::Web.get( status_code: 200, - duration: 5, + duration: 10, sql_duration: 1, - redis_duration: 3, - net_duration: 5, + redis_duration: 2, + net_duration: 3, json: true, controller: "list", action: "latest", @@ -265,10 +265,10 @@ module DiscoursePrometheus metrics << InternalMetric::Web.get( status_code: 302, - duration: 5, + duration: 10, sql_duration: 1, - redis_duration: 3, - net_duration: 5, + redis_duration: 2, + net_duration: 3, controller: "list", action: "latest", cache: true, @@ -311,10 +311,11 @@ module DiscoursePrometheus } [ - ["http_duration_seconds", 5.0], + ["http_duration_seconds", 10.0], + ["http_application_duration_seconds", 4.0], ["http_sql_duration_seconds", 1.0], - ["http_redis_duration_seconds", 3.0], - ["http_net_duration_seconds", 5.0], + ["http_redis_duration_seconds", 2.0], + ["http_net_duration_seconds", 3.0], ].each { |metric_name, sum| assert_metric.call(metric_name, sum) } end end