From 9177cac299b1fd36ecf3ad5dc01965b5ea386c61 Mon Sep 17 00:00:00 2001 From: TOEL2 Date: Mon, 9 Mar 2026 10:00:15 +0000 Subject: [PATCH 1/4] [ELI-686] - Adding custom subsegments for xray --- .../audit/audit_service.py | 1 + .../repos/campaign_repo.py | 13 ++++++++----- .../repos/consumer_mapping_repo.py | 1 + .../repos/person_repo.py | 1 + .../repos/secret_repo.py | 1 + 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/eligibility_signposting_api/audit/audit_service.py b/src/eligibility_signposting_api/audit/audit_service.py index 7494661cf..ff9751b15 100644 --- a/src/eligibility_signposting_api/audit/audit_service.py +++ b/src/eligibility_signposting_api/audit/audit_service.py @@ -21,6 +21,7 @@ def __init__( self.firehose = firehose self.audit_delivery_stream = audit_delivery_stream + @xray_recorder.capture("AuditService.audit") def audit(self, audit_record: dict) -> None: """ Sends an audit record to the configured Firehose delivery stream. diff --git a/src/eligibility_signposting_api/repos/campaign_repo.py b/src/eligibility_signposting_api/repos/campaign_repo.py index 26b701962..f284fa3ad 100644 --- a/src/eligibility_signposting_api/repos/campaign_repo.py +++ b/src/eligibility_signposting_api/repos/campaign_repo.py @@ -25,9 +25,12 @@ def __init__( self.s3_client = s3_client self.bucket_name = bucket_name + @xray_recorder.capture("CampaignRepo.get_campaign_configs") def get_campaign_configs(self) -> Generator[CampaignConfig]: - campaign_objects = self.s3_client.list_objects(Bucket=self.bucket_name) - for campaign_object in campaign_objects["Contents"]: - response = self.s3_client.get_object(Bucket=self.bucket_name, Key=f"{campaign_object['Key']}") - body = response["Body"].read() - yield Rules.model_validate(json.loads(body)).campaign_config + with xray_recorder.in_subsegment("CampaignRepo.get_campaign_configs:list_objects"): + campaign_objects = self.s3_client.list_objects(Bucket=self.bucket_name) + with xray_recorder.in_subsegment("CampaignRepo.get_campaign_configs:get_objects"): + for campaign_object in campaign_objects["Contents"]: + response = self.s3_client.get_object(Bucket=self.bucket_name, Key=f"{campaign_object['Key']}") + body = response["Body"].read() + yield Rules.model_validate(json.loads(body)).campaign_config diff --git a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py index 487b9ca00..0ac241e64 100644 --- a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py +++ b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py @@ -28,6 +28,7 @@ def __init__( self.s3_client = s3_client self.bucket_name = bucket_name + @xray_recorder.capture("ConsumerMappingRepo.get_permitted_campaign_ids") def get_permitted_campaign_ids(self, consumer_id: ConsumerId) -> list[CampaignID] | None: try: response = self.s3_client.get_object(Bucket=self.bucket_name, Key=CONSUMER_MAPPING_FILE_NAME) diff --git a/src/eligibility_signposting_api/repos/person_repo.py b/src/eligibility_signposting_api/repos/person_repo.py index d0c7d0411..9ccb6014b 100644 --- a/src/eligibility_signposting_api/repos/person_repo.py +++ b/src/eligibility_signposting_api/repos/person_repo.py @@ -54,6 +54,7 @@ def get_person_record(self, nhs_hash: str | None) -> Any: return None + @xray_recorder.capture("PersonRepo.get_eligibility_data") def get_eligibility_data(self, nhs_number: NHSNumber) -> Person: # Hash using AWSCURRENT secret and fetch items items = None diff --git a/src/eligibility_signposting_api/repos/secret_repo.py b/src/eligibility_signposting_api/repos/secret_repo.py index cf37ad9ca..cf86d6ffb 100644 --- a/src/eligibility_signposting_api/repos/secret_repo.py +++ b/src/eligibility_signposting_api/repos/secret_repo.py @@ -16,6 +16,7 @@ def __init__(self, secret_manager: Annotated[BaseClient, Inject(qualifier="secre super().__init__() self.secret_manager = secret_manager + @xray_recorder.capture("SecretRepo._get_secret_by_stage") def _get_secret_by_stage(self, secret_name: str, stage: str) -> dict[str, str]: """Internal helper to fetch a secret by version stage.""" try: From b400600f1c2a9190fe08d14cc61958a4a47a5554 Mon Sep 17 00:00:00 2001 From: TOEL2 Date: Mon, 9 Mar 2026 10:09:11 +0000 Subject: [PATCH 2/4] [ELI-686] - Adding import --- src/eligibility_signposting_api/audit/audit_service.py | 1 + src/eligibility_signposting_api/repos/campaign_repo.py | 1 + src/eligibility_signposting_api/repos/consumer_mapping_repo.py | 1 + src/eligibility_signposting_api/repos/person_repo.py | 1 + src/eligibility_signposting_api/repos/secret_repo.py | 1 + 5 files changed, 5 insertions(+) diff --git a/src/eligibility_signposting_api/audit/audit_service.py b/src/eligibility_signposting_api/audit/audit_service.py index ff9751b15..14e8d4809 100644 --- a/src/eligibility_signposting_api/audit/audit_service.py +++ b/src/eligibility_signposting_api/audit/audit_service.py @@ -2,6 +2,7 @@ import logging from typing import Annotated +from aws_xray_sdk.core import xray_recorder from botocore.client import BaseClient from wireup import Inject, service diff --git a/src/eligibility_signposting_api/repos/campaign_repo.py b/src/eligibility_signposting_api/repos/campaign_repo.py index f284fa3ad..dcdd3bd92 100644 --- a/src/eligibility_signposting_api/repos/campaign_repo.py +++ b/src/eligibility_signposting_api/repos/campaign_repo.py @@ -2,6 +2,7 @@ from collections.abc import Generator from typing import Annotated, NewType +from aws_xray_sdk.core import xray_recorder from botocore.client import BaseClient from wireup import Inject, service diff --git a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py index 0ac241e64..3c6535f4b 100644 --- a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py +++ b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py @@ -2,6 +2,7 @@ import logging from typing import Annotated, NewType +from aws_xray_sdk.core import xray_recorder from botocore.client import BaseClient from botocore.exceptions import ClientError from wireup import Inject, service diff --git a/src/eligibility_signposting_api/repos/person_repo.py b/src/eligibility_signposting_api/repos/person_repo.py index 9ccb6014b..c9adaa1b4 100644 --- a/src/eligibility_signposting_api/repos/person_repo.py +++ b/src/eligibility_signposting_api/repos/person_repo.py @@ -1,6 +1,7 @@ import logging from typing import Annotated, Any, NewType +from aws_xray_sdk.core import xray_recorder from boto3.dynamodb.conditions import Key from boto3.resources.base import ServiceResource from wireup import Inject, service diff --git a/src/eligibility_signposting_api/repos/secret_repo.py b/src/eligibility_signposting_api/repos/secret_repo.py index cf86d6ffb..3cbbc65f9 100644 --- a/src/eligibility_signposting_api/repos/secret_repo.py +++ b/src/eligibility_signposting_api/repos/secret_repo.py @@ -1,6 +1,7 @@ import logging from typing import Annotated, NewType +from aws_xray_sdk.core import xray_recorder from botocore.client import BaseClient from botocore.exceptions import ClientError from wireup import Inject, service From c876ae891f71d4d0b91171e8a3c0fd1d92953239 Mon Sep 17 00:00:00 2001 From: TOEL2 Date: Mon, 9 Mar 2026 10:21:59 +0000 Subject: [PATCH 3/4] [ELI-686] - ignoring pyright --- src/eligibility_signposting_api/audit/audit_service.py | 2 +- src/eligibility_signposting_api/repos/campaign_repo.py | 2 +- src/eligibility_signposting_api/repos/consumer_mapping_repo.py | 2 +- src/eligibility_signposting_api/repos/person_repo.py | 2 +- src/eligibility_signposting_api/repos/secret_repo.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/eligibility_signposting_api/audit/audit_service.py b/src/eligibility_signposting_api/audit/audit_service.py index 14e8d4809..1d3ccd4a0 100644 --- a/src/eligibility_signposting_api/audit/audit_service.py +++ b/src/eligibility_signposting_api/audit/audit_service.py @@ -22,7 +22,7 @@ def __init__( self.firehose = firehose self.audit_delivery_stream = audit_delivery_stream - @xray_recorder.capture("AuditService.audit") + @xray_recorder.capture("AuditService.audit") # pyright: ignore[reportCallIssue] def audit(self, audit_record: dict) -> None: """ Sends an audit record to the configured Firehose delivery stream. diff --git a/src/eligibility_signposting_api/repos/campaign_repo.py b/src/eligibility_signposting_api/repos/campaign_repo.py index dcdd3bd92..90168012f 100644 --- a/src/eligibility_signposting_api/repos/campaign_repo.py +++ b/src/eligibility_signposting_api/repos/campaign_repo.py @@ -26,7 +26,7 @@ def __init__( self.s3_client = s3_client self.bucket_name = bucket_name - @xray_recorder.capture("CampaignRepo.get_campaign_configs") + @xray_recorder.capture("CampaignRepo.get_campaign_configs") # pyright: ignore[reportCallIssue] def get_campaign_configs(self) -> Generator[CampaignConfig]: with xray_recorder.in_subsegment("CampaignRepo.get_campaign_configs:list_objects"): campaign_objects = self.s3_client.list_objects(Bucket=self.bucket_name) diff --git a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py index 3c6535f4b..92be4bc1a 100644 --- a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py +++ b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py @@ -29,7 +29,7 @@ def __init__( self.s3_client = s3_client self.bucket_name = bucket_name - @xray_recorder.capture("ConsumerMappingRepo.get_permitted_campaign_ids") + @xray_recorder.capture("ConsumerMappingRepo.get_permitted_campaign_ids") # pyright: ignore[reportCallIssue] def get_permitted_campaign_ids(self, consumer_id: ConsumerId) -> list[CampaignID] | None: try: response = self.s3_client.get_object(Bucket=self.bucket_name, Key=CONSUMER_MAPPING_FILE_NAME) diff --git a/src/eligibility_signposting_api/repos/person_repo.py b/src/eligibility_signposting_api/repos/person_repo.py index c9adaa1b4..95bc0e739 100644 --- a/src/eligibility_signposting_api/repos/person_repo.py +++ b/src/eligibility_signposting_api/repos/person_repo.py @@ -55,7 +55,7 @@ def get_person_record(self, nhs_hash: str | None) -> Any: return None - @xray_recorder.capture("PersonRepo.get_eligibility_data") + @xray_recorder.capture("PersonRepo.get_eligibility_data") # pyright: ignore[reportCallIssue] def get_eligibility_data(self, nhs_number: NHSNumber) -> Person: # Hash using AWSCURRENT secret and fetch items items = None diff --git a/src/eligibility_signposting_api/repos/secret_repo.py b/src/eligibility_signposting_api/repos/secret_repo.py index 3cbbc65f9..54177154d 100644 --- a/src/eligibility_signposting_api/repos/secret_repo.py +++ b/src/eligibility_signposting_api/repos/secret_repo.py @@ -17,7 +17,7 @@ def __init__(self, secret_manager: Annotated[BaseClient, Inject(qualifier="secre super().__init__() self.secret_manager = secret_manager - @xray_recorder.capture("SecretRepo._get_secret_by_stage") + @xray_recorder.capture("SecretRepo._get_secret_by_stage") # pyright: ignore[reportCallIssue] def _get_secret_by_stage(self, secret_name: str, stage: str) -> dict[str, str]: """Internal helper to fetch a secret by version stage.""" try: From 331fcb4e49464c90d80ea744ea1a3881dbde5eb4 Mon Sep 17 00:00:00 2001 From: TOEL2 Date: Mon, 9 Mar 2026 10:24:36 +0000 Subject: [PATCH 4/4] [ELI-686] - formatting --- src/eligibility_signposting_api/audit/audit_service.py | 2 +- src/eligibility_signposting_api/repos/campaign_repo.py | 2 +- src/eligibility_signposting_api/repos/consumer_mapping_repo.py | 2 +- src/eligibility_signposting_api/repos/person_repo.py | 2 +- src/eligibility_signposting_api/repos/secret_repo.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/eligibility_signposting_api/audit/audit_service.py b/src/eligibility_signposting_api/audit/audit_service.py index 1d3ccd4a0..41fddb123 100644 --- a/src/eligibility_signposting_api/audit/audit_service.py +++ b/src/eligibility_signposting_api/audit/audit_service.py @@ -22,7 +22,7 @@ def __init__( self.firehose = firehose self.audit_delivery_stream = audit_delivery_stream - @xray_recorder.capture("AuditService.audit") # pyright: ignore[reportCallIssue] + @xray_recorder.capture("AuditService.audit") # pyright: ignore[reportCallIssue] def audit(self, audit_record: dict) -> None: """ Sends an audit record to the configured Firehose delivery stream. diff --git a/src/eligibility_signposting_api/repos/campaign_repo.py b/src/eligibility_signposting_api/repos/campaign_repo.py index 90168012f..6dc06de6e 100644 --- a/src/eligibility_signposting_api/repos/campaign_repo.py +++ b/src/eligibility_signposting_api/repos/campaign_repo.py @@ -26,7 +26,7 @@ def __init__( self.s3_client = s3_client self.bucket_name = bucket_name - @xray_recorder.capture("CampaignRepo.get_campaign_configs") # pyright: ignore[reportCallIssue] + @xray_recorder.capture("CampaignRepo.get_campaign_configs") # pyright: ignore[reportCallIssue] def get_campaign_configs(self) -> Generator[CampaignConfig]: with xray_recorder.in_subsegment("CampaignRepo.get_campaign_configs:list_objects"): campaign_objects = self.s3_client.list_objects(Bucket=self.bucket_name) diff --git a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py index 92be4bc1a..f259a7be3 100644 --- a/src/eligibility_signposting_api/repos/consumer_mapping_repo.py +++ b/src/eligibility_signposting_api/repos/consumer_mapping_repo.py @@ -29,7 +29,7 @@ def __init__( self.s3_client = s3_client self.bucket_name = bucket_name - @xray_recorder.capture("ConsumerMappingRepo.get_permitted_campaign_ids") # pyright: ignore[reportCallIssue] + @xray_recorder.capture("ConsumerMappingRepo.get_permitted_campaign_ids") # pyright: ignore[reportCallIssue] def get_permitted_campaign_ids(self, consumer_id: ConsumerId) -> list[CampaignID] | None: try: response = self.s3_client.get_object(Bucket=self.bucket_name, Key=CONSUMER_MAPPING_FILE_NAME) diff --git a/src/eligibility_signposting_api/repos/person_repo.py b/src/eligibility_signposting_api/repos/person_repo.py index 95bc0e739..bfc31e437 100644 --- a/src/eligibility_signposting_api/repos/person_repo.py +++ b/src/eligibility_signposting_api/repos/person_repo.py @@ -55,7 +55,7 @@ def get_person_record(self, nhs_hash: str | None) -> Any: return None - @xray_recorder.capture("PersonRepo.get_eligibility_data") # pyright: ignore[reportCallIssue] + @xray_recorder.capture("PersonRepo.get_eligibility_data") # pyright: ignore[reportCallIssue] def get_eligibility_data(self, nhs_number: NHSNumber) -> Person: # Hash using AWSCURRENT secret and fetch items items = None diff --git a/src/eligibility_signposting_api/repos/secret_repo.py b/src/eligibility_signposting_api/repos/secret_repo.py index 54177154d..4957846cc 100644 --- a/src/eligibility_signposting_api/repos/secret_repo.py +++ b/src/eligibility_signposting_api/repos/secret_repo.py @@ -17,7 +17,7 @@ def __init__(self, secret_manager: Annotated[BaseClient, Inject(qualifier="secre super().__init__() self.secret_manager = secret_manager - @xray_recorder.capture("SecretRepo._get_secret_by_stage") # pyright: ignore[reportCallIssue] + @xray_recorder.capture("SecretRepo._get_secret_by_stage") # pyright: ignore[reportCallIssue] def _get_secret_by_stage(self, secret_name: str, stage: str) -> dict[str, str]: """Internal helper to fetch a secret by version stage.""" try: