Skip to content

Commit 84ed981

Browse files
authored
[Logs forwarder] Scrub log's inner messages (DataDog#860)
* Add a service override test * [Logs forwarder] allow to scrub log's inner messages * properly catch exception
1 parent e7248e6 commit 84ed981

File tree

4 files changed

+51
-4
lines changed

4 files changed

+51
-4
lines changed

aws/logs_monitoring/forwarder.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,17 +82,27 @@ def _forward_logs(self, logs, key=None):
8282
if logger.isEnabledFor(logging.DEBUG):
8383
logger.debug(f"Forwarding {len(logs)} logs")
8484

85+
scrubber = DatadogScrubber(SCRUBBING_RULE_CONFIGS)
8586
logs_to_forward = []
8687
for log in logs:
8788
if key:
8889
log = add_retry_tag(log)
90+
91+
# apply scrubbing rules to inner log message if exists
92+
if isinstance(log, dict) and log.get("message"):
93+
try:
94+
log["message"] = scrubber.scrub(log["message"])
95+
except Exception as e:
96+
logger.exception(
97+
f"Exception while scrubbing log message {log['message']}: {e}"
98+
)
99+
89100
logs_to_forward.append(json.dumps(log, ensure_ascii=False))
90101

91102
logs_to_forward = filter_logs(
92103
logs_to_forward, INCLUDE_AT_MATCH, EXCLUDE_AT_MATCH
93104
)
94105

95-
scrubber = DatadogScrubber(SCRUBBING_RULE_CONFIGS)
96106
if DD_USE_TCP:
97107
batcher = DatadogBatcher(256 * 1000, 256 * 1000, 1)
98108
cli = DatadogTCPClient(DD_URL, DD_PORT, DD_NO_SSL, DD_API_KEY, scrubber)

aws/logs_monitoring/settings.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ def __init__(self, name, pattern, placeholder):
176176
ScrubbingRuleConfig(
177177
"DD_SCRUBBING_RULE",
178178
get_env_var("DD_SCRUBBING_RULE", default=None),
179-
get_env_var("DD_SCRUBBING_RULE_REPLACEMENT", default="xxxxx"),
179+
get_env_var("DD_SCRUBBING_RULE_REPLACEMENT", default=""),
180180
),
181181
]
182182

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"messageType": "DATA_MESSAGE",
3+
"owner": "601427279990",
4+
"logGroup": "/aws/lambda/testing-datadog",
5+
"logStream": "2024/10/10/[$LATEST]20bddfd5a2dc4c6b97ac02800eae90d0",
6+
"subscriptionFilters": [
7+
"testing-datadog"
8+
],
9+
"logEvents": [
10+
{
11+
"id": "35311576111948622874033876462979853992919938886093242368",
12+
"timestamp": 1583425836114,
13+
"message": "{\"status\":\"debug\",\"message\":\"datadog:Patched console output with trace context\",\"ddtags\":\"env:test,service:test-inner-message\"}\n"
14+
}
15+
]
16+
}

aws/logs_monitoring/tests/test_lambda_function.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,30 @@ def test_overrding_service_tag_from_lambda_cache_when_dd_tags_is_set(
242242
for log in logs:
243243
self.assertEqual(log["service"], "lambda_service")
244244

245-
def _get_input_data(self):
245+
@patch("caching.cloudwatch_log_group_cache.CloudwatchLogGroupTagsCache.__init__")
246+
def test_overrding_service_tag_from_message_ddtags(self, mock_cache_init):
247+
mock_cache_init.return_value = None
248+
cache_layer = CacheLayer("")
249+
cache_layer._lambda_cache = MagicMock()
250+
cache_layer._cloudwatch_log_group_cache = MagicMock()
251+
context = Context()
252+
input_data = self._get_input_data(path="events/cloudwatch_logs_ddtags.json")
253+
event = {
254+
"awslogs": {"data": self._create_cloudwatch_log_event_from_data(input_data)}
255+
}
256+
normalized_events = parse(event, context, cache_layer)
257+
enriched_events = enrich(normalized_events, cache_layer)
258+
transformed_events = transform(enriched_events)
259+
260+
_, logs, _ = split(transformed_events)
261+
self.assertEqual(len(logs), 1)
262+
for log in logs:
263+
self.assertEqual(log["service"], "test-inner-message")
264+
self.assertTrue(isinstance(log["message"], str))
265+
266+
def _get_input_data(self, path="events/cloudwatch_logs.json"):
246267
my_path = os.path.abspath(os.path.dirname(__file__))
247-
path = os.path.join(my_path, "events/cloudwatch_logs.json")
268+
path = os.path.join(my_path, path)
248269

249270
with open(
250271
path,

0 commit comments

Comments
 (0)