File tree Expand file tree Collapse file tree 5 files changed +80
-5
lines changed
Expand file tree Collapse file tree 5 files changed +80
-5
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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 ;
Original file line number Diff line number Diff line change 11from fastapi import FastAPI
2+ from app .api .routes import events
23
34app = FastAPI (title = "EventRelay" )
45
6+ app .include_router (events .router )
7+
58@app .get ("/health" )
69def health ():
710 return {"status" : "ok" }
Original file line number Diff line number Diff line change 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+ )
Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments