@oneuptime/common 13.0.8 → 14.0.1
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/Index.ts +4 -0
- package/Models/DatabaseModels/Monitor.ts +3 -2
- package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
- package/Scripts/generate-service-worker.js +65 -4
- package/Server/API/BaseAPI.ts +26 -5
- package/Server/API/GlobalConfigAPI.ts +228 -462
- package/Server/API/ProjectOIDC.ts +25 -16
- package/Server/API/ProjectSSO.ts +24 -16
- package/Server/API/StatusPageAPI.ts +100 -42
- package/Server/API/TeamMemberAPI.ts +10 -1
- 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/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/UserAuthorization.ts +38 -16
- package/Server/Services/AuditLogService.ts +84 -1079
- package/Server/Services/DatabaseService.ts +10 -0
- package/Server/Services/EnterpriseLicenseService.ts +38 -0
- package/Server/Services/GlobalConfigService.ts +80 -1
- package/Server/Services/Index.ts +4 -0
- package/Server/Services/MonitorProbeService.ts +116 -20
- package/Server/Services/MonitorService.ts +59 -6
- package/Server/Services/MonitorStatusTimelineService.ts +284 -0
- package/Server/Services/MonitorTemplateService.ts +26 -0
- package/Server/Services/ProjectService.ts +284 -0
- package/Server/Services/RumSessionPinService.ts +25 -6
- package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
- package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
- package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
- package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
- package/Server/Services/StatusPagePrivateUserService.ts +7 -3
- package/Server/Services/StatusPageService.ts +78 -1
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/TeamService.ts +10 -0
- package/Server/Services/UserService.ts +10 -17
- package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
- package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
- package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
- package/Server/Types/Markdown.ts +41 -0
- package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
- package/Server/Utils/AI/Toolbox/SloTools.ts +1 -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/Monitor/AffectedResourceList.ts +148 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
- package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
- package/Server/Utils/Monitor/RootCauseList.ts +139 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
- package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
- 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/AuditLogsAndComplianceShells.test.tsx +572 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
- package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
- package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
- package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
- package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
- package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
- package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
- package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
- package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
- 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/DatabaseModels/ResourceFeedModels.test.ts +0 -8
- package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
- package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
- package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
- package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
- 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/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
- package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
- package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
- package/Tests/Server/Services/AuditLogService.test.ts +460 -990
- package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
- package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -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/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
- package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
- package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
- package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
- package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
- package/Tests/Server/Types/Markdown.test.ts +183 -1
- package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
- package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +10 -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/Monitor/AffectedResourceList.test.ts +518 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
- package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
- package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
- package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
- package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
- package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
- package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
- package/Tests/Types/API/Route.test.ts +56 -0
- package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
- package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -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 +84 -178
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
- package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
- package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
- package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
- package/Tests/UI/Components/Icon.test.tsx +26 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
- package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
- package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
- package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
- package/Tests/Utils/HostAddressUtil.test.ts +138 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
- package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
- package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
- package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
- package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
- package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
- package/Types/API/Hostname.ts +63 -16
- package/Types/API/Route.ts +19 -2
- package/Types/API/URL.ts +26 -2
- 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/MetricMonitor/MetricCriteriaContext.ts +6 -5
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
- package/Types/Monitor/MonitorStep.ts +6 -1
- package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
- package/Types/Permission.ts +90 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
- package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
- package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
- package/UI/Components/Feed/FeedOptions.ts +427 -0
- package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
- package/UI/Components/Feed/useFeedItems.ts +28 -9
- package/UI/Components/Feed/useFeedOptions.ts +225 -0
- package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
- package/UI/Components/Icon/Icon.tsx +1 -1
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/ModelList/ModelList.tsx +11 -1
- package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
- package/UI/esbuild-enterprise.js +263 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
- package/Utils/HostAddressUtil.ts +94 -0
- package/Utils/LabelRuleImportExport.ts +27 -9
- package/Utils/Monitor/MetricValueFormatter.ts +2 -2
- package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
- package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
- package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
- package/Utils/Slo/SloDuration.ts +22 -6
- package/Utils/Slo/SloHealth.ts +8 -7
- package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
- package/Utils/Slo/SloOverviewText.ts +33 -0
- package/Utils/Slo/SloProjection.ts +4 -3
- 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/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.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/ServiceLevelObjectiveFeed.js +2 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
- package/build/dist/Server/API/BaseAPI.js +26 -5
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
- package/build/dist/Server/API/GlobalConfigAPI.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/StatusPageAPI.js +93 -43
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TeamMemberAPI.js +8 -1
- package/build/dist/Server/API/TeamMemberAPI.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/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
- package/build/dist/Server/Middleware/UserAuthorization.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 +7 -0
- package/build/dist/Server/Services/DatabaseService.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/Index.js +4 -0
- package/build/dist/Server/Services/Index.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 +48 -6
- 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/ProjectService.js +214 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/RumSessionPinService.js +24 -6
- package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.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/TeamService.js +9 -0
- package/build/dist/Server/Services/TeamService.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/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/TablePermission.js +10 -3
- 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/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
- package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.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/Monitor/AffectedResourceList.js +67 -0
- package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
- 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/Criteria/MetricMonitorCriteria.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.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/Monitor/RootCauseList.js +101 -0
- package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
- package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
- 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/API/Route.js +18 -2
- package/build/dist/Types/API/Route.js.map +1 -1
- package/build/dist/Types/API/URL.js +23 -2
- package/build/dist/Types/API/URL.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/Permission.js +84 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.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/EditionLabel/EditionLabel.js +414 -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/Feed/FeedOptions.js +235 -0
- package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
- package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
- package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
- package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
- package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
- 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/Icon/Icon.js +1 -1
- package/build/dist/UI/Components/Icon/Icon.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/ModelList/ModelList.js +4 -1
- package/build/dist/UI/Components/ModelList/ModelList.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/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/LabelRuleImportExport.js +22 -6
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
- 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/Rules/MonitorTypeRuleCriteria.js +18 -0
- package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloDuration.js +13 -5
- package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
- package/build/dist/Utils/Slo/SloHealth.js +8 -7
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
- package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
- 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/SecurityEventsExplorer.test.tsx +0 -761
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
- package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
- package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
- 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
|
@@ -76,6 +76,7 @@ import Typeof from "../../Types/Typeof";
|
|
|
76
76
|
import API from "../../Utils/API";
|
|
77
77
|
import Slug from "../../Utils/Slug";
|
|
78
78
|
import { getRuleCriteriaValidationError } from "../../Utils/Rules/RuleCriteriaMatcher";
|
|
79
|
+
import { getMonitorTypeCriteriaValidationError } from "../../Utils/Rules/MonitorTypeRuleCriteria";
|
|
79
80
|
import RuleCriteria, {
|
|
80
81
|
RULE_CRITERIA_LEGACY_NEVER_MATCH_PATTERN,
|
|
81
82
|
RuleCriteriaOperator,
|
|
@@ -852,6 +853,15 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
|
|
|
852
853
|
);
|
|
853
854
|
}
|
|
854
855
|
|
|
856
|
+
if (metadata.type === TableColumnType.MonitorType) {
|
|
857
|
+
const validationError: string | null =
|
|
858
|
+
getMonitorTypeCriteriaValidationError(filter);
|
|
859
|
+
|
|
860
|
+
if (validationError) {
|
|
861
|
+
throw new BadDataException(validationError);
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
|
|
855
865
|
const isRelationField: boolean =
|
|
856
866
|
metadata.type === TableColumnType.EntityArray;
|
|
857
867
|
const isRelationOperator: boolean = RULE_CRITERIA_RELATION_OPERATORS.has(
|
|
@@ -3,11 +3,26 @@ import EnterpriseLicense from "../../Models/DatabaseModels/EnterpriseLicense";
|
|
|
3
3
|
import MarketingEventUtil from "../Utils/Marketing/MarketingEventUtil";
|
|
4
4
|
import { MarketingEventType } from "../../Types/Marketing/MarketingEvent";
|
|
5
5
|
import { OnCreate } from "../Types/Database/Hooks";
|
|
6
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
6
7
|
import OneUptimeDate from "../../Types/Date";
|
|
7
8
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
8
9
|
import ObjectID from "../../Types/ObjectID";
|
|
9
10
|
import Semaphore, { SemaphoreMutex } from "../Infrastructure/Semaphore";
|
|
10
11
|
import logger from "../Utils/Logger";
|
|
12
|
+
import crypto from "crypto";
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* Random bytes in a license key generated by the server: 256 bits, written as
|
|
16
|
+
* 64 hex characters (the column holds 100). Keys issued before server-side
|
|
17
|
+
* generation are browser-made UUIDs and keep working unchanged.
|
|
18
|
+
*/
|
|
19
|
+
export const ENTERPRISE_LICENSE_KEY_RANDOM_BYTES: number = 32;
|
|
20
|
+
|
|
21
|
+
export const generateEnterpriseLicenseKey: () => string = (): string => {
|
|
22
|
+
return crypto
|
|
23
|
+
.randomBytes(ENTERPRISE_LICENSE_KEY_RANDOM_BYTES)
|
|
24
|
+
.toString("hex");
|
|
25
|
+
};
|
|
11
26
|
|
|
12
27
|
export const ENTERPRISE_LICENSE_USAGE_AGGREGATION_LOCK_NAMESPACE: string =
|
|
13
28
|
"EnterpriseLicenseService.usageAggregation";
|
|
@@ -66,6 +81,29 @@ export class Service extends DatabaseService<EnterpriseLicense> {
|
|
|
66
81
|
}
|
|
67
82
|
}
|
|
68
83
|
|
|
84
|
+
/*
|
|
85
|
+
* A license created with no key (the Admin Dashboard's "leave blank to
|
|
86
|
+
* auto-generate") gets one from the server's CSPRNG here, instead of from
|
|
87
|
+
* the browser. A key typed by the admin is kept, trimmed: installations
|
|
88
|
+
* trim the key they send, so stored whitespace would make it unmatchable.
|
|
89
|
+
*/
|
|
90
|
+
@CaptureSpan()
|
|
91
|
+
protected override async onBeforeCreate(
|
|
92
|
+
createBy: CreateBy<EnterpriseLicense>,
|
|
93
|
+
): Promise<OnCreate<EnterpriseLicense>> {
|
|
94
|
+
const providedKey: string =
|
|
95
|
+
typeof createBy.data.licenseKey === "string"
|
|
96
|
+
? createBy.data.licenseKey.trim()
|
|
97
|
+
: "";
|
|
98
|
+
|
|
99
|
+
createBy.data.licenseKey = providedKey || generateEnterpriseLicenseKey();
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
createBy,
|
|
103
|
+
carryForward: undefined,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
69
107
|
@CaptureSpan()
|
|
70
108
|
protected override async onCreateSuccess(
|
|
71
109
|
_onCreate: OnCreate<EnterpriseLicense>,
|
|
@@ -2,13 +2,45 @@ import DatabaseService from "./DatabaseService";
|
|
|
2
2
|
import Model from "../../Models/DatabaseModels/GlobalConfig";
|
|
3
3
|
import InMemoryTTLCache from "../Infrastructure/InMemoryTTLCache";
|
|
4
4
|
import ObjectID from "../../Types/ObjectID";
|
|
5
|
-
import { OnUpdate } from "../Types/Database/Hooks";
|
|
5
|
+
import { OnCreate, OnUpdate } from "../Types/Database/Hooks";
|
|
6
6
|
import CaptureSpan from "../Utils/Telemetry/CaptureSpan";
|
|
7
|
+
import CreateBy from "../Types/Database/CreateBy";
|
|
7
8
|
import UpdateBy from "../Types/Database/UpdateBy";
|
|
8
9
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
10
|
+
import NotAuthorizedException from "../../Types/Exception/NotAuthorizedException";
|
|
11
|
+
import DatabaseCommonInteractionProps from "../../Types/BaseDatabase/DatabaseCommonInteractionProps";
|
|
9
12
|
import TelegramVerificationToken from "../Utils/TelegramVerificationToken";
|
|
10
13
|
import GlobalCache from "../Infrastructure/GlobalCache";
|
|
11
14
|
|
|
15
|
+
/*
|
|
16
|
+
* The columns that hold this installation's license state and identity. They
|
|
17
|
+
* are written only by OneUptime itself - the license client (activation,
|
|
18
|
+
* refresh, the daily usage report), the first-boot stamp of the Enterprise
|
|
19
|
+
* Edition and the data migrations - and every one of those writes runs with
|
|
20
|
+
* isRoot. A master admin reaches GlobalConfig through the generic CRUD API
|
|
21
|
+
* too, and master admins bypass the (empty) column ACLs, so without this list
|
|
22
|
+
* one PUT could forge a license expiry, raise the seat limit, restart the
|
|
23
|
+
* unlicensed trial or swap the instance id an instance-bound license
|
|
24
|
+
* is checked against.
|
|
25
|
+
*
|
|
26
|
+
* enterpriseLicenseNotificationEmail and enterpriseLicenseExpiryReminderDays
|
|
27
|
+
* are deliberately NOT here: they are settings the oneuptime.com admin edits
|
|
28
|
+
* from the Admin Dashboard.
|
|
29
|
+
*/
|
|
30
|
+
export const ROOT_ONLY_LICENSE_COLUMNS: ReadonlyArray<keyof Model> = [
|
|
31
|
+
"instanceId",
|
|
32
|
+
"enterpriseCompanyName",
|
|
33
|
+
"enterpriseLicenseKey",
|
|
34
|
+
"enterpriseLicenseExpiresAt",
|
|
35
|
+
"enterpriseLicenseToken",
|
|
36
|
+
"enterpriseLicenseIsEvaluation",
|
|
37
|
+
"enterpriseLicenseUserLimit",
|
|
38
|
+
"enterpriseLicenseCurrentUserCount",
|
|
39
|
+
"enterpriseLicenseUserCountUpdatedAt",
|
|
40
|
+
"enterpriseLicenseInstances",
|
|
41
|
+
"enterpriseEditionFirstSeenAt",
|
|
42
|
+
];
|
|
43
|
+
|
|
12
44
|
const TELEGRAM_WEBHOOK_SECRET_CACHE_NAMESPACE: string =
|
|
13
45
|
"global-config-security";
|
|
14
46
|
const TELEGRAM_WEBHOOK_SECRET_GENERATION_KEY: string =
|
|
@@ -203,10 +235,57 @@ export class Service extends DatabaseService<Model> {
|
|
|
203
235
|
);
|
|
204
236
|
}
|
|
205
237
|
|
|
238
|
+
/*
|
|
239
|
+
* Refuses any write to ROOT_ONLY_LICENSE_COLUMNS that does not come from
|
|
240
|
+
* OneUptime itself. An explicit null counts as a write: clearing the license
|
|
241
|
+
* token is as much a forgery as setting one.
|
|
242
|
+
*/
|
|
243
|
+
public assertLicenseColumnsWrittenByRootOnly(
|
|
244
|
+
data: unknown,
|
|
245
|
+
props: DatabaseCommonInteractionProps,
|
|
246
|
+
): void {
|
|
247
|
+
if (props.isRoot) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const writtenColumns: Array<string> = ROOT_ONLY_LICENSE_COLUMNS.filter(
|
|
252
|
+
(column: keyof Model): boolean => {
|
|
253
|
+
return (
|
|
254
|
+
(data as Record<string, unknown>)[column as string] !== undefined
|
|
255
|
+
);
|
|
256
|
+
},
|
|
257
|
+
).map((column: keyof Model): string => {
|
|
258
|
+
return column as string;
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
if (writtenColumns.length === 0) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
throw new NotAuthorizedException(
|
|
266
|
+
`${writtenColumns.join(", ")} can only be changed by OneUptime itself. ` +
|
|
267
|
+
"Use the license dialog in the Admin Dashboard to activate or refresh the Enterprise license.",
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
@CaptureSpan()
|
|
272
|
+
protected override async onBeforeCreate(
|
|
273
|
+
createBy: CreateBy<Model>,
|
|
274
|
+
): Promise<OnCreate<Model>> {
|
|
275
|
+
this.assertLicenseColumnsWrittenByRootOnly(createBy.data, createBy.props);
|
|
276
|
+
|
|
277
|
+
return {
|
|
278
|
+
createBy,
|
|
279
|
+
carryForward: null,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
206
283
|
@CaptureSpan()
|
|
207
284
|
protected override async onBeforeUpdate(
|
|
208
285
|
updateBy: UpdateBy<Model>,
|
|
209
286
|
): Promise<OnUpdate<Model>> {
|
|
287
|
+
this.assertLicenseColumnsWrittenByRootOnly(updateBy.data, updateBy.props);
|
|
288
|
+
|
|
210
289
|
if (updateBy.data.telegramWebhookSecretToken !== undefined) {
|
|
211
290
|
const secret: unknown = updateBy.data.telegramWebhookSecretToken;
|
|
212
291
|
|
package/Server/Services/Index.ts
CHANGED
|
@@ -384,6 +384,8 @@ import ServiceLevelObjectiveOwnerUserService from "./ServiceLevelObjectiveOwnerU
|
|
|
384
384
|
import ServiceLevelObjectiveOwnerTeamService from "./ServiceLevelObjectiveOwnerTeamService";
|
|
385
385
|
import ServiceLevelObjectiveMonitorRuleService from "./ServiceLevelObjectiveMonitorRuleService";
|
|
386
386
|
import ServiceLevelObjectiveFeedService from "./ServiceLevelObjectiveFeedService";
|
|
387
|
+
import ServiceLevelObjectiveOwnerRuleService from "./ServiceLevelObjectiveOwnerRuleService";
|
|
388
|
+
import ServiceLevelObjectiveLabelRuleService from "./ServiceLevelObjectiveLabelRuleService";
|
|
387
389
|
import SloHistoryService from "./SloHistoryService";
|
|
388
390
|
import IncidentReminderRuleService from "./IncidentReminderRuleService";
|
|
389
391
|
import AlertReminderRuleService from "./AlertReminderRuleService";
|
|
@@ -818,6 +820,8 @@ const services: Array<BaseService> = [
|
|
|
818
820
|
ServiceLevelObjectiveOwnerTeamService,
|
|
819
821
|
ServiceLevelObjectiveMonitorRuleService,
|
|
820
822
|
ServiceLevelObjectiveFeedService,
|
|
823
|
+
ServiceLevelObjectiveOwnerRuleService,
|
|
824
|
+
ServiceLevelObjectiveLabelRuleService,
|
|
821
825
|
IncidentReminderRuleService,
|
|
822
826
|
AlertReminderRuleService,
|
|
823
827
|
ScheduledMaintenanceReminderRuleService,
|
|
@@ -13,14 +13,66 @@ import MonitorService from "./MonitorService";
|
|
|
13
13
|
import ProbeService from "./ProbeService";
|
|
14
14
|
import { MonitorTypeHelper } from "../../Types/Monitor/MonitorType";
|
|
15
15
|
import CronTab from "../Utils/CronTab";
|
|
16
|
-
import logger, { LogAttributes } from "../Utils/Logger";
|
|
16
|
+
import logger, { EXTERNAL_FAULT, LogAttributes } from "../Utils/Logger";
|
|
17
17
|
import { SubscriptionStatusUtil } from "../../Types/Billing/SubscriptionStatus";
|
|
18
|
+
import MonitoringIntervalValidator from "../Utils/Monitor/MonitoringIntervalValidator";
|
|
18
19
|
|
|
19
20
|
export class Service extends DatabaseService<MonitorProbe> {
|
|
20
21
|
public constructor() {
|
|
21
22
|
super(MonitorProbe);
|
|
22
23
|
}
|
|
23
24
|
|
|
25
|
+
/**
|
|
26
|
+
* The next time a monitor with this interval is due, or `fallback`.
|
|
27
|
+
*
|
|
28
|
+
* Exported on the class (and covered directly by tests) because both
|
|
29
|
+
* scheduling paths — the batch claim query and the single-monitor refresh
|
|
30
|
+
* after an edit — have to agree about what a stored interval means. They
|
|
31
|
+
* did not before: the claim query swallowed a parse failure silently and
|
|
32
|
+
* fell back to one minute, so a monitor asking for five minutes was probed
|
|
33
|
+
* four times more often than requested, indefinitely and invisibly.
|
|
34
|
+
*
|
|
35
|
+
* Order is load-bearing. cron-parser gets the RAW value first, so the
|
|
36
|
+
* thousands of rows that were always valid take a byte-identical path and
|
|
37
|
+
* anything the parser understands but our grammar does not ("@hourly") is
|
|
38
|
+
* still honoured. Only when that fails do we try to read the value as a
|
|
39
|
+
* human cadence ("5m", "Every 5 minutes"), which is what makes those rows
|
|
40
|
+
* schedule correctly on deploy — before the data migration has run, and
|
|
41
|
+
* for any row that later arrives through a hook-free write or a restore.
|
|
42
|
+
*/
|
|
43
|
+
public static resolveNextPingAt(data: {
|
|
44
|
+
monitoringInterval: string | null | undefined;
|
|
45
|
+
fallback: Date;
|
|
46
|
+
onUnreadable?: (() => void) | undefined;
|
|
47
|
+
}): Date {
|
|
48
|
+
if (!data.monitoringInterval) {
|
|
49
|
+
return data.fallback;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
return CronTab.getNextExecutionTime(data.monitoringInterval);
|
|
54
|
+
} catch {
|
|
55
|
+
// Not a cron expression. Try to read it as a human cadence instead.
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const normalizedCron: string | null =
|
|
59
|
+
MonitoringIntervalValidator.normalizeForRead(data.monitoringInterval);
|
|
60
|
+
|
|
61
|
+
if (normalizedCron) {
|
|
62
|
+
try {
|
|
63
|
+
return CronTab.getNextExecutionTime(normalizedCron);
|
|
64
|
+
} catch {
|
|
65
|
+
// Normalizer produced something cron-parser rejects. Report it.
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (data.onUnreadable) {
|
|
70
|
+
data.onUnreadable();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return data.fallback;
|
|
74
|
+
}
|
|
75
|
+
|
|
24
76
|
public async pruneStaleLastMonitoringLogEntries(data: {
|
|
25
77
|
monitorId: ObjectID;
|
|
26
78
|
validMonitorStepIds: Array<string>;
|
|
@@ -103,20 +155,28 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
103
155
|
continue;
|
|
104
156
|
}
|
|
105
157
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
158
|
+
/*
|
|
159
|
+
* The falsy guard matters: a Manual monitor (and every other row with
|
|
160
|
+
* no interval) reaches here with undefined, and the old unguarded call
|
|
161
|
+
* handed that straight to cron-parser, which threw and logged an error
|
|
162
|
+
* for a perfectly ordinary row on every single interval edit.
|
|
163
|
+
*/
|
|
164
|
+
const nextPing: Date = Service.resolveNextPingAt({
|
|
165
|
+
monitoringInterval: monitorProbe?.monitor?.monitoringInterval,
|
|
166
|
+
fallback: OneUptimeDate.addRemoveMinutes(
|
|
167
|
+
OneUptimeDate.getCurrentDate(),
|
|
168
|
+
1,
|
|
169
|
+
),
|
|
170
|
+
onUnreadable: () => {
|
|
171
|
+
logger.error(
|
|
172
|
+
`updateNextPingAtForMonitor: monitoringInterval "${monitorProbe?.monitor?.monitoringInterval}" cannot be read as a schedule; falling back to a 1-minute cadence.`,
|
|
173
|
+
{
|
|
174
|
+
...EXTERNAL_FAULT,
|
|
175
|
+
monitorId: data.monitorId?.toString(),
|
|
176
|
+
} as LogAttributes,
|
|
177
|
+
);
|
|
178
|
+
},
|
|
179
|
+
});
|
|
120
180
|
|
|
121
181
|
if (nextPing && monitorProbe.id) {
|
|
122
182
|
await this.updateOneById({
|
|
@@ -223,6 +283,17 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
223
283
|
const nextPingDates: Array<Date> = [];
|
|
224
284
|
const caseFragments: Array<string> = [];
|
|
225
285
|
|
|
286
|
+
/*
|
|
287
|
+
* Rows whose interval neither cron-parser nor the normalizer could
|
|
288
|
+
* read. Collected and logged ONCE per batch below rather than per
|
|
289
|
+
* row: this loop runs for every claimed monitor, every minute, on
|
|
290
|
+
* every probe-ingest instance, so a per-row log line would flood.
|
|
291
|
+
*/
|
|
292
|
+
const unreadableIntervals: Array<{
|
|
293
|
+
monitorProbeId: string;
|
|
294
|
+
monitoringInterval: string;
|
|
295
|
+
}> = [];
|
|
296
|
+
|
|
226
297
|
for (let i: number = 0; i < selectedRows.length; i++) {
|
|
227
298
|
const row: { _id: string; monitoringInterval: string | null } =
|
|
228
299
|
selectedRows[i]!;
|
|
@@ -230,11 +301,16 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
230
301
|
|
|
231
302
|
let nextPing: Date = defaultNextPing;
|
|
232
303
|
if (row.monitoringInterval) {
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
304
|
+
nextPing = Service.resolveNextPingAt({
|
|
305
|
+
monitoringInterval: row.monitoringInterval,
|
|
306
|
+
fallback: defaultNextPing,
|
|
307
|
+
onUnreadable: () => {
|
|
308
|
+
unreadableIntervals.push({
|
|
309
|
+
monitorProbeId: row._id,
|
|
310
|
+
monitoringInterval: row.monitoringInterval as string,
|
|
311
|
+
});
|
|
312
|
+
},
|
|
313
|
+
});
|
|
238
314
|
}
|
|
239
315
|
|
|
240
316
|
nextPingDates.push(nextPing);
|
|
@@ -243,6 +319,26 @@ export class Service extends DatabaseService<MonitorProbe> {
|
|
|
243
319
|
);
|
|
244
320
|
}
|
|
245
321
|
|
|
322
|
+
/*
|
|
323
|
+
* One aggregated line per batch, at error level with EXTERNAL_FAULT.
|
|
324
|
+
*
|
|
325
|
+
* Not debug: LOG_LEVEL=ERROR is what ships, so a debug or warn line
|
|
326
|
+
* here is deleted from stdout on exactly the installs where an
|
|
327
|
+
* operator would go looking. This condition used to be swallowed by
|
|
328
|
+
* a bare `catch {}`, which is why a monitor storing "5m" was probed
|
|
329
|
+
* every minute instead of every five for as long as the row existed,
|
|
330
|
+
* with nothing anywhere to grep for. EXTERNAL_FAULT marks it as
|
|
331
|
+
* tenant data rather than our own failure, so it does not page us.
|
|
332
|
+
*/
|
|
333
|
+
if (unreadableIntervals.length > 0) {
|
|
334
|
+
logger.error(
|
|
335
|
+
`claimMonitorProbesForProbing: ${unreadableIntervals.length} monitor(s) have a monitoringInterval that cannot be read as a schedule and are falling back to a 1-minute cadence. Fix the stored value - "*/5 * * * *" means every 5 minutes. Offenders: ${JSON.stringify(
|
|
336
|
+
unreadableIntervals.slice(0, 20),
|
|
337
|
+
)}`,
|
|
338
|
+
EXTERNAL_FAULT,
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
|
|
246
342
|
const updateQuery: string = `
|
|
247
343
|
UPDATE "MonitorProbe"
|
|
248
344
|
SET "lastPingAt" = $1,
|
|
@@ -39,6 +39,7 @@ import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
|
39
39
|
import { PlanType } from "../../Types/Billing/SubscriptionPlan";
|
|
40
40
|
import LIMIT_MAX, { LIMIT_PER_PROJECT } from "../../Types/Database/LimitMax";
|
|
41
41
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
42
|
+
import MonitoringIntervalValidator from "../Utils/Monitor/MonitoringIntervalValidator";
|
|
42
43
|
import { JSONObject, JSONValue } from "../../Types/JSON";
|
|
43
44
|
import MonitorType, {
|
|
44
45
|
MonitorTypeHelper,
|
|
@@ -97,6 +98,7 @@ import { WhatsAppMessagePayload } from "../../Types/WhatsApp/WhatsAppMessage";
|
|
|
97
98
|
import MonitorTemplateService from "./MonitorTemplateService";
|
|
98
99
|
import RelationIdUtil from "../Utils/Database/RelationIdUtil";
|
|
99
100
|
import OwnerRuleAssignment from "../Utils/Rules/OwnerRuleAssignment";
|
|
101
|
+
import HostAddressUtil from "../../Utils/HostAddressUtil";
|
|
100
102
|
import NetworkDeviceMonitorTemplateUtil from "../../Utils/Monitor/NetworkDeviceMonitorTemplateUtil";
|
|
101
103
|
|
|
102
104
|
const MONITOR_TEMPLATE_RELATION_KEYS: Array<string> = [
|
|
@@ -195,7 +197,17 @@ export class Service extends DatabaseService<Model> {
|
|
|
195
197
|
) {
|
|
196
198
|
const port: string = firstStep.data.monitorDestinationPort.toString();
|
|
197
199
|
if (monitorDestination && port) {
|
|
198
|
-
|
|
200
|
+
/*
|
|
201
|
+
* Bracketed when the host is an IPv6 literal. Plain
|
|
202
|
+
* concatenation there does not merely look odd: "2001:db8::1" +
|
|
203
|
+
* ":179" is "2001:db8::1:179", which is itself a valid IPv6
|
|
204
|
+
* address — a DIFFERENT host from the one being monitored, named
|
|
205
|
+
* in an alert somebody is about to act on.
|
|
206
|
+
*/
|
|
207
|
+
monitorDestination = HostAddressUtil.formatHostAndPort({
|
|
208
|
+
host: monitorDestination,
|
|
209
|
+
port: port,
|
|
210
|
+
});
|
|
199
211
|
}
|
|
200
212
|
}
|
|
201
213
|
|
|
@@ -207,7 +219,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
207
219
|
monitorDestination = firstStep.data.snmpMonitor.hostname || "";
|
|
208
220
|
const port: number = firstStep.data.snmpMonitor.port || 161;
|
|
209
221
|
if (monitorDestination && port) {
|
|
210
|
-
monitorDestination =
|
|
222
|
+
monitorDestination = HostAddressUtil.formatHostAndPort({
|
|
223
|
+
host: monitorDestination,
|
|
224
|
+
port: port,
|
|
225
|
+
});
|
|
211
226
|
}
|
|
212
227
|
}
|
|
213
228
|
|
|
@@ -239,7 +254,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
239
254
|
databaseName: string;
|
|
240
255
|
} = firstStep.data.sqlMonitor;
|
|
241
256
|
if (sql.host) {
|
|
242
|
-
monitorDestination = `${
|
|
257
|
+
monitorDestination = `${HostAddressUtil.formatHostAndPort({
|
|
258
|
+
host: sql.host,
|
|
259
|
+
port: sql.port,
|
|
260
|
+
})}/${sql.databaseName}`;
|
|
243
261
|
}
|
|
244
262
|
}
|
|
245
263
|
|
|
@@ -254,7 +272,10 @@ export class Service extends DatabaseService<Model> {
|
|
|
254
272
|
databaseName: string;
|
|
255
273
|
} = firstStep.data.databaseMonitor;
|
|
256
274
|
if (database.host) {
|
|
257
|
-
monitorDestination = `${
|
|
275
|
+
monitorDestination = `${HostAddressUtil.formatHostAndPort({
|
|
276
|
+
host: database.host,
|
|
277
|
+
port: database.port,
|
|
278
|
+
})}/${database.databaseName}`;
|
|
258
279
|
}
|
|
259
280
|
}
|
|
260
281
|
}
|
|
@@ -604,6 +625,21 @@ export class Service extends DatabaseService<Model> {
|
|
|
604
625
|
resolveReferenceId(updateBy.data.currentMonitorStatus);
|
|
605
626
|
|
|
606
627
|
const updateDataKeys: Array<string> = Object.keys(updateBy.data || {});
|
|
628
|
+
|
|
629
|
+
/*
|
|
630
|
+
* Key presence, never truthiness or the stored value: renaming one of
|
|
631
|
+
* the monitors that already holds a broken interval sends only {name},
|
|
632
|
+
* and gating on the stored value would make those monitors un-editable
|
|
633
|
+
* — punishing the customer for our validation gap.
|
|
634
|
+
*/
|
|
635
|
+
if (updateDataKeys.includes("monitoringInterval")) {
|
|
636
|
+
(updateBy.data as unknown as Record<string, unknown>)[
|
|
637
|
+
"monitoringInterval"
|
|
638
|
+
] = MonitoringIntervalValidator.validateAndNormalize(
|
|
639
|
+
updateBy.data.monitoringInterval as string | null | undefined,
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
|
|
607
643
|
const isMonitorStepsWritten: boolean =
|
|
608
644
|
updateDataKeys.includes("monitorSteps");
|
|
609
645
|
const isMonitorTemplateWritten: boolean = RelationIdUtil.isWritten(
|
|
@@ -1265,14 +1301,15 @@ export class Service extends DatabaseService<Model> {
|
|
|
1265
1301
|
}
|
|
1266
1302
|
|
|
1267
1303
|
/*
|
|
1268
|
-
* SLO monitor rules match on labels, name and description, so an edit to
|
|
1269
|
-
* any of
|
|
1304
|
+
* SLO monitor rules match on labels, type, name and description, so an edit to
|
|
1305
|
+
* any of those fields can pull this monitor into an SLO's error budget or
|
|
1270
1306
|
* push it out of one. Keyed on `!== undefined` rather than on a non-empty
|
|
1271
1307
|
* value: clearing every label arrives as `[]`, and that is precisely the
|
|
1272
1308
|
* edit that should detach the monitor from every rule-driven SLO.
|
|
1273
1309
|
*/
|
|
1274
1310
|
if (
|
|
1275
1311
|
(onUpdate.updateBy.data.labels !== undefined ||
|
|
1312
|
+
onUpdate.updateBy.data.monitorType !== undefined ||
|
|
1276
1313
|
onUpdate.updateBy.data.name !== undefined ||
|
|
1277
1314
|
onUpdate.updateBy.data.description !== undefined) &&
|
|
1278
1315
|
updatedItemIds.length > 0
|
|
@@ -1359,6 +1396,22 @@ export class Service extends DatabaseService<Model> {
|
|
|
1359
1396
|
throw new BadDataException("ProjectId required to create monitor.");
|
|
1360
1397
|
}
|
|
1361
1398
|
|
|
1399
|
+
/*
|
|
1400
|
+
* Canonicalize the monitoring interval before anything is persisted.
|
|
1401
|
+
*
|
|
1402
|
+
* Gated on key presence, not truthiness: createBy.data is a model
|
|
1403
|
+
* INSTANCE whose columns are all declared `= undefined`, and null is a
|
|
1404
|
+
* meaningful value here ("no schedule"), so a truthiness test would skip
|
|
1405
|
+
* exactly the writes that need checking.
|
|
1406
|
+
*/
|
|
1407
|
+
if (createBy.data.monitoringInterval !== undefined) {
|
|
1408
|
+
(createBy.data as unknown as Record<string, unknown>)[
|
|
1409
|
+
"monitoringInterval"
|
|
1410
|
+
] = MonitoringIntervalValidator.validateAndNormalize(
|
|
1411
|
+
createBy.data.monitoringInterval,
|
|
1412
|
+
);
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1362
1415
|
/*
|
|
1363
1416
|
* Validate the request's shape before consulting billing. A conflicting
|
|
1364
1417
|
* Monitor Template reference, or one hidden by the caller's read scope, is
|