Skip to content

Commit cbf26c2

Browse files
authored
Merge pull request #237 from ecmwf-projects/COPDS-2368-user-ip-in-logs
Add User IP in logs
2 parents d14689e + 11632c3 commit cbf26c2

File tree

3 files changed

+25
-47
lines changed

3 files changed

+25
-47
lines changed

cads_processing_api_service/clients.py

Lines changed: 8 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,6 @@ def get_processes(
108108
back : bool | None, optional
109109
Specifies in which sense the list of processes should be traversed, used for pagination.
110110
"""
111-
structlog.contextvars.bind_contextvars(client_endpoint="get_processes")
112111
logger.info("get_processes")
113112
statement = sqlalchemy.select(self.process_table)
114113
sort_key, sort_dir = utils.parse_sortby(sortby.name)
@@ -161,10 +160,7 @@ def get_process(
161160
ogc_api_processes_fastapi.models.ProcessDescription
162161
Process description.
163162
"""
164-
structlog.contextvars.bind_contextvars(
165-
client_endpoint="get_process", process_id=process_id
166-
)
167-
logger.info("get_process")
163+
logger.info("get_process", process_id=process_id)
168164
catalogue_sessionmaker = db_utils.get_catalogue_sessionmaker(
169165
db_utils.ConnectionMode.read
170166
)
@@ -219,13 +215,12 @@ def post_process_execution(
219215
models.StatusInfo
220216
Submitted job's status information.
221217
"""
222-
structlog.contextvars.bind_contextvars(
218+
logger.info(
219+
"post_process_execution",
223220
**auth_info.model_dump(),
224-
client_endpoint="post_process_execution",
225221
process_id=process_id,
226222
execution_content=execution_content.model_dump(),
227223
)
228-
logger.info("post_process_execution")
229224
_ = limits.check_rate_limits(
230225
SETTINGS.rate_limits.process_execution.post,
231226
auth_info,
@@ -288,7 +283,6 @@ def post_process_execution(
288283
)
289284
)
290285
job_id = str(uuid.uuid4())
291-
structlog.contextvars.bind_contextvars(job_id=job_id)
292286
job_kwargs = adaptors.make_system_job_kwargs(
293287
dataset, request_inputs, adaptor.resources
294288
)
@@ -381,11 +375,7 @@ def get_jobs(
381375
models.JobList
382376
List of jobs status information.
383377
"""
384-
structlog.contextvars.bind_contextvars(
385-
**auth_info.model_dump(),
386-
client_endpoint="get_jobs",
387-
)
388-
logger.info("get_jobs")
378+
logger.info("get_jobs", **auth_info.model_dump())
389379
_ = limits.check_rate_limits(
390380
SETTINGS.rate_limits.jobs.get,
391381
auth_info,
@@ -505,12 +495,7 @@ def get_job(
505495
models.StatusInfo
506496
Job status information.
507497
"""
508-
structlog.contextvars.bind_contextvars(
509-
**auth_info.model_dump(),
510-
job_id=job_id,
511-
client_endpoint="get_job",
512-
)
513-
logger.info("get_job")
498+
logger.info("get_job", job_id=job_id, **auth_info.model_dump())
514499
_ = limits.check_rate_limits(
515500
SETTINGS.rate_limits.job.get,
516501
auth_info,
@@ -526,9 +511,6 @@ def get_job(
526511
else db_utils.ConnectionMode.read
527512
)
528513
try:
529-
structlog.contextvars.bind_contextvars(
530-
compute_connection_mode=compute_connection_mode
531-
)
532514
compute_sessionmaker = db_utils.get_compute_sessionmaker(
533515
mode=compute_connection_mode
534516
)
@@ -554,12 +536,8 @@ def get_job(
554536
if compute_connection_mode == db_utils.ConnectionMode.write:
555537
raise
556538
else:
557-
compute_connection_mode = db_utils.ConnectionMode.write
558-
structlog.contextvars.bind_contextvars(
559-
compute_connection_mode=compute_connection_mode
560-
)
561539
compute_sessionmaker = db_utils.get_compute_sessionmaker(
562-
mode=compute_connection_mode
540+
mode=db_utils.ConnectionMode.write
563541
)
564542
with compute_sessionmaker() as compute_session:
565543
job = utils.get_job_from_broker_db(
@@ -637,10 +615,7 @@ def get_job_results(
637615
ogc_api_processes_fastapi.models.Results
638616
Job results.
639617
"""
640-
structlog.contextvars.bind_contextvars(
641-
**auth_info.model_dump(), job_id=job_id, client_endpoint="get_job_results"
642-
)
643-
logger.info("get_job_results")
618+
logger.info("get_job_results", job_id=job_id, **auth_info.model_dump())
644619
_ = limits.check_rate_limits(
645620
SETTINGS.rate_limits.job_results.get,
646621
auth_info,
@@ -651,9 +626,6 @@ def get_job_results(
651626
else db_utils.ConnectionMode.read
652627
)
653628
try:
654-
structlog.contextvars.bind_contextvars(
655-
compute_connection_mode=compute_connection_mode
656-
)
657629
compute_sessionmaker = db_utils.get_compute_sessionmaker(
658630
mode=compute_connection_mode
659631
)
@@ -670,10 +642,6 @@ def get_job_results(
670642
if compute_connection_mode == db_utils.ConnectionMode.write:
671643
raise
672644
else:
673-
compute_connection_mode = db_utils.ConnectionMode.write
674-
structlog.contextvars.bind_contextvars(
675-
compute_connection_mode=compute_connection_mode
676-
)
677645
compute_sessionmaker = db_utils.get_compute_sessionmaker(
678646
mode=db_utils.ConnectionMode.write
679647
)
@@ -709,10 +677,7 @@ def delete_job(
709677
ogc_api_processes_fastapi.models.StatusInfo
710678
Job status information
711679
"""
712-
structlog.contextvars.bind_contextvars(
713-
**auth_info.model_dump(), job_id=job_id, operation="delete_job"
714-
)
715-
logger.info("delete_job")
680+
logger.info("delete_job", job_id=job_id, **auth_info.model_dump())
716681
_ = limits.check_rate_limits(
717682
SETTINGS.rate_limits.job.delete,
718683
auth_info,

cads_processing_api_service/main.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,18 @@ def add_user_request_flag(
5050

5151
@asynccontextmanager
5252
async def lifespan(application: fastapi.FastAPI) -> AsyncGenerator[Any, None]:
53-
cads_common.logging.structlog_configure([add_user_request_flag])
53+
cads_common.logging.structlog_configure(
54+
[
55+
add_user_request_flag,
56+
structlog.processors.CallsiteParameterAdder(
57+
[
58+
structlog.processors.CallsiteParameter.FILENAME,
59+
structlog.processors.CallsiteParameter.FUNC_NAME,
60+
structlog.processors.CallsiteParameter.LINENO,
61+
],
62+
),
63+
]
64+
)
5465
cads_common.logging.logging_configure()
5566
yield
5667

@@ -93,7 +104,10 @@ async def initialize_logger(
93104
) -> Any:
94105
structlog.contextvars.clear_contextvars()
95106
trace_id = str(uuid.uuid4())
96-
structlog.contextvars.bind_contextvars(trace_id=trace_id, request=request.url.path)
107+
user_ip = request.headers.get("X-Real-IP", None)
108+
structlog.contextvars.bind_contextvars(
109+
trace_id=trace_id, request=request.url.path, user_ip=user_ip
110+
)
97111
response = await call_next(request)
98112
return response
99113

cads_processing_api_service/utils.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -463,9 +463,8 @@ def get_job_from_broker_db(
463463
"""
464464
try:
465465
job = cads_broker.database.get_request(request_uid=job_id, session=session)
466-
structlog.contextvars.bind_contextvars(job_status=job.status)
467466
if job.status in ("dismissed", "deleted"):
468-
logger.error("job status is dismissed or deleted")
467+
logger.error("job status is dismissed or deleted", job_status=job.status)
469468
raise ogc_api_processes_fastapi.exceptions.NoSuchJob(
470469
detail=f"job {job_id} {job.status}"
471470
)

0 commit comments

Comments
 (0)