Skip to content

Commit 7f65100

Browse files
committed
Metrics for client and server.
1 parent 8eafc1f commit 7f65100

File tree

5 files changed

+76
-1
lines changed

5 files changed

+76
-1
lines changed

config/metrics.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# frozen_string_literal: true
2+
3+
# Released under the MIT License.
4+
# Copyright, 2025, by Samuel Williams.
5+
6+
def prepare
7+
require "metrics/provider/async/http"
8+
end

config/sus.rb

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,16 @@
99
require "covered/sus"
1010
include Covered::Sus
1111

12-
require "traces"
1312
ENV["TRACES_BACKEND"] ||= "traces/backend/test"
13+
ENV["METRICS_BACKEND"] ||= "metrics/backend/test"
14+
15+
def prepare_instrumentation!
16+
require "traces"
17+
require "metrics"
18+
end
19+
20+
def before_tests(...)
21+
prepare_instrumentation!
22+
23+
super
24+
end

lib/metrics/provider/async/http.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# frozen_string_literal: true
2+
3+
require_relative "http/client"
4+
require_relative "http/server"
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
# Released under the MIT License.
4+
# Copyright, 2025, by Samuel Williams.
5+
6+
require_relative "../../../../async/http/client"
7+
require "metrics/provider"
8+
9+
Metrics::Provider(Async::HTTP::Client) do
10+
ASYNC_HTTP_CLIENT_REQUEST_INITIATED = Metrics.metric("async.http.client.request.initiated", :counter, description: "The number of HTTP client requests initiated.")
11+
ASYNC_HTTP_CLIENT_REQUEST_COMPLETED = Metrics.metric("async.http.client.request.completed", :counter, description: "The number of HTTP client requests completed.")
12+
13+
def make_response(request, connection, attempt)
14+
ASYNC_HTTP_CLIENT_REQUEST_INITIATED.emit(1, tags: ["method:#{request.method}"])
15+
16+
response = super(request, connection, attempt)
17+
18+
ASYNC_HTTP_CLIENT_REQUEST_COMPLETED.emit(1, tags: ["method:#{request.method}", "status:#{response.status}"])
19+
20+
return response
21+
ensure
22+
unless response
23+
ASYNC_HTTP_CLIENT_REQUEST_COMPLETED.emit(1, tags: ["method:#{request.method}", "status:failed"])
24+
end
25+
end
26+
end
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# frozen_string_literal: true
2+
3+
# Released under the MIT License.
4+
# Copyright, 2025, by Samuel Williams.
5+
6+
require_relative "../../../../async/http/server"
7+
require "metrics/provider"
8+
9+
Metrics::Provider(Async::HTTP::Server) do
10+
ASYNC_HTTP_SERVER_REQUEST_INITIATED = Metrics.metric("async.http.server.request.initiated", :counter, description: "The number of HTTP server requests initiated.")
11+
ASYNC_HTTP_SERVER_REQUEST_COMPLETED = Metrics.metric("async.http.server.request.completed", :counter, description: "The number of HTTP server requests completed.")
12+
13+
def call(request)
14+
ASYNC_HTTP_SERVER_REQUEST_INITIATED.emit(1, tags: ["method:#{request.method}"])
15+
16+
response = super(request)
17+
18+
ASYNC_HTTP_SERVER_REQUEST_COMPLETED.emit(1, tags: ["method:#{request.method}", "status:#{response.status}"])
19+
20+
return response
21+
ensure
22+
unless response
23+
ASYNC_HTTP_SERVER_REQUEST_COMPLETED.emit(1, tags: ["method:#{request.method}", "status:failed"])
24+
end
25+
end
26+
end

0 commit comments

Comments
 (0)