ESC

Type to search...

Debugging

Debug EVOID services with logging, tracing, and inspection tools.

Basic Logging with loguru

Use loguru for structured logging:

from loguru import logger
from evoid.web.route import Service, get

app = Service("api")

@app.get("/items/{item_id}")
async def get_item(item_id: int):
    logger.debug(f"Fetching item {item_id}")
    
    if item_id > 100:
        logger.warning(f"Item {item_id} might not exist")
        return {"error": "Item not found"}
    
    logger.info(f"Successfully fetched item {item_id}")
    return {"item_id": item_id, "name": "Widget"}

Pipeline Tracing with logger_processor

Add a logging processor to trace pipeline execution:

from evoid.core import Context, register_processor
from loguru import logger

async def logger_processor(ctx: Context) -> dict:
    logger.info(f"Intent: {ctx.intent.name}")
    logger.info(f"Metadata: {ctx.metadata}")
    logger.info(f"State: {ctx.state}")
    return {"logged": True}

# Register for all intents
register_processor("*", logger_processor)

# Or register for specific intent
register_processor("GET:/items", logger_processor)

Inspecting Intent Metadata

Debug by inspecting intent metadata in handlers:

from evoid.web.route import Service, get, before
from evoid.core import Context
from loguru import logger

async def debug_metadata(ctx: Context) -> dict:
    logger.debug("=== Intent Metadata ===")
    logger.debug(f"Method: {ctx.metadata.get('method')}")
    logger.debug(f"Path: {ctx.metadata.get('path')}")
    logger.debug(f"Headers: {ctx.metadata.get('headers')}")
    logger.debug(f"Query params: {ctx.metadata.get('params')}")
    logger.debug(f"Body: {ctx.metadata.get('body')}")
    logger.debug(f"Path params: {ctx.metadata.get('path_params')}")
    return {"debugged": True}

app = Service("api")

@app.get("/debug/")
async def debug_endpoint():
    return {"status": "ok"}

before("GET:/debug", "debug_metadata")

Debug Mode

Run services in debug mode for verbose output:

from evoid.web.route import Service

# Enable debug mode
app = Service("api", debug=True)

# Or configure via environment
import os
os.environ["EVOID_DEBUG"] = "true"

CLI Debug Flag

Use the --debug flag when running services:

# Run with debug output
evo service run --debug

# Run specific service
evo service run my_service --debug

# Run with custom log level
evo service run --log-level DEBUG

Native IOP Debugging

Debug native IOP services:

from evoid.native import create_service, on
from evoid import Intent, Level
from loguru import logger

app = create_service("api")

GET_ITEMS = Intent(
    name="GET:/items",
    level=Level.STANDARD,
    metadata={"method": "GET", "path": "/items"},
)

async def handle_get_items(intent: Intent) -> dict:
    logger.debug(f"Intent received: {intent.name}")
    logger.debug(f"Metadata: {intent.metadata}")
    
    # Debug logic
    params = intent.metadata.get("params", {})
    logger.debug(f"Query params: {params}")
    
    return {"items": [], "debug": True}

on(app, GET_ITEMS, handle_get_items)

Summary

ApproachWhen to Use
Basic loggingTrack normal operations
Pipeline tracingUnderstand request flow
Metadata inspectionDebug request data
Debug modeDevelopment environment
CLI flagsRuntime debugging