import { useFlag, useParams } from 'common' import { ExternalLink, RefreshCw } from 'lucide-react' import Link from 'next/link' import { useQueryState } from 'nuqs' import { useEffect } from 'react' import { Button, cn, CriticalIcon, Separator } from 'ui' import { Admonition } from 'ui-patterns/Admonition' import { GenericSkeletonLoader } from 'ui-patterns/ShimmeringLoader' import { TimestampInfo } from 'ui-patterns/TimestampInfo' import { UserHeader } from './UserHeader' import { PANEL_PADDING } from './Users.constants' import { LOGS_TABLES } from '@/components/interfaces/Settings/Logs/Logs.constants' import { ButtonTooltip } from '@/components/ui/ButtonTooltip' import { User } from '@/data/auth/users-infinite-query' import { pickLogsQueryBuilder } from '@/data/logs/logs-endpoint' import { analyticsLiteral, safeSql } from '@/data/logs/safe-analytics-sql' import useLogsPreview from '@/hooks/analytics/useLogsPreview' import { useLogsUrlState } from '@/hooks/analytics/useLogsUrlState' interface UserLogsProps { user: User } const getApiLogsQuery = (userId: string) => safeSql` select cast(timestamp as datetime) as timestamp, event_message, metadata from edge_logs where metadata[SAFE_OFFSET(0)].request[SAFE_OFFSET(0)].sb[SAFE_OFFSET(0)].auth_user = ${analyticsLiteral(userId)} limit 100 ` const getApiLogsQueryOtel = (userId: string) => safeSql` select timestamp, event_message, log_attributes from logs where source = 'auth_logs' and log_attributes['auth_event.actor_id'] = ${analyticsLiteral(userId)} order by timestamp desc limit 100 ` export const UserLogs = ({ user }: UserLogsProps) => { const { ref } = useParams() const useOtel = useFlag('otelLegacyLogs') const { filters, setFilters } = useLogsUrlState() const [, setFiltersValue] = useQueryState('f') const apiLogsQuery = pickLogsQueryBuilder( useOtel, getApiLogsQueryOtel, getApiLogsQuery )(user.id ?? '') const { logData: authLogs, isSuccess: isSuccessAuthLogs, isLoading: isLoadingAuthLogs, refresh, } = useLogsPreview({ projectRef: ref as string, table: LOGS_TABLES.auth, filterOverride: { search_query: user.id }, limit: 5, }) useEffect(() => { if (user.id) setFilters({ ...filters, search_query: user.id }) return () => { setFiltersValue(null) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [user.id]) return (
Auth API logs
View logs associated with this Auth user
Authentication logs
Latest logs from authentication for this user in the past hour
{`${log.path} | ${log.msg}`}