feat(integrations): add telemetry.dev logging integration

This commit is contained in:
ephraimduncan 2026-07-29 13:03:34 +00:00
parent c274cf321c
commit 90682100e0
6 changed files with 78 additions and 0 deletions

View file

@ -128,6 +128,7 @@ _custom_logger_compatible_callbacks_literal = Literal[
"arize",
"arize_phoenix",
"langtrace",
"telemetry_dev",
"gcs_bucket",
"azure_storage",
"opik",

View file

@ -0,0 +1,3 @@
from litellm.integrations.telemetry_dev.telemetry_dev import TelemetryDevLogger
__all__ = ["TelemetryDevLogger"]

View file

@ -0,0 +1,47 @@
import os
from typing import TYPE_CHECKING, Any
from litellm.integrations.opentelemetry import OpenTelemetry
if TYPE_CHECKING:
from litellm.integrations.opentelemetry import OpenTelemetryConfig
from litellm.types.integrations.arize import Protocol
else:
Protocol = Any
OpenTelemetryConfig = Any
class TelemetryDevConfig:
"""Configuration for the telemetry.dev OTLP integration."""
def __init__(
self,
otlp_auth_headers: str,
protocol: Protocol,
endpoint: str,
):
self.otlp_auth_headers = otlp_auth_headers
self.protocol = protocol
self.endpoint = endpoint
class TelemetryDevLogger(OpenTelemetry):
"""telemetry.dev logger that extends OpenTelemetry for OTLP export."""
@staticmethod
def get_telemetry_dev_config() -> TelemetryDevConfig:
api_key = os.environ.get("TELEMETRY_DEV_API_KEY")
if not api_key:
raise ValueError(
"TELEMETRY_DEV_API_KEY environment variable is required for the telemetry.dev integration."
)
base_url = os.environ.get(
"TELEMETRY_DEV_BASE_URL", "https://ingest.telemetry.dev"
).rstrip("/")
return TelemetryDevConfig(
otlp_auth_headers=f"Authorization=Bearer {api_key}",
protocol="otlp_http",
endpoint=f"{base_url}/v1/traces",
)

View file

@ -85,6 +85,7 @@ class CustomLoggerRegistry:
"langfuse_otel": OpenTelemetry,
"arize_phoenix": OpenTelemetry,
"langtrace": OpenTelemetry,
"telemetry_dev": OpenTelemetry,
"weave_otel": OpenTelemetry,
"levo": OpenTelemetry,
"mlflow": MlflowLogger,

View file

@ -3825,6 +3825,31 @@ def _init_custom_logger_compatible_class(
_levo_otel_logger = LevoLogger(config=otel_config, callback_name="levo")
_in_memory_loggers.append(_levo_otel_logger)
return _levo_otel_logger # type: ignore
elif logging_integration == "telemetry_dev":
from litellm.integrations.opentelemetry import OpenTelemetryConfig
from litellm.integrations.telemetry_dev.telemetry_dev import (
TelemetryDevLogger,
)
telemetry_dev_config = TelemetryDevLogger.get_telemetry_dev_config()
otel_config = OpenTelemetryConfig(
exporter=telemetry_dev_config.protocol,
endpoint=telemetry_dev_config.endpoint,
headers=telemetry_dev_config.otlp_auth_headers,
)
for callback in _in_memory_loggers:
if (
isinstance(callback, TelemetryDevLogger)
and callback.callback_name == "telemetry_dev"
):
return callback # type: ignore
telemetry_dev_logger = TelemetryDevLogger(
config=otel_config, callback_name="telemetry_dev"
)
_in_memory_loggers.append(telemetry_dev_logger)
return telemetry_dev_logger # type: ignore
elif logging_integration == "otel":
# Gate the new typed V2 adapter behind LITELLM_OTEL_V2. When off,
# the legacy 3,227-line god-class is used unchanged. The two are

View file

@ -42,6 +42,7 @@ expected_env_vars = {
"GOOGLE_APPLICATION_CREDENTIALS": "gcs_credentials",
"OPIK_API_KEY": "opik_api_key",
"LANGTRACE_API_KEY": "langtrace_api_key",
"TELEMETRY_DEV_API_KEY": "td_live_test",
"LOGFIRE_TOKEN": "logfire_token",
"ARIZE_SPACE_KEY": "arize_space_key",
"ARIZE_API_KEY": "arize_api_key",