From e8d4234dbda96ff01e0c5e1a639e97c9b0b667e0 Mon Sep 17 00:00:00 2001 From: Idris Mokhtarzada Date: Fri, 26 Jul 2024 17:02:05 -0400 Subject: [PATCH] Better JSON serialization for Datadog logs Dicts are now properly serialized to JSON so that Datadog can parse the child attributes. Also, numbers and nulls are sent as numbers and nulls instead of strings. --- litellm/integrations/datadog.py | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/litellm/integrations/datadog.py b/litellm/integrations/datadog.py index 01b8c81e088..97ad96a5d68 100644 --- a/litellm/integrations/datadog.py +++ b/litellm/integrations/datadog.py @@ -9,6 +9,20 @@ import litellm, uuid from litellm._logging import print_verbose, verbose_logger +def make_json_serializable(payload): + for key, value in payload.items(): + try: + if isinstance(value, dict): + # recursively sanitize dicts + payload[key] = make_json_serializable(value.copy()) + if not isinstance(value, (str, int, float, bool, type(None))): + # everything else becomes a string + payload[key] = str(value) + except: + # non blocking if it can't cast to a str + pass + + class DataDogLogger: # Class variables or attributes def __init__( @@ -104,13 +118,7 @@ class DataDogLogger: "metadata": clean_metadata, } - # Ensure everything in the payload is converted to str - for key, value in payload.items(): - try: - payload[key] = str(value) - except: - # non blocking if it can't cast to a str - pass + make_json_serializable(payload) import json payload = json.dumps(payload)