@oneuptime/common 14.0.3 → 14.0.6
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/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
- package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
- package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
- package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
- package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +1 -1
- package/Server/Middleware/TelemetryIngest.ts +15 -8
- package/Server/Services/AlertReminderRuleService.ts +100 -24
- package/Server/Services/DatabaseServerEndpointService.ts +895 -0
- package/Server/Services/DatabaseServerFeedService.ts +128 -0
- package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
- package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
- package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
- package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
- package/Server/Services/DatabaseServerService.ts +4546 -0
- package/Server/Services/DatabaseService.ts +14 -8
- package/Server/Services/DockerResourceService.ts +43 -2
- package/Server/Services/IncidentReminderRuleService.ts +103 -23
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +113 -5
- package/Server/Services/IoTDeviceService.ts +145 -37
- package/Server/Services/MetricService.ts +1 -1
- package/Server/Services/OpenTelemetryIngestService.ts +19 -0
- package/Server/Services/PodmanResourceService.ts +43 -2
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
- package/Server/Services/ServiceService.ts +1 -1
- package/Server/Services/TelemetryUsageBillingService.ts +29 -2
- package/Server/Services/UserProjectSsoConsentService.ts +74 -0
- package/Server/Services/UserService.ts +14 -1
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +84 -2
- package/Server/Utils/AI/Toolbox/MetricTools.ts +13 -2
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +81 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +1 -1
- package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +33 -0
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +192 -9
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2264 -755
- package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
- package/Server/Utils/Monitor/MonitorResource.ts +47 -11
- package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
- package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/StartServer.ts +26 -6
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
- package/Server/Utils/Telemetry/Telemetry.ts +16 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
- package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
- package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
- package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
- package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
- package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
- package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
- package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
- package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
- package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
- package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
- package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
- package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
- package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
- package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
- package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
- package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
- package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
- package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
- package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
- package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
- package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
- package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
- package/Tests/App/Dashboard/NetworkTopologyExplorerSearch.test.tsx +1267 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
- package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
- package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +4 -1
- package/Tests/App/Dashboard/RumOverviewPage.test.tsx +127 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
- package/Tests/App/Dashboard/SiteSearchBox.test.tsx +2110 -0
- package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +168 -8
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
- package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
- package/Tests/ClassStrings.ts +178 -0
- package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
- package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/RenderedMarkup.ts +518 -0
- package/Tests/ResponsiveVisibility.test.ts +490 -4
- package/Tests/ResponsiveVisibility.ts +505 -52
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
- package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
- package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
- package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
- package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
- package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
- package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
- package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
- package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
- package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
- package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
- package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
- package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
- package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +12 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
- package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
- package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
- package/Tests/Server/Services/SavedViewDefaults.test.ts +325 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/StatusPageCertificateService.test.ts +169 -0
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +191 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
- package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
- package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
- package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
- package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
- package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
- package/Tests/Server/Types/Database/QueryHelperSearchAllWords.test.ts +651 -0
- package/Tests/Server/Utils/AI/AlertWriteTools.test.ts +256 -0
- package/Tests/Server/Utils/AI/IncidentWriteTools.test.ts +482 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +54 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
- package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
- package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
- package/Tests/Server/Utils/Monitor/MetricDecimalThreshold.test.ts +417 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1815 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
- package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
- package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
- package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
- package/Tests/Types/BaseDatabase/AggregationType.test.ts +5 -1
- package/Tests/Types/Dashboard/KubernetesDashboardTemplate.test.ts +184 -0
- package/Tests/Types/Dashboard/KubernetesDashboardTemplates.test.ts +107 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
- package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
- package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
- package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
- package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
- package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
- package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
- package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +292 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +272 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
- package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +202 -0
- package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
- package/Tests/UI/Components/Card.test.tsx +93 -2
- package/Tests/UI/Components/FeedOptions.test.ts +6 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
- package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
- package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
- package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +76 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +53 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +54 -0
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
- package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
- package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
- package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
- package/Tests/UI/Utils/Navigation.test.ts +102 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
- package/Tests/Utils/Dashboard/KubernetesClusterCpuTileRepair.test.ts +370 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
- package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
- package/Tests/Utils/Rules/MonitorTypeRuleCriteria.test.ts +181 -0
- package/Tests/Utils/ValueFormatter.test.ts +50 -0
- package/Tests/tsconfig.json +16 -0
- package/Types/AI/AIResourceContext.ts +7 -0
- package/Types/BaseDatabase/AggregationType.ts +7 -0
- package/Types/Dashboard/DashboardTemplates.ts +22 -8
- package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
- package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
- package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
- package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
- package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
- package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
- package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
- package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/CephAlertTemplates.ts +18 -0
- package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
- package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
- package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
- package/Types/Permission.ts +267 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
- package/Types/Rules/RuleRun.ts +12 -0
- package/Types/Rum/SessionReplayCustomEvents.ts +29 -3
- package/Types/Rum/WebVitals.ts +13 -0
- package/Types/Telemetry/EntityType.ts +23 -0
- package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
- package/Types/Telemetry/ServiceType.ts +8 -0
- package/UI/Components/Banner/Banner.tsx +1 -1
- package/UI/Components/Card/Card.tsx +1 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
- package/UI/Components/Date/StartAndEndDate.tsx +5 -5
- package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
- package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
- package/UI/Components/Forms/BasicForm.tsx +1 -1
- package/UI/Components/Header/Header.tsx +1 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
- package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
- package/UI/Components/Input/Input.tsx +11 -0
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
- package/UI/Components/Modal/ModalFooter.tsx +1 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
- package/UI/Components/Navbar/NavBar.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
- package/UI/Components/Page/Page.tsx +1 -1
- package/UI/Components/Pagination/Pagination.tsx +3 -3
- package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
- package/UI/Components/SideMenu/SideMenu.tsx +4 -1
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
- package/UI/Components/StatusPage/ResourceList.tsx +6 -6
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
- package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Styles/Theme.css +8 -1
- package/UI/Utils/Navigation.ts +89 -42
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
- package/UI/Utils/TelemetryService.ts +4 -3
- package/Utils/Dashboard/KubernetesClusterCpuTileRepair.ts +147 -0
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/MetricUnitUtil.ts +103 -11
- package/Utils/Monitor/MetricValueFormatter.ts +66 -13
- package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
- package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
- package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
- package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
- package/Utils/Telemetry/EntityKey.ts +176 -0
- package/Utils/ValueFormatter.ts +16 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
- package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +8 -4
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerResourceService.js +30 -3
- package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +88 -5
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceService.js +111 -24
- package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanResourceService.js +30 -3
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +1 -1
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
- package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +13 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +73 -2
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js +13 -2
- package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +58 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +31 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +135 -14
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +20 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +7 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationType.js +7 -0
- package/build/dist/Types/BaseDatabase/AggregationType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +22 -8
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -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/Rum/SessionReplayCustomEvents.js.map +1 -1
- package/build/dist/Types/Rum/WebVitals.js +12 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +23 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +8 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Banner/Banner.js +1 -1
- package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
- package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +1 -1
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
- package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +66 -33
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js +110 -0
- package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js.map +1 -0
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +77 -13
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +15 -0
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
- package/tsconfig.tests.json +7 -5
|
@@ -4015,17 +4015,23 @@ class DatabaseService<TBaseModel extends BaseModel> extends BaseService {
|
|
|
4015
4015
|
/*
|
|
4016
4016
|
* The lock is taken by the sub-SELECT and inherited by the UPDATE within
|
|
4017
4017
|
* the same implicit transaction, so the outer write never blocks either.
|
|
4018
|
-
*
|
|
4019
|
-
*
|
|
4020
|
-
*
|
|
4018
|
+
*
|
|
4019
|
+
* The UPDATE sits in a CTE so the statement is a SELECT of the rows it
|
|
4020
|
+
* wrote. TypeORM's postgres `query()` answers a top-level UPDATE with
|
|
4021
|
+
* `[rows, rowCount]` - an array of length 2 whether or not anything was
|
|
4022
|
+
* written - so a bare `UPDATE ... RETURNING` made every skipped write
|
|
4023
|
+
* read as applied. A SELECT comes back as its rows: one when the row
|
|
4024
|
+
* was written, none when it was locked or no longer exists.
|
|
4021
4025
|
*/
|
|
4022
|
-
const sql: string = `
|
|
4023
|
-
", ",
|
|
4024
|
-
)} WHERE "${primaryColumnName}" IN (SELECT "${primaryColumnName}" FROM "${
|
|
4026
|
+
const sql: string = `WITH "updated" AS (UPDATE "${
|
|
4025
4027
|
metadata.tableName
|
|
4026
|
-
}" WHERE "${primaryColumnName}"
|
|
4028
|
+
}" SET ${setClauses.join(", ")} WHERE "${primaryColumnName}" IN (SELECT "${
|
|
4029
|
+
primaryColumnName
|
|
4030
|
+
}" FROM "${metadata.tableName}" WHERE "${primaryColumnName}" = $${
|
|
4027
4031
|
params.length
|
|
4028
|
-
} FOR UPDATE SKIP LOCKED) RETURNING "${primaryColumnName}"
|
|
4032
|
+
} FOR UPDATE SKIP LOCKED) RETURNING "${primaryColumnName}") SELECT "${
|
|
4033
|
+
primaryColumnName
|
|
4034
|
+
}" FROM "updated"`;
|
|
4029
4035
|
|
|
4030
4036
|
const result: unknown = await repository.manager.query(sql, params);
|
|
4031
4037
|
|
|
@@ -39,6 +39,19 @@ export interface ParsedDockerContainer {
|
|
|
39
39
|
cpuPercent: number | null;
|
|
40
40
|
memoryBytes: number | null;
|
|
41
41
|
observedAt: Date;
|
|
42
|
+
/*
|
|
43
|
+
* The container labels the agent copies onto its metrics (Compose /
|
|
44
|
+
* Swarm / Testcontainers keys, see CONTAINER_CLASSIFIER_LABEL_KEYS):
|
|
45
|
+
* MERGED into the row's labels, never replacing what the inventory
|
|
46
|
+
* snapshot wrote. Null / omitted leaves the labels alone.
|
|
47
|
+
*/
|
|
48
|
+
labels?: JSONObject | null | undefined;
|
|
49
|
+
/*
|
|
50
|
+
* When the container's current run started (metric time − container.uptime).
|
|
51
|
+
* Fills an empty resourceCreationTimestamp, and moves it forward when
|
|
52
|
+
* the container was restarted or recreated under the same name.
|
|
53
|
+
*/
|
|
54
|
+
startedAt?: Date | null | undefined;
|
|
42
55
|
}
|
|
43
56
|
|
|
44
57
|
export interface ParsedDockerResource {
|
|
@@ -141,7 +154,7 @@ export class Service extends DatabaseService<Model> {
|
|
|
141
154
|
|
|
142
155
|
for (const c of chunk) {
|
|
143
156
|
valueFragments.push(
|
|
144
|
-
`($${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}::numeric, $${p++}::bigint, $${p++}::timestamptz, $${p++}::timestamptz, $${p++})`,
|
|
157
|
+
`($${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}, $${p++}::numeric, $${p++}::bigint, $${p++}::timestamptz, $${p++}::timestamptz, $${p++}, $${p++}::jsonb, $${p++}::timestamptz)`,
|
|
145
158
|
);
|
|
146
159
|
params.push(
|
|
147
160
|
data.projectId.toString(),
|
|
@@ -160,15 +173,27 @@ export class Service extends DatabaseService<Model> {
|
|
|
160
173
|
c.observedAt,
|
|
161
174
|
c.observedAt,
|
|
162
175
|
0, // version (BaseModel @VersionColumn)
|
|
176
|
+
c.labels && Object.keys(c.labels).length > 0
|
|
177
|
+
? JSON.stringify(c.labels)
|
|
178
|
+
: null,
|
|
179
|
+
c.startedAt || null,
|
|
163
180
|
);
|
|
164
181
|
}
|
|
165
182
|
|
|
183
|
+
/*
|
|
184
|
+
* The same container name with a different id is a recreated
|
|
185
|
+
* container: its labels and start time replace the old ones. Else
|
|
186
|
+
* the metric labels are merged into whatever the inventory wrote,
|
|
187
|
+
* and the start time only moves forward (a restart) — by more than
|
|
188
|
+
* a minute, so clock jitter between scrapes never rewrites it.
|
|
189
|
+
*/
|
|
166
190
|
const sql: string = `
|
|
167
191
|
INSERT INTO "DockerResource" (
|
|
168
192
|
"projectId", "dockerHostId", "kind", "name",
|
|
169
193
|
"containerId", "imageName", "state",
|
|
170
194
|
"latestCpuPercent", "latestMemoryBytes",
|
|
171
|
-
"metricsUpdatedAt", "lastSeenAt", "version"
|
|
195
|
+
"metricsUpdatedAt", "lastSeenAt", "version",
|
|
196
|
+
"labels", "resourceCreationTimestamp"
|
|
172
197
|
)
|
|
173
198
|
VALUES ${valueFragments.join(", ")}
|
|
174
199
|
ON CONFLICT ("projectId", "dockerHostId", "kind", "name")
|
|
@@ -180,6 +205,22 @@ export class Service extends DatabaseService<Model> {
|
|
|
180
205
|
"latestMemoryBytes" = COALESCE(EXCLUDED."latestMemoryBytes", "DockerResource"."latestMemoryBytes"),
|
|
181
206
|
"metricsUpdatedAt" = EXCLUDED."metricsUpdatedAt",
|
|
182
207
|
"lastSeenAt" = EXCLUDED."lastSeenAt",
|
|
208
|
+
"labels" = CASE
|
|
209
|
+
WHEN EXCLUDED."labels" IS NULL THEN "DockerResource"."labels"
|
|
210
|
+
WHEN lower(left(EXCLUDED."containerId", 12)) <> lower(left("DockerResource"."containerId", 12))
|
|
211
|
+
THEN EXCLUDED."labels"
|
|
212
|
+
WHEN jsonb_typeof("DockerResource"."labels") = 'object'
|
|
213
|
+
THEN "DockerResource"."labels" || EXCLUDED."labels"
|
|
214
|
+
ELSE EXCLUDED."labels"
|
|
215
|
+
END,
|
|
216
|
+
"resourceCreationTimestamp" = CASE
|
|
217
|
+
WHEN EXCLUDED."resourceCreationTimestamp" IS NULL THEN "DockerResource"."resourceCreationTimestamp"
|
|
218
|
+
WHEN "DockerResource"."resourceCreationTimestamp" IS NULL
|
|
219
|
+
OR lower(left(EXCLUDED."containerId", 12)) <> lower(left("DockerResource"."containerId", 12))
|
|
220
|
+
OR EXCLUDED."resourceCreationTimestamp" > "DockerResource"."resourceCreationTimestamp" + interval '1 minute'
|
|
221
|
+
THEN EXCLUDED."resourceCreationTimestamp"
|
|
222
|
+
ELSE "DockerResource"."resourceCreationTimestamp"
|
|
223
|
+
END,
|
|
183
224
|
"updatedAt" = now()
|
|
184
225
|
WHERE EXCLUDED."lastSeenAt" >= "DockerResource"."lastSeenAt"
|
|
185
226
|
`;
|
|
@@ -101,10 +101,34 @@ export class Service extends DatabaseService<Model> {
|
|
|
101
101
|
return onDelete;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
/*
|
|
105
|
+
* Re-matches the reminder rule for every open incident in the project and
|
|
106
|
+
* rewrites its nextReminderNotificationAt.
|
|
107
|
+
*
|
|
108
|
+
* Without options that is one read of at most LIMIT_MAX open incidents, and
|
|
109
|
+
* it must stay one: the rule create, update and delete hooks run it inside
|
|
110
|
+
* the API request.
|
|
111
|
+
*
|
|
112
|
+
* `onlyWithoutNextReminder` narrows that to open incidents with no reminder
|
|
113
|
+
* scheduled at all, and reads every one of them, in `_id`-ordered pages of
|
|
114
|
+
* LIMIT_MAX. It exists for backfills (see the
|
|
115
|
+
* ScheduleRemindersMissedByReminderRuleLookup data migration), which run in a
|
|
116
|
+
* worker rather than a request and must reach every such incident of the
|
|
117
|
+
* project, however many there are. The pages are cursored by `_id`, not
|
|
118
|
+
* offset, because refreshing an incident can take it out of the set being
|
|
119
|
+
* paged. An incident that already has a timestamp is left alone, because
|
|
120
|
+
* re-scheduling it would push a reminder that is due, or overdue, one full
|
|
121
|
+
* interval later.
|
|
122
|
+
*/
|
|
104
123
|
@CaptureSpan()
|
|
105
124
|
public async refreshSchedulesForOpenIncidents(
|
|
106
125
|
projectId: ObjectID,
|
|
126
|
+
options?: { onlyWithoutNextReminder?: boolean | undefined } | undefined,
|
|
107
127
|
): Promise<void> {
|
|
128
|
+
const onlyWithoutNextReminder: boolean = Boolean(
|
|
129
|
+
options?.onlyWithoutNextReminder,
|
|
130
|
+
);
|
|
131
|
+
|
|
108
132
|
try {
|
|
109
133
|
const unresolvedStates: Array<IncidentState> =
|
|
110
134
|
await IncidentStateService.findBy({
|
|
@@ -132,33 +156,51 @@ export class Service extends DatabaseService<Model> {
|
|
|
132
156
|
return;
|
|
133
157
|
}
|
|
134
158
|
|
|
135
|
-
|
|
136
|
-
|
|
159
|
+
let afterId: ObjectID | null = null;
|
|
160
|
+
|
|
161
|
+
while (true) {
|
|
162
|
+
const openIncidents: Array<Incident> = await this.findOpenIncidents({
|
|
137
163
|
projectId: projectId,
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
},
|
|
143
|
-
limit: LIMIT_MAX,
|
|
144
|
-
skip: 0,
|
|
145
|
-
props: {
|
|
146
|
-
isRoot: true,
|
|
147
|
-
},
|
|
148
|
-
});
|
|
164
|
+
unresolvedStateIds: unresolvedStateIds,
|
|
165
|
+
onlyWithoutNextReminder: onlyWithoutNextReminder,
|
|
166
|
+
afterId: afterId,
|
|
167
|
+
});
|
|
149
168
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
169
|
+
for (const incident of openIncidents) {
|
|
170
|
+
try {
|
|
171
|
+
await IncidentService.refreshReminderSchedule({
|
|
172
|
+
incidentId: incident.id!,
|
|
173
|
+
projectId: projectId,
|
|
174
|
+
});
|
|
175
|
+
} catch (error) {
|
|
176
|
+
logger.error(
|
|
177
|
+
`Failed to refresh reminder schedule for incident ${incident.id}: ${error}`,
|
|
178
|
+
{ projectId: projectId?.toString() } as LogAttributes,
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Without the option, the one read above is all there is.
|
|
184
|
+
if (!onlyWithoutNextReminder || openIncidents.length < LIMIT_MAX) {
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const lastId: ObjectID | null =
|
|
189
|
+
openIncidents[openIncidents.length - 1]!.id;
|
|
190
|
+
|
|
191
|
+
if (!lastId || (afterId && lastId.toString() <= afterId.toString())) {
|
|
192
|
+
/*
|
|
193
|
+
* A full page whose last row does not move the cursor forward
|
|
194
|
+
* would be read again forever. Not reachable with `_id ASC` and a
|
|
195
|
+
* `> afterId` filter; guarded so a broken sort cannot hang the
|
|
196
|
+
* backfill.
|
|
197
|
+
*/
|
|
198
|
+
throw new Error(
|
|
199
|
+
"the open incident page did not advance its _id cursor",
|
|
160
200
|
);
|
|
161
201
|
}
|
|
202
|
+
|
|
203
|
+
afterId = lastId;
|
|
162
204
|
}
|
|
163
205
|
} catch (error) {
|
|
164
206
|
logger.error(
|
|
@@ -168,6 +210,44 @@ export class Service extends DatabaseService<Model> {
|
|
|
168
210
|
}
|
|
169
211
|
}
|
|
170
212
|
|
|
213
|
+
/*
|
|
214
|
+
* One read of the project's open incidents: those whose current state is one
|
|
215
|
+
* of `unresolvedStateIds`. Both paths of refreshSchedulesForOpenIncidents
|
|
216
|
+
* read through here, so what "open" means is written once.
|
|
217
|
+
*
|
|
218
|
+
* With `onlyWithoutNextReminder`, only those with no reminder scheduled,
|
|
219
|
+
* `_id` ascending and after `afterId` when there is one. Without it, no
|
|
220
|
+
* cursor and the default order: the read the rule hooks have always made.
|
|
221
|
+
*/
|
|
222
|
+
private async findOpenIncidents(data: {
|
|
223
|
+
projectId: ObjectID;
|
|
224
|
+
unresolvedStateIds: Array<ObjectID>;
|
|
225
|
+
onlyWithoutNextReminder: boolean;
|
|
226
|
+
afterId: ObjectID | null;
|
|
227
|
+
}): Promise<Array<Incident>> {
|
|
228
|
+
return await IncidentService.findBy({
|
|
229
|
+
query: {
|
|
230
|
+
projectId: data.projectId,
|
|
231
|
+
currentIncidentStateId: QueryHelper.any(data.unresolvedStateIds),
|
|
232
|
+
...(data.onlyWithoutNextReminder
|
|
233
|
+
? { nextReminderNotificationAt: QueryHelper.isNull() }
|
|
234
|
+
: {}),
|
|
235
|
+
...(data.afterId ? { _id: QueryHelper.greaterThan(data.afterId) } : {}),
|
|
236
|
+
},
|
|
237
|
+
select: {
|
|
238
|
+
_id: true,
|
|
239
|
+
},
|
|
240
|
+
...(data.onlyWithoutNextReminder
|
|
241
|
+
? { sort: { _id: SortOrder.Ascending } }
|
|
242
|
+
: {}),
|
|
243
|
+
limit: LIMIT_MAX,
|
|
244
|
+
skip: 0,
|
|
245
|
+
props: {
|
|
246
|
+
isRoot: true,
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
|
|
171
251
|
@CaptureSpan()
|
|
172
252
|
public async findMatchingRule(data: {
|
|
173
253
|
projectId: ObjectID;
|
package/Server/Services/Index.ts
CHANGED
|
@@ -106,6 +106,12 @@ import VMwareVCenterOwnerRuleService from "./VMwareVCenterOwnerRuleService";
|
|
|
106
106
|
import VMwareVCenterOwnerTeamService from "./VMwareVCenterOwnerTeamService";
|
|
107
107
|
import VMwareVCenterOwnerUserService from "./VMwareVCenterOwnerUserService";
|
|
108
108
|
import CephClusterOwnerUserService from "./CephClusterOwnerUserService";
|
|
109
|
+
import DatabaseServerService from "./DatabaseServerService";
|
|
110
|
+
import DatabaseServerEndpointService from "./DatabaseServerEndpointService";
|
|
111
|
+
import DatabaseServerLabelRuleService from "./DatabaseServerLabelRuleService";
|
|
112
|
+
import DatabaseServerOwnerRuleService from "./DatabaseServerOwnerRuleService";
|
|
113
|
+
import DatabaseServerOwnerTeamService from "./DatabaseServerOwnerTeamService";
|
|
114
|
+
import DatabaseServerOwnerUserService from "./DatabaseServerOwnerUserService";
|
|
109
115
|
import LlmProviderService from "./LlmProviderService";
|
|
110
116
|
import DataSourceService from "./DataSourceService";
|
|
111
117
|
import AuditLogService from "./AuditLogService";
|
|
@@ -150,6 +156,7 @@ import KubernetesClusterFeedService from "./KubernetesClusterFeedService";
|
|
|
150
156
|
import DockerHostFeedService from "./DockerHostFeedService";
|
|
151
157
|
import DockerSwarmClusterFeedService from "./DockerSwarmClusterFeedService";
|
|
152
158
|
import CephClusterFeedService from "./CephClusterFeedService";
|
|
159
|
+
import DatabaseServerFeedService from "./DatabaseServerFeedService";
|
|
153
160
|
import PodmanHostFeedService from "./PodmanHostFeedService";
|
|
154
161
|
import ProxmoxClusterFeedService from "./ProxmoxClusterFeedService";
|
|
155
162
|
import VMwareVCenterFeedService from "./VMwareVCenterFeedService";
|
|
@@ -291,6 +298,7 @@ import UserOnCallLogService from "./UserOnCallLogService";
|
|
|
291
298
|
import UserOnCallLogTimelineService from "./UserOnCallLogTimelineService";
|
|
292
299
|
import UserService from "./UserService";
|
|
293
300
|
import UserSessionService from "./UserSessionService";
|
|
301
|
+
import UserProjectSsoConsentService from "./UserProjectSsoConsentService";
|
|
294
302
|
import UserTotpAuthService from "./UserTotpAuthService";
|
|
295
303
|
import UserTwoFactorBackupCodeService from "./UserTwoFactorBackupCodeService";
|
|
296
304
|
import UserWebAuthnService from "./UserWebAuthnService";
|
|
@@ -573,6 +581,12 @@ const services: Array<BaseService> = [
|
|
|
573
581
|
VMwareVCenterOwnerRuleService,
|
|
574
582
|
VMwareVCenterOwnerTeamService,
|
|
575
583
|
VMwareVCenterOwnerUserService,
|
|
584
|
+
DatabaseServerService,
|
|
585
|
+
DatabaseServerEndpointService,
|
|
586
|
+
DatabaseServerLabelRuleService,
|
|
587
|
+
DatabaseServerOwnerRuleService,
|
|
588
|
+
DatabaseServerOwnerTeamService,
|
|
589
|
+
DatabaseServerOwnerUserService,
|
|
576
590
|
LlmProviderService,
|
|
577
591
|
DataSourceService,
|
|
578
592
|
|
|
@@ -600,6 +614,7 @@ const services: Array<BaseService> = [
|
|
|
600
614
|
DockerHostFeedService,
|
|
601
615
|
DockerSwarmClusterFeedService,
|
|
602
616
|
CephClusterFeedService,
|
|
617
|
+
DatabaseServerFeedService,
|
|
603
618
|
PodmanHostFeedService,
|
|
604
619
|
ProxmoxClusterFeedService,
|
|
605
620
|
VMwareVCenterFeedService,
|
|
@@ -691,6 +706,7 @@ const services: Array<BaseService> = [
|
|
|
691
706
|
|
|
692
707
|
UserService,
|
|
693
708
|
UserSessionService,
|
|
709
|
+
UserProjectSsoConsentService,
|
|
694
710
|
UserCallService,
|
|
695
711
|
UserEmailService,
|
|
696
712
|
UserNotificationRuleService,
|
|
@@ -31,6 +31,11 @@ import {
|
|
|
31
31
|
shouldWarnEntityBudgetOnce,
|
|
32
32
|
} from "../Utils/Telemetry/EntityRegistry";
|
|
33
33
|
|
|
34
|
+
// A database node's port, as its calls named it (deriveDatabaseDisplayName).
|
|
35
|
+
const PORT_REGEX: RegExp = /^\d{1,5}$/;
|
|
36
|
+
// A bare IPv6 address - bracketed before a port.
|
|
37
|
+
const IPV6_LITERAL_REGEX: RegExp = /^[0-9a-f:.]+$/i;
|
|
38
|
+
|
|
34
39
|
export class InventoryItemService extends DatabaseService<Model> {
|
|
35
40
|
public constructor() {
|
|
36
41
|
super(Model);
|
|
@@ -427,6 +432,39 @@ export class InventoryItemService extends DatabaseService<Model> {
|
|
|
427
432
|
}
|
|
428
433
|
}
|
|
429
434
|
|
|
435
|
+
/*
|
|
436
|
+
* A database dependency node named by the old rule - its bare namespace,
|
|
437
|
+
* "orders" for every Postgres a project calls - is renamed to
|
|
438
|
+
* "<namespace> @ <server>" the next time it is seen. Same guard as above:
|
|
439
|
+
* only a name this service generated is replaced, never one a person
|
|
440
|
+
* typed, and a later sighting that cannot name the port does not undo a
|
|
441
|
+
* name that has it.
|
|
442
|
+
*/
|
|
443
|
+
if (entity.entityType === EntityType.Database) {
|
|
444
|
+
const desiredDisplayName: string =
|
|
445
|
+
InventoryItemService.deriveDatabaseDisplayName(entity).substring(
|
|
446
|
+
0,
|
|
447
|
+
ColumnLength.ShortText,
|
|
448
|
+
);
|
|
449
|
+
const existingDisplayName: string = existing.displayName || "";
|
|
450
|
+
const generatedBefore: Array<string> = [
|
|
451
|
+
InventoryItemService.deriveLegacyDatabaseDisplayName(entity),
|
|
452
|
+
InventoryItemService.deriveDatabaseDisplayName(entity, {
|
|
453
|
+
withPort: false,
|
|
454
|
+
}),
|
|
455
|
+
].map((name: string): string => {
|
|
456
|
+
return name.substring(0, ColumnLength.ShortText);
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
if (
|
|
460
|
+
desiredDisplayName &&
|
|
461
|
+
existingDisplayName !== desiredDisplayName &&
|
|
462
|
+
(!existingDisplayName || generatedBefore.includes(existingDisplayName))
|
|
463
|
+
) {
|
|
464
|
+
update.displayName = desiredDisplayName;
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
430
468
|
const incoming: Record<string, string> = entity.descriptiveAttributes || {};
|
|
431
469
|
if (Object.keys(incoming).length > 0) {
|
|
432
470
|
const current: Record<string, unknown> =
|
|
@@ -498,6 +536,13 @@ export class InventoryItemService extends DatabaseService<Model> {
|
|
|
498
536
|
}
|
|
499
537
|
}
|
|
500
538
|
|
|
539
|
+
if (entity.entityType === EntityType.Database) {
|
|
540
|
+
const databaseName: string = this.deriveDatabaseDisplayName(entity);
|
|
541
|
+
if (databaseName) {
|
|
542
|
+
return databaseName;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
501
546
|
for (const key of this.dependencyDisplayNameOrderByType[
|
|
502
547
|
entity.entityType
|
|
503
548
|
] || []) {
|
|
@@ -509,13 +554,76 @@ export class InventoryItemService extends DatabaseService<Model> {
|
|
|
509
554
|
return this.deriveFallbackDisplayName(entity);
|
|
510
555
|
}
|
|
511
556
|
|
|
557
|
+
/*
|
|
558
|
+
* A database dependency node is named after the logical database AND the
|
|
559
|
+
* server it lives on: "<db.namespace> @ <host[:port]>". The namespace alone
|
|
560
|
+
* ("orders") is shared by every copy of an application's schema - an e2e
|
|
561
|
+
* project showed ten different PostgreSQL servers all named "orders" on
|
|
562
|
+
* the Service Map and in Inventory. The host is the node's identifying
|
|
563
|
+
* `server.address`; the port is the descriptive `server.port` its calls
|
|
564
|
+
* named (left off when they named none, or several). Only the name
|
|
565
|
+
* changes: the node's identity (engine, host, namespace) does not.
|
|
566
|
+
* Without a namespace it is the server alone, without a host the
|
|
567
|
+
* namespace, and with neither the engine. '' when nothing names it.
|
|
568
|
+
*/
|
|
569
|
+
public static deriveDatabaseDisplayName(
|
|
570
|
+
entity: ExtractedEntity,
|
|
571
|
+
options?: { withPort?: boolean | undefined },
|
|
572
|
+
): string {
|
|
573
|
+
const id: Record<string, string> = entity.identifyingAttributes || {};
|
|
574
|
+
const descriptive: Record<string, string> =
|
|
575
|
+
entity.descriptiveAttributes || {};
|
|
576
|
+
|
|
577
|
+
const namespace: string = (id["db.namespace"] || "").trim();
|
|
578
|
+
const host: string = (id["server.address"] || "").trim();
|
|
579
|
+
const port: string = (descriptive["server.port"] || "").trim();
|
|
580
|
+
|
|
581
|
+
let server: string = host;
|
|
582
|
+
if (host && options?.withPort !== false && PORT_REGEX.test(port)) {
|
|
583
|
+
if (!host.includes(":")) {
|
|
584
|
+
server = `${host}:${port}`;
|
|
585
|
+
} else if (IPV6_LITERAL_REGEX.test(host)) {
|
|
586
|
+
// A bare IPv6 address takes brackets before a port.
|
|
587
|
+
server = `[${host}]:${port}`;
|
|
588
|
+
}
|
|
589
|
+
// Anything else with a colon (a host list) already names its ports.
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
if (namespace && server) {
|
|
593
|
+
return `${namespace} @ ${server}`;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
return server || namespace || (id["db.system.name"] || "").trim();
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/*
|
|
600
|
+
* What deriveDisplayName named a database node before it named the server
|
|
601
|
+
* too: the first of namespace, host, engine. Only a row still carrying
|
|
602
|
+
* this (or the port-less new name) is renamed - see buildDescriptiveUpdate.
|
|
603
|
+
*/
|
|
604
|
+
private static deriveLegacyDatabaseDisplayName(
|
|
605
|
+
entity: ExtractedEntity,
|
|
606
|
+
): string {
|
|
607
|
+
const id: Record<string, string> = entity.identifyingAttributes || {};
|
|
608
|
+
|
|
609
|
+
for (const key of this.dependencyDisplayNameOrderByType[
|
|
610
|
+
EntityType.Database
|
|
611
|
+
] || []) {
|
|
612
|
+
if (id[key]) {
|
|
613
|
+
return id[key]!;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
return this.deriveFallbackDisplayName(entity);
|
|
618
|
+
}
|
|
619
|
+
|
|
512
620
|
/*
|
|
513
621
|
* Dependency endpoints have composite identities in which the most
|
|
514
|
-
* recognisable part is not a `*.name` key
|
|
515
|
-
*
|
|
516
|
-
*
|
|
517
|
-
*
|
|
518
|
-
* them, then their host.
|
|
622
|
+
* recognisable part is not a `*.name` key. A database is named by
|
|
623
|
+
* deriveDatabaseDisplayName; its order here is the old rule (namespace,
|
|
624
|
+
* then host, then engine), which deriveLegacyDatabaseDisplayName reads to
|
|
625
|
+
* recognise the names it generated. Remote endpoints read best as the
|
|
626
|
+
* service name their callers gave them, then their host.
|
|
519
627
|
*/
|
|
520
628
|
private static readonly dependencyDisplayNameOrderByType: Partial<
|
|
521
629
|
Record<EntityType, Array<string>>
|
|
@@ -78,6 +78,123 @@ const UPSERT_COLUMNS: Array<string> = [
|
|
|
78
78
|
"version",
|
|
79
79
|
];
|
|
80
80
|
|
|
81
|
+
/*
|
|
82
|
+
* One entry per column of the `FROM (VALUES ...) AS v(...)` source in
|
|
83
|
+
* bulkUpdateLatestMetrics(). The placeholder tuple, the alias list, the
|
|
84
|
+
* bound params and the SET clause are all generated from this table, so
|
|
85
|
+
* they cannot drift apart: a hand-written tuple once carried 9
|
|
86
|
+
* placeholders against 10 aliases and 10 params, and Postgres rejected
|
|
87
|
+
* every mirror write (GitHub #3998).
|
|
88
|
+
*
|
|
89
|
+
* mirrorColumn: the IoTDevice column the value is COALESCEd into, or
|
|
90
|
+
* null for the join keys and observedAt, which the statement uses
|
|
91
|
+
* directly.
|
|
92
|
+
*/
|
|
93
|
+
export interface LatestMetricColumn {
|
|
94
|
+
alias: string;
|
|
95
|
+
cast: string | null;
|
|
96
|
+
mirrorColumn: string | null;
|
|
97
|
+
value: (metric: IoTDeviceLatestMetric) => unknown;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const nullableNumber: (value: number | null | undefined) => number | null = (
|
|
101
|
+
value: number | null | undefined,
|
|
102
|
+
): number | null => {
|
|
103
|
+
return value !== null && value !== undefined ? value : null;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
// bigint params go over the wire as integer strings: a JS number past 2^53 loses precision.
|
|
107
|
+
const nullableBigInt: (value: number | null | undefined) => string | null = (
|
|
108
|
+
value: number | null | undefined,
|
|
109
|
+
): string | null => {
|
|
110
|
+
return value !== null && value !== undefined
|
|
111
|
+
? Math.trunc(value).toString()
|
|
112
|
+
: null;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
export const LATEST_METRIC_COLUMNS: ReadonlyArray<LatestMetricColumn> = [
|
|
116
|
+
{
|
|
117
|
+
alias: "kind",
|
|
118
|
+
cast: null,
|
|
119
|
+
mirrorColumn: null,
|
|
120
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
121
|
+
return m.kind;
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
alias: "externalId",
|
|
126
|
+
cast: null,
|
|
127
|
+
mirrorColumn: null,
|
|
128
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
129
|
+
return m.externalId;
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
alias: "cpu",
|
|
134
|
+
cast: "numeric",
|
|
135
|
+
mirrorColumn: "latestCpuPercent",
|
|
136
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
137
|
+
return nullableNumber(m.cpuPercent);
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
alias: "mem",
|
|
142
|
+
cast: "bigint",
|
|
143
|
+
mirrorColumn: "latestMemoryBytes",
|
|
144
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
145
|
+
return nullableBigInt(m.memoryBytes);
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
alias: "maxMem",
|
|
150
|
+
cast: "bigint",
|
|
151
|
+
mirrorColumn: "maxMemoryBytes",
|
|
152
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
153
|
+
return nullableBigInt(m.maxMemoryBytes);
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
alias: "memPct",
|
|
158
|
+
cast: "numeric",
|
|
159
|
+
mirrorColumn: "latestMemoryPercent",
|
|
160
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
161
|
+
return nullableNumber(m.memoryPercent);
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
alias: "battery",
|
|
166
|
+
cast: "numeric",
|
|
167
|
+
mirrorColumn: "latestBatteryPercent",
|
|
168
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
169
|
+
return nullableNumber(m.batteryPercent);
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
alias: "signal",
|
|
174
|
+
cast: "numeric",
|
|
175
|
+
mirrorColumn: "latestSignalStrengthDbm",
|
|
176
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
177
|
+
return nullableNumber(m.signalStrengthDbm);
|
|
178
|
+
},
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
alias: "temp",
|
|
182
|
+
cast: "numeric",
|
|
183
|
+
mirrorColumn: "latestTemperatureCelsius",
|
|
184
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
185
|
+
return nullableNumber(m.temperatureCelsius);
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
alias: "observedAt",
|
|
190
|
+
cast: "timestamptz",
|
|
191
|
+
mirrorColumn: null,
|
|
192
|
+
value: (m: IoTDeviceLatestMetric): unknown => {
|
|
193
|
+
return m.observedAt;
|
|
194
|
+
},
|
|
195
|
+
},
|
|
196
|
+
];
|
|
197
|
+
|
|
81
198
|
export class Service extends DatabaseService<Model> {
|
|
82
199
|
public constructor() {
|
|
83
200
|
super(Model);
|
|
@@ -260,6 +377,22 @@ export class Service extends DatabaseService<Model> {
|
|
|
260
377
|
return;
|
|
261
378
|
}
|
|
262
379
|
|
|
380
|
+
const aliases: string = LATEST_METRIC_COLUMNS.map(
|
|
381
|
+
(column: LatestMetricColumn) => {
|
|
382
|
+
return `"${column.alias}"`;
|
|
383
|
+
},
|
|
384
|
+
).join(", ");
|
|
385
|
+
|
|
386
|
+
const assignments: string = LATEST_METRIC_COLUMNS.filter(
|
|
387
|
+
(column: LatestMetricColumn) => {
|
|
388
|
+
return column.mirrorColumn !== null;
|
|
389
|
+
},
|
|
390
|
+
)
|
|
391
|
+
.map((column: LatestMetricColumn) => {
|
|
392
|
+
return `"${column.mirrorColumn}" = COALESCE(v."${column.alias}", p."${column.mirrorColumn}"),`;
|
|
393
|
+
})
|
|
394
|
+
.join("\n ");
|
|
395
|
+
|
|
263
396
|
for (let i: number = 0; i < metrics.length; i += UPSERT_BATCH_SIZE) {
|
|
264
397
|
const chunk: Array<IoTDeviceLatestMetric> = metrics.slice(
|
|
265
398
|
i,
|
|
@@ -274,51 +407,26 @@ export class Service extends DatabaseService<Model> {
|
|
|
274
407
|
let paramIndex: number = 3;
|
|
275
408
|
|
|
276
409
|
for (const m of chunk) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
? Math.trunc(m.memoryBytes).toString()
|
|
288
|
-
: null,
|
|
289
|
-
m.maxMemoryBytes !== null && m.maxMemoryBytes !== undefined
|
|
290
|
-
? Math.trunc(m.maxMemoryBytes).toString()
|
|
291
|
-
: null,
|
|
292
|
-
m.memoryPercent !== null && m.memoryPercent !== undefined
|
|
293
|
-
? m.memoryPercent
|
|
294
|
-
: null,
|
|
295
|
-
m.batteryPercent !== null && m.batteryPercent !== undefined
|
|
296
|
-
? m.batteryPercent
|
|
297
|
-
: null,
|
|
298
|
-
m.signalStrengthDbm !== null && m.signalStrengthDbm !== undefined
|
|
299
|
-
? m.signalStrengthDbm
|
|
300
|
-
: null,
|
|
301
|
-
m.temperatureCelsius !== null && m.temperatureCelsius !== undefined
|
|
302
|
-
? m.temperatureCelsius
|
|
303
|
-
: null,
|
|
304
|
-
m.observedAt,
|
|
305
|
-
);
|
|
410
|
+
const placeholders: Array<string> = [];
|
|
411
|
+
for (const column of LATEST_METRIC_COLUMNS) {
|
|
412
|
+
placeholders.push(
|
|
413
|
+
column.cast
|
|
414
|
+
? `$${paramIndex++}::${column.cast}`
|
|
415
|
+
: `$${paramIndex++}`,
|
|
416
|
+
);
|
|
417
|
+
params.push(column.value(m));
|
|
418
|
+
}
|
|
419
|
+
valueFragments.push(`(${placeholders.join(", ")})`);
|
|
306
420
|
}
|
|
307
421
|
|
|
308
422
|
const sql: string = `
|
|
309
423
|
UPDATE "IoTDevice" AS p
|
|
310
424
|
SET
|
|
311
|
-
|
|
312
|
-
"latestMemoryBytes" = COALESCE(v."mem", p."latestMemoryBytes"),
|
|
313
|
-
"maxMemoryBytes" = COALESCE(v."maxMem", p."maxMemoryBytes"),
|
|
314
|
-
"latestMemoryPercent" = COALESCE(v."memPct", p."latestMemoryPercent"),
|
|
315
|
-
"latestBatteryPercent" = COALESCE(v."battery", p."latestBatteryPercent"),
|
|
316
|
-
"latestSignalStrengthDbm" = COALESCE(v."signal", p."latestSignalStrengthDbm"),
|
|
317
|
-
"latestTemperatureCelsius" = COALESCE(v."temp", p."latestTemperatureCelsius"),
|
|
425
|
+
${assignments}
|
|
318
426
|
"metricsUpdatedAt" = v."observedAt",
|
|
319
427
|
"updatedAt" = now()
|
|
320
428
|
FROM (VALUES ${valueFragments.join(", ")})
|
|
321
|
-
AS v(
|
|
429
|
+
AS v(${aliases})
|
|
322
430
|
WHERE
|
|
323
431
|
p."projectId" = $1
|
|
324
432
|
AND p."iotFleetId" = $2
|