Compare commits

...

5 Commits

Author SHA1 Message Date
Erik Johnston
8cd0a81f25 Set right content type header 2023-07-12 15:32:17 +01:00
Erik Johnston
daa5321055 Fixup3 2023-07-12 15:24:29 +01:00
Erik Johnston
cbbdf14be3 fixup 2023-07-12 15:11:59 +01:00
Erik Johnston
9c815553ed Fix exemplars 2023-07-12 15:07:13 +01:00
Erik Johnston
e7176e8120 Add prometheus exemplars support 2023-07-12 14:46:42 +01:00
4 changed files with 39 additions and 7 deletions

View File

@@ -16,13 +16,17 @@
import logging
import threading
import traceback
from typing import Dict, Mapping, Set, Tuple
from typing import TYPE_CHECKING, Dict, Mapping, Optional, Set, Tuple
from prometheus_client.core import Counter, Histogram
from synapse.logging.context import current_context
from synapse.logging.opentracing import get_prometheus_exemplar
from synapse.metrics import LaterGauge
if TYPE_CHECKING:
import opentracing
logger = logging.getLogger(__name__)
@@ -143,7 +147,12 @@ LaterGauge(
class RequestMetrics:
def start(self, time_sec: float, name: str, method: str) -> None:
def start(
self,
time_sec: float,
name: str,
method: str,
) -> None:
self.start_ts = time_sec
self.start_context = current_context()
self.name = name
@@ -162,7 +171,13 @@ class RequestMetrics:
with _in_flight_requests_lock:
_in_flight_requests.add(self)
def stop(self, time_sec: float, response_code: int, sent_bytes: int) -> None:
def stop(
self,
time_sec: float,
response_code: int,
sent_bytes: int,
span: Optional["opentracing.Span"],
) -> None:
with _in_flight_requests_lock:
_in_flight_requests.discard(self)
@@ -193,7 +208,7 @@ class RequestMetrics:
response_count.labels(self.method, self.name, tag).inc()
response_timer.labels(self.method, self.name, tag, response_code_str).observe(
time_sec - self.start_ts
time_sec - self.start_ts, exemplar=get_prometheus_exemplar(span)
)
resource_usage = context.get_resource_usage()

View File

@@ -487,7 +487,9 @@ class SynapseRequest(Request):
self._opentracing_span.finish()
try:
self.request_metrics.stop(self.finish_time, self.code, self.sentLength)
self.request_metrics.stop(
self.finish_time, self.code, self.sentLength, self._opentracing_span
)
except Exception as e:
logger.warning("Failed to stop metrics: %r", e)

View File

@@ -672,6 +672,20 @@ def active_span() -> Optional["opentracing.Span"]:
return opentracing.tracer.active_span
def get_prometheus_exemplar(
span: Optional["opentracing.Span"] = None,
) -> Optional[Dict[str, str]]:
if not span:
span = active_span()
if not span:
return None
trace_id = getattr(span, "trace_id", None)
return {"trace_id": f"{trace_id:x}"}
@ensure_active_span("set a tag")
def set_tag(key: str, value: Union[str, bool, int, float]) -> None:
"""Sets a tag on the active span"""

View File

@@ -13,12 +13,13 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from prometheus_client import REGISTRY, CollectorRegistry, generate_latest
from prometheus_client import REGISTRY, CollectorRegistry
from prometheus_client.openmetrics.exposition import generate_latest
from twisted.web.resource import Resource
from twisted.web.server import Request
CONTENT_TYPE_LATEST = "text/plain; version=0.0.4; charset=utf-8"
CONTENT_TYPE_LATEST = "application/openmetrics-text; version=1.0.0; charset=utf-8"
class MetricsResource(Resource):