diff --git a/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx b/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx index 0f42bf05878..ffd19f2e298 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx @@ -15,7 +15,7 @@ import { import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import DefaultPreviewSelectionRenderer from './LogSelectionRenderers/DefaultPreviewSelectionRenderer' import type { LogData, QueryType } from './Logs.types' -import { jwtAPIKey, apiKey, role as extractRole } from './Logs.utils' +import { apiKey, role as extractRole, jwtAPIKey } from './Logs.utils' export interface LogSelectionProps { log?: LogData @@ -97,6 +97,7 @@ const LogSelection = ({ log, onClose, queryType, isLoading, error }: LogSelectio Raw +
+ {selectionOpen && ( diff --git a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx index 98ab6f2b58a..17bc50b429f 100644 --- a/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx +++ b/apps/studio/components/interfaces/UnifiedLogs/ServiceFlowPanel.tsx @@ -3,6 +3,7 @@ import { useState } from 'react' import { useParams } from 'common' import { useDataTable } from 'components/ui/DataTable/providers/DataTableProvider' import { ServiceFlowType, useUnifiedLogInspectionQuery } from 'data/logs' +import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { CodeBlock, ResizableHandle, @@ -43,6 +44,8 @@ export function ServiceFlowPanel({ const { ref: projectRef } = useParams() const [activeTab, setActiveTab] = useState('service-flow') + const { logsMetadata } = useIsFeatureEnabled(['logs:metadata']) + const logType = selectedRow?.log_type const serviceFlowType: ServiceFlowType | undefined = logType === 'edge function' ? 'edge-function' : (logType as ServiceFlowType) @@ -69,6 +72,14 @@ export function ServiceFlowPanel({ const jsonData = shouldShowServiceFlow && serviceFlowData?.result?.[0] ? serviceFlowData.result[0] : selectedRow + const formattedJsonData = + !logsMetadata && 'raw_log_data' in jsonData && 'metadata' in jsonData.raw_log_data + ? { + ...jsonData, + raw_log_data: { ...jsonData.raw_log_data, metadata: undefined }, + } + : jsonData + if (selectedRowKey) { return ( <> @@ -218,7 +229,7 @@ export function ServiceFlowPanel({ language="json" className="max-h-[800px] overflow-auto border-none rounded-none [&_pre]:!leading-tight [&_code]:!leading-tight" > - {JSON.stringify(jsonData, null, 2)} + {JSON.stringify(formattedJsonData, null, 2)} diff --git a/apps/studio/hooks/analytics/useLogsQuery.tsx b/apps/studio/hooks/analytics/useLogsQuery.tsx index 33d9404c64e..0adedd21292 100644 --- a/apps/studio/hooks/analytics/useLogsQuery.tsx +++ b/apps/studio/hooks/analytics/useLogsQuery.tsx @@ -16,6 +16,7 @@ import { checkForWithClause, } from 'components/interfaces/Settings/Logs/Logs.utils' import { get } from 'data/fetchers' +import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' import { DOCS_URL } from 'lib/constants' export interface LogsQueryHook { @@ -46,6 +47,8 @@ const useLogsQuery = ( : defaultHelper.calcTo(), }) + const { logsMetadata } = useIsFeatureEnabled(['logs:metadata']) + useEffect(() => { setParams((prev) => ({ ...prev, @@ -113,10 +116,19 @@ const useLogsQuery = ( setParams((prev) => ({ ...prev, sql: newQuery })) } + const logData = (data?.result ?? []).map((x) => { + if (logsMetadata) { + return x + } else { + const { metadata, ...log } = x + return log + } + }) + return { params, isLoading: (_enabled && isLoading) || isRefetching, - logData: data?.result ?? [], + logData: logData, error, changeQuery, runQuery: () => refetch(), diff --git a/apps/studio/hooks/analytics/useSingleLog.tsx b/apps/studio/hooks/analytics/useSingleLog.tsx index b773b45e673..6e0dbe9cc50 100644 --- a/apps/studio/hooks/analytics/useSingleLog.tsx +++ b/apps/studio/hooks/analytics/useSingleLog.tsx @@ -8,6 +8,7 @@ import type { } from 'components/interfaces/Settings/Logs/Logs.types' import { genSingleLogQuery } from 'components/interfaces/Settings/Logs/Logs.utils' import { get } from 'data/fetchers' +import { useIsFeatureEnabled } from 'hooks/misc/useIsFeatureEnabled' interface SingleLogHook { data: LogData | undefined @@ -35,6 +36,8 @@ function useSingleLog({ const enabled = Boolean(id && table) + const { logsMetadata } = useIsFeatureEnabled(['logs:metadata']) + const { data, error: rcError, @@ -67,8 +70,11 @@ function useSingleLog({ let error: null | string | object = rcError ? (rcError as any).message : null const result = data?.result ? data.result[0] : undefined + return { - data: result, + data: !!result + ? { ...result, metadata: logsMetadata ? result?.metadata : undefined } + : undefined, isLoading: (enabled && isLoading) || isRefetching, error, refresh: () => refetch(), diff --git a/packages/common/enabled-features/enabled-features.json b/packages/common/enabled-features/enabled-features.json index b5da63241e5..e6a8f46bbc0 100644 --- a/packages/common/enabled-features/enabled-features.json +++ b/packages/common/enabled-features/enabled-features.json @@ -68,6 +68,7 @@ "logs:templates": true, "logs:collections": true, + "logs:metadata": true, "logs:show_metadata_ip_template": true, "organization:show_sso_settings": true, diff --git a/packages/common/enabled-features/enabled-features.schema.json b/packages/common/enabled-features/enabled-features.schema.json index e491f749764..54ba0767619 100644 --- a/packages/common/enabled-features/enabled-features.schema.json +++ b/packages/common/enabled-features/enabled-features.schema.json @@ -245,6 +245,10 @@ "type": "boolean", "description": "Enable the logs collections page" }, + "logs:metadata": { + "type": "boolean", + "description": "Show the metadata field for logs in logs explorer" + }, "logs:show_metadata_ip_template": { "type": "boolean", "description": "Show the Metadata IP template in the logs explorer" @@ -449,6 +453,7 @@ "profile:show_account_deletion", "logs:templates", "logs:collections", + "logs:metadata", "logs:show_metadata_ip_template", "organization:show_sso_settings", "project_creation:show_advanced_config",