Skip to content

Commit 3244eec

Browse files
authored
feat(debug log): enable debug log through environment variable and have HTTP request/responses being logged as airbyte messages (#711)
1 parent 1c9049a commit 3244eec

File tree

2 files changed

+23
-5
lines changed

2 files changed

+23
-5
lines changed

airbyte_cdk/entrypoint.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
from airbyte_cdk.connector import TConfig
2424
from airbyte_cdk.exception_handler import init_uncaught_exception_handler
25-
from airbyte_cdk.logger import PRINT_BUFFER, init_logger
25+
from airbyte_cdk.logger import PRINT_BUFFER, init_logger, is_platform_debug_log_enabled
2626
from airbyte_cdk.models import (
2727
AirbyteConnectionStatus,
2828
AirbyteMessage,
@@ -158,7 +158,7 @@ def run(self, parsed_args: argparse.Namespace) -> Iterable[str]:
158158
if not cmd:
159159
raise Exception("No command passed")
160160

161-
if hasattr(parsed_args, "debug") and parsed_args.debug:
161+
if (hasattr(parsed_args, "debug") and parsed_args.debug) or is_platform_debug_log_enabled():
162162
self.logger.setLevel(logging.DEBUG)
163163
logger.setLevel(logging.DEBUG)
164164
self.logger.debug("Debug logs enabled")

airbyte_cdk/logger.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
#
22
# Copyright (c) 2023 Airbyte, Inc., all rights reserved.
33
#
4-
54
import json
65
import logging
76
import logging.config
7+
import os
88
from typing import Any, Callable, Mapping, Optional, Tuple
99

1010
import orjson
@@ -40,6 +40,10 @@
4040
}
4141

4242

43+
def is_platform_debug_log_enabled() -> bool:
44+
return os.environ.get("LOG_LEVEL", "info").lower() == "debug"
45+
46+
4347
def init_logger(name: Optional[str] = None) -> logging.Logger:
4448
"""Initial set up of logger"""
4549
logger = logging.getLogger(name)
@@ -73,8 +77,22 @@ def format(self, record: logging.LogRecord) -> str:
7377
airbyte_level = self.level_mapping.get(record.levelno, "INFO")
7478
if airbyte_level == Level.DEBUG:
7579
extras = self.extract_extra_args_from_record(record)
76-
debug_dict = {"type": "DEBUG", "message": record.getMessage(), "data": extras}
77-
return filter_secrets(json.dumps(debug_dict))
80+
if is_platform_debug_log_enabled():
81+
# We have a different behavior between debug logs enabled through `--debug` argument and debug logs
82+
# enabled through environment variable. The reason is that for platform logs, we need to have these
83+
# printed as AirbyteMessage which is not the case with the current previous implementation.
84+
# Why not migrate both to AirbyteMessages then? AirbyteMessages do not support having structured logs.
85+
# which means that the DX would be degraded compared to the current solution (devs will need to identify
86+
# the `log.message` field and figure out where in this field is the response while the current solution
87+
# have a specific field that is structured for extras.
88+
message = f"{filter_secrets(record.getMessage())} ///\nExtra logs: {filter_secrets(json.dumps(extras))}"
89+
log_message = AirbyteMessage(
90+
type=Type.LOG, log=AirbyteLogMessage(level=airbyte_level, message=message)
91+
)
92+
return orjson.dumps(AirbyteMessageSerializer.dump(log_message)).decode()
93+
else:
94+
debug_dict = {"type": "DEBUG", "message": record.getMessage(), "data": extras}
95+
return filter_secrets(json.dumps(debug_dict))
7896
else:
7997
message = super().format(record)
8098
message = filter_secrets(message)

0 commit comments

Comments
 (0)