+ {/* Logging Exporters (admin-owned OTEL trace destinations assigned to this identity) */}
+
+
+
+ Logging Exporters
+ {loggingExporters.length}
+
+ {loggingExporters.length > 0 ? (
+
+ {loggingExporters.map((name, index) => (
+
+ {name}
+
+ ))}
+
+ ) : (
+
+
+ No logging exporters assigned
+
+ )}
+
diff --git a/ui/litellm-dashboard/src/components/networking.tsx b/ui/litellm-dashboard/src/components/networking.tsx
index 3d15aea8fdd..50d0863866d 100644
--- a/ui/litellm-dashboard/src/components/networking.tsx
+++ b/ui/litellm-dashboard/src/components/networking.tsx
@@ -209,6 +209,18 @@ export interface CredentialItem {
custom_llm_provider?: string;
description?: string;
required?: boolean;
+ // "logging" tags an admin-owned trace destination (Option A: lives in the
+ // free-form credential_info, no schema migration). Absent = a provider credential.
+ credential_type?: string;
+ // Non-secret destination host/endpoint, surfaced in the logging credentials list.
+ host?: string;
+ // Admin-owned access grant for a logging destination: which identities its
+ // traces fan out to. global reaches everyone; teams/orgs list ids.
+ access?: {
+ global?: boolean;
+ teams?: string[];
+ orgs?: string[];
+ };
};
}
diff --git a/ui/litellm-dashboard/src/components/organization/organization_view.tsx b/ui/litellm-dashboard/src/components/organization/organization_view.tsx
index a3ee0004fa6..664f0bb5fa1 100644
--- a/ui/litellm-dashboard/src/components/organization/organization_view.tsx
+++ b/ui/litellm-dashboard/src/components/organization/organization_view.tsx
@@ -12,6 +12,7 @@ import React, { useMemo, useState } from "react";
import MemberTable from "../common_components/MemberTable";
import UserSearchModal from "../common_components/user_search_modal";
import MCPServerSelector from "../mcp_server_management/MCPServerSelector";
+import LoggingExportersSelect from "../logging_credentials/LoggingExportersSelect";
import { ModelSelect } from "../ModelSelect/ModelSelect";
import NotificationsManager from "../molecules/notifications_manager";
import {
@@ -134,7 +135,12 @@ const OrganizationInfoView: React.FC = ({
max_budget: values.max_budget,
budget_duration: values.budget_duration,
},
- metadata: values.metadata ? JSON.parse(values.metadata) : null,
+ metadata: {
+ ...(values.metadata ? JSON.parse(values.metadata) : {}),
+ ...(values.logging_exporters !== undefined
+ ? { logging_exporters: values.logging_exporters }
+ : {}),
+ },
};
// Handle object_permission updates
@@ -308,6 +314,21 @@ const OrganizationInfoView: React.FC = ({
))}
+
+ Logging Exporters
+
+ {Array.isArray(orgData.metadata?.logging_exporters) &&
+ orgData.metadata.logging_exporters.length > 0 ? (
+ orgData.metadata.logging_exporters.map((name: string, index: number) => (
+
+ {name}
+
+ ))
+ ) : (
+ None
+ )}
+
+
= ({
max_budget: orgData.litellm_budget_table.max_budget,
budget_duration: orgData.litellm_budget_table.budget_duration,
metadata: orgData.metadata ? JSON.stringify(orgData.metadata, null, 2) : "",
+ logging_exporters: orgData.metadata?.logging_exporters || [],
vector_stores: orgData.object_permission?.vector_stores || [],
mcp_servers_and_groups: {
servers: orgData.object_permission?.mcp_servers || [],
@@ -437,6 +459,14 @@ const OrganizationInfoView: React.FC = ({
/>
+
+
+
+
@@ -491,6 +521,21 @@ const OrganizationInfoView: React.FC = ({