@oneuptime/common 13.0.7 → 14.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/AuditLog.ts +23 -15
- package/Models/DatabaseModels/GlobalConfig.ts +24 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +1 -1
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +1 -1
- package/Scripts/generate-service-worker.js +65 -4
- package/Server/API/AIBillingAPI.ts +1 -0
- package/Server/API/AIInsightAPI.ts +1 -4
- package/Server/API/AIInvestigationAPI.ts +1 -4
- package/Server/API/AIReadinessAPI.ts +4 -5
- package/Server/API/AlertAPI.ts +1 -0
- package/Server/API/AutoRemediationAPI.ts +1 -4
- package/Server/API/BaseAPI.ts +34 -0
- package/Server/API/BaseAnalyticsAPI.ts +80 -9
- package/Server/API/BillingAPI.ts +2 -0
- package/Server/API/BillingInvoiceAPI.ts +1 -0
- package/Server/API/BillingPaymentMethodAPI.ts +2 -0
- package/Server/API/CodeFixRunAPI.ts +1 -3
- package/Server/API/CommonAPI.ts +68 -4
- package/Server/API/DashboardAPI.ts +12 -12
- package/Server/API/GlobalConfigAPI.ts +243 -460
- package/Server/API/IncidentAPI.ts +2 -0
- package/Server/API/IncidentEpisodeAPI.ts +1 -0
- package/Server/API/NotificationAPI.ts +1 -0
- package/Server/API/OnCallCalendarAPI.ts +4 -5
- package/Server/API/OnCallDutyPolicyAPI.ts +7 -0
- package/Server/API/OnCallReadinessAPI.ts +4 -1
- package/Server/API/OnCallScheduleTimelineAPI.ts +731 -0
- package/Server/API/ProjectAPI.ts +1 -0
- package/Server/API/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/ScheduledMaintenanceAPI.ts +1 -0
- package/Server/API/StatusPageAPI.ts +261 -74
- package/Server/API/TeamMemberAPI.ts +13 -1
- package/Server/API/UserCallAPI.ts +2 -0
- package/Server/API/UserEmailAPI.ts +2 -0
- package/Server/API/UserIncomingCallNumberAPI.ts +2 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +1 -0
- package/Server/API/UserSlackAPI.ts +1 -0
- package/Server/API/UserSmsAPI.ts +2 -0
- package/Server/API/UserTotpAuthAPI.ts +1 -0
- package/Server/API/UserWebAuthnAPI.ts +2 -0
- package/Server/API/UserWebhookAPI.ts +1 -0
- package/Server/API/UserWhatsAppAPI.ts +2 -0
- package/Server/Enterprise/EnterpriseEdition.ts +649 -0
- package/Server/Enterprise/EnterpriseFeature.ts +48 -0
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
- package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
- package/Server/EnvironmentConfig.ts +147 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +2 -0
- package/Server/Middleware/MasterAdminAuthorization.ts +13 -2
- package/Server/Middleware/UserAuthorization.ts +117 -21
- package/Server/Services/ApiKeyPermissionService.ts +101 -4
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +245 -0
- package/Server/Services/DetectionRuleService.ts +5 -4
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +56 -4
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- package/Server/Services/OnCallDutyPolicyChildService.ts +261 -0
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.ts +2 -2
- package/Server/Services/OnCallDutyPolicyEscalationRuleUserService.ts +2 -2
- package/Server/Services/PayAsYouGoBillingService.ts +23 -28
- package/Server/Services/ProjectService.ts +302 -0
- package/Server/Services/RumSessionPinService.ts +293 -22
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamPermissionService.ts +120 -26
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/ThreatIntelFeedService.ts +6 -3
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/BasePermission.ts +9 -7
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/Index.ts +75 -11
- package/Server/Types/Database/Permissions/TablePermission.ts +34 -31
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Utils/AI/AIChatPrivacyFilter.ts +8 -0
- package/Server/Utils/AI/AIRunPrivacyFilter.ts +8 -0
- package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
- package/Server/Utils/EditionEnforcement.ts +233 -0
- package/Server/Utils/FrontendEnvironment.ts +41 -2
- package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
- package/Server/Utils/MasterAdminPageAccess.ts +61 -0
- package/Server/Utils/Monitor/AffectedResourceList.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/MonitorAlert.ts +3 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +543 -333
- package/Server/Utils/Monitor/MonitorIncident.ts +3 -1
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1 -1
- package/Server/Utils/Realtime.ts +163 -45
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +11 -28
- package/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.ts +170 -0
- package/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.ts +1 -1
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +6 -2
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.ts +10 -9
- package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
- package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
- package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
- package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +1059 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerEditForm.test.tsx +376 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +757 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +307 -0
- package/Tests/App/Dashboard/ArgumentsFormGroupByUnlistedAttributes.test.tsx +131 -0
- package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +1 -1
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +9 -1
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +24 -0
- package/Tests/App/Dashboard/DashboardVariableSelector.test.tsx +162 -8
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +105 -6
- package/Tests/App/Dashboard/EntityFilterDropdownUnlistedSelection.test.tsx +434 -0
- package/Tests/App/Dashboard/EscalationRuleReadiness.test.tsx +276 -1
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +9 -1
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +58 -42
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +42 -5
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +34 -23
- package/Tests/App/Dashboard/ScheduleTimeline.test.tsx +1580 -0
- package/Tests/App/Dashboard/ScheduleTimelineAPI.test.ts +280 -0
- package/Tests/App/Dashboard/ScheduleTimelineModel.test.ts +673 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +133 -70
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsDetectionRulesPage.test.tsx +86 -3
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -58
- package/Tests/App/Dashboard/SecurityEventsGuideContent.test.ts +1313 -0
- package/Tests/App/Dashboard/SecurityEventsHowItWorksCard.test.tsx +536 -0
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsNoResults.test.tsx +222 -0
- package/Tests/App/Dashboard/SecurityEventsThreatIntelPage.test.tsx +199 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +171 -36
- package/Tests/App/Dashboard/SloViewSideMenu.test.tsx +215 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +40 -3
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +12 -4
- package/Tests/App/PublicDashboard/PublicDashboardWidgetListAuth.test.tsx +623 -0
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
- package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
- package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +23 -1
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +138 -5
- package/Tests/Server/API/AIGenerationProjectAIToggle.test.ts +187 -0
- package/Tests/Server/API/AIInvestigationAvailabilityAuthorization.test.ts +51 -3
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +55 -2
- package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- package/Tests/Server/API/BaseAnalyticsAPIAggregateCache.test.ts +729 -0
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +93 -7
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +36 -3
- package/Tests/Server/API/CommonAPIAuthGuard.test.ts +1003 -24
- package/Tests/Server/API/DashboardPublicRateLimit.test.ts +6 -3
- package/Tests/Server/API/ExpiredSessionAIRoutes.test.ts +708 -0
- package/Tests/Server/API/ExpiredSessionCustomRoutes.test.ts +928 -0
- package/Tests/Server/API/ExpiredSessionMonitorTemplate.test.ts +319 -0
- package/Tests/Server/API/ExpiredSessionOnCallDutyPolicy.test.ts +336 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +820 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +766 -381
- package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +115 -12
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +375 -8
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +196 -912
- package/Tests/Server/API/OnCallScheduleTimelineAPI.test.ts +1513 -0
- package/Tests/Server/API/OnCallSetupReminderAPI.test.ts +119 -7
- package/Tests/Server/API/ProjectScopedCustomRouteAuth.test.ts +111 -4
- package/Tests/Server/API/PublicRouteInvalidAccessToken.test.ts +615 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +89 -2
- package/Tests/Server/API/SessionReplayAPI.test.ts +121 -0
- package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
- package/Tests/Server/API/StatusPageMasterPasswordRateLimit.test.ts +4 -2
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +441 -0
- package/Tests/Server/API/StatusPageTestEmailReportAuth.test.ts +664 -0
- package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
- package/Tests/Server/API/TeamMemberRemoveUserFromProjectAPI.test.ts +7 -0
- package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +6 -0
- package/Tests/Server/API/UserNotificationSettingAPI.test.ts +65 -4
- package/Tests/Server/API/UserProjectsAPI.test.ts +63 -3
- package/Tests/Server/API/UserTotpAuthAPI.test.ts +48 -2
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +11 -2
- package/Tests/Server/API/UserWebAuthnBackupCodeMinting.test.ts +46 -3
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +18 -2
- package/Tests/Server/API/ZZVerifyChatsAuth.test.ts +24 -7
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
- package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
- package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
- package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
- package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
- package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
- package/Tests/Server/Middleware/ExpiredSessionUserMiddleware.test.ts +563 -0
- package/Tests/Server/Middleware/MasterAdminAuthorization.test.ts +299 -19
- package/Tests/Server/Middleware/PublicRouteUserMiddleware.test.ts +453 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +24 -0
- package/Tests/Server/Services/ApiKeyPermissionSecurity.test.ts +2 -0
- package/Tests/Server/Services/ApiKeyPermissionService.test.ts +3 -3
- package/Tests/Server/Services/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- package/Tests/Server/Services/DatabaseServiceCreateSuppliedId.test.ts +147 -0
- package/Tests/Server/Services/DatabaseServiceLoginBeforeHooks.test.ts +1078 -0
- package/Tests/Server/Services/DatabaseServiceTenantRelationGuard.test.ts +259 -0
- package/Tests/Server/Services/DatabaseServiceWriteOperatorValues.test.ts +147 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
- package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
- package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +115 -1
- package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- package/Tests/Server/Services/OnCallChildCreateAuthorizationPostgres.test.ts +711 -0
- package/Tests/Server/Services/OnCallDutyPolicyChildService.test.ts +733 -0
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +190 -140
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +4 -9
- package/Tests/Server/Services/PermissionBlockDeletion.test.ts +780 -0
- package/Tests/Server/Services/PermissionBlockDeletionPostgres.test.ts +628 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +77 -1
- package/Tests/Server/Services/RumSessionPinCreatePermission.test.ts +715 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
- package/Tests/Server/Services/TeamMemberMultiTenantReadPostgres.test.ts +394 -0
- package/Tests/Server/Services/TeamPrivilegeEscalation.test.ts +6 -0
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +131 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +13 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Database/Permissions/ModelPermissionAnonymousRefusal.test.ts +518 -0
- package/Tests/Server/Types/Database/Permissions/MultiTenantPermissions.test.ts +350 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +282 -25
- package/Tests/Server/Types/Database/Permissions/TableLevelBlockPermission.test.ts +459 -0
- package/Tests/Server/Types/Markdown.test.ts +181 -0
- package/Tests/Server/Utils/AI/AIRunPrivacyFilter.test.ts +101 -9
- package/Tests/Server/Utils/AI/ChatAgentHelpers.test.ts +88 -4
- package/Tests/Server/Utils/AI/Toolbox/ExceptionTools.test.ts +459 -0
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +794 -0
- package/Tests/Server/Utils/AI/Toolbox/RecentChangesTools.test.ts +574 -0
- package/Tests/Server/Utils/AI/Toolbox/SecurityEventTools.test.ts +596 -0
- package/Tests/Server/Utils/CaptchaRequestAndLogging.test.ts +395 -0
- package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
- package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
- package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
- package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
- package/Tests/Server/Utils/MasterAdminPageAccess.test.ts +251 -0
- package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +616 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +934 -96
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
- package/Tests/Server/Utils/Realtime.test.ts +502 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorSeverity.test.ts +216 -0
- package/Tests/Server/Utils/SecurityEvent/DetectionRuleEvaluator.test.ts +142 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.test.ts +140 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepairClickhouseIntegration.test.ts +542 -0
- package/Tests/Server/Utils/Telemetry/ChangeEventRow.test.ts +743 -0
- package/Tests/Server/Utils/Telemetry/RuntimeMetrics.test.ts +465 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Alert.test.ts +202 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeams/Messages/ScheduledMaintenance.test.ts +231 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Alert.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/AlertEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/Incident.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/IncidentEpisode.test.ts +194 -0
- package/Tests/Server/Utils/Workspace/Slack/Messages/ScheduledMaintenance.test.ts +247 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/AI/AIInsightEvidence.test.ts +206 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/BaseDatabase/DatabaseCommonInteractionPropsUtilAnonymous.test.ts +144 -0
- package/Tests/Types/Call/CallProvider.test.ts +528 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
- package/Tests/Types/Kubernetes/KubernetesCostIngest.test.ts +236 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimeline.test.ts +736 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleTimelineLayout.test.ts +996 -0
- package/Tests/Types/SecurityEvent/SigmaRule.test.ts +142 -0
- package/Tests/Types/Workflow/Components/JSON.test.ts +182 -0
- package/Tests/UI/Components/BasicFormDropdownNormalization.test.tsx +116 -1
- package/Tests/UI/Components/Dropdown/DropdownAsyncOptions.test.tsx +81 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
- package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +165 -171
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- package/Tests/UI/Components/EventAttachmentList.test.tsx +174 -0
- package/Tests/UI/Components/Forms/BasicFormBurnRateTemplateDefaults.test.tsx +395 -0
- package/Tests/UI/Components/Forms/BasicFormCollapsibleSections.test.tsx +286 -0
- package/Tests/UI/Components/Forms/FormSummary.test.tsx +128 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableQueryChange.test.tsx +365 -0
- package/Tests/UI/Components/OpenAuthenticatedUrl.test.ts +358 -0
- package/Tests/UI/Components/SessionAwareImage.test.tsx +496 -0
- package/Tests/UI/Components/TelemetryHistogramZeroBuckets.test.tsx +190 -0
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/TooltipInteractive.test.tsx +97 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsChatsCardInstallGuidance.test.tsx +1 -1
- package/Tests/UI/Monitor/EvaluationLogListTimestamps.test.tsx +367 -0
- package/Tests/UI/Utils/API/BaseAPIRefreshSession.test.ts +1087 -0
- package/Tests/UI/Utils/API/DashboardHost.ts +12 -0
- package/Tests/UI/Utils/API/FakeAxiosServer.ts +183 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/UI/Utils/Cookie.test.ts +440 -0
- package/Tests/UI/Utils/ModelAPIRequestClient.test.ts +278 -0
- package/Tests/UI/Utils/Navigation.test.ts +33 -0
- package/Tests/UI/Utils/PricingPlan.test.ts +295 -0
- package/Tests/UI/Utils/Realtime.test.ts +759 -0
- package/Tests/UI/Utils/Telemetry/Telemetry.test.ts +500 -0
- package/Tests/Utils/APIInstanceDispatch.test.ts +311 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizerSeverity.test.ts +565 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.ts +40 -0
- package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
- package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
- package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
- package/Types/Database/CanonicalModelInstance.ts +102 -0
- package/Types/Database/TableColumn.ts +20 -6
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
- package/Types/IP/IPv6.ts +6 -1
- package/Types/Monitor/MonitorEvaluationSummary.ts +3 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- package/Types/OnCallDutyPolicy/ScheduleTimeline.ts +507 -0
- package/Types/OnCallDutyPolicy/ScheduleTimelineLayout.ts +589 -0
- package/Types/Realtime/EventName.ts +11 -0
- package/Types/SecurityEvent/DetectionFindingConstants.ts +14 -0
- package/Types/SecurityEvent/OcsfSeverity.ts +31 -26
- package/Types/SecurityEvent/SigmaRule.ts +51 -0
- package/Types/SecurityEvent/ThreatIntelConstants.ts +18 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
- package/UI/Components/AttachmentList/EventAttachmentList.tsx +30 -2
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +12 -2
- package/UI/Components/Dropdown/Dropdown.tsx +6 -1
- package/UI/Components/EditionLabel/EditionLabel.tsx +808 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
- package/UI/Components/EventItem/EventItem.tsx +12 -1
- package/UI/Components/Forms/BasicForm.tsx +151 -126
- package/UI/Components/Forms/CollapsibleFormSection.tsx +63 -0
- package/UI/Components/Forms/Fields/FormField.tsx +10 -4
- package/UI/Components/Forms/FormSummary.tsx +7 -0
- package/UI/Components/Forms/Types/Field.ts +10 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +2 -1
- package/UI/Components/Markdown.tsx/SessionAwareImage.tsx +122 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/ModelTable/BaseModelTable.tsx +34 -5
- package/UI/Components/ModelTable/TableView.tsx +1 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +8 -1
- package/UI/Components/Tooltip/Tooltip.tsx +8 -1
- package/UI/Utils/API/API.ts +173 -12
- package/UI/Utils/API/RequestOptions.ts +11 -0
- package/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.ts +31 -7
- package/UI/Utils/ModelAPI/ModelAPI.ts +30 -9
- package/UI/Utils/Navigation.ts +9 -0
- package/UI/Utils/OpenAuthenticatedUrl.ts +154 -0
- package/UI/Utils/Realtime.ts +176 -30
- package/UI/esbuild-enterprise.js +263 -0
- package/Utils/API.ts +14 -5
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +157 -7
- package/Utils/SecurityEvent/Sigma/SigmaRuleParser.ts +9 -17
- package/Utils/Slo/SloBurnRateTemplate.ts +2 -2
- package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
- package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
- package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -1
- package/build/dist/Server/API/AIBillingAPI.js +1 -1
- package/build/dist/Server/API/AIBillingAPI.js.map +1 -1
- package/build/dist/Server/API/AIInsightAPI.js +1 -4
- package/build/dist/Server/API/AIInsightAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +1 -4
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIReadinessAPI.js +1 -3
- package/build/dist/Server/API/AIReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/AlertAPI.js +1 -1
- package/build/dist/Server/API/AlertAPI.js.map +1 -1
- package/build/dist/Server/API/AutoRemediationAPI.js +1 -4
- package/build/dist/Server/API/AutoRemediationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +33 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +55 -10
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +2 -2
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +2 -2
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/CodeFixRunAPI.js +1 -3
- package/build/dist/Server/API/CodeFixRunAPI.js.map +1 -1
- package/build/dist/Server/API/CommonAPI.js +50 -5
- package/build/dist/Server/API/CommonAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +12 -12
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +158 -342
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +2 -2
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js +1 -1
- package/build/dist/Server/API/IncidentEpisodeAPI.js.map +1 -1
- package/build/dist/Server/API/NotificationAPI.js +1 -1
- package/build/dist/Server/API/NotificationAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1 -4
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js +6 -0
- package/build/dist/Server/API/OnCallDutyPolicyAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js +4 -1
- package/build/dist/Server/API/OnCallReadinessAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js +494 -0
- package/build/dist/Server/API/OnCallScheduleTimelineAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectAPI.js +1 -1
- package/build/dist/Server/API/ProjectAPI.js.map +1 -1
- package/build/dist/Server/API/ProjectOIDC.js +24 -16
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +24 -16
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js +1 -1
- package/build/dist/Server/API/ScheduledMaintenanceAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +218 -76
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +11 -4
- package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
- package/build/dist/Server/API/UserCallAPI.js +2 -2
- package/build/dist/Server/API/UserCallAPI.js.map +1 -1
- package/build/dist/Server/API/UserEmailAPI.js +2 -2
- package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js +2 -2
- package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -1
- package/build/dist/Server/API/UserSlackAPI.js +1 -1
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -1
- package/build/dist/Server/API/UserSmsAPI.js +2 -2
- package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js +1 -1
- package/build/dist/Server/API/UserTotpAuthAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js +2 -2
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js +1 -1
- package/build/dist/Server/API/UserWebhookAPI.js.map +1 -1
- package/build/dist/Server/API/UserWhatsAppAPI.js +2 -2
- package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +84 -2
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +2 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js +11 -2
- package/build/dist/Server/Middleware/MasterAdminAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +94 -15
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/ApiKeyPermissionService.js +80 -4
- package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +71 -740
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +171 -0
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DetectionRuleService.js +4 -4
- package/build/dist/Server/Services/DetectionRuleService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/GlobalConfigService.js +63 -0
- package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +90 -17
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +45 -4
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js +170 -0
- package/build/dist/Server/Services/OnCallDutyPolicyChildService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleTeamService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js +2 -2
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleUserService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +20 -27
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +231 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +198 -16
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +71 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +10 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamPermissionService.js +89 -27
- package/build/dist/Server/Services/TeamPermissionService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +5 -4
- package/build/dist/Server/Services/ThreatIntelFeedService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +10 -16
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/Index.js +60 -6
- package/build/dist/Server/Types/Database/Permissions/Index.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +24 -16
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +31 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIChatPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js +7 -0
- package/build/dist/Server/Utils/AI/AIRunPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
- package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
- package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
- package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
- package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
- package/build/dist/Server/Utils/MasterAdminPageAccess.js +39 -0
- package/build/dist/Server/Utils/MasterAdminPageAccess.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +96 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +449 -261
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +3 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
- package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
- package/build/dist/Server/Utils/Realtime.js +126 -37
- package/build/dist/Server/Utils/Realtime.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +7 -25
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js +127 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOpsSeverityRepair.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Sigma/SigmaClickhouseCompiler.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js +4 -8
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelMatcher.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
- package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
- package/build/dist/Types/API/Hostname.js +59 -11
- package/build/dist/Types/API/Hostname.js.map +1 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js +31 -1
- package/build/dist/Types/BaseDatabase/DatabaseCommonInteractionPropsUtil.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
- package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
- package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
- package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
- package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
- package/build/dist/Types/Database/TableColumn.js +19 -6
- package/build/dist/Types/Database/TableColumn.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
- package/build/dist/Types/IP/IPv6.js +6 -1
- package/build/dist/Types/IP/IPv6.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js +321 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimeline.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js +372 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleTimelineLayout.js.map +1 -0
- package/build/dist/Types/Realtime/EventName.js +10 -0
- package/build/dist/Types/Realtime/EventName.js.map +1 -1
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js +11 -0
- package/build/dist/Types/SecurityEvent/DetectionFindingConstants.js.map +1 -1
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js +30 -25
- package/build/dist/Types/SecurityEvent/OcsfSeverity.js.map +1 -1
- package/build/dist/Types/SecurityEvent/SigmaRule.js +47 -0
- package/build/dist/Types/SecurityEvent/SigmaRule.js.map +1 -1
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js +14 -0
- package/build/dist/Types/SecurityEvent/ThreatIntelConstants.js.map +1 -1
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
- package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js +9 -4
- package/build/dist/UI/Components/AttachmentList/EventAttachmentList.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +10 -2
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +5 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +425 -585
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
- package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
- package/build/dist/UI/Components/EventItem/EventItem.js +2 -2
- package/build/dist/UI/Components/EventItem/EventItem.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +70 -64
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js +27 -0
- package/build/dist/UI/Components/Forms/CollapsibleFormSection.js.map +1 -0
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -7
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/FormSummary.js +7 -0
- package/build/dist/UI/Components/Forms/FormSummary.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +2 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js +84 -0
- package/build/dist/UI/Components/Markdown.tsx/SessionAwareImage.js.map +1 -0
- package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +14 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js +1 -1
- package/build/dist/UI/Components/ModelTable/TableView.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +8 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +2 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/API/API.js +143 -19
- package/build/dist/UI/Utils/API/API.js.map +1 -1
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js +21 -7
- package/build/dist/UI/Utils/AnalyticsModelAPI/AnalyticsModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +26 -9
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +8 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js +92 -0
- package/build/dist/UI/Utils/OpenAuthenticatedUrl.js.map +1 -0
- package/build/dist/UI/Utils/Realtime.js +120 -15
- package/build/dist/UI/Utils/Realtime.js.map +1 -1
- package/build/dist/Utils/API.js +13 -5
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/HostAddressUtil.js +80 -0
- package/build/dist/Utils/HostAddressUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
- package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
- package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +123 -6
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js +4 -18
- package/build/dist/Utils/SecurityEvent/Sigma/SigmaRuleParser.js.map +1 -1
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +2 -2
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
- package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
- package/jest.config.json +3 -1
- package/package.json +1 -1
- package/test-setup.sh +103 -34
- package/tsconfig.json +13 -0
- package/Server/API/EnterpriseLicenseAPI.ts +0 -925
- package/Server/API/TeamComplianceAPI.ts +0 -158
- package/Server/Middleware/SCIMAuthorization.ts +0 -141
- package/Server/Services/TeamComplianceService.ts +0 -733
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
- package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
- package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
- package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
- package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
- package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
- package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
- package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
- package/build/dist/Server/Services/TeamComplianceService.js +0 -537
- package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
- package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
|
@@ -2,38 +2,14 @@ import Redis, { ClientType } from "../../Infrastructure/Redis";
|
|
|
2
2
|
import Dictionary from "../../../Types/Dictionary";
|
|
3
3
|
|
|
4
4
|
/*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* What a single Redis/Valkey INFO call reports, for the admin health API
|
|
6
|
+
* (packages/App/API/AdminHealth.ts).
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Under memory pressure with an eviction policy this key can itself be evicted,
|
|
14
|
-
* which costs one interval of eviction detection: the next run finds no sample,
|
|
15
|
-
* re-seeds it, and reports deltas again from there.
|
|
16
|
-
*/
|
|
17
|
-
const COUNTER_SAMPLE_KEY: string = "oneuptime-instance-health-redis-sample";
|
|
18
|
-
const COUNTER_SAMPLE_TTL_IN_SECONDS: number = 60 * 60;
|
|
19
|
-
|
|
20
|
-
/*
|
|
21
|
-
* The minimum age of the baseline the counter deltas are measured against, so
|
|
22
|
-
* every evaluation answers "did this happen in at least the last half hour"
|
|
23
|
-
* rather than "did it happen in the last five minutes".
|
|
24
|
-
*
|
|
25
|
-
* That span is what keeps an edge-triggered signal from flapping. Evictions
|
|
26
|
-
* arriving in bursts would otherwise clear on the first quiet tick and fire
|
|
27
|
-
* again on the next, emailing every other cycle.
|
|
28
|
-
*
|
|
29
|
-
* Two samples are kept rather than one because a single rolling baseline is a
|
|
30
|
-
* TUMBLING window, not a sliding one: the tick immediately after a roll would
|
|
31
|
-
* compare against a five-minute-old sample and a lone quiet tick there would
|
|
32
|
-
* resolve the notification, re-notifying on the next burst of the same ongoing
|
|
33
|
-
* incident. Measuring against the OLDER of two samples makes the lookback
|
|
34
|
-
* always at least this long (and at most twice it).
|
|
8
|
+
* The counter history that turns INFO's cumulative totals into "did this
|
|
9
|
+
* happen recently" belongs to the Enterprise instance-health worker and lives
|
|
10
|
+
* next to it in ee/Server/Workers/InstanceHealth/RedisHealth.ts, which reads
|
|
11
|
+
* INFO through readInfoSnapshot below.
|
|
35
12
|
*/
|
|
36
|
-
export const COUNTER_WINDOW_IN_SECONDS: number = 30 * 60;
|
|
37
13
|
|
|
38
14
|
// Everything a single INFO call reports, with no history involved.
|
|
39
15
|
export interface RedisInfoSnapshot {
|
|
@@ -56,36 +32,6 @@ export interface RedisInfoSnapshot {
|
|
|
56
32
|
uptimeInSeconds: number;
|
|
57
33
|
}
|
|
58
34
|
|
|
59
|
-
export interface RedisHealthSnapshot extends RedisInfoSnapshot {
|
|
60
|
-
/*
|
|
61
|
-
* Increase over the baseline. null when this run has no baseline it can trust
|
|
62
|
-
* — no stored sample, or Redis restarted and reset the counters.
|
|
63
|
-
*/
|
|
64
|
-
evictedKeysDelta: number | null;
|
|
65
|
-
rejectedConnectionsDelta: number | null;
|
|
66
|
-
/*
|
|
67
|
-
* How far back the deltas above actually reach, so messages can state the
|
|
68
|
-
* real span instead of quoting a nominal constant. null alongside null deltas.
|
|
69
|
-
*/
|
|
70
|
-
counterWindowInSeconds: number | null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export interface RedisCounterSample {
|
|
74
|
-
evictedKeys: number;
|
|
75
|
-
rejectedConnections: number;
|
|
76
|
-
uptimeInSeconds: number;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/*
|
|
80
|
-
* The two retained samples. Deltas are measured against `older`, which keeps
|
|
81
|
-
* the lookback at least COUNTER_WINDOW_IN_SECONDS at every tick; `newer` is the
|
|
82
|
-
* one promoted to `older` at the next roll.
|
|
83
|
-
*/
|
|
84
|
-
export interface RedisCounterSamples {
|
|
85
|
-
older: RedisCounterSample;
|
|
86
|
-
newer: RedisCounterSample;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
35
|
/*
|
|
90
36
|
* INFO is a flat `field:value` document split into `# Section` blocks. Section
|
|
91
37
|
* headers and comment lines are dropped; field names are unique across sections
|
|
@@ -191,144 +137,11 @@ async function getMaxClients(
|
|
|
191
137
|
return null;
|
|
192
138
|
}
|
|
193
139
|
|
|
194
|
-
function parseCounterSample(value: unknown): RedisCounterSample | null {
|
|
195
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
196
|
-
return null;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
const sample: Record<string, unknown> = value as Record<string, unknown>;
|
|
200
|
-
const evictedKeys: number = Number(sample["evictedKeys"]);
|
|
201
|
-
const rejectedConnections: number = Number(sample["rejectedConnections"]);
|
|
202
|
-
const uptimeInSeconds: number = Number(sample["uptimeInSeconds"]);
|
|
203
|
-
|
|
204
|
-
if (
|
|
205
|
-
!Number.isFinite(evictedKeys) ||
|
|
206
|
-
!Number.isFinite(rejectedConnections) ||
|
|
207
|
-
!Number.isFinite(uptimeInSeconds)
|
|
208
|
-
) {
|
|
209
|
-
return null;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
return { evictedKeys, rejectedConnections, uptimeInSeconds };
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
async function readCounterSamples(
|
|
216
|
-
client: ClientType,
|
|
217
|
-
): Promise<RedisCounterSamples | null> {
|
|
218
|
-
try {
|
|
219
|
-
const raw: string | null = await client.get(COUNTER_SAMPLE_KEY);
|
|
220
|
-
|
|
221
|
-
if (!raw) {
|
|
222
|
-
return null;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const parsed: unknown = JSON.parse(raw);
|
|
226
|
-
|
|
227
|
-
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
228
|
-
return null;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const stored: Record<string, unknown> = parsed as Record<string, unknown>;
|
|
232
|
-
const older: RedisCounterSample | null = parseCounterSample(
|
|
233
|
-
stored["older"],
|
|
234
|
-
);
|
|
235
|
-
const newer: RedisCounterSample | null = parseCounterSample(
|
|
236
|
-
stored["newer"],
|
|
237
|
-
);
|
|
238
|
-
|
|
239
|
-
if (older && newer) {
|
|
240
|
-
return { older, newer };
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/*
|
|
244
|
-
* A single-sample payload is what the previous release wrote. Treat it as
|
|
245
|
-
* both ends of the pair so an upgrade keeps its baseline instead of going
|
|
246
|
-
* blind for a window.
|
|
247
|
-
*/
|
|
248
|
-
const legacy: RedisCounterSample | null = parseCounterSample(parsed);
|
|
249
|
-
|
|
250
|
-
return legacy ? { older: legacy, newer: legacy } : null;
|
|
251
|
-
} catch {
|
|
252
|
-
// A missing or unreadable sample simply means no delta this run.
|
|
253
|
-
return null;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
|
|
257
140
|
/*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
* kept alive by other means — see getRedisHealthSnapshot.
|
|
141
|
+
* One INFO read, plus the CONFIG fallback for maxclients. Exported so the
|
|
142
|
+
* Enterprise worker's snapshot reads Redis exactly the way this file does.
|
|
261
143
|
*/
|
|
262
|
-
async function
|
|
263
|
-
client: ClientType,
|
|
264
|
-
samples: RedisCounterSamples,
|
|
265
|
-
): Promise<boolean> {
|
|
266
|
-
try {
|
|
267
|
-
await client.set(
|
|
268
|
-
COUNTER_SAMPLE_KEY,
|
|
269
|
-
JSON.stringify(samples),
|
|
270
|
-
"EX",
|
|
271
|
-
COUNTER_SAMPLE_TTL_IN_SECONDS,
|
|
272
|
-
);
|
|
273
|
-
return true;
|
|
274
|
-
} catch {
|
|
275
|
-
/*
|
|
276
|
-
* Losing the baseline must never fail the health evaluation that produced
|
|
277
|
-
* this snapshot, so the error is swallowed and reported through the return.
|
|
278
|
-
*/
|
|
279
|
-
return false;
|
|
280
|
-
}
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
// Keep a baseline alive across the runs that do not rewrite it.
|
|
284
|
-
async function refreshCounterSampleTtl(client: ClientType): Promise<void> {
|
|
285
|
-
try {
|
|
286
|
-
await client.expire(COUNTER_SAMPLE_KEY, COUNTER_SAMPLE_TTL_IN_SECONDS);
|
|
287
|
-
} catch {
|
|
288
|
-
// Same reasoning as writeCounterSamples: never fail the evaluation over this.
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
/*
|
|
293
|
-
* The pair rolls only once the NEWER sample has aged past the window, which
|
|
294
|
-
* promotes it to `older` and starts a fresh one. Deltas are always measured
|
|
295
|
-
* against `older`, so the lookback never drops below the window. Redis' own
|
|
296
|
-
* uptime measures that age, which avoids trusting either machine's clock.
|
|
297
|
-
*/
|
|
298
|
-
export function shouldRollCounterSamples(data: {
|
|
299
|
-
previous: RedisCounterSamples | null;
|
|
300
|
-
currentUptimeInSeconds: number;
|
|
301
|
-
didRestart: boolean;
|
|
302
|
-
}): boolean {
|
|
303
|
-
if (!data.previous || data.didRestart) {
|
|
304
|
-
return true;
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
return (
|
|
308
|
-
data.currentUptimeInSeconds - data.previous.newer.uptimeInSeconds >=
|
|
309
|
-
COUNTER_WINDOW_IN_SECONDS
|
|
310
|
-
);
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
/*
|
|
314
|
-
* Compare a monotonic counter against its previous value. A decrease, or a
|
|
315
|
-
* shorter uptime than the sample was taken at, means Redis restarted and the
|
|
316
|
-
* counter began again from zero — the difference is meaningless, so report no
|
|
317
|
-
* delta rather than a fabricated spike.
|
|
318
|
-
*/
|
|
319
|
-
export function getCounterDelta(data: {
|
|
320
|
-
current: number;
|
|
321
|
-
previous: number;
|
|
322
|
-
didRestart: boolean;
|
|
323
|
-
}): number | null {
|
|
324
|
-
if (data.didRestart || data.current < data.previous) {
|
|
325
|
-
return null;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
return data.current - data.previous;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
async function readInfoSnapshot(
|
|
144
|
+
export async function readInfoSnapshot(
|
|
332
145
|
client: ClientType,
|
|
333
146
|
): Promise<RedisInfoSnapshot> {
|
|
334
147
|
const info: Dictionary<string> = parseRedisInfo(await client.info());
|
|
@@ -341,9 +154,9 @@ async function readInfoSnapshot(
|
|
|
341
154
|
|
|
342
155
|
/*
|
|
343
156
|
* Read-only view for the admin health API. It deliberately does NOT touch the
|
|
344
|
-
*
|
|
345
|
-
* the worker needs, so a page refresh could hide
|
|
346
|
-
* notification that exists to catch it.
|
|
157
|
+
* counter sample the Enterprise health worker keeps: advancing that baseline
|
|
158
|
+
* here would consume the delta the worker needs, so a page refresh could hide
|
|
159
|
+
* an eviction burst from the notification that exists to catch it.
|
|
347
160
|
*/
|
|
348
161
|
export async function getRedisInfoSnapshot(): Promise<RedisInfoSnapshot | null> {
|
|
349
162
|
const client: ClientType | null = Redis.getClient();
|
|
@@ -354,81 +167,3 @@ export async function getRedisInfoSnapshot(): Promise<RedisInfoSnapshot | null>
|
|
|
354
167
|
|
|
355
168
|
return await readInfoSnapshot(client);
|
|
356
169
|
}
|
|
357
|
-
|
|
358
|
-
/*
|
|
359
|
-
* The evaluating worker's view: the same INFO read, plus the counter deltas
|
|
360
|
-
* that turn cumulative totals into "did this happen in roughly the last
|
|
361
|
-
* COUNTER_WINDOW_IN_SECONDS". Returns null when Redis is unreachable, which the
|
|
362
|
-
* caller treats as "cannot evaluate" rather than "healthy".
|
|
363
|
-
*/
|
|
364
|
-
export async function getRedisHealthSnapshot(): Promise<RedisHealthSnapshot | null> {
|
|
365
|
-
const client: ClientType | null = Redis.getClient();
|
|
366
|
-
|
|
367
|
-
if (!client || !Redis.isConnected()) {
|
|
368
|
-
return null;
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const snapshot: RedisInfoSnapshot = await readInfoSnapshot(client);
|
|
372
|
-
|
|
373
|
-
const previousSamples: RedisCounterSamples | null =
|
|
374
|
-
await readCounterSamples(client);
|
|
375
|
-
const didRestart: boolean = Boolean(
|
|
376
|
-
previousSamples &&
|
|
377
|
-
previousSamples.older.uptimeInSeconds > snapshot.uptimeInSeconds,
|
|
378
|
-
);
|
|
379
|
-
// Deltas always measure against the older half, never the freshly rolled one.
|
|
380
|
-
const baseline: RedisCounterSample | null = previousSamples
|
|
381
|
-
? previousSamples.older
|
|
382
|
-
: null;
|
|
383
|
-
|
|
384
|
-
const current: RedisCounterSample = {
|
|
385
|
-
evictedKeys: snapshot.evictedKeys,
|
|
386
|
-
rejectedConnections: snapshot.rejectedConnections,
|
|
387
|
-
uptimeInSeconds: snapshot.uptimeInSeconds,
|
|
388
|
-
};
|
|
389
|
-
const wantsRoll: boolean = shouldRollCounterSamples({
|
|
390
|
-
previous: previousSamples,
|
|
391
|
-
currentUptimeInSeconds: snapshot.uptimeInSeconds,
|
|
392
|
-
didRestart,
|
|
393
|
-
});
|
|
394
|
-
const didRoll: boolean = wantsRoll
|
|
395
|
-
? await writeCounterSamples(client, {
|
|
396
|
-
older: previousSamples && !didRestart ? previousSamples.newer : current,
|
|
397
|
-
newer: current,
|
|
398
|
-
})
|
|
399
|
-
: false;
|
|
400
|
-
|
|
401
|
-
/*
|
|
402
|
-
* Keep the existing samples alive whenever they were not rolled — including
|
|
403
|
-
* when the roll FAILED, which is the case that matters most. Under the
|
|
404
|
-
* noeviction policy Redis rejects SET once it is out of memory but still
|
|
405
|
-
* serves EXPIRE, so letting a failed write skip the refresh would expire the
|
|
406
|
-
* baseline precisely when memory is full: eviction detection would then go
|
|
407
|
-
* permanently blind at the moment it is needed, because every later write
|
|
408
|
-
* fails the same way and the key never returns.
|
|
409
|
-
*/
|
|
410
|
-
if (!didRoll) {
|
|
411
|
-
await refreshCounterSampleTtl(client);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
return {
|
|
415
|
-
...snapshot,
|
|
416
|
-
counterWindowInSeconds: baseline
|
|
417
|
-
? snapshot.uptimeInSeconds - baseline.uptimeInSeconds
|
|
418
|
-
: null,
|
|
419
|
-
evictedKeysDelta: baseline
|
|
420
|
-
? getCounterDelta({
|
|
421
|
-
current: snapshot.evictedKeys,
|
|
422
|
-
previous: baseline.evictedKeys,
|
|
423
|
-
didRestart,
|
|
424
|
-
})
|
|
425
|
-
: null,
|
|
426
|
-
rejectedConnectionsDelta: baseline
|
|
427
|
-
? getCounterDelta({
|
|
428
|
-
current: snapshot.rejectedConnections,
|
|
429
|
-
previous: baseline.rejectedConnections,
|
|
430
|
-
didRestart,
|
|
431
|
-
})
|
|
432
|
-
: null,
|
|
433
|
-
};
|
|
434
|
-
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import UserMiddleware from "../Middleware/UserAuthorization";
|
|
2
|
+
import { ExpressRequest, ExpressResponse } from "./Express";
|
|
3
|
+
import JSONWebToken from "./JsonWebToken";
|
|
4
|
+
import logger from "./Logger";
|
|
5
|
+
import Response from "./Response";
|
|
6
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
7
|
+
import { JSONObject } from "../../Types/JSON";
|
|
8
|
+
import JSONWebTokenData from "../../Types/JsonWebTokenData";
|
|
9
|
+
|
|
10
|
+
export const NOT_A_MASTER_ADMIN_MESSAGE: string =
|
|
11
|
+
"Unauthorized: Only master admins can access the admin dashboard.";
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* Gate for the Admin Dashboard's index page (the HTML shell, not its APIs).
|
|
15
|
+
*
|
|
16
|
+
* It refuses only a caller it can positively identify as NOT a master admin.
|
|
17
|
+
* A missing access token, or one that no longer decodes, is served the shell:
|
|
18
|
+
* the access-token cookie expires with the JWT inside it, so an admin who
|
|
19
|
+
* reloads a tab left open past the token lifetime arrives here with no token
|
|
20
|
+
* at all, and answering that with a 422 JSON page meant the app never loaded
|
|
21
|
+
* and so never got to refresh the session. The shell holds nothing the public
|
|
22
|
+
* static bundle does not; once it loads, the SPA sends a signed-out visitor to
|
|
23
|
+
* the login page, and every admin API it calls refreshes an expired session
|
|
24
|
+
* (or answers 401) on its own.
|
|
25
|
+
*/
|
|
26
|
+
export const ensureMasterAdminPageAccess: (data: {
|
|
27
|
+
req: ExpressRequest;
|
|
28
|
+
res: ExpressResponse;
|
|
29
|
+
service: string;
|
|
30
|
+
}) => Promise<JSONObject> = async (data: {
|
|
31
|
+
req: ExpressRequest;
|
|
32
|
+
res: ExpressResponse;
|
|
33
|
+
service: string;
|
|
34
|
+
}): Promise<JSONObject> => {
|
|
35
|
+
const accessToken: string | undefined =
|
|
36
|
+
UserMiddleware.getAccessTokenFromExpressRequest(data.req);
|
|
37
|
+
|
|
38
|
+
if (!accessToken) {
|
|
39
|
+
return {};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let authData: JSONWebTokenData;
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
authData = JSONWebToken.decode(accessToken);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
// Expired or unreadable: let the app load and refresh it.
|
|
48
|
+
logger.debug(error, { service: data.service });
|
|
49
|
+
return {};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (!authData.isMasterAdmin) {
|
|
53
|
+
Response.sendErrorResponse(
|
|
54
|
+
data.req,
|
|
55
|
+
data.res,
|
|
56
|
+
new NotAuthorizedException(NOT_A_MASTER_ADMIN_MESSAGE),
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return {};
|
|
61
|
+
};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { escapeMarkdownInline } from "../../../Utils/Markdown/MarkdownEscape";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* The "Affected Resources" block of a platform monitor's root cause.
|
|
5
|
+
*
|
|
6
|
+
* Kubernetes, Proxmox, VMware, Docker Swarm and Ceph monitors each attach a
|
|
7
|
+
* per-resource breakdown to the incident / alert they open, and each one
|
|
8
|
+
* used to render it as a GitHub-flavoured table: up to six columns of long,
|
|
9
|
+
* unbreakable identifiers (pod names, node names, pool paths). That table
|
|
10
|
+
* is read in three places, and it read badly in all of them:
|
|
11
|
+
*
|
|
12
|
+
* - the email: the DetailBox card leaves roughly 416px for the root
|
|
13
|
+
* cause, so every cell wrapped mid-identifier and a ten-row table
|
|
14
|
+
* became a wall of fragments,
|
|
15
|
+
* - Slack: mrkdwn has no tables, so the incident feed posted the raw
|
|
16
|
+
* "| … |" pipe rows, and convertMarkdownToSlackRichText unrolled each
|
|
17
|
+
* row into a "_Row 1_" block of "*Header:* value" lines,
|
|
18
|
+
* - the dashboard: the widest column decided the layout, and a single
|
|
19
|
+
* long node name squeezed the rest into two-line cells.
|
|
20
|
+
*
|
|
21
|
+
* So the breakdown is a ranked list instead. Each resource is one numbered
|
|
22
|
+
* item — worst first, the same order the table used — that says what the
|
|
23
|
+
* resource is, names it, and gives its value:
|
|
24
|
+
*
|
|
25
|
+
* 1. **Pod** `checkout-7d9f` — **3**
|
|
26
|
+
* - Namespace: `payments`
|
|
27
|
+
* - Deployment: `checkout`
|
|
28
|
+
* - Node: `gke-prod-pool-1-abcd`
|
|
29
|
+
*
|
|
30
|
+
* and the rest of its identity sits underneath as labelled bullets. A
|
|
31
|
+
* missing attribute is simply left out, where the table had to print "-".
|
|
32
|
+
*
|
|
33
|
+
* Plain markdown, deliberately: marked (email), react-markdown (dashboard),
|
|
34
|
+
* slackify-markdown (Slack), the dashboard editor's WYSIWYG converters and
|
|
35
|
+
* Markdown.convertToPlainText all understand a nested list, so nothing
|
|
36
|
+
* downstream needs to know this block exists.
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
export interface AffectedResourceListDetail {
|
|
40
|
+
// Plain text. Escaped when rendered.
|
|
41
|
+
label: string;
|
|
42
|
+
// Markdown, rendered as-is. An empty value drops the whole detail.
|
|
43
|
+
value: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface AffectedResourceListEntry {
|
|
47
|
+
// Plain text, e.g. "Pod" or "Virtual Machine". Escaped when rendered.
|
|
48
|
+
kind: string;
|
|
49
|
+
// Markdown, normally built with AffectedResourceList.code().
|
|
50
|
+
name: string;
|
|
51
|
+
// Markdown — the formatted metric value.
|
|
52
|
+
value: string;
|
|
53
|
+
details: Array<AffectedResourceListDetail>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export default class AffectedResourceList {
|
|
57
|
+
// How many resources the list shows before it summarises the rest.
|
|
58
|
+
public static readonly MAX_ENTRIES: number = 10;
|
|
59
|
+
|
|
60
|
+
public static render(input: {
|
|
61
|
+
// Plain text, e.g. "Affected Resources".
|
|
62
|
+
heading: string;
|
|
63
|
+
// Plain text, e.g. "affected resources" in "... and 3 more affected resources".
|
|
64
|
+
overflowNoun: string;
|
|
65
|
+
// Every resource that qualified for the list, including those not shown.
|
|
66
|
+
totalCount: number;
|
|
67
|
+
// The resources to show, already sorted worst first.
|
|
68
|
+
entries: Array<AffectedResourceListEntry>;
|
|
69
|
+
}): string {
|
|
70
|
+
const lines: Array<string> = [];
|
|
71
|
+
|
|
72
|
+
input.entries.forEach(
|
|
73
|
+
(entry: AffectedResourceListEntry, index: number): void => {
|
|
74
|
+
const marker: string = `${index + 1}.`;
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* A nested bullet belongs to its item only when it is indented to
|
|
78
|
+
* the item's content column, which is one past the marker — three
|
|
79
|
+
* spaces under "1.", four under "10.". A fixed three-space indent
|
|
80
|
+
* would push item 10's details out into a separate top-level list.
|
|
81
|
+
*/
|
|
82
|
+
const indent: string = " ".repeat(marker.length + 1);
|
|
83
|
+
|
|
84
|
+
/*
|
|
85
|
+
* The kind is bold so each item's first line stands out from the
|
|
86
|
+
* detail bullets under it — the value at the end of the line is
|
|
87
|
+
* bold too, so the eye lands on what it is and how bad it is.
|
|
88
|
+
*/
|
|
89
|
+
const kind: string = escapeMarkdownInline(entry.kind).trim();
|
|
90
|
+
const title: string = [kind ? `**${kind}**` : "", entry.name.trim()]
|
|
91
|
+
.filter((part: string): boolean => {
|
|
92
|
+
return part.length > 0;
|
|
93
|
+
})
|
|
94
|
+
.join(" ");
|
|
95
|
+
|
|
96
|
+
lines.push(`${marker} ${title} — ${entry.value}`);
|
|
97
|
+
|
|
98
|
+
for (const detail of entry.details) {
|
|
99
|
+
if (!detail.value || detail.value.trim().length === 0) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
lines.push(
|
|
104
|
+
`${indent}- ${escapeMarkdownInline(detail.label)}: ${detail.value}`,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
const hiddenCount: number = input.totalCount - input.entries.length;
|
|
111
|
+
|
|
112
|
+
if (hiddenCount > 0) {
|
|
113
|
+
/*
|
|
114
|
+
* The blank line matters: without it the summary is a lazy
|
|
115
|
+
* continuation of the last item's final bullet, not a paragraph of
|
|
116
|
+
* its own.
|
|
117
|
+
*/
|
|
118
|
+
lines.push("");
|
|
119
|
+
lines.push(
|
|
120
|
+
`*... and ${hiddenCount} more ${escapeMarkdownInline(input.overflowNoun)}*`,
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return `\n\n**${escapeMarkdownInline(input.heading)}** (${input.totalCount} total)\n\n${lines.join("\n")}`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/*
|
|
128
|
+
* A resource identifier as an inline code span.
|
|
129
|
+
*
|
|
130
|
+
* The identifiers come from telemetry attributes, and a VMware VM or a
|
|
131
|
+
* Proxmox guest can be named anything. Wrapping a name that contains a
|
|
132
|
+
* backtick in single backticks closes the span early and spills the rest
|
|
133
|
+
* of the name — and whatever markdown it contains — into the list. So the
|
|
134
|
+
* fence is always one backtick longer than the longest run inside the
|
|
135
|
+
* value, and padded with a space on each side when the value has any
|
|
136
|
+
* backticks at all (CommonMark strips exactly one from each side, so the
|
|
137
|
+
* padding never shows). Line breaks become spaces: a newline inside a
|
|
138
|
+
* list item would end the item.
|
|
139
|
+
*/
|
|
140
|
+
public static code(value: string | undefined | null): string {
|
|
141
|
+
if (value === undefined || value === null) {
|
|
142
|
+
return "";
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const text: string = String(value)
|
|
146
|
+
.replace(/\s*[\r\n]+\s*/g, " ")
|
|
147
|
+
.trim();
|
|
148
|
+
|
|
149
|
+
if (text.length === 0) {
|
|
150
|
+
return "";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const backtickRuns: Array<string> = text.match(/`+/g) || [];
|
|
154
|
+
|
|
155
|
+
const longestRun: number = backtickRuns.reduce(
|
|
156
|
+
(longest: number, run: string): number => {
|
|
157
|
+
return Math.max(longest, run.length);
|
|
158
|
+
},
|
|
159
|
+
0,
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
if (longestRun === 0) {
|
|
163
|
+
return `\`${text}\``;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const fence: string = "`".repeat(longestRun + 1);
|
|
167
|
+
|
|
168
|
+
return `${fence} ${text} ${fence}`;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/*
|
|
172
|
+
* A display name alongside the identifier it abbreviates — a Proxmox
|
|
173
|
+
* guest's name and its `qemu/100` id, a Ceph pool's name and number, a
|
|
174
|
+
* vSphere resource pool's name and inventory path. Either half may be
|
|
175
|
+
* missing; when both are the same only one is shown.
|
|
176
|
+
*/
|
|
177
|
+
public static codeWithId(input: {
|
|
178
|
+
name?: string | undefined;
|
|
179
|
+
id?: string | undefined;
|
|
180
|
+
}): string {
|
|
181
|
+
const name: string = AffectedResourceList.code(input.name);
|
|
182
|
+
const id: string = AffectedResourceList.code(input.id);
|
|
183
|
+
|
|
184
|
+
if (name && id && name !== id) {
|
|
185
|
+
return `${name} (${id})`;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return name || id;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -17,6 +17,7 @@ import MetricService from "../../../Services/MetricService";
|
|
|
17
17
|
import CaptureSpan from "../../Telemetry/CaptureSpan";
|
|
18
18
|
import InBetween from "../../../../Types/BaseDatabase/InBetween";
|
|
19
19
|
import CronTab from "../../CronTab";
|
|
20
|
+
import MonitoringIntervalUtil from "../../../../Utils/Monitor/MonitoringIntervalUtil";
|
|
20
21
|
import logger from "../../Logger";
|
|
21
22
|
|
|
22
23
|
/**
|
|
@@ -488,8 +489,16 @@ export default class EvaluateOverTime {
|
|
|
488
489
|
monitoringInterval?: string | undefined;
|
|
489
490
|
sortedSampleTimes: Array<number>;
|
|
490
491
|
}): number | null {
|
|
492
|
+
/*
|
|
493
|
+
* Through the normalizer first: a monitor storing "5m" has a perfectly
|
|
494
|
+
* well-defined cadence, and treating it as "cadence unknown" made
|
|
495
|
+
* over-time windows fall back to guessing from the data.
|
|
496
|
+
*/
|
|
491
497
|
const configuredIntervalInSeconds: number | null =
|
|
492
|
-
CronTab.getIntervalInSeconds(
|
|
498
|
+
CronTab.getIntervalInSeconds(
|
|
499
|
+
MonitoringIntervalUtil.toCronOrNull(data.monitoringInterval) ||
|
|
500
|
+
data.monitoringInterval,
|
|
501
|
+
);
|
|
493
502
|
|
|
494
503
|
if (configuredIntervalInSeconds !== null) {
|
|
495
504
|
return configuredIntervalInSeconds;
|
|
@@ -86,6 +86,7 @@ export default class MonitorAlert {
|
|
|
86
86
|
select: {
|
|
87
87
|
_id: true,
|
|
88
88
|
title: true,
|
|
89
|
+
createdAt: true,
|
|
89
90
|
createdCriteriaId: true,
|
|
90
91
|
projectId: true,
|
|
91
92
|
alertNumber: true,
|
|
@@ -514,6 +515,7 @@ export default class MonitorAlert {
|
|
|
514
515
|
relatedAlertNumber: alreadyOpenAlert?.alertNumber,
|
|
515
516
|
relatedAlertNumberWithPrefix:
|
|
516
517
|
alreadyOpenAlert?.alertNumberWithPrefix,
|
|
518
|
+
relatedAlertCreatedAt: alreadyOpenAlert?.createdAt,
|
|
517
519
|
at: OneUptimeDate.getCurrentDate(),
|
|
518
520
|
});
|
|
519
521
|
continue;
|
|
@@ -794,7 +796,7 @@ export default class MonitorAlert {
|
|
|
794
796
|
relatedAlertId: createdAlert.id?.toString(),
|
|
795
797
|
relatedAlertNumber: createdAlert.alertNumber,
|
|
796
798
|
relatedAlertNumberWithPrefix: createdAlert.alertNumberWithPrefix,
|
|
797
|
-
at: OneUptimeDate.getCurrentDate(),
|
|
799
|
+
at: createdAlert.createdAt || OneUptimeDate.getCurrentDate(),
|
|
798
800
|
});
|
|
799
801
|
} catch (err) {
|
|
800
802
|
/*
|