diff --git a/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx b/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx index fb62e0e5360..1913b4ba78a 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogSelection.tsx @@ -42,6 +42,8 @@ const LogSelection = ({ log, onClose, queryType, isLoading, error }: LogSelectio case 'database': return + case 'pg_cron': + return case 'fn_edge': return diff --git a/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx b/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx index ba438fac150..f83f79c0f8d 100644 --- a/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx +++ b/apps/studio/components/interfaces/Settings/Logs/LogTable.tsx @@ -173,6 +173,9 @@ const LogTable = ({ case 'auth': columns = AuthColumnRenderer break + case 'pg_cron': + columns = DatabasePostgresColumnRender + break default: if (firstRow && isDefaultLogPreviewFormat(firstRow)) { diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.constants.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.constants.ts index 4168bea354c..8323db71696 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.constants.ts +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.constants.ts @@ -363,6 +363,7 @@ export enum LogsTableName { POSTGREST = 'postgrest_logs', SUPAVISOR = 'supavisor_logs', WAREHOUSE = 'warehouse_logs', + PG_CRON = 'pg_cron', } export const LOGS_TABLES = { @@ -376,6 +377,7 @@ export const LOGS_TABLES = { postgrest: LogsTableName.POSTGREST, supavisor: LogsTableName.SUPAVISOR, warehouse: LogsTableName.WAREHOUSE, + pg_cron: LogsTableName.POSTGRES, } export const LOGS_SOURCE_DESCRIPTION = { @@ -389,6 +391,7 @@ export const LOGS_SOURCE_DESCRIPTION = { [LogsTableName.POSTGREST]: 'RESTful API web server logs', [LogsTableName.SUPAVISOR]: 'Cloud-native Postgres connection pooler logs', [LogsTableName.WAREHOUSE]: 'Logs obtained from a data warehouse collection', + [LogsTableName.PG_CRON]: 'Logs obtained from pg_cron', } export const genQueryParams = (params: { [k: string]: string }) => { diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.types.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.types.ts index f9c055618af..565c00e41b1 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.types.ts +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.types.ts @@ -88,6 +88,7 @@ export type QueryType = | 'supavisor' | 'postgrest' | 'warehouse' + | 'pg_cron' export type Mode = 'simple' | 'custom' diff --git a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts index b4c4732ee15..5d941ede204 100644 --- a/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts +++ b/apps/studio/components/interfaces/Settings/Logs/Logs.utils.ts @@ -211,6 +211,17 @@ limit ${limit} ${orderBy} limit ${limit} ` + + case 'pg_cron': + return `select identifier, postgres_logs.timestamp, id, event_message, parsed.error_severity +from postgres_logs + cross join unnest(metadata) as m + cross join unnest(m.parsed) as parsed +where parsed.application_name = 'pg_cron' +${where} +${orderBy} +limit ${limit} +` } } diff --git a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx index ae123766bdf..d24b38bfa3f 100644 --- a/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx +++ b/apps/studio/components/layouts/LogsLayout/LogsSidebarMenuV2.tsx @@ -164,6 +164,12 @@ export function LogsSidebarMenuV2() { url: `/project/${ref}/logs/edge-functions-logs`, items: [], }, + { + name: 'Cron Jobs', + key: 'pg_cron', + url: `/project/${ref}/logs/pgcron-logs`, + items: [], + }, ] const filteredLogs = BASE_COLLECTIONS.filter((collection) => { diff --git a/apps/studio/pages/project/[ref]/logs/pgcron-logs.tsx b/apps/studio/pages/project/[ref]/logs/pgcron-logs.tsx new file mode 100644 index 00000000000..25ba5c01e35 --- /dev/null +++ b/apps/studio/pages/project/[ref]/logs/pgcron-logs.tsx @@ -0,0 +1,24 @@ +import { useRouter } from 'next/router' + +import { LogsTableName } from 'components/interfaces/Settings/Logs/Logs.constants' +import LogsPreviewer from 'components/interfaces/Settings/Logs/LogsPreviewer' +import LogsLayout from 'components/layouts/LogsLayout/LogsLayout' +import type { NextPageWithLayout } from 'types' + +export const LogPage: NextPageWithLayout = () => { + const router = useRouter() + const { ref } = router.query + + return ( + + ) +} + +LogPage.getLayout = (page) => {page} + +export default LogPage