Skip to content

Commit

Permalink
FEATURE: Introduce http_application_duration_seconds summary metric (
Browse files Browse the repository at this point in the history
…#67)

The metric is useful when introducing a change that would only affect
the performance of application code. For example, upgrading Ruby
versions or enabling YJIT in Ruby. With this metric, we are able to
isolate and analyse the performance of the application code as a result
of those changes.
  • Loading branch information
tgxworld committed Apr 25, 2023
1 parent de1eb83 commit 802cb5a
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 12 deletions.
32 changes: 29 additions & 3 deletions lib/collector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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",
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
19 changes: 10 additions & 9 deletions spec/lib/collector_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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,
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 802cb5a

Please sign in to comment.