def METHOD_NAME(behaviour: AsyncHandlerMethod[Response]):
    @functools.wraps(behaviour)
    async def new_behaviour(
        request: Request, context: BentoServicerContext
    ) -> Response | t.Awaitable[Response]:
        if not isinstance(request, pb.Request):
            return await behaviour(request, context)
        api_name = request.api_name
        # instrument request total count
        self.metrics_request_total.labels(
            api_name=api_name,
            service_name=component_context.bento_name,
            service_version=component_context.bento_version,
            http_response_code=to_http_status(
                t.cast(grpc.StatusCode, context.code())
            ),
        ).inc()
        # instrument request duration
        assert START_TIME_VAR.get() != 0
        total_time = max(default_timer() - START_TIME_VAR.get(), 0)
        self.metrics_request_duration.labels(  # type: ignore (unfinished prometheus types)
            api_name=api_name,
            service_name=component_context.bento_name,
            service_version=component_context.bento_version,
            http_response_code=to_http_status(
                t.cast(grpc.StatusCode, context.code())
            ),
        ).observe(
            total_time
        )
        START_TIME_VAR.set(0)
        # instrument request in progress
        with self.metrics_request_in_progress.labels(
            api_name=api_name,
            service_version=component_context.bento_version,
            service_name=component_context.bento_name,
        ).track_inprogress():
            response = await behaviour(request, context)
        return response
    return new_behaviour