🚀 Starting Document Translation API... ⏳ Waiting for database to be ready... Connecting to postgres:5432... Waiting for database... (1/30) Waiting for database... (2/30) Waiting for database... (3/30) Waiting for database... (4/30) Waiting for database... (5/30) Waiting for database... (6/30) Waiting for database... (7/30) Waiting for database... (8/30) Waiting for database... (9/30) Waiting for database... (10/30) Waiting for database... (11/30) Waiting for database... (12/30) Waiting for database... (13/30) Waiting for database... (14/30) Waiting for database... (15/30) Waiting for database... (16/30) Waiting for database... (17/30) Waiting for database... (18/30) Waiting for database... (19/30) Waiting for database... (20/30) Waiting for database... (21/30) Waiting for database... (22/30) Waiting for database... (23/30) Waiting for database... (24/30) Waiting for database... (25/30) Waiting for database... (26/30) Waiting for database... (27/30) Waiting for database... (28/30) Waiting for database... (29/30) Waiting for database... (30/30) 📦 Running database migrations... INFO [alembic.runtime.migration] Context impl PostgresqlImpl. INFO [alembic.runtime.migration] Will assume transactional DDL. ⏳ Waiting for Redis... Waiting for Redis... (1/10) Waiting for Redis... (2/10) Waiting for Redis... (3/10) Waiting for Redis... (4/10) Waiting for Redis... (5/10) Waiting for Redis... (6/10) Waiting for Redis... (7/10) Waiting for Redis... (8/10) Waiting for Redis... (9/10) Waiting for Redis... (10/10) 🎯 Starting uvicorn... INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit) INFO: Started parent process [1] {"positional_args": [["https://wordly.art", "http://localhost:3000", "http://localhost:3001", "http://127.0.0.1:3000", "http://127.0.0.1:3001"]], "event": "CORS: non-production \u2014 localhost dev ports merged into allowed origins: %s", "level": "info", "timestamp": "2026-05-17T17:11:22.381690Z"} {"positional_args": [["https://wordly.art", "http://localhost:3000", "http://localhost:3001", "http://127.0.0.1:3000", "http://127.0.0.1:3001"]], "event": "CORS: non-production \u2014 localhost dev ports merged into allowed origins: %s", "level": "info", "timestamp": "2026-05-17T17:11:22.391687Z"} INFO: Started server process [115] INFO: Waiting for application startup. {"event": "Starting Document Translation API...", "level": "info", "timestamp": "2026-05-17T17:11:22.412313Z"} INFO: Started server process [118] INFO: Waiting for application startup. {"event": "Starting Document Translation API...", "level": "info", "timestamp": "2026-05-17T17:11:22.422764Z"} {"event": "\u2705 Database tables initialized (async)", "level": "info", "timestamp": "2026-05-17T17:11:22.441699Z"} {"event": "Database connection verified", "level": "info", "timestamp": "2026-05-17T17:11:22.442565Z"} {"event": "File cleanup manager started", "level": "info", "timestamp": "2026-05-17T17:11:22.442668Z"} {"event": "API ready to accept requests", "level": "info", "timestamp": "2026-05-17T17:11:22.442711Z"} {"event": "\u2705 Database tables initialized (async)", "level": "info", "timestamp": "2026-05-17T17:11:22.452056Z"} {"event": "Database connection verified", "level": "info", "timestamp": "2026-05-17T17:11:22.452952Z"} {"event": "File cleanup manager started", "level": "info", "timestamp": "2026-05-17T17:11:22.453047Z"} {"event": "API ready to accept requests", "level": "info", "timestamp": "2026-05-17T17:11:22.453088Z"} {"event": "Redis async client connected (shared)", "level": "info", "timestamp": "2026-05-17T17:11:22.458535Z"} INFO: Application startup complete. {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:11:22.459996", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:11:22.460020Z"} {"positional_args": [["https://wordly.art", "http://localhost:3000", "http://localhost:3001", "http://127.0.0.1:3000", "http://127.0.0.1:3001"]], "event": "CORS: non-production \u2014 localhost dev ports merged into allowed origins: %s", "level": "info", "timestamp": "2026-05-17T17:11:22.479626Z"} {"event": "Redis async client connected (shared)", "level": "info", "timestamp": "2026-05-17T17:11:22.480471Z"} INFO: Application startup complete. {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:11:22.481779", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:11:22.481800Z"} {"positional_args": [["https://wordly.art", "http://localhost:3000", "http://localhost:3001", "http://127.0.0.1:3000", "http://127.0.0.1:3001"]], "event": "CORS: non-production \u2014 localhost dev ports merged into allowed origins: %s", "level": "info", "timestamp": "2026-05-17T17:11:22.489773Z"} INFO: Started server process [116] INFO: Waiting for application startup. {"event": "Starting Document Translation API...", "level": "info", "timestamp": "2026-05-17T17:11:22.509417Z"} INFO: Started server process [117] INFO: Waiting for application startup. {"event": "Starting Document Translation API...", "level": "info", "timestamp": "2026-05-17T17:11:22.519375Z"} {"event": "\u2705 Database tables initialized (async)", "level": "info", "timestamp": "2026-05-17T17:11:22.537873Z"} {"event": "Database connection verified", "level": "info", "timestamp": "2026-05-17T17:11:22.538652Z"} {"event": "File cleanup manager started", "level": "info", "timestamp": "2026-05-17T17:11:22.538740Z"} {"event": "API ready to accept requests", "level": "info", "timestamp": "2026-05-17T17:11:22.538779Z"} {"event": "\u2705 Database tables initialized (async)", "level": "info", "timestamp": "2026-05-17T17:11:22.547593Z"} {"event": "Database connection verified", "level": "info", "timestamp": "2026-05-17T17:11:22.548456Z"} {"event": "File cleanup manager started", "level": "info", "timestamp": "2026-05-17T17:11:22.548570Z"} {"event": "API ready to accept requests", "level": "info", "timestamp": "2026-05-17T17:11:22.548626Z"} {"event": "Redis async client connected (shared)", "level": "info", "timestamp": "2026-05-17T17:11:22.554183Z"} INFO: Application startup complete. {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:11:22.555618", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:11:22.555640Z"} {"event": "Redis async client connected (shared)", "level": "info", "timestamp": "2026-05-17T17:11:22.564580Z"} INFO: Application startup complete. {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:11:22.566021", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:11:22.566042Z"} {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "0952ee8d", "level": "info", "timestamp": "2026-05-17T17:11:23.415144Z"} {"event": "Redis sync client connected (shared)", "request_id": "0952ee8d", "level": "info", "timestamp": "2026-05-17T17:11:23.422831Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 8.304, "event": "request_completed", "request_id": "0952ee8d", "level": "info", "timestamp": "2026-05-17T17:11:23.423426Z"} INFO: 127.0.0.1:39488 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "172.20.0.1", "event": "request_started", "request_id": "fec1023a", "level": "info", "timestamp": "2026-05-17T17:11:23.867885Z"} {"event": "Redis sync client connected (shared)", "request_id": "fec1023a", "level": "info", "timestamp": "2026-05-17T17:11:23.875512Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 8.246, "event": "request_completed", "request_id": "fec1023a", "level": "info", "timestamp": "2026-05-17T17:11:23.876108Z"} INFO: 172.20.0.1:34692 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "172.20.0.1", "event": "request_started", "request_id": "f2c60024", "level": "info", "timestamp": "2026-05-17T17:11:23.944065Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.226, "event": "request_completed", "request_id": "f2c60024", "level": "info", "timestamp": "2026-05-17T17:11:23.946282Z"} INFO: 172.20.0.1:34708 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "ffb62786", "level": "info", "timestamp": "2026-05-17T17:11:25.665331Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.155, "event": "request_completed", "request_id": "ffb62786", "level": "info", "timestamp": "2026-05-17T17:11:25.666462Z"} INFO: 172.20.0.6:50404 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "0bbf4bca", "level": "info", "timestamp": "2026-05-17T17:11:35.662038Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.334, "event": "request_completed", "request_id": "0bbf4bca", "level": "info", "timestamp": "2026-05-17T17:11:35.663357Z"} INFO: 172.20.0.6:41622 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "e94bf663", "level": "info", "timestamp": "2026-05-17T17:11:45.661105Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.059, "event": "request_completed", "request_id": "e94bf663", "level": "info", "timestamp": "2026-05-17T17:11:45.662154Z"} INFO: 172.20.0.6:37112 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "973ea3f0", "level": "info", "timestamp": "2026-05-17T17:11:53.462094Z"} {"event": "Redis sync client connected (shared)", "request_id": "973ea3f0", "level": "info", "timestamp": "2026-05-17T17:11:53.469537Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 8.179, "event": "request_completed", "request_id": "973ea3f0", "level": "info", "timestamp": "2026-05-17T17:11:53.470256Z"} INFO: 127.0.0.1:46364 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "56e70681", "level": "info", "timestamp": "2026-05-17T17:11:55.661476Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.001, "event": "request_completed", "request_id": "56e70681", "level": "info", "timestamp": "2026-05-17T17:11:55.662466Z"} INFO: 172.20.0.6:57742 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "30e0ed4b", "level": "info", "timestamp": "2026-05-17T17:12:05.661054Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.328, "event": "request_completed", "request_id": "30e0ed4b", "level": "info", "timestamp": "2026-05-17T17:12:05.662357Z"} INFO: 172.20.0.6:37922 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "5cdd34ee", "level": "info", "timestamp": "2026-05-17T17:12:15.661045Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.025, "event": "request_completed", "request_id": "5cdd34ee", "level": "info", "timestamp": "2026-05-17T17:12:15.662060Z"} INFO: 172.20.0.6:44744 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "6ccf9698", "level": "info", "timestamp": "2026-05-17T17:12:23.507069Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.09, "event": "request_completed", "request_id": "6ccf9698", "level": "info", "timestamp": "2026-05-17T17:12:23.509145Z"} INFO: 127.0.0.1:60030 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "cad7d1be", "level": "info", "timestamp": "2026-05-17T17:12:25.661643Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.535, "event": "request_completed", "request_id": "cad7d1be", "level": "info", "timestamp": "2026-05-17T17:12:25.663173Z"} INFO: 172.20.0.6:45036 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "5cbf8014", "level": "info", "timestamp": "2026-05-17T17:12:35.661023Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.003, "event": "request_completed", "request_id": "5cbf8014", "level": "info", "timestamp": "2026-05-17T17:12:35.662015Z"} INFO: 172.20.0.6:49096 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "db392fe6", "level": "info", "timestamp": "2026-05-17T17:12:45.661640Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 0.998, "event": "request_completed", "request_id": "db392fe6", "level": "info", "timestamp": "2026-05-17T17:12:45.662627Z"} INFO: 172.20.0.6:60652 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "dad2a986", "level": "info", "timestamp": "2026-05-17T17:12:53.544924Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.107, "event": "request_completed", "request_id": "dad2a986", "level": "info", "timestamp": "2026-05-17T17:12:53.547020Z"} INFO: 127.0.0.1:59876 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "f63b1413", "level": "info", "timestamp": "2026-05-17T17:12:55.661941Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.272, "event": "request_completed", "request_id": "f63b1413", "level": "info", "timestamp": "2026-05-17T17:12:55.663189Z"} INFO: 172.20.0.6:39182 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "dd90b6ed", "level": "info", "timestamp": "2026-05-17T17:13:05.681172Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.037, "event": "request_completed", "request_id": "dd90b6ed", "level": "info", "timestamp": "2026-05-17T17:13:05.682191Z"} INFO: 172.20.0.6:37982 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "3cb5dedd", "level": "info", "timestamp": "2026-05-17T17:13:15.660756Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.336, "event": "request_completed", "request_id": "3cb5dedd", "level": "info", "timestamp": "2026-05-17T17:13:15.662086Z"} INFO: 172.20.0.6:54296 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "839cf9f7", "level": "info", "timestamp": "2026-05-17T17:13:23.589967Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 1.996, "event": "request_completed", "request_id": "839cf9f7", "level": "info", "timestamp": "2026-05-17T17:13:23.591952Z"} INFO: 127.0.0.1:45676 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "d443cfbd", "level": "info", "timestamp": "2026-05-17T17:13:25.661474Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 0.981, "event": "request_completed", "request_id": "d443cfbd", "level": "info", "timestamp": "2026-05-17T17:13:25.662445Z"} INFO: 172.20.0.6:44714 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "f4c6b76f", "level": "info", "timestamp": "2026-05-17T17:13:35.683441Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.238, "event": "request_completed", "request_id": "f4c6b76f", "level": "info", "timestamp": "2026-05-17T17:13:35.684647Z"} INFO: 172.20.0.6:38144 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "9c3145d5", "level": "info", "timestamp": "2026-05-17T17:13:45.661379Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.012, "event": "request_completed", "request_id": "9c3145d5", "level": "info", "timestamp": "2026-05-17T17:13:45.662381Z"} INFO: 172.20.0.6:55298 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "89d2d10e", "level": "info", "timestamp": "2026-05-17T17:13:53.629836Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.035, "event": "request_completed", "request_id": "89d2d10e", "level": "info", "timestamp": "2026-05-17T17:13:53.631858Z"} INFO: 127.0.0.1:40654 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "42f74d0b", "level": "info", "timestamp": "2026-05-17T17:13:55.661606Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 0.966, "event": "request_completed", "request_id": "42f74d0b", "level": "info", "timestamp": "2026-05-17T17:13:55.662563Z"} INFO: 172.20.0.6:41534 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "7c6e0f9c", "level": "info", "timestamp": "2026-05-17T17:14:05.683680Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.031, "event": "request_completed", "request_id": "7c6e0f9c", "level": "info", "timestamp": "2026-05-17T17:14:05.684696Z"} INFO: 172.20.0.6:44916 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "c1bd1f3f", "level": "info", "timestamp": "2026-05-17T17:14:15.682417Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.658, "event": "request_completed", "request_id": "c1bd1f3f", "level": "info", "timestamp": "2026-05-17T17:14:15.684060Z"} INFO: 172.20.0.6:44324 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "15cd7770", "level": "info", "timestamp": "2026-05-17T17:14:23.668443Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.171, "event": "request_completed", "request_id": "15cd7770", "level": "info", "timestamp": "2026-05-17T17:14:23.670604Z"} INFO: 127.0.0.1:34284 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "e47e0b17", "level": "info", "timestamp": "2026-05-17T17:14:25.684397Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.248, "event": "request_completed", "request_id": "e47e0b17", "level": "info", "timestamp": "2026-05-17T17:14:25.685613Z"} INFO: 172.20.0.6:37214 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "10bf57d4", "level": "info", "timestamp": "2026-05-17T17:14:35.661616Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.029, "event": "request_completed", "request_id": "10bf57d4", "level": "info", "timestamp": "2026-05-17T17:14:35.662632Z"} INFO: 172.20.0.6:48092 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "58ae597f", "level": "info", "timestamp": "2026-05-17T17:14:45.661638Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.013, "event": "request_completed", "request_id": "58ae597f", "level": "info", "timestamp": "2026-05-17T17:14:45.662640Z"} INFO: 172.20.0.6:44578 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "b2fe5d7c", "level": "info", "timestamp": "2026-05-17T17:14:53.707360Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.217, "event": "request_completed", "request_id": "b2fe5d7c", "level": "info", "timestamp": "2026-05-17T17:14:53.709576Z"} INFO: 127.0.0.1:39056 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "8c452cc5", "level": "info", "timestamp": "2026-05-17T17:14:55.662077Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.038, "event": "request_completed", "request_id": "8c452cc5", "level": "info", "timestamp": "2026-05-17T17:14:55.663105Z"} INFO: 172.20.0.6:58856 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "2ba84cfb", "level": "info", "timestamp": "2026-05-17T17:15:05.661058Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.311, "event": "request_completed", "request_id": "2ba84cfb", "level": "info", "timestamp": "2026-05-17T17:15:05.662359Z"} INFO: 172.20.0.6:57554 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "6c58569d", "level": "info", "timestamp": "2026-05-17T17:15:15.660586Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.047, "event": "request_completed", "request_id": "6c58569d", "level": "info", "timestamp": "2026-05-17T17:15:15.661620Z"} INFO: 172.20.0.6:43854 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "4c88cac5", "level": "info", "timestamp": "2026-05-17T17:15:23.746303Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.642, "event": "request_completed", "request_id": "4c88cac5", "level": "info", "timestamp": "2026-05-17T17:15:23.748930Z"} INFO: 127.0.0.1:41870 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "be43eebf", "level": "info", "timestamp": "2026-05-17T17:15:25.662094Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.183, "event": "request_completed", "request_id": "be43eebf", "level": "info", "timestamp": "2026-05-17T17:15:25.663263Z"} INFO: 172.20.0.6:41386 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "916f7fc5", "level": "info", "timestamp": "2026-05-17T17:15:35.661119Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.066, "event": "request_completed", "request_id": "916f7fc5", "level": "info", "timestamp": "2026-05-17T17:15:35.662176Z"} INFO: 172.20.0.6:48524 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "ed93716b", "level": "info", "timestamp": "2026-05-17T17:15:45.661080Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 0.98, "event": "request_completed", "request_id": "ed93716b", "level": "info", "timestamp": "2026-05-17T17:15:45.662049Z"} INFO: 172.20.0.6:40504 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "f9c4cca3", "level": "info", "timestamp": "2026-05-17T17:15:53.784245Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.799, "event": "request_completed", "request_id": "f9c4cca3", "level": "info", "timestamp": "2026-05-17T17:15:53.787026Z"} INFO: 127.0.0.1:55384 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "dd82f907", "level": "info", "timestamp": "2026-05-17T17:15:55.661193Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.021, "event": "request_completed", "request_id": "dd82f907", "level": "info", "timestamp": "2026-05-17T17:15:55.662205Z"} INFO: 172.20.0.6:59130 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "ef2ac592", "level": "info", "timestamp": "2026-05-17T17:16:05.661519Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.053, "event": "request_completed", "request_id": "ef2ac592", "level": "info", "timestamp": "2026-05-17T17:16:05.662560Z"} INFO: 172.20.0.6:42932 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "a6daa069", "level": "info", "timestamp": "2026-05-17T17:16:15.662582Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.069, "event": "request_completed", "request_id": "a6daa069", "level": "info", "timestamp": "2026-05-17T17:16:15.663628Z"} INFO: 172.20.0.6:51850 - "GET /metrics HTTP/1.1" 200 OK {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:16:22.461453", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:16:22.461485Z"} {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:16:22.482113", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:16:22.482146Z"} {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:16:22.556190", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:16:22.556226Z"} {"files_deleted": 0, "bytes_freed_mb": 0.0, "orphaned_deleted": 0, "cleanup_run_timestamp": "2026-05-17T17:16:22.566761", "event": "cleanup_completed", "level": "info", "timestamp": "2026-05-17T17:16:22.566798Z"} {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "3e2473aa", "level": "info", "timestamp": "2026-05-17T17:16:23.828059Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.547, "event": "request_completed", "request_id": "3e2473aa", "level": "info", "timestamp": "2026-05-17T17:16:23.830593Z"} INFO: 127.0.0.1:45570 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "90063a81", "level": "info", "timestamp": "2026-05-17T17:16:25.661869Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 0.997, "event": "request_completed", "request_id": "90063a81", "level": "info", "timestamp": "2026-05-17T17:16:25.662855Z"} INFO: 172.20.0.6:48240 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "3fcaffcf", "level": "info", "timestamp": "2026-05-17T17:16:35.661734Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.035, "event": "request_completed", "request_id": "3fcaffcf", "level": "info", "timestamp": "2026-05-17T17:16:35.662759Z"} INFO: 172.20.0.6:53906 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "2fb8103d", "level": "info", "timestamp": "2026-05-17T17:16:45.660807Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.234, "event": "request_completed", "request_id": "2fb8103d", "level": "info", "timestamp": "2026-05-17T17:16:45.662026Z"} INFO: 172.20.0.6:35962 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "a319dbcc", "level": "info", "timestamp": "2026-05-17T17:16:53.866139Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.473, "event": "request_completed", "request_id": "a319dbcc", "level": "info", "timestamp": "2026-05-17T17:16:53.868607Z"} INFO: 127.0.0.1:36240 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "46e42991", "level": "info", "timestamp": "2026-05-17T17:16:55.662359Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.021, "event": "request_completed", "request_id": "46e42991", "level": "info", "timestamp": "2026-05-17T17:16:55.663369Z"} INFO: 172.20.0.6:59572 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "2324cc27", "level": "info", "timestamp": "2026-05-17T17:17:05.660609Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.043, "event": "request_completed", "request_id": "2324cc27", "level": "info", "timestamp": "2026-05-17T17:17:05.661643Z"} INFO: 172.20.0.6:49408 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "03673c90", "level": "info", "timestamp": "2026-05-17T17:17:15.661649Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.105, "event": "request_completed", "request_id": "03673c90", "level": "info", "timestamp": "2026-05-17T17:17:15.662745Z"} INFO: 172.20.0.6:45116 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "c607cb87", "level": "info", "timestamp": "2026-05-17T17:17:23.907134Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 1.99, "event": "request_completed", "request_id": "c607cb87", "level": "info", "timestamp": "2026-05-17T17:17:23.909114Z"} INFO: 127.0.0.1:41178 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "3672ae0c", "level": "info", "timestamp": "2026-05-17T17:17:25.661442Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 0.993, "event": "request_completed", "request_id": "3672ae0c", "level": "info", "timestamp": "2026-05-17T17:17:25.662424Z"} INFO: 172.20.0.6:36692 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "25bdc6fa", "level": "info", "timestamp": "2026-05-17T17:17:35.660440Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.019, "event": "request_completed", "request_id": "25bdc6fa", "level": "info", "timestamp": "2026-05-17T17:17:35.661449Z"} INFO: 172.20.0.6:41322 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "4337a01e", "level": "info", "timestamp": "2026-05-17T17:17:45.660875Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.002, "event": "request_completed", "request_id": "4337a01e", "level": "info", "timestamp": "2026-05-17T17:17:45.661866Z"} INFO: 172.20.0.6:33176 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "c9b7b88c", "level": "info", "timestamp": "2026-05-17T17:17:53.952563Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.099, "event": "request_completed", "request_id": "c9b7b88c", "level": "info", "timestamp": "2026-05-17T17:17:53.954647Z"} INFO: 127.0.0.1:36764 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "0286de08", "level": "info", "timestamp": "2026-05-17T17:17:55.661959Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 0.993, "event": "request_completed", "request_id": "0286de08", "level": "info", "timestamp": "2026-05-17T17:17:55.662942Z"} INFO: 172.20.0.6:50744 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "a42235e3", "level": "info", "timestamp": "2026-05-17T17:18:05.660816Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.012, "event": "request_completed", "request_id": "a42235e3", "level": "info", "timestamp": "2026-05-17T17:18:05.661819Z"} INFO: 172.20.0.6:55188 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/languages", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "a0762339", "level": "info", "timestamp": "2026-05-17T17:18:09.853583Z"} {"method": "GET", "path": "/api/v1/languages", "status_code": 200, "duration_ms": 1.246, "event": "request_completed", "request_id": "a0762339", "level": "info", "timestamp": "2026-05-17T17:18:09.854823Z"} INFO: 172.20.0.9:35236 - "GET /api/v1/languages HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/providers/available", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "6dc042b1", "level": "info", "timestamp": "2026-05-17T17:18:09.861169Z"} {"method": "GET", "path": "/api/v1/providers/available", "status_code": 200, "duration_ms": 1.357, "event": "request_completed", "request_id": "6dc042b1", "level": "info", "timestamp": "2026-05-17T17:18:09.862519Z"} INFO: 172.20.0.9:35250 - "GET /api/v1/providers/available HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/auth/me", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "68937668", "level": "info", "timestamp": "2026-05-17T17:18:09.866205Z"} {"event": "Redis sync client connected (shared)", "request_id": "68937668", "level": "info", "timestamp": "2026-05-17T17:18:09.867317Z"} {"event": "Token blocklist using Redis (persistent across restarts)", "request_id": "68937668", "level": "info", "timestamp": "2026-05-17T17:18:09.867370Z"} {"method": "GET", "path": "/api/v1/auth/me", "status_code": 200, "duration_ms": 23.408, "event": "request_completed", "request_id": "68937668", "level": "info", "timestamp": "2026-05-17T17:18:09.889629Z"} INFO: 172.20.0.9:35264 - "GET /api/v1/auth/me HTTP/1.1" 200 OK {"method": "POST", "path": "/api/v1/translate", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "af725d1a", "level": "info", "timestamp": "2026-05-17T17:18:14.569738Z"} {"event": "Token blocklist using Redis (persistent across restarts)", "request_id": "af725d1a", "level": "info", "timestamp": "2026-05-17T17:18:14.587190Z"} {"job_id": "tr_06f9aff68e80", "original_filename": "wiki.pdf", "file_size": 2154510, "file_hash": "40e509ae49741c8c0f0d280dbacd8deec1fdb0a2c6a9427d5159acfec77b3ec9", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "timestamp": "2026-05-17T17:18:14.675518Z", "event": "file_uploaded", "request_id": "af725d1a", "level": "info"} {"job_id": "tr_06f9aff68e80", "ttl_seconds": 3600, "event": "file_tracked_in_redis", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.675830Z"} {"event": "[af725d1a] Created translation job tr_06f9aff68e80 for wiki.pdf", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.676106Z"} {"event": "google_provider_using_cloud_api", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.678462Z"} {"method": "POST", "path": "/api/v1/translate", "status_code": 202, "duration_ms": 112.516, "event": "request_completed", "request_id": "af725d1a", "level": "info", "timestamp": "2026-05-17T17:18:14.682243Z"} INFO: 172.20.0.9:35266 - "POST /api/v1/translate HTTP/1.1" 202 Accepted {"method": "GET", "path": "/api/v1/translations/tr_06f9aff68e80", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "d65b3cf1", "level": "info", "timestamp": "2026-05-17T17:18:14.717537Z"} {"event": "Token blocklist using Redis (persistent across restarts)", "request_id": "d65b3cf1", "level": "info", "timestamp": "2026-05-17T17:18:14.726467Z"} {"method": "GET", "path": "/api/v1/translations/tr_06f9aff68e80", "status_code": 200, "duration_ms": 23.756, "event": "request_completed", "request_id": "d65b3cf1", "level": "info", "timestamp": "2026-05-17T17:18:14.741294Z"} INFO: 172.20.0.9:35274 - "GET /api/v1/translations/tr_06f9aff68e80 HTTP/1.1" 200 OK {"pages": 6, "file": "input_517ddb52_wiki.pdf", "font": "/usr/share/fonts/truetype/noto/NotoSans-Regular.ttf", "event": "pdf_layout_start", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.745197Z"} {"total_blocks": 0, "translated_blocks": 0, "event": "pdf_blocks_processed", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.837841Z"} {"pages": 6, "processing_time_ms": 157.73, "output": "/app/outputs/translated_6c1429db_translated_517ddb52_wiki.pdf", "event": "pdf_layout_success", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.840896Z"} {"event": "Job tr_06f9aff68e80: usage recorded \u2014 1 page(s)", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.850106Z"} {"file": "/app/outputs/translated_6c1429db_translated_517ddb52_wiki.pdf", "event": "watermark_added_pdf", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.950210Z"} {"event": "Job tr_06f9aff68e80: watermark applied (free plan)", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.950581Z"} {"event": "Job tr_06f9aff68e80: Completed successfully", "request_id": "af725d1a", "user_id": "14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "level": "info", "timestamp": "2026-05-17T17:18:14.950779Z"} {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "c8e55a39", "level": "info", "timestamp": "2026-05-17T17:18:15.660768Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.143, "event": "request_completed", "request_id": "c8e55a39", "level": "info", "timestamp": "2026-05-17T17:18:15.661901Z"} INFO: 172.20.0.6:36254 - "GET /metrics HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/translations/tr_06f9aff68e80", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "5966b6cb", "level": "info", "timestamp": "2026-05-17T17:18:16.714805Z"} {"event": "Token blocklist using Redis (persistent across restarts)", "request_id": "5966b6cb", "level": "info", "timestamp": "2026-05-17T17:18:16.715435Z"} {"method": "GET", "path": "/api/v1/translations/tr_06f9aff68e80", "status_code": 200, "duration_ms": 84.202, "event": "request_completed", "request_id": "5966b6cb", "level": "info", "timestamp": "2026-05-17T17:18:16.799005Z"} INFO: 172.20.0.9:35286 - "GET /api/v1/translations/tr_06f9aff68e80 HTTP/1.1" 200 OK {"method": "GET", "path": "/health", "client_ip": "127.0.0.1", "event": "request_started", "request_id": "a4d14070", "level": "info", "timestamp": "2026-05-17T17:18:23.990430Z"} {"method": "GET", "path": "/health", "status_code": 200, "duration_ms": 2.151, "event": "request_completed", "request_id": "a4d14070", "level": "info", "timestamp": "2026-05-17T17:18:23.992566Z"} INFO: 127.0.0.1:43562 - "GET /health HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "30358172", "level": "info", "timestamp": "2026-05-17T17:18:25.662049Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.162, "event": "request_completed", "request_id": "30358172", "level": "info", "timestamp": "2026-05-17T17:18:25.663199Z"} INFO: 172.20.0.6:60524 - "GET /metrics HTTP/1.1" 200 OK {"method": "PATCH", "path": "/api/v1/admin/users/14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "c030527f", "level": "info", "timestamp": "2026-05-17T17:18:26.073909Z"} {"event": "admin_tier_change", "request_id": "c030527f", "level": "info", "timestamp": "2026-05-17T17:18:26.080927Z"} {"method": "PATCH", "path": "/api/v1/admin/users/14cc7c0b-c67a-4bfd-8fee-35dd6c61761d", "status_code": 200, "duration_ms": 7.406, "event": "request_completed", "request_id": "c030527f", "level": "info", "timestamp": "2026-05-17T17:18:26.081310Z"} INFO: 172.20.0.9:44762 - "PATCH /api/v1/admin/users/14cc7c0b-c67a-4bfd-8fee-35dd6c61761d HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/admin/users", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "d58944eb", "level": "info", "timestamp": "2026-05-17T17:18:26.112803Z"} {"method": "GET", "path": "/api/v1/admin/users", "status_code": 200, "duration_ms": 4.981, "event": "request_completed", "request_id": "d58944eb", "level": "info", "timestamp": "2026-05-17T17:18:26.117774Z"} INFO: 172.20.0.9:44776 - "GET /api/v1/admin/users HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/providers/available", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "0a0b4901", "level": "info", "timestamp": "2026-05-17T17:18:29.839411Z"} {"method": "GET", "path": "/api/v1/providers/available", "status_code": 200, "duration_ms": 1.184, "event": "request_completed", "request_id": "0a0b4901", "level": "info", "timestamp": "2026-05-17T17:18:29.840582Z"} INFO: 172.20.0.9:43648 - "GET /api/v1/providers/available HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/auth/me", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "2e460b02", "level": "info", "timestamp": "2026-05-17T17:18:29.841166Z"} {"event": "Token blocklist using Redis (persistent across restarts)", "request_id": "2e460b02", "level": "info", "timestamp": "2026-05-17T17:18:29.841766Z"} {"method": "GET", "path": "/api/v1/languages", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "60b84010", "level": "info", "timestamp": "2026-05-17T17:18:29.843340Z"} {"method": "GET", "path": "/api/v1/languages", "status_code": 200, "duration_ms": 0.869, "event": "request_completed", "request_id": "60b84010", "level": "info", "timestamp": "2026-05-17T17:18:29.844200Z"} INFO: 172.20.0.9:43670 - "GET /api/v1/languages HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/auth/me", "status_code": 200, "duration_ms": 21.452, "event": "request_completed", "request_id": "2e460b02", "level": "info", "timestamp": "2026-05-17T17:18:29.862620Z"} INFO: 172.20.0.9:43662 - "GET /api/v1/auth/me HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/auth/me", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "318229e6", "level": "info", "timestamp": "2026-05-17T17:18:33.244143Z"} {"event": "Token blocklist using Redis (persistent across restarts)", "request_id": "318229e6", "level": "info", "timestamp": "2026-05-17T17:18:33.244597Z"} {"method": "GET", "path": "/api/v1/auth/me", "status_code": 200, "duration_ms": 2.578, "event": "request_completed", "request_id": "318229e6", "level": "info", "timestamp": "2026-05-17T17:18:33.246715Z"} INFO: 172.20.0.9:43680 - "GET /api/v1/auth/me HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/providers/available", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "e52681bb", "level": "info", "timestamp": "2026-05-17T17:18:33.254917Z"} {"method": "GET", "path": "/api/v1/providers/available", "status_code": 200, "duration_ms": 1.427, "event": "request_completed", "request_id": "e52681bb", "level": "info", "timestamp": "2026-05-17T17:18:33.256353Z"} {"method": "GET", "path": "/api/v1/languages", "client_ip": "2a01:e0a:ffb:12c0:3055:a5de:f9c7:1b34", "event": "request_started", "request_id": "a0be60c5", "level": "info", "timestamp": "2026-05-17T17:18:33.256895Z"} INFO: 172.20.0.9:43688 - "GET /api/v1/providers/available HTTP/1.1" 200 OK {"method": "GET", "path": "/api/v1/languages", "status_code": 200, "duration_ms": 1.283, "event": "request_completed", "request_id": "a0be60c5", "level": "info", "timestamp": "2026-05-17T17:18:33.258180Z"} INFO: 172.20.0.9:43704 - "GET /api/v1/languages HTTP/1.1" 200 OK {"method": "GET", "path": "/metrics", "client_ip": "172.20.0.6", "event": "request_started", "request_id": "599da081", "level": "info", "timestamp": "2026-05-17T17:18:35.660845Z"} {"method": "GET", "path": "/metrics", "status_code": 200, "duration_ms": 1.192, "event": "request_completed", "request_id": "599da081", "level": "info", "timestamp": "2026-05-17T17:18:35.662027Z"} INFO: 172.20.0.6:48698 - "GET /metrics HTTP/1.1" 200 OK