Catch BrokenPipeError from metrics server, and log as a warning (#14072)

This commit is contained in:
David Robertson 2022-10-07 13:35:44 +01:00 committed by GitHub
parent d6ae14e60e
commit 1fa2e58772
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 6 deletions

1
changelog.d/14072.misc Normal file
View File

@ -0,0 +1 @@
Don't create noisy Sentry events when a requester drops connection to the metrics server mid-request.

View File

@ -20,7 +20,7 @@ Due to the renaming of metrics in prometheus_client 0.4.0, this customised
vendoring of the code will emit both the old versions that Synapse dashboards vendoring of the code will emit both the old versions that Synapse dashboards
expect, and the newer "best practice" version of the up-to-date official client. expect, and the newer "best practice" version of the up-to-date official client.
""" """
import logging
import math import math
import threading import threading
from http.server import BaseHTTPRequestHandler, HTTPServer from http.server import BaseHTTPRequestHandler, HTTPServer
@ -34,6 +34,7 @@ from prometheus_client.core import Sample
from twisted.web.resource import Resource from twisted.web.resource import Resource
from twisted.web.server import Request from twisted.web.server import Request
logger = logging.getLogger(__name__)
CONTENT_TYPE_LATEST = "text/plain; version=0.0.4; charset=utf-8" CONTENT_TYPE_LATEST = "text/plain; version=0.0.4; charset=utf-8"
@ -219,11 +220,16 @@ class MetricsHandler(BaseHTTPRequestHandler):
except Exception: except Exception:
self.send_error(500, "error generating metric output") self.send_error(500, "error generating metric output")
raise raise
try:
self.send_response(200) self.send_response(200)
self.send_header("Content-Type", CONTENT_TYPE_LATEST) self.send_header("Content-Type", CONTENT_TYPE_LATEST)
self.send_header("Content-Length", str(len(output))) self.send_header("Content-Length", str(len(output)))
self.end_headers() self.end_headers()
self.wfile.write(output) self.wfile.write(output)
except BrokenPipeError as e:
logger.warning(
"BrokenPipeError when serving metrics (%s). Did Prometheus restart?", e
)
def log_message(self, format: str, *args: Any) -> None: def log_message(self, format: str, *args: Any) -> None:
"""Log nothing.""" """Log nothing."""