mirror of
https://github.com/BerriAI/litellm.git
synced 2026-09-11 22:51:28 +00:00
[Fix] Datadog LLM Observability tags format (env, service, version missing) (#23673)
* tag fix * greptile comment
This commit is contained in:
parent
b16a786aa1
commit
73220a34d1
5 changed files with 25 additions and 20 deletions
|
|
@ -291,7 +291,7 @@ class DataDogLogger(
|
|||
|
||||
dd_payload = DatadogPayload(
|
||||
ddsource=get_datadog_source(),
|
||||
ddtags=get_datadog_tags(),
|
||||
ddtags=",".join(get_datadog_tags()),
|
||||
hostname=get_datadog_hostname(),
|
||||
message=safe_dumps(message_payload),
|
||||
service=get_datadog_service(),
|
||||
|
|
@ -442,7 +442,7 @@ class DataDogLogger(
|
|||
verbose_logger.debug("Datadog: Logger - Logging payload = %s", json_payload)
|
||||
dd_payload = DatadogPayload(
|
||||
ddsource=get_datadog_source(),
|
||||
ddtags=get_datadog_tags(standard_logging_object=standard_logging_object),
|
||||
ddtags=",".join(get_datadog_tags(standard_logging_object=standard_logging_object)),
|
||||
hostname=get_datadog_hostname(),
|
||||
message=json_payload,
|
||||
service=get_datadog_service(),
|
||||
|
|
@ -545,7 +545,7 @@ class DataDogLogger(
|
|||
_dd_message_str = safe_dumps(_payload_dict)
|
||||
_dd_payload = DatadogPayload(
|
||||
ddsource=get_datadog_source(),
|
||||
ddtags=get_datadog_tags(),
|
||||
ddtags=",".join(get_datadog_tags()),
|
||||
hostname=get_datadog_hostname(),
|
||||
message=_dd_message_str,
|
||||
service=get_datadog_service(),
|
||||
|
|
@ -587,7 +587,7 @@ class DataDogLogger(
|
|||
_dd_message_str = safe_dumps(_payload_dict)
|
||||
_dd_payload = DatadogPayload(
|
||||
ddsource=get_datadog_source(),
|
||||
ddtags=get_datadog_tags(),
|
||||
ddtags=",".join(get_datadog_tags()),
|
||||
hostname=get_datadog_hostname(),
|
||||
message=_dd_message_str,
|
||||
service=get_datadog_service(),
|
||||
|
|
@ -678,7 +678,7 @@ class DataDogLogger(
|
|||
|
||||
dd_payload = DatadogPayload(
|
||||
ddsource=get_datadog_source(),
|
||||
ddtags=get_datadog_tags(),
|
||||
ddtags=",".join(get_datadog_tags()),
|
||||
hostname=get_datadog_hostname(),
|
||||
message=json_payload,
|
||||
service=get_datadog_service(),
|
||||
|
|
|
|||
|
|
@ -38,8 +38,13 @@ def get_datadog_pod_name() -> str:
|
|||
|
||||
def get_datadog_tags(
|
||||
standard_logging_object: Optional[StandardLoggingPayload] = None,
|
||||
) -> str:
|
||||
"""Build Datadog tags string used by multiple integrations."""
|
||||
) -> List[str]:
|
||||
"""Build Datadog tags as a list of individual tag strings.
|
||||
|
||||
Returns a list of "key:value" strings suitable for Datadog LLM Observability
|
||||
(which expects tags as an array). For Datadog Logs API (ddtags), join with
|
||||
comma: ",".join(get_datadog_tags(...)).
|
||||
"""
|
||||
|
||||
base_tags = {
|
||||
"env": get_datadog_env(),
|
||||
|
|
@ -66,4 +71,4 @@ def get_datadog_tags(
|
|||
if team_tag:
|
||||
tags.append(f"team:{team_tag}")
|
||||
|
||||
return ",".join(tags)
|
||||
return tags
|
||||
|
|
|
|||
|
|
@ -203,7 +203,7 @@ class DataDogLLMObsLogger(CustomBatchLogger):
|
|||
type="span",
|
||||
attributes=DDSpanAttributes(
|
||||
ml_app=get_datadog_service(),
|
||||
tags=[get_datadog_tags()],
|
||||
tags=get_datadog_tags(),
|
||||
spans=self.log_queue,
|
||||
),
|
||||
),
|
||||
|
|
@ -315,7 +315,7 @@ class DataDogLLMObsLogger(CustomBatchLogger):
|
|||
duration=int((end_time - start_time).total_seconds() * 1e9),
|
||||
metrics=metrics,
|
||||
status="error" if error_info else "ok",
|
||||
tags=[get_datadog_tags(standard_logging_object=standard_logging_payload)],
|
||||
tags=get_datadog_tags(standard_logging_object=standard_logging_payload),
|
||||
)
|
||||
|
||||
apm_trace_id = self._get_apm_trace_id()
|
||||
|
|
|
|||
|
|
@ -593,7 +593,7 @@ def test_datadog_static_methods():
|
|||
# Test tags format with default values
|
||||
assert (
|
||||
"env:unknown,service:litellm-server,version:unknown,HOSTNAME:"
|
||||
in get_datadog_tags()
|
||||
in ",".join(get_datadog_tags())
|
||||
)
|
||||
|
||||
# Test with custom environment variables
|
||||
|
|
@ -631,7 +631,7 @@ def test_datadog_static_methods():
|
|||
# Test tags format with custom values
|
||||
expected_custom_tags = "env:production,service:custom-service,version:1.0.0,HOSTNAME:test-host,POD_NAME:pod-123"
|
||||
print("DataDogLogger._get_datadog_tags()", get_datadog_tags())
|
||||
assert get_datadog_tags() == expected_custom_tags
|
||||
assert ",".join(get_datadog_tags()) == expected_custom_tags
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
|
|
@ -672,11 +672,11 @@ def test_get_datadog_tags():
|
|||
"""Test the _get_datadog_tags static method with various inputs"""
|
||||
# Test with no standard_logging_object and default env vars
|
||||
base_tags = get_datadog_tags()
|
||||
assert "env:" in base_tags
|
||||
assert "service:" in base_tags
|
||||
assert "version:" in base_tags
|
||||
assert "POD_NAME:" in base_tags
|
||||
assert "HOSTNAME:" in base_tags
|
||||
assert any("env:" in t for t in base_tags)
|
||||
assert any("service:" in t for t in base_tags)
|
||||
assert any("version:" in t for t in base_tags)
|
||||
assert any("POD_NAME:" in t for t in base_tags)
|
||||
assert any("HOSTNAME:" in t for t in base_tags)
|
||||
|
||||
# Test with custom env vars
|
||||
test_env = {
|
||||
|
|
@ -705,12 +705,12 @@ def test_get_datadog_tags():
|
|||
# Test with empty request_tags
|
||||
standard_logging_obj["request_tags"] = []
|
||||
tags_empty_request = get_datadog_tags(standard_logging_obj)
|
||||
assert "request_tag:" not in tags_empty_request
|
||||
assert not any(t.startswith("request_tag:") for t in tags_empty_request)
|
||||
|
||||
# Test with None request_tags
|
||||
standard_logging_obj["request_tags"] = None
|
||||
tags_none_request = get_datadog_tags(standard_logging_obj)
|
||||
assert "request_tag:" not in tags_none_request
|
||||
assert not any(t.startswith("request_tag:") for t in tags_none_request)
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ class TestDatadogTagsRegression:
|
|||
assert "env:test-env" in tags_legacy
|
||||
assert "service:test-service" in tags_legacy
|
||||
# Verify NO team tag (should not invent one)
|
||||
assert "team:" not in tags_legacy
|
||||
assert not any(t.startswith("team:") for t in tags_legacy)
|
||||
|
||||
# Case 2: New feature (team info provided)
|
||||
payload_with_team = StandardLoggingPayload(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue