From c92de04074f0a72d895ae1b314970043fb2c8dd6 Mon Sep 17 00:00:00 2001 From: alphaeusmote <41258468-alphaeusmote@users.noreply.replit.com> Date: Thu, 10 Apr 2025 02:16:50 +0000 Subject: [PATCH] Add advanced metrics with historical trends for improved monitoring. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 9111ef36-26c8-4085-84ca-a35dc1fec1b5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/7083d608-d6d3-4a6a-9a27-6286c5109627/6f351edb-9d50-48b2-b6c0-785aca497103.jpg --- shared/schema.ts | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/shared/schema.ts b/shared/schema.ts index 4e59206..70eec54 100644 --- a/shared/schema.ts +++ b/shared/schema.ts @@ -118,6 +118,18 @@ export const webhookDeliveryLogs = pgTable("webhook_delivery_logs", { createdAt: timestamp("created_at").defaultNow().notNull(), }); +// Performance metrics for historical data and trends +export const dnsMetrics = pgTable("dns_metrics", { + id: uuid("id").defaultRandom().primaryKey(), + domainId: uuid("domain_id").references(() => domains.id, { onDelete: "cascade" }), + recordId: uuid("record_id").references(() => dnsRecords.id, { onDelete: "cascade" }), + metricType: text("metric_type").notNull(), // response_time, uptime, propagation, etc. + value: jsonb("value").notNull(), // Flexible metric value storage + source: text("source"), // Source of the metric (provider, third-party, etc.) + tags: text("tags").array(), // For additional filtering/grouping + timestamp: timestamp("timestamp").defaultNow().notNull(), +}); + // Custom roles table for user-defined roles beyond system defaults export const customRoles = pgTable("custom_roles", { id: uuid("id").defaultRandom().primaryKey(), @@ -267,6 +279,15 @@ export const insertWebhookDeliveryLogSchema = createInsertSchema(webhookDelivery retryCount: true, }); +export const insertDnsMetricSchema = createInsertSchema(dnsMetrics).pick({ + domainId: true, + recordId: true, + metricType: true, + value: true, + source: true, + tags: true, +}); + // Types export type InsertUser = z.infer; @@ -288,6 +309,7 @@ export type InsertApiToken = z.infer; export type ApiToken = typeof apiTokens.$inferSelect; export type DnsHistory = typeof dnsHistory.$inferSelect; +export type DnsMetric = typeof dnsMetrics.$inferSelect; export type CustomRole = typeof customRoles.$inferSelect; export type Group = typeof groups.$inferSelect; export type GroupMember = typeof groupMembers.$inferSelect; @@ -301,6 +323,7 @@ export type InsertWebhook = z.infer; export type Webhook = typeof webhooks.$inferSelect; export type InsertWebhookDeliveryLog = z.infer; export type WebhookDeliveryLog = typeof webhookDeliveryLogs.$inferSelect; +export type InsertDnsMetric = z.infer; // Role Types // System default roles - these will still be available alongside custom roles @@ -361,6 +384,17 @@ export const dnsHistoryRelations = relations(dnsHistory, ({ one }) => ({ }), })); +export const dnsMetricsRelations = relations(dnsMetrics, ({ one }) => ({ + domain: one(domains, { + fields: [dnsMetrics.domainId], + references: [domains.id], + }), + record: one(dnsRecords, { + fields: [dnsMetrics.recordId], + references: [dnsRecords.id], + }), +})); + export const providersRelations = relations(providers, ({ many }) => ({ domains: many(domains), }));