Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add response time metrics for introspection requests #16131

Merged
merged 2 commits into from
Aug 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/16131.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add response time metrics for introspection requests for delegated auth.
34 changes: 27 additions & 7 deletions synapse/api/auth/msc3861_delegated.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
from authlib.oauth2.rfc7523 import ClientSecretJWT, PrivateKeyJWT, private_key_jwt_sign
from authlib.oauth2.rfc7662 import IntrospectionToken
from authlib.oidc.discovery import OpenIDProviderMetadata, get_well_known_url
from prometheus_client import Histogram

from twisted.web.client import readBody
from twisted.web.http_headers import Headers
Expand All @@ -46,6 +47,13 @@

logger = logging.getLogger(__name__)

introspection_response_timer = Histogram(
"synapse_api_auth_delegated_introspection_response",
"Time taken to get a response for an introspection request",
["code"],
)


# Scope as defined by MSC2967
# https://github.com/matrix-org/matrix-spec-proposals/pull/2967
SCOPE_MATRIX_API = "urn:matrix:org.matrix.msc2967.client:api:*"
Expand Down Expand Up @@ -190,14 +198,26 @@ async def _introspect_token(self, token: str) -> IntrospectionToken:
# Do the actual request
# We're not using the SimpleHttpClient util methods as we don't want to
# check the HTTP status code, and we do the body encoding ourselves.
response = await self._http_client.request(
method="POST",
uri=uri,
data=body.encode("utf-8"),
headers=headers,
)

resp_body = await make_deferred_yieldable(readBody(response))
start_time = self._clock.time()
try:
response = await self._http_client.request(
method="POST",
uri=uri,
data=body.encode("utf-8"),
headers=headers,
)

resp_body = await make_deferred_yieldable(readBody(response))
except Exception:
end_time = self._clock.time()
introspection_response_timer.labels("ERR").observe(end_time - start_time)
raise

end_time = self._clock.time()
introspection_response_timer.labels(response.code).observe(
end_time - start_time
)

if response.code < 200 or response.code >= 300:
raise HttpResponseException(
Expand Down