Skip to content

Commit d0a2edd

Browse files
committed
Added logs for cloud storage
1 parent 256b9c1 commit d0a2edd

File tree

1 file changed

+79
-10
lines changed

1 file changed

+79
-10
lines changed

backend/app/core/cloud/storage.py

Lines changed: 79 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import os
2-
2+
import logging
33
import functools as ft
44
from pathlib import Path
55
from dataclasses import dataclass, asdict
@@ -13,6 +13,8 @@
1313
from app.api.deps import CurrentUser
1414
from app.core.config import settings
1515

16+
logger = logging.getLogger(__name__)
17+
1618

1719
class CloudStorageError(Exception):
1820
pass
@@ -21,6 +23,9 @@ class CloudStorageError(Exception):
2123
class AmazonCloudStorageClient:
2224
@ft.cached_property
2325
def client(self):
26+
logger.info(
27+
f"[AmazonCloudStorageClient.client] Initializing S3 client | {{'region': '{settings.AWS_DEFAULT_REGION}'}}"
28+
)
2429
kwargs = {}
2530
cred_params = (
2631
("aws_access_key_id", "AWS_ACCESS_KEY_ID"),
@@ -31,25 +36,53 @@ def client(self):
3136
for i, j in cred_params:
3237
kwargs[i] = os.environ.get(j, getattr(settings, j))
3338

34-
return boto3.client("s3", **kwargs)
39+
client = boto3.client("s3", **kwargs)
40+
logger.info(
41+
f"[AmazonCloudStorageClient.client] S3 client initialized | {{'region': '{settings.AWS_DEFAULT_REGION}'}}"
42+
)
43+
return client
3544

3645
def create(self):
46+
logger.info(
47+
f"[AmazonCloudStorageClient.create] Checking/creating S3 bucket | {{'bucket': '{settings.AWS_S3_BUCKET}'}}"
48+
)
3749
try:
3850
# does the bucket exist...
3951
self.client.head_bucket(Bucket=settings.AWS_S3_BUCKET)
52+
logger.info(
53+
f"[AmazonCloudStorageClient.create] Bucket exists | {{'bucket': '{settings.AWS_S3_BUCKET}'}}"
54+
)
4055
except ValueError as err:
56+
logger.error(
57+
f"[AmazonCloudStorageClient.create] Invalid bucket configuration | {{'bucket': '{settings.AWS_S3_BUCKET}', 'error': '{str(err)}'}}"
58+
)
4159
raise CloudStorageError(err) from err
4260
except ClientError as err:
4361
response = int(err.response["Error"]["Code"])
4462
if response != 404:
63+
logger.error(
64+
f"[AmazonCloudStorageClient.create] Unexpected AWS error | {{'bucket': '{settings.AWS_S3_BUCKET}', 'error': '{str(err)}', 'code': {response}}}"
65+
)
4566
raise CloudStorageError(err) from err
4667
# ... if not create it
47-
self.client.create_bucket(
48-
Bucket=settings.AWS_S3_BUCKET,
49-
CreateBucketConfiguration={
50-
"LocationConstraint": settings.AWS_DEFAULT_REGION,
51-
},
68+
logger.warning(
69+
f"[AmazonCloudStorageClient.create] Bucket not found, creating | {{'bucket': '{settings.AWS_S3_BUCKET}'}}"
5270
)
71+
try:
72+
self.client.create_bucket(
73+
Bucket=settings.AWS_S3_BUCKET,
74+
CreateBucketConfiguration={
75+
"LocationConstraint": settings.AWS_DEFAULT_REGION,
76+
},
77+
)
78+
logger.info(
79+
f"[AmazonCloudStorageClient.create] Bucket created successfully | {{'bucket': '{settings.AWS_S3_BUCKET}'}}"
80+
)
81+
except ClientError as create_err:
82+
logger.error(
83+
f"[AmazonCloudStorageClient.create] Failed to create bucket | {{'bucket': '{settings.AWS_S3_BUCKET}', 'error': '{str(create_err)}'}}"
84+
)
85+
raise CloudStorageError(create_err) from create_err
5386

5487

5588
@dataclass(frozen=True)
@@ -61,6 +94,9 @@ def __str__(self):
6194
return urlunparse(self.to_url())
6295

6396
def to_url(self):
97+
logger.info(
98+
f"[SimpleStorageName.to_url] Generating S3 URL | {{'bucket': '{self.Bucket}', 'key': '{self.Key}'}}"
99+
)
64100
kwargs = {
65101
"scheme": "s3",
66102
"netloc": self.Bucket,
@@ -69,21 +105,35 @@ def to_url(self):
69105
for k in ParseResult._fields:
70106
kwargs.setdefault(k)
71107

72-
return ParseResult(**kwargs)
108+
url = ParseResult(**kwargs)
109+
logger.info(
110+
f"[SimpleStorageName.to_url] S3 URL generated | {{'url': '{urlunparse(url)}'}}"
111+
)
112+
return url
73113

74114
@classmethod
75115
def from_url(cls, url: str):
116+
logger.info(
117+
f"[SimpleStorageName.from_url] Parsing S3 URL | {{'url': '{url}'}}"
118+
)
76119
url = urlparse(url)
77120
path = Path(url.path)
78121
if path.is_absolute():
79122
path = path.relative_to(path.root)
80123

81-
return cls(Bucket=url.netloc, Key=str(path))
124+
instance = cls(Bucket=url.netloc, Key=str(path))
125+
logger.info(
126+
f"[SimpleStorageName.from_url] URL parsed successfully | {{'bucket': '{instance.Bucket}', 'key': '{instance.Key}'}}"
127+
)
128+
return instance
82129

83130

84131
class CloudStorage:
85132
def __init__(self, user: CurrentUser):
86133
self.user = user
134+
logger.info(
135+
f"[CloudStorage.init] Initialized CloudStorage | {{'user_id': '{user.id}'}}"
136+
)
87137

88138
def put(self, source: UploadFile, basename: str):
89139
raise NotImplementedError()
@@ -96,8 +146,14 @@ class AmazonCloudStorage(CloudStorage):
96146
def __init__(self, user: CurrentUser):
97147
super().__init__(user)
98148
self.aws = AmazonCloudStorageClient()
149+
logger.info(
150+
f"[AmazonCloudStorage.init] Initialized AmazonCloudStorage | {{'user_id': '{user.id}'}}"
151+
)
99152

100153
def put(self, source: UploadFile, basename: Path) -> SimpleStorageName:
154+
logger.info(
155+
f"[AmazonCloudStorage.put] Starting file upload | {{'user_id': '{self.user.id}', 'filename': '{source.filename}', 'basename': '{basename}'}}"
156+
)
101157
key = Path(str(self.user.id), basename)
102158
destination = SimpleStorageName(str(key))
103159

@@ -111,16 +167,29 @@ def put(self, source: UploadFile, basename: Path) -> SimpleStorageName:
111167
},
112168
**kwargs,
113169
)
170+
logger.info(
171+
f"[AmazonCloudStorage.put] File uploaded successfully | {{'user_id': '{self.user.id}', 'bucket': '{destination.Bucket}', 'key': '{destination.Key}'}}"
172+
)
114173
except ClientError as err:
174+
logger.error(
175+
f"[AmazonCloudStorage.put] AWS upload error | {{'user_id': '{self.user.id}', 'bucket': '{destination.Bucket}', 'key': '{destination.Key}', 'error': '{str(err)}'}}"
176+
)
115177
raise CloudStorageError(f'AWS Error: "{err}"') from err
116178

117179
return destination
118180

119181
def stream(self, url: str) -> StreamingBody:
182+
logger.info(
183+
f"[AmazonCloudStorage.stream] Starting file stream | {{'user_id': '{self.user.id}', 'url': '{url}'}}"
184+
)
120185
name = SimpleStorageName.from_url(url)
121186
kwargs = asdict(name)
122187
try:
123-
return self.aws.client.get_object(**kwargs).get("Body")
188+
body = self.aws.client.get_object(**kwargs).get("Body")
189+
logger.info(
190+
f"[AmazonCloudStorage.stream] File streamed successfully | {{'user_id': '{self.user.id}', 'bucket': '{name.Bucket}', 'key': '{name.Key}'}}"
191+
)
192+
return body
124193
except ClientError as err:
125194
raise CloudStorageError(f'AWS Error: "{err}" ({url})') from err
126195

0 commit comments

Comments
 (0)