From e301e253d0dcb09727fad580635a170bea5221ab Mon Sep 17 00:00:00 2001 From: Simon Larsen Date: Mon, 28 Apr 2025 18:05:48 +0100 Subject: [PATCH] feat: Add projectId to various monitor response and criteria interfaces --- .../Utils/Monitor/Criteria/APIRequestCriteria.ts | 1 + .../Server/Utils/Monitor/Criteria/EvaluateOverTime.ts | 8 ++++++-- .../Utils/Monitor/Criteria/IncomingRequestCriteria.ts | 1 + .../Utils/Monitor/Criteria/SSLMonitorCriteria.ts | 1 + .../Utils/Monitor/Criteria/ServerMonitorCriteria.ts | 1 + .../Server/Utils/Monitor/Criteria/SyntheticMonitor.ts | 1 + Common/Server/Utils/Monitor/MonitorResource.ts | 11 +++++++++++ .../Monitor/IncomingMonitor/IncomingMonitorRequest.ts | 1 + Common/Types/Monitor/LogMonitor/LogMonitorResponse.ts | 1 + .../Monitor/MetricMonitor/MetricMonitorResponse.ts | 1 + .../Monitor/ServerMonitor/ServerMonitorResponse.ts | 1 + .../Monitor/TraceMonitor/TraceMonitorResponse.ts | 1 + Common/Types/Probe/ProbeMonitorResponse.ts | 1 + IncomingRequestIngest/API/IncomingRequest.ts | 8 +++++++- IncomingRequestIngest/package-lock.json | 5 +++-- 15 files changed, 38 insertions(+), 5 deletions(-) diff --git a/Common/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts b/Common/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts index 2e2ff0607a..b80b3cdc82 100644 --- a/Common/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts +++ b/Common/Server/Utils/Monitor/Criteria/APIRequestCriteria.ts @@ -32,6 +32,7 @@ export default class APIRequestCriteria { ) { try { overTimeValue = await EvaluateOverTime.getValueOverTime({ + projectId: (input.dataToProcess as ProbeMonitorResponse).projectId, monitorId: input.dataToProcess.monitorId!, evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions, metricType: input.criteriaFilter.checkOn, diff --git a/Common/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts b/Common/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts index f287131be9..1a304c8e30 100644 --- a/Common/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +++ b/Common/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts @@ -1,5 +1,4 @@ import Query from "../../../Types/AnalyticsDatabase/Query"; -import GreaterThanOrEqual from "Common/Types/BaseDatabase/GreaterThanOrEqual"; import { LIMIT_PER_PROJECT } from "Common/Types/Database/LimitMax"; import OneUptimeDate from "Common/Types/Date"; import { JSONObject } from "Common/Types/JSON"; @@ -13,10 +12,12 @@ import Metric from "../../../../Models/AnalyticsModels/Metric"; import MonitorMetricTypeUtil from "../../../../Utils/Monitor/MonitorMetricType"; import MetricService from "../../../Services/MetricService"; import CaptureSpan from "../../Telemetry/CaptureSpan"; +import QueryHelper from "../../../Types/Database/QueryHelper"; export default class EvaluateOverTime { @CaptureSpan() public static async getValueOverTime(data: { + projectId: ObjectID; monitorId: ObjectID; evaluateOverTimeOptions: EvaluateOverTimeOptions; metricType: CheckOn; @@ -30,8 +31,11 @@ export default class EvaluateOverTime { // TODO: Query over miscData + const now: Date = OneUptimeDate.getCurrentDate(); + const query: Query = { - createdAt: new GreaterThanOrEqual(lastMinutesDate), + projectId: data.projectId, + time: QueryHelper.inBetween(lastMinutesDate, now), serviceId: data.monitorId, name: MonitorMetricTypeUtil.getMonitorMeticTypeByCheckOn(data.metricType), }; diff --git a/Common/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts b/Common/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts index 198962e94e..d010018019 100644 --- a/Common/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +++ b/Common/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts @@ -46,6 +46,7 @@ export default class IncomingRequestCriteria { ) { try { overTimeValue = await EvaluateOverTime.getValueOverTime({ + projectId: (input.dataToProcess as IncomingMonitorRequest).projectId, monitorId: input.dataToProcess.monitorId!, evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions, metricType: input.criteriaFilter.checkOn, diff --git a/Common/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts b/Common/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts index 2543e6ac1c..5e1efc2bb8 100644 --- a/Common/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +++ b/Common/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts @@ -36,6 +36,7 @@ export default class ServerMonitorCriteria { ) { try { overTimeValue = await EvaluateOverTime.getValueOverTime({ + projectId: (input.dataToProcess as ProbeMonitorResponse).projectId, monitorId: input.dataToProcess.monitorId!, evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions, metricType: input.criteriaFilter.checkOn, diff --git a/Common/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts b/Common/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts index 5b49a34780..b7dd3b9701 100644 --- a/Common/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts +++ b/Common/Server/Utils/Monitor/Criteria/ServerMonitorCriteria.ts @@ -34,6 +34,7 @@ export default class ServerMonitorCriteria { ) { try { overTimeValue = await EvaluateOverTime.getValueOverTime({ + projectId: (input.dataToProcess as ServerMonitorResponse).projectId, monitorId: input.dataToProcess.monitorId!, evaluateOverTimeOptions: input.criteriaFilter.evaluateOverTimeOptions, metricType: input.criteriaFilter.checkOn, diff --git a/Common/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts b/Common/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts index 0a036c528f..5478a53ad0 100644 --- a/Common/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts +++ b/Common/Server/Utils/Monitor/Criteria/SyntheticMonitor.ts @@ -17,6 +17,7 @@ export default class SyntheticMonitoringCriteria { // check custom code monitoring criteria first const result: string | null = await CustomCodeMonitoringCriteria.isMonitorInstanceCriteriaFilterMet({ + monitorResponse: syntheticMonitorResponse, criteriaFilter: input.criteriaFilter, }); diff --git a/Common/Server/Utils/Monitor/MonitorResource.ts b/Common/Server/Utils/Monitor/MonitorResource.ts index 73ea92a1b3..b40da2a9a9 100644 --- a/Common/Server/Utils/Monitor/MonitorResource.ts +++ b/Common/Server/Utils/Monitor/MonitorResource.ts @@ -102,6 +102,8 @@ export default class MonitorResourceUtil { }, }); + + logger.debug("Monitor found"); logger.debug("Monitor ID: " + dataToProcess.monitorId); @@ -110,6 +112,15 @@ export default class MonitorResourceUtil { throw new BadDataException("Monitor not found"); } + if(!monitor.projectId){ + logger.debug( + `${dataToProcess.monitorId.toString()} Monitor does not have a projectId`, + ); + throw new BadDataException("Monitor does not have a projectId"); + } + + dataToProcess.projectId = monitor.projectId; + if (monitor.disableActiveMonitoring) { logger.debug( `${dataToProcess.monitorId.toString()} Monitor is disabled. Please enable it to start monitoring again.`, diff --git a/Common/Types/Monitor/IncomingMonitor/IncomingMonitorRequest.ts b/Common/Types/Monitor/IncomingMonitor/IncomingMonitorRequest.ts index 9e62b66392..cace5261cc 100644 --- a/Common/Types/Monitor/IncomingMonitor/IncomingMonitorRequest.ts +++ b/Common/Types/Monitor/IncomingMonitor/IncomingMonitorRequest.ts @@ -4,6 +4,7 @@ import { JSONObject } from "../../JSON"; import ObjectID from "../../ObjectID"; export default interface IncomingMonitorRequest { + projectId: ObjectID; monitorId: ObjectID; requestHeaders?: Dictionary | undefined; requestBody?: string | JSONObject | undefined; diff --git a/Common/Types/Monitor/LogMonitor/LogMonitorResponse.ts b/Common/Types/Monitor/LogMonitor/LogMonitorResponse.ts index 6f2533aa06..7920d0ea4b 100644 --- a/Common/Types/Monitor/LogMonitor/LogMonitorResponse.ts +++ b/Common/Types/Monitor/LogMonitor/LogMonitorResponse.ts @@ -3,6 +3,7 @@ import Query from "../../BaseDatabase/Query"; import ObjectID from "../../ObjectID"; export default interface LogMonitorResponse { + projectId: ObjectID; logCount: number; logQuery: Query; monitorId: ObjectID; diff --git a/Common/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts b/Common/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts index 97033c7887..d1b4f20a6f 100644 --- a/Common/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +++ b/Common/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts @@ -4,6 +4,7 @@ import MetricsViewConfig from "../../Metrics/MetricsViewConfig"; import ObjectID from "../../ObjectID"; export default interface MetricMonitorResponse { + projectId: ObjectID; startAndEndDate?: InBetween; metricResult: Array; metricViewConfig: MetricsViewConfig; diff --git a/Common/Types/Monitor/ServerMonitor/ServerMonitorResponse.ts b/Common/Types/Monitor/ServerMonitor/ServerMonitorResponse.ts index a003db403c..0ee62cc2b9 100644 --- a/Common/Types/Monitor/ServerMonitor/ServerMonitorResponse.ts +++ b/Common/Types/Monitor/ServerMonitor/ServerMonitorResponse.ts @@ -8,6 +8,7 @@ export interface ServerProcess { } export default interface ServerMonitorResponse { + projectId: ObjectID; monitorId: ObjectID; hostname: string; // Hostname of the server basicInfrastructureMetrics?: BasicInfrastructureMetrics | undefined; diff --git a/Common/Types/Monitor/TraceMonitor/TraceMonitorResponse.ts b/Common/Types/Monitor/TraceMonitor/TraceMonitorResponse.ts index 050cb917f4..9e02a5e4e2 100644 --- a/Common/Types/Monitor/TraceMonitor/TraceMonitorResponse.ts +++ b/Common/Types/Monitor/TraceMonitor/TraceMonitorResponse.ts @@ -3,6 +3,7 @@ import ObjectID from "../../ObjectID"; import Span from "../../../Models/AnalyticsModels/Span"; export default interface TraceMonitorResponse { + projectId: ObjectID; spanCount: number; spanQuery: Query; monitorId: ObjectID; diff --git a/Common/Types/Probe/ProbeMonitorResponse.ts b/Common/Types/Probe/ProbeMonitorResponse.ts index 6315e46680..85c9ec8937 100644 --- a/Common/Types/Probe/ProbeMonitorResponse.ts +++ b/Common/Types/Probe/ProbeMonitorResponse.ts @@ -10,6 +10,7 @@ import ObjectID from "../ObjectID"; import Port from "../Port"; export default interface ProbeMonitorResponse { + projectId: ObjectID; isOnline?: boolean | undefined; monitorDestination?: URL | IP | Hostname | undefined; monitorDestinationPort?: Port | undefined; diff --git a/IncomingRequestIngest/API/IncomingRequest.ts b/IncomingRequestIngest/API/IncomingRequest.ts index aa73ce123d..63f0665210 100644 --- a/IncomingRequestIngest/API/IncomingRequest.ts +++ b/IncomingRequestIngest/API/IncomingRequest.ts @@ -57,6 +57,7 @@ const processIncomingRequest: RequestHandler = async ( }, select: { _id: true, + projectId: true, }, props: { isRoot: true, @@ -67,8 +68,13 @@ const processIncomingRequest: RequestHandler = async ( throw new BadDataException("Monitor not found"); } + if(!monitor.projectId) { + throw new BadDataException("Project not found"); + } + const incomingRequest: IncomingMonitorRequest = { - monitorId: new ObjectID(monitor._id), + projectId: monitor.projectId, + monitorId: new ObjectID(monitor._id.toString()), requestHeaders: requestHeaders, requestBody: requestBody, incomingRequestReceivedAt: OneUptimeDate.getCurrentDate(), diff --git a/IncomingRequestIngest/package-lock.json b/IncomingRequestIngest/package-lock.json index ea7fe440f5..2dae115ef5 100644 --- a/IncomingRequestIngest/package-lock.json +++ b/IncomingRequestIngest/package-lock.json @@ -27,7 +27,7 @@ "license": "Apache-2.0", "dependencies": { "@bull-board/express": "^5.21.4", - "@clickhouse/client": "^1.8.1", + "@clickhouse/client": "^1.10.1", "@elastic/elasticsearch": "^8.12.1", "@monaco-editor/react": "^4.4.6", "@opentelemetry/api": "^1.9.0", @@ -82,7 +82,7 @@ "nodemailer": "^6.9.10", "otpauth": "^9.3.1", "pg": "^8.7.3", - "playwright": "^1.48.2", + "playwright": "^1.50.0", "posthog-js": "^1.139.6", "prop-types": "^15.8.1", "qrcode": "^1.5.3", @@ -105,6 +105,7 @@ "redis-semaphore": "^5.5.1", "reflect-metadata": "^0.2.2", "remark-gfm": "^3.0.1", + "slackify-markdown": "^4.4.0", "slugify": "^1.6.5", "socket.io": "^4.7.4", "socket.io-client": "^4.7.5",