Skip to content

Commit 8622ebd

Browse files
committed
Implemented event posting endpoint + logging system
1 parent df63c3a commit 8622ebd

File tree

5 files changed

+80
-5
lines changed

5 files changed

+80
-5
lines changed

backend/app/api/routes/events.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
from fastapi import APIRouter, status
2+
from app.models.event import EventIn
3+
from app.core.logging import get_logger
4+
5+
router = APIRouter(prefix="/events", tags=["events"])
6+
logger = get_logger("eventrelay.events")
7+
8+
@router.post("", status_code=status.HTTP_202_ACCEPTED)
9+
async def ingest_event(event: EventIn):
10+
logger.info(
11+
"event_recieved",
12+
extra={
13+
"extra": {
14+
"source": event.source,
15+
"type": event.type,
16+
"timestamp": event.timestamp.isoformat(),
17+
}
18+
},
19+
)
20+
21+
return {
22+
"status": "accepted",
23+
"event_type": event.type,
24+
}

backend/app/core/logging.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import logging
2+
import json
3+
from datetime import datetime, UTC
4+
5+
class JsonFormatter(logging.Formatter):
6+
def format(self, record):
7+
log = {
8+
"level": record.levelname,
9+
"message": record.getMessage(),
10+
"time": datetime.now(UTC).isoformat()
11+
}
12+
13+
if hasattr(record, "extra"):
14+
log.update(record.extra)
15+
16+
return json.dumps(log)
17+
18+
def get_logger(name: str) -> logging.Logger:
19+
logger = logging.getLogger(name)
20+
logger.setLevel(logging.INFO)
21+
22+
handler = logging.StreamHandler()
23+
handler.setFormatter(JsonFormatter())
24+
25+
if not logger.handlers:
26+
logger.addHandler(handler)
27+
28+
return logger;

backend/app/main.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
from fastapi import FastAPI
2+
from app.api.routes import events
23

34
app = FastAPI(title="EventRelay")
45

6+
app.include_router(events.router)
7+
58
@app.get("/health")
69
def health():
710
return {"status": "ok"}

backend/app/models/event.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from pydantic import BaseModel, Field
2+
from typing import Optional, Dict
3+
from datetime import datetime
4+
5+
6+
class EventIn(BaseModel):
7+
source: str = Field(..., example="auth-service")
8+
type: str = Field(..., example="user.login")
9+
payload: Dict = Field(..., example={"user_id": 123})
10+
timestamp: Optional[datetime] = Field(
11+
default_factory=datetime.utcnow
12+
)

backend/requirements.txt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
fastapi
2-
uvicorn
3-
psycopg2-binary
4-
redis
5-
prometheus-client
1+
# Web Framework
2+
fastapi[standard]>=0.115.0
3+
uvicorn[standard]>=0.32.0
4+
pydantic>=2.9.0
5+
6+
# Database
7+
psycopg2-binary>=2.9.9
8+
9+
# Cache/Queue
10+
redis>=5.2.0
11+
12+
# Monitoring
13+
prometheus-client>=0.21.0

0 commit comments

Comments
 (0)