Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@ netengine/
spec/ Pydantic v2 models + YAML loader with cross-field validation
events/ EventEnvelope schema (locked)
api/ FastAPI operator API
logging/ Structured logging (loguru)
logs/ Structured logging (loguru)
errors.py Error hierarchy (SubstrateError, DNSError, PKIError, …)
migrations/ SQL schema + pgmq queue setup
examples/ Reference YAML specs
Expand Down
2 changes: 1 addition & 1 deletion netengine/api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from fastapi import FastAPI

from netengine.api.routes import router
from logs.middleware import StructuredLoggingMiddleware
from netengine.logs.middleware import StructuredLoggingMiddleware

app = FastAPI(
title="NetEngine Operator API",
Expand Down
2 changes: 1 addition & 1 deletion netengine/api/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer

from netengine.core.state import RuntimeState
from logs import get_logger
from netengine.logs import get_logger

logger = get_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion netengine/api/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
from netengine.core.reload import ReloadResult, apply_reload
from netengine.core.state import RUNTIME_STATE_SCHEMA_VERSION, RuntimeState
from netengine.events.queues import PRIMARY_QUEUES, Queue, dlq_for
from logs import get_logger
from netengine.logs import get_logger
from netengine.phase_labels import PHASE_LABELS
from netengine.security.redaction import (
_contains_private_pem,
Expand Down
2 changes: 1 addition & 1 deletion netengine/cli/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
run_migrations,
)
from netengine.events.queues import PRIMARY_QUEUES, Queue, dlq_for
from logs import get_logger
from netengine.logs import get_logger
from netengine.phase_labels import PHASE_LABELS
from netengine.spec.loader import (
SpecLoadError,
Expand Down
2 changes: 1 addition & 1 deletion netengine/core/consumer_supervisor.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import asyncio
from typing import Any, Callable, Coroutine, Dict

from logs import get_logger
from netengine.logs import get_logger

logger = get_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion netengine/core/docker_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import os
from typing import Any, Optional

from logs import get_logger
from netengine.logs import get_logger

logger = get_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion netengine/core/drift_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
"""

import asyncio
import logs
import netengine.logs as logs
from dataclasses import dataclass
from datetime import UTC, datetime
from typing import Any, Optional
Expand Down
2 changes: 1 addition & 1 deletion netengine/core/orchestrator.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
from netengine.handlers.dns import DNSHandler
from netengine.handlers.phase_pki import PKIPhaseHandler
from netengine.handlers.substrate import SubstrateHandler
from logs import get_logger
from netengine.logs import get_logger
from netengine.monitoring.metrics import record_healthcheck_failure, record_phase
from netengine.phases.phase_ands import ANDsPhaseHandler
from netengine.phases.phase_inworld_identity import InWorldIdentityPhaseHandler
Expand Down
2 changes: 1 addition & 1 deletion netengine/core/reload.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from pydantic import BaseModel

from netengine.core.state import RuntimeState
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.models import NetEngineSpec

logger = get_logger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion netengine/core/self_healing.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
Implements the logic for re-applying drifted phases and their dependencies.
"""

import logs
import netengine.logs as logs
from dataclasses import dataclass
from typing import Optional

Expand Down
2 changes: 1 addition & 1 deletion netengine/core/state.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from pathlib import Path
from typing import TYPE_CHECKING, Any, Dict, Optional, TypedDict, cast

from logs import get_logger
from netengine.logs import get_logger

if TYPE_CHECKING:
import asyncio
Expand Down
2 changes: 1 addition & 1 deletion netengine/handlers/and_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from netengine.handlers.domain_registry_handler import DomainRegistryHandler
from netengine.handlers.gateway_handler import GatewayHandler
from netengine.handlers.protocols import DockerAdapterProtocol, PGMQAdapterProtocol
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.models import NetEngineSpec


Expand Down
2 changes: 1 addition & 1 deletion netengine/handlers/app_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from netengine.handlers.oidc_handler import OIDCHandler
from netengine.handlers.pki_handler import PKIHandler
from netengine.handlers.protocols import DockerAdapterProtocol, PGMQAdapterProtocol
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.models import NetEngineSpec


Expand Down
2 changes: 1 addition & 1 deletion netengine/handlers/gateway_portal_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
from netengine.handlers.context import PhaseContext
from netengine.handlers.gateway_handler import GatewayHandler
from netengine.handlers.protocols import DockerAdapterProtocol
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.models import CrossWorldPeer, GatewayPortal
from netengine.spec.types import GatewayCrossWorldMode, GatewayRealInternetMode

Expand Down
2 changes: 1 addition & 1 deletion netengine/handlers/phase_pki.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from netengine.handlers._base import BasePhaseHandler
from netengine.handlers.context import PhaseContext
from netengine.handlers.pki_handler import PKIHandler
from logs import get_logger
from netengine.logs import get_logger
from netengine.workers.pki_cert_rotation_worker import CertTypeRotationConfig, PKICertRotationWorker

logger = get_logger(__name__)
Expand Down
2 changes: 1 addition & 1 deletion netengine/handlers/pki_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from netengine.core.state import RuntimeState
from netengine.errors import PKIError
from netengine.handlers.protocols import DockerAdapterProtocol
from logs import get_logger
from netengine.logs import get_logger

logger = get_logger(__name__)

Expand Down
18 changes: 18 additions & 0 deletions netengine/logs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@
"LoggerFactory",
"LogConfig",
"get_logger",
"getLogger",
"Logger",
"DEBUG",
"INFO",
"WARNING",
"ERROR",
"CRITICAL",
"log_context",
"timed_operation",
# Tracing
Expand All @@ -39,6 +46,9 @@
"PerformanceMetricsSink",
]

import logging as _stdlib_logging
from loguru._logger import Logger

from .core import LogConfig, LoggerFactory, get_logger, log_context, timed_operation
from .middleware import LoggingMiddleware, StructuredLoggingMiddleware
from .sinks import (
Expand All @@ -59,5 +69,13 @@
with_trace_context,
)

# Compatibility aliases for code/tests that previously used a logging-like module.
getLogger = get_logger
DEBUG = _stdlib_logging.DEBUG
INFO = _stdlib_logging.INFO
WARNING = _stdlib_logging.WARNING
ERROR = _stdlib_logging.ERROR
CRITICAL = _stdlib_logging.CRITICAL

# Initialize logger on import
logger = LoggerFactory.get_logger(__name__)
22 changes: 22 additions & 0 deletions netengine/logs/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"""

import json
import logging
import os
import sys
import threading
Expand Down Expand Up @@ -134,6 +135,15 @@ def format_record_json(record: "Record") -> str:
return json.dumps(log_entry).replace("{", "{{").replace("}", "}}") + "\n"


def forward_to_stdlib_logging(message: Any) -> None:
"""Forward Loguru records to Python logging for pytest caplog and integrations."""
record = message.record
logging.getLogger(record["extra"].get("logger_name") or record["name"]).log(
record["level"].no,
record["message"],
)


# ============================================================================
# Filters
# ============================================================================
Expand Down Expand Up @@ -269,6 +279,7 @@ def initialize(
if add_default_sinks:
cls.add_stdout_sink(config)
cls.add_file_sink(config)
cls.add_stdlib_sink(config)

cls._initialized = True

Expand All @@ -289,6 +300,17 @@ def add_stdout_sink(cls, config: type[LogConfig] = LogConfig) -> None:
)
cls._sinks.append("stdout")

@classmethod
def add_stdlib_sink(cls, config: type[LogConfig] = LogConfig) -> None:
"""Forward log records to Python's logging module for integrations like pytest caplog."""
_logger.add(
forward_to_stdlib_logging,
level=config.LOG_LEVEL,
format="{message}",
filter=NoiseFilter(),
)
cls._sinks.append("stdlib")

@classmethod
def add_file_sink(
cls,
Expand Down
2 changes: 1 addition & 1 deletion netengine/monitoring/service.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""Monitoring service — runs all probes on schedule and publishes world_health events to pgmq."""

import asyncio
import logs
import netengine.logs as logs
from typing import Any

from netengine.core.pgmq_client import PGMQClient
Expand Down
2 changes: 1 addition & 1 deletion netengine/phases/phase_inworld_identity.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from netengine.handlers.docker_handler import DockerHandler
from netengine.handlers.oidc_handler import OIDCHandler
from netengine.handlers.pki_handler import PKIHandler
from logs import get_logger
from netengine.logs import get_logger

logger = get_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion netengine/phases/phase_platform_identity.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from netengine.handlers.docker_handler import DockerHandler
from netengine.handlers.oidc_handler import OIDCHandler
from netengine.handlers.pki_handler import PKIHandler
from logs import get_logger
from netengine.logs import get_logger

logger = get_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion netengine/spec/loader.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
"""YAML spec loading and validation with OmegaConf composition support."""

import ipaddress
import logs
import netengine.logs as logs
from collections.abc import Iterator
from pathlib import Path
from typing import Any, Optional
Expand Down
2 changes: 1 addition & 1 deletion netengine/utils/migrations.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from types import TracebackType
from typing import Protocol

from logs import get_logger
from netengine.logs import get_logger

logger = get_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion netengine/workers/pki_cert_rotation_worker.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# netengine/workers/pki_cert_rotation_worker.py
import asyncio
import logs
import netengine.logs as logs
from dataclasses import dataclass
from datetime import UTC, datetime, timedelta
from typing import Any, Awaitable, Callable, Dict, List, Optional, cast
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ exclude = [
"netengine/handlers/mail_handler\\.py",
"netengine/handlers/minio_handler\\.py",
"netengine/handlers/whois_server\\.py",
"netengine/logging/middleware\\.py",
"netengine/logging/sinks\\.py",
"netengine/logs/middleware\\.py",
"netengine/logs/sinks\\.py",
]

[[tool.mypy.overrides]]
Expand Down
4 changes: 2 additions & 2 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
"""Pytest configuration and shared fixtures."""

import logs
import netengine.logs as logs
from pathlib import Path
from unittest.mock import AsyncMock, MagicMock

import pytest

from netengine.handlers.context import PhaseContext, RuntimeState
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.loader import load_spec
from netengine.spec.models import NetEngineSpec

Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_e2e_federation.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@
from netengine.handlers.docker_handler import DockerHandler
from netengine.handlers.gateway_portal_handler import GatewayPortalHandler
from netengine.handlers.substrate import SubstrateHandler
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.loader import load_spec
from netengine.spec.models import (
CrossWorldConfig,
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_e2e_fullstack.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
from netengine.handlers.docker_handler import DockerHandler
from netengine.handlers.phase_pki import PKIPhaseHandler
from netengine.handlers.substrate import SubstrateHandler
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.loader import load_spec

FIXTURES_DIR = Path(__file__).parent.parent / "fixtures"
Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_m1_m2_bootstrap.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from netengine.handlers.context import PhaseContext, RuntimeState
from netengine.handlers.dns import DNSHandler
from netengine.handlers.substrate import SubstrateHandler
from logs import get_logger
from netengine.logs import get_logger
from netengine.spec.models import NetEngineSpec


Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_m6_inworld_identity.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from netengine.core.state import RuntimeState
from netengine.handlers._base import BasePhaseHandler
from netengine.handlers.context import PhaseContext
from logs import get_logger
from netengine.logs import get_logger
from netengine.phases.phase_inworld_identity import InWorldIdentityPhaseHandler
from netengine.spec.models import IdentityInWorldPhase, InWorldUser, OrgUsers

Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_m7_ands.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from netengine.core.state import RuntimeState
from netengine.handlers._base import BasePhaseHandler
from netengine.handlers.context import PhaseContext
from logs import get_logger
from netengine.logs import get_logger
from netengine.phases.phase_ands import ANDsPhaseHandler


Expand Down
2 changes: 1 addition & 1 deletion tests/integration/test_m8_mail.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from netengine.core.state import RuntimeState
from netengine.handlers._base import BasePhaseHandler
from netengine.handlers.context import PhaseContext
from logs import get_logger
from netengine.logs import get_logger
from netengine.phases.phase_services import ServicesPhaseHandler
from netengine.spec.models import (
DKIMConfig,
Expand Down
2 changes: 1 addition & 1 deletion tests/test_pgmq_emitters.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from netengine.handlers.dns import DNSHandler
from netengine.handlers.phase_pki import PKIPhaseHandler
from netengine.handlers.substrate import SubstrateHandler
from logs import get_logger
from netengine.logs import get_logger
from netengine.phases.phase_inworld_identity import InWorldIdentityPhaseHandler


Expand Down
Loading