RestAPI: adds support for logging client information

This commit is contained in:
Mose Müller 2024-11-27 09:43:50 +01:00
parent e3c144fa6e
commit 4d84c9778f

View File

@ -5,6 +5,7 @@ from typing import TYPE_CHECKING
import aiohttp.web import aiohttp.web
import aiohttp_middlewares.error import aiohttp_middlewares.error
import click
from pydase.data_service.state_manager import StateManager from pydase.data_service.state_manager import StateManager
from pydase.server.web_server.api.v1.endpoints import ( from pydase.server.web_server.api.v1.endpoints import (
@ -28,10 +29,12 @@ STATUS_FAILED = 400
async def _get_value( async def _get_value(
request: aiohttp.web.Request, state_manager: StateManager request: aiohttp.web.Request, state_manager: StateManager
) -> aiohttp.web.Response: ) -> aiohttp.web.Response:
logger.info("Handle api request: %s", request) log_id = get_log_id(request)
access_path = request.rel_url.query["access_path"] access_path = request.rel_url.query["access_path"]
logger.info("Client [%s] is getting the value of '%s'", log_id, access_path)
status = STATUS_OK status = STATUS_OK
try: try:
result = get_value(state_manager, access_path) result = get_value(state_manager, access_path)
@ -45,8 +48,14 @@ async def _get_value(
async def _update_value( async def _update_value(
request: aiohttp.web.Request, state_manager: StateManager request: aiohttp.web.Request, state_manager: StateManager
) -> aiohttp.web.Response: ) -> aiohttp.web.Response:
log_id = get_log_id(request)
data: UpdateDict = await request.json() data: UpdateDict = await request.json()
logger.info(
"Client [%s] is updating the value of '%s'", log_id, data["access_path"]
)
try: try:
update_value(state_manager, data) update_value(state_manager, data)
@ -59,6 +68,12 @@ async def _update_value(
async def _trigger_method( async def _trigger_method(
request: aiohttp.web.Request, state_manager: StateManager request: aiohttp.web.Request, state_manager: StateManager
) -> aiohttp.web.Response: ) -> aiohttp.web.Response:
log_id = get_log_id(request)
access_path = request.rel_url.query["access_path"]
logger.info("Client [%s] is triggering the method '%s'", log_id, access_path)
data: TriggerMethodDict = await request.json() data: TriggerMethodDict = await request.json()
method = get_object_attr_from_path(state_manager.service, data["access_path"]) method = get_object_attr_from_path(state_manager.service, data["access_path"])
@ -78,6 +93,20 @@ async def _trigger_method(
return aiohttp.web.json_response(dump(e), status=STATUS_FAILED) return aiohttp.web.json_response(dump(e), status=STATUS_FAILED)
def get_log_id(request: aiohttp.web.Request) -> str:
client_id_header = request.headers.get("x-client-id", None)
remote_username_header = request.headers.get("remote-user", None)
if client_id_header is not None:
log_id = f"id={click.style(client_id_header, fg='cyan')}"
elif remote_username_header is not None:
log_id = f"user={click.style(remote_username_header, fg='cyan')}"
else:
log_id = f"id={click.style(None, fg='cyan')}"
return log_id
def create_api_application(state_manager: StateManager) -> aiohttp.web.Application: def create_api_application(state_manager: StateManager) -> aiohttp.web.Application:
api_application = aiohttp.web.Application( api_application = aiohttp.web.Application(
middlewares=(aiohttp_middlewares.error.error_middleware(),) middlewares=(aiohttp_middlewares.error.error_middleware(),)