import FullPageLoader from "@/components/fullPageLoader"; import { Badge } from "@/components/ui/badge"; import { setSelectedPlugin, useAppDispatch, useGetPluginsQuery } from "@/lib/store"; import { cn } from "@/lib/utils"; import { useTheme } from "next-themes"; import { useQueryState } from "nuqs"; import { useEffect, useMemo } from "react"; import BigQueryView from "./plugins/bigqueryView"; import DatadogView from "./plugins/datadogView"; import MaximView from "./plugins/maximView"; import NewrelicView from "./plugins/newRelicView"; import OtelView from "./plugins/otelView"; import PrometheusView from "./plugins/prometheusView"; type SupportedPlatform = { id: string; name: string; icon: React.ReactNode; tag?: string; disabled?: boolean; }; const supportedPlatformsList = (resolvedTheme: string): SupportedPlatform[] => [ { id: "otel", name: "Open Telemetry", icon: ( ), }, { id: "prometheus", name: "Prometheus", icon: Prometheus, }, { id: "maxim", name: "Maxim", icon: Maxim, }, { id: "datadog", name: "Datadog", icon: Datadog, }, { id: "bigquery", name: "BigQuery", icon: BigQuery, }, { id: "newrelic", name: "New Relic", icon: ( ), disabled: true, }, ]; export default function ObservabilityView() { const dispatch = useAppDispatch(); const { data: plugins, isLoading } = useGetPluginsQuery(); const [selectedPluginId, setSelectedPluginId] = useQueryState("plugin"); const { resolvedTheme } = useTheme(); const supportedPlatforms = useMemo(() => supportedPlatformsList(resolvedTheme || "light"), [resolvedTheme]); // Map UI tab IDs to actual plugin names (prometheus tab uses telemetry plugin) const getPluginNameForTab = (tabId: string) => (tabId === "prometheus" ? "telemetry" : tabId); useEffect(() => { if (!plugins || plugins.length === 0) return; if (!selectedPluginId) { setSelectedPluginId(supportedPlatforms[0].id); } else { const pluginName = getPluginNameForTab(selectedPluginId); const plugin = plugins.find((plugin) => plugin.name === pluginName) ?? { name: selectedPluginId, enabled: false, config: {}, isCustom: false, path: "", }; dispatch(setSelectedPlugin(plugin)); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [plugins]); useEffect(() => { if (selectedPluginId) { const pluginName = getPluginNameForTab(selectedPluginId); const plugin = plugins?.find((plugin) => plugin.name === pluginName) ?? { name: selectedPluginId, enabled: false, config: {}, isCustom: false, path: "", }; dispatch(setSelectedPlugin(plugin)); } else { setSelectedPluginId(supportedPlatforms[0].id); } }, [selectedPluginId]); if (isLoading) { return ; } return (
Providers
{supportedPlatforms.map((tab) => ( ))}
{selectedPluginId === "prometheus" && } {selectedPluginId === "otel" && } {selectedPluginId === "maxim" && } {selectedPluginId === "datadog" && } {selectedPluginId === "bigquery" && } {selectedPluginId === "newrelic" && }
); }