Skip to content

Commit 3616aa6

Browse files
authored
Merge pull request #43 from open-mpic/ds-dcv-slight-decoupling
Trace Logging and DCV Checker http client lifecycle
2 parents 5de9b33 + a8444c0 commit 3616aa6

15 files changed

Lines changed: 157 additions & 68 deletions

clean.sh

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ rm open-tofu/*.generated.tf
1010
rm -r layer/create_layer_virtualenv
1111
rm -r layer/python311_layer_content
1212
rm -r layer/mpic_coordinator_layer_content
13-
rm -r layer/mpic_caa_checker_layer_content
14-
rm -r layer/mpic_dcv_checker_layer_content
15-
rm -r layer/mpic_common_layer_content
1613

1714
rm layer/*.zip
1815

config.example.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,3 +22,5 @@ caa-domains:
2222
# absolute maximum regardless of orchestration parameters in request
2323
# NOT to be interpreted as the default number of attempts (default is 1 unless explicitly set in request)
2424
absolute-max-attempts: 3
25+
26+
log-level: INFO

configure.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,12 @@ def main(raw_args=None):
109109
# Set the source path for the lambda functions.
110110
main_tf_string = main_tf_string.replace("{{source-path}}", f"{config['source-path']}")
111111

112+
# Set log level if present.
113+
if "log-level" in config:
114+
main_tf_string = main_tf_string.replace("{{log-level-with-key}}", f"log_level = \"{config['log-level']}\"")
115+
else:
116+
main_tf_string = main_tf_string.replace("{{log-level-with-key}}", "")
117+
112118
# Derive the out file from the input file name.
113119
if not args.main_tf_template.endswith(".tf.template"):
114120
print(f"Error: invalid tf template name: {args.main_tf_template}. Make sure all tf template files end in '.tf.template'.")
@@ -148,6 +154,12 @@ def main(raw_args=None):
148154
# Set the source path for the lambda functions.
149155
aws_perspective_tf_region = aws_perspective_tf_region.replace("{{source-path}}", f"{config['source-path']}")
150156

157+
# Set log level if present.
158+
if "log-level" in config:
159+
aws_perspective_tf_region = aws_perspective_tf_region.replace("{{log-level-with-key}}", f"log_level = \"{config['log-level']}\"")
160+
else:
161+
aws_perspective_tf_region = aws_perspective_tf_region.replace("{{log-level-with-key}}", "")
162+
151163
if not args.aws_perspective_tf_template.endswith(".tf.template"):
152164
print(f"Error: invalid tf template name: {args.aws_perspective_tf_template}. Make sure all tf template files end in '.tf.template'.")
153165
exit()

open-tofu/aws-perspective.tf.template

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,11 @@ resource "aws_lambda_function" "mpic_dcv_checker_lambda_{{region}}" {
218218
security_group_ids = [for s in aws_default_security_group.default_security_group_{{region}} : s.id]
219219
}
220220
provider = aws.{{region}}
221+
environment {
222+
variables = {
223+
{{log-level-with-key}}
224+
}
225+
}
221226
}
222227

223228
resource "aws_lambda_function" "mpic_caa_checker_lambda_{{region}}" {
@@ -246,6 +251,7 @@ resource "aws_lambda_function" "mpic_caa_checker_lambda_{{region}}" {
246251
environment {
247252
variables = {
248253
default_caa_domains = {{default-caa-domains}}
254+
{{log-level-with-key}}
249255
}
250256
}
251257
}

open-tofu/main.tf.template

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ resource "aws_lambda_function" "mpic_coordinator_lambda" {
8484
default_perspective_count = {{default-perspective-count}}
8585
hash_secret = {{hash-secret}}
8686
{{absolute-max-attempts-with-key}}
87+
{{log-level-with-key}}
8788
}
8889
}
8990
}

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@ classifiers = [
2626
"Programming Language :: Python :: Implementation :: PyPy",
2727
]
2828
dependencies = [
29-
# "open-mpic-core @ git+https://github.com/open-mpic/open-mpic-core-python.git@main",
29+
#"open-mpic-core @ git+https://github.com/open-mpic/open-mpic-core-python.git@ds-trace-logging",
3030
"pyyaml==6.0.1",
3131
"requests>=2.32.3",
3232
"dnspython==2.6.1",
3333
"pydantic==2.8.2",
3434
"aiohttp==3.11.11",
3535
"aws-lambda-powertools[parser]==3.2.0",
36-
"open-mpic-core==4.4.0",
36+
"open-mpic-core==4.6.1",
3737
"aioboto3~=13.3.0",
3838
]
3939

src/aws_lambda_mpic/__about__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.3.2"
1+
__version__ = "0.4.0"

src/aws_lambda_mpic/mpic_caa_checker_lambda/mpic_caa_checker_lambda_function.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
1+
import os
12
import asyncio
23

34
from aws_lambda_powertools.utilities.parser import event_parser
45

56
from open_mpic_core.common_domain.check_request import CaaCheckRequest
67
from open_mpic_core.mpic_caa_checker.mpic_caa_checker import MpicCaaChecker
7-
import os
8+
from open_mpic_core.common_util.trace_level_logger import get_logger
9+
10+
logger = get_logger(__name__)
811

912

1013
class MpicCaaCheckerLambdaHandler:
1114
def __init__(self):
1215
self.perspective_code = os.environ['AWS_REGION']
1316
self.default_caa_domain_list = os.environ['default_caa_domains'].split("|")
14-
self.caa_checker = MpicCaaChecker(self.default_caa_domain_list, self.perspective_code)
17+
self.log_level = os.environ['log_level'] if 'log_level' in os.environ else None
18+
19+
self.logger = logger.getChild(self.__class__.__name__)
20+
if self.log_level:
21+
self.logger.setLevel(self.log_level)
22+
23+
self.caa_checker = MpicCaaChecker(default_caa_domain_list=self.default_caa_domain_list,
24+
perspective_code=self.perspective_code,
25+
log_level=self.logger.level)
1526

1627
def process_invocation(self, caa_request: CaaCheckRequest):
1728
try:

src/aws_lambda_mpic/mpic_coordinator_lambda/mpic_coordinator_lambda_function.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
1+
import logging
12
import os
23
import json
4+
import traceback
5+
36
import yaml
47
import asyncio
58
import aioboto3
69

710
from asyncio import Queue
811
from collections import defaultdict
912
from importlib import resources
10-
11-
from aws_lambda_powertools.utilities.parser import event_parser, envelopes
1213
from pydantic import TypeAdapter, ValidationError, BaseModel
14+
from aws_lambda_powertools.utilities.parser import event_parser, envelopes
15+
1316
from open_mpic_core.common_domain.check_request import BaseCheckRequest
1417
from open_mpic_core.common_domain.check_response import CheckResponse
1518
from open_mpic_core.mpic_coordinator.domain.mpic_request import MpicRequest
@@ -18,6 +21,9 @@
1821
from open_mpic_core.mpic_coordinator.mpic_coordinator import MpicCoordinator, MpicCoordinatorConfiguration
1922
from open_mpic_core.common_domain.enum.check_type import CheckType
2023
from open_mpic_core.mpic_coordinator.domain.remote_perspective import RemotePerspective
24+
from open_mpic_core.common_util.trace_level_logger import get_logger
25+
26+
logger = get_logger(__name__)
2127

2228

2329
class PerspectiveEndpointInfo(BaseModel):
@@ -37,6 +43,11 @@ def __init__(self):
3743
self.default_perspective_count = int(os.environ['default_perspective_count'])
3844
self.global_max_attempts = int(os.environ['absolute_max_attempts']) if 'absolute_max_attempts' in os.environ else None
3945
self.hash_secret = os.environ['hash_secret']
46+
self.log_level = os.getenv('log_level', None)
47+
48+
self.logger = logger.getChild(self.__class__.__name__)
49+
if self.log_level:
50+
self.logger.setLevel(self.log_level)
4051

4152
self.remotes_per_perspective_per_check_type = {
4253
CheckType.DCV: {perspective_code: perspective_config.dcv_endpoint_info for perspective_code, perspective_config in perspectives.items()},
@@ -54,10 +65,7 @@ def __init__(self):
5465
self.hash_secret
5566
)
5667

57-
self.mpic_coordinator = MpicCoordinator(
58-
self.call_remote_perspective,
59-
self.mpic_coordinator_configuration
60-
)
68+
self.mpic_coordinator = MpicCoordinator(self.call_remote_perspective, self.mpic_coordinator_configuration, self.logger.level)
6169

6270
# for correct deserialization of responses based on discriminator field (check type)
6371
self.mpic_request_adapter = TypeAdapter(MpicRequest)
@@ -125,7 +133,7 @@ async def call_remote_perspective(self, perspective: RemotePerspective, check_ty
125133
response_payload = json.loads(await response['Payload'].read())
126134
return self.check_response_adapter.validate_json(response_payload['body'])
127135
except ValidationError as ve:
128-
# We might want to handle this differently later.
136+
self.logger.log(level=logging.ERROR, msg=f"Validation error in response from {perspective.code}: {ve}")
129137
raise ve
130138
finally:
131139
await self.release_lambda_client(perspective.code, client)
@@ -184,6 +192,9 @@ def wrapper(*args, **kwargs):
184192
except ValidationError as validation_error:
185193
return build_400_response(MpicRequestValidationMessages.REQUEST_VALIDATION_FAILED.key, validation_error.errors())
186194
except Exception as e:
195+
logger.error(f"An error occurred: {str(e)}")
196+
print(traceback.format_exc())
197+
print(f"BOY HOWDY error occurred: {str(e)}")
187198
return {
188199
'statusCode': 500,
189200
'headers': {'Content-Type': 'application/json'},

src/aws_lambda_mpic/mpic_dcv_checker_lambda/mpic_dcv_checker_lambda_function.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,27 @@
1+
import os
12
import asyncio
23

34
from aws_lambda_powertools.utilities.parser import event_parser
45

56
from open_mpic_core.common_domain.check_request import DcvCheckRequest
67
from open_mpic_core.mpic_dcv_checker.mpic_dcv_checker import MpicDcvChecker
7-
import os
8+
from open_mpic_core.common_util.trace_level_logger import get_logger
9+
10+
logger = get_logger(__name__)
811

912

1013
class MpicDcvCheckerLambdaHandler:
1114
def __init__(self):
1215
self.perspective_code = os.environ['AWS_REGION']
13-
self.dcv_checker = MpicDcvChecker(self.perspective_code)
16+
self.log_level = os.environ['log_level'] if 'log_level' in os.environ else None
17+
18+
self.logger = logger.getChild(self.__class__.__name__)
19+
if self.log_level:
20+
self.logger.setLevel(self.log_level)
1421

15-
async def initialize(self):
16-
await self.dcv_checker.initialize()
22+
self.dcv_checker = MpicDcvChecker(perspective_code=self.perspective_code,
23+
reuse_http_client=False,
24+
log_level=self.logger.level)
1725

1826
def process_invocation(self, dcv_request: DcvCheckRequest):
1927
try:
@@ -23,6 +31,9 @@ def process_invocation(self, dcv_request: DcvCheckRequest):
2331
event_loop = asyncio.new_event_loop()
2432
asyncio.set_event_loop(event_loop)
2533

34+
self.logger.debug("(debug log) Processing DCV check request: %s", dcv_request)
35+
print("(print) Processing DCV check request: %s", dcv_request)
36+
2637
dcv_response = event_loop.run_until_complete(self.dcv_checker.check_dcv(dcv_request))
2738
status_code = 200
2839
if dcv_response.errors is not None and len(dcv_response.errors) > 0:
@@ -42,26 +53,13 @@ def process_invocation(self, dcv_request: DcvCheckRequest):
4253
_handler = None
4354

4455

45-
async def initialize_handler() -> MpicDcvCheckerLambdaHandler:
46-
handler = MpicDcvCheckerLambdaHandler()
47-
await handler.initialize()
48-
return handler
49-
50-
5156
def get_handler() -> MpicDcvCheckerLambdaHandler:
5257
"""
5358
Singleton pattern to avoid recreating the handler on every Lambda invocation
5459
"""
5560
global _handler
5661
if _handler is None:
57-
try:
58-
event_loop = asyncio.get_running_loop()
59-
except RuntimeError:
60-
# No running event loop, create a new one
61-
event_loop = asyncio.new_event_loop()
62-
asyncio.set_event_loop(event_loop)
63-
64-
_handler = event_loop.run_until_complete(initialize_handler())
62+
_handler = MpicDcvCheckerLambdaHandler()
6563
return _handler
6664

6765

0 commit comments

Comments
 (0)