[docs]defdecorate_proxy_controller(wrapped:IAsyncController,*,name:Optional[str]=None,port:Optional[int]=None):""" Decorates a builtin or custom proxy controller to collect metrics for prometheus. """common_labels=dict(name=(nameor"-"),port=(portor"-"))@wraps(wrapped)asyncdefwrapper(request:HttpRequest,*args,**kwargs)->HttpResponse:labels={**common_labels,"method":request.method}CONTROLLER_REQUESTS.labels(**labels).inc()CONTROLLER_REQUESTS_IN_PROGRESS.labels(**labels).inc()before_time=time.perf_counter()try:response=awaitwrapped(request,*args,**kwargs)CONTROLLER_RESPONSES.labels(**labels,status=getattr(response,"status","-")).inc()returnresponseexceptExceptionasexc:# noqa: BLE001CONTROLLER_EXCEPTIONS.labels(**labels,path=request.path,exception=type(exc).__name__).inc()raiseexcfromNonefinally:after_time=time.perf_counter()CONTROLLER_REQUESTS_TIME.labels(**labels).observe(after_time-before_time)CONTROLLER_REQUESTS_IN_PROGRESS.labels(**labels).dec()returnwrapper
[docs]defdecorate_http_client_send(wrapped):""" Decorates the httpx async client send method to collect metrics for prometheus. """@wraps(wrapped)asyncdefwrapper(request:httpx.Request,*args,**kwargs)->httpx.Response:labels={"name":request.extensions.get("harp",{}).get("endpoint","-"),"method":request.method}REMOTE_REQUESTS.labels(**labels).inc()REMOTE_REQUESTS_IN_PROGRESS.labels(**labels).inc()before_time=time.perf_counter()try:response=awaitwrapped(request,*args,**kwargs)REMOTE_RESPONSES.labels(**labels,status=getattr(response,"status_code","-")).inc()returnresponseexceptExceptionasexc:# noqa: BLE001REMOTE_EXCEPTIONS.labels(**labels,url=str(request.url),exception=type(exc).__name__).inc()raiseexcfromNonefinally:after_time=time.perf_counter()REMOTE_REQUESTS_TIME.labels(**labels).observe(after_time-before_time)REMOTE_REQUESTS_IN_PROGRESS.labels(**labels).dec()returnwrapper