Skip to content
Snippets Groups Projects
  • Sean Quah's avatar
    6b18eb44
    Fix opentracing and Prometheus metrics for replication requests (#10996) · 6b18eb44
    Sean Quah authored
    This commit fixes two bugs to do with decorators not instrumenting
    `ReplicationEndpoint`'s `send_request` correctly. There are two
    decorators on `send_request`: Prometheus' `Gauge.track_inprogress()`
    and Synapse's `opentracing.trace`.
    
    `Gauge.track_inprogress()` does not have any support for async
    functions when used as a decorator. Since async functions behave like
    regular functions that return coroutines, only the creation of the
    coroutine was covered by the metric and none of the actual body of
    `send_request`.
    
    `Gauge.track_inprogress()` returns a regular, non-async function
    wrapping `send_request`, which is the source of the next bug.
    The `opentracing.trace` decorator would normally handle async functions
    correctly, but since the wrapped `send_request` is a non-async function,
    the decorator ends up suffering from the same issue as
    `Gauge.track_inprogress()`: the opentracing span only measures the
    creation of the coroutine and none of the actual function body.
    
    Using `Gauge.track_inprogress()` as a context manager instead of a
    decorator resolves both bugs.
    6b18eb44
    History
    Fix opentracing and Prometheus metrics for replication requests (#10996)
    Sean Quah authored
    This commit fixes two bugs to do with decorators not instrumenting
    `ReplicationEndpoint`'s `send_request` correctly. There are two
    decorators on `send_request`: Prometheus' `Gauge.track_inprogress()`
    and Synapse's `opentracing.trace`.
    
    `Gauge.track_inprogress()` does not have any support for async
    functions when used as a decorator. Since async functions behave like
    regular functions that return coroutines, only the creation of the
    coroutine was covered by the metric and none of the actual body of
    `send_request`.
    
    `Gauge.track_inprogress()` returns a regular, non-async function
    wrapping `send_request`, which is the source of the next bug.
    The `opentracing.trace` decorator would normally handle async functions
    correctly, but since the wrapped `send_request` is a non-async function,
    the decorator ends up suffering from the same issue as
    `Gauge.track_inprogress()`: the opentracing span only measures the
    creation of the coroutine and none of the actual function body.
    
    Using `Gauge.track_inprogress()` as a context manager instead of a
    decorator resolves both bugs.