@oneuptime/common 12.0.34 → 13.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/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/CloudResource.ts +45 -7
- package/Models/DatabaseModels/CodeRepository.ts +85 -0
- package/Models/DatabaseModels/GlobalConfig.ts +12 -12
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +57 -7
- package/Models/DatabaseModels/GoogleSecOpsConnectionRun.ts +263 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/InventoryItem.ts +44 -1
- package/Models/DatabaseModels/NetworkDevice.ts +126 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/User.ts +51 -2
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +43 -2
- package/Models/DatabaseModels/UserWebAuthn.ts +17 -0
- package/Models/DatabaseModels/VMwareResource.ts +1149 -0
- package/Models/DatabaseModels/VMwareVCenter.ts +1122 -0
- package/Models/DatabaseModels/VMwareVCenterFeed.ts +625 -0
- package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +514 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +596 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerTeam.ts +485 -0
- package/Models/DatabaseModels/VMwareVCenterOwnerUser.ts +484 -0
- package/Models/DatabaseModels/WorkflowVariable.ts +22 -1
- package/Server/API/AIAgentDataAPI.ts +79 -4
- package/Server/API/AIAgentGitHubAPI.ts +523 -0
- package/Server/API/AIChatAPI.ts +20 -1
- package/Server/API/BillingAPI.ts +33 -0
- package/Server/API/DashboardAPI.ts +10 -0
- package/Server/API/GitHubAPI.ts +47 -5
- package/Server/API/GoogleSecOpsConnectionAPI.ts +79 -0
- package/Server/API/UserWebAuthnAPI.ts +21 -1
- package/Server/API/VMwareResourceAPI.ts +143 -0
- package/Server/EnvironmentConfig.ts +47 -16
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.ts +68 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.ts +26 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.ts +636 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.ts +47 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.ts +17 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Infrastructure/Redis.ts +8 -8
- package/Server/Infrastructure/Status.ts +10 -4
- package/Server/Middleware/IdentityRateLimit.ts +101 -0
- package/Server/Services/AIRunService.ts +13 -0
- package/Server/Services/BillingPaymentMethodService.ts +99 -28
- package/Server/Services/BillingService.ts +287 -20
- package/Server/Services/CloudResourceInstanceService.ts +70 -0
- package/Server/Services/DatabaseService.ts +65 -13
- package/Server/Services/ExceptionAggregationService.ts +1 -0
- package/Server/Services/GoogleSecOpsConnectionRunService.ts +10 -0
- package/Server/Services/GoogleSecOpsConnectionService.ts +12 -0
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +31 -1
- package/Server/Services/LogAggregationService.ts +1 -0
- package/Server/Services/MetricAggregationService.ts +1 -0
- package/Server/Services/MobilePasskeyLoginService.ts +216 -0
- package/Server/Services/MonitorService.ts +51 -1
- package/Server/Services/MonitorTemplateService.ts +218 -35
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +481 -42
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +176 -2
- package/Server/Services/NetworkDeviceDiscoveryScanService.ts +87 -2
- package/Server/Services/NetworkDeviceService.ts +69 -0
- package/Server/Services/OpenTelemetryIngestService.ts +17 -0
- package/Server/Services/PayAsYouGoBillingService.ts +446 -0
- package/Server/Services/ProjectService.ts +46 -2
- package/Server/Services/ServerlessFunctionInstanceService.ts +71 -0
- package/Server/Services/TeamMemberService.ts +96 -36
- package/Server/Services/TelemetryIngestionKeyService.ts +80 -10
- package/Server/Services/TelemetryUsageBillingService.ts +95 -5
- package/Server/Services/TraceAggregationService.ts +5 -4
- package/Server/Services/UserNotificationRuleService.ts +76 -25
- package/Server/Services/UserWebAuthnService.ts +592 -133
- package/Server/Services/VMwareResourceService.ts +648 -0
- package/Server/Services/VMwareVCenterFeedService.ts +99 -0
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +240 -0
- package/Server/Services/VMwareVCenterLabelRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +252 -0
- package/Server/Services/VMwareVCenterOwnerRuleService.ts +14 -0
- package/Server/Services/VMwareVCenterOwnerTeamService.ts +139 -0
- package/Server/Services/VMwareVCenterOwnerUserService.ts +133 -0
- package/Server/Services/VMwareVCenterService.ts +629 -0
- package/Server/Services/WorkflowVariableService.ts +203 -0
- package/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.ts +17 -0
- package/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.ts +31 -1
- package/Server/Types/Database/Permissions/ReadPermission.ts +45 -5
- package/Server/Types/Database/QueryUtil.ts +56 -0
- package/Server/Types/Markdown.ts +93 -1
- package/Server/Utils/CodeRepository/GitHub/GitHub.ts +7 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.ts +341 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.ts +274 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.ts +375 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubConversation.ts +846 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.ts +360 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubRunReply.ts +421 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.ts +140 -0
- package/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.ts +906 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +225 -17
- package/Server/Utils/DataSource/EgressGuard.ts +160 -15
- package/Server/Utils/Database/TruncateColumnValue.ts +1 -1
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +12 -1
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +35 -2
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +44 -0
- package/Server/Utils/LogRedaction.ts +2 -1
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +82 -35
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +31 -5
- package/Server/Utils/Monitor/MonitorAlert.ts +1 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +502 -38
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +82 -9
- package/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.ts +16 -7
- package/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.ts +29 -17
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +107 -48
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +26 -4
- package/Server/Utils/Monitor/MonitorResourceContext.ts +5 -3
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +14 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +1 -0
- package/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.ts +158 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +27 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +26 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +28 -5
- package/Server/Utils/ResourceFeed/ResourceFeedUtil.ts +3 -3
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +14 -9
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.ts +116 -84
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +594 -195
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.ts +466 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +16 -1
- package/Server/Utils/Telemetry/ResourceHeartbeat.ts +2 -1
- package/Server/Utils/Telemetry/TelemetryEntity.ts +264 -10
- package/Server/Utils/Telemetry/VMwareSnapshotScan.ts +1352 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +529 -0
- package/Tests/App/Accounts/MobilePasskey.test.tsx +620 -0
- package/Tests/App/Accounts/PasswordRequirements.test.tsx +254 -0
- package/Tests/App/Accounts/RegisterPassword.test.tsx +553 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +32 -0
- package/Tests/App/Dashboard/AdoptedDeviceDrawer.test.tsx +374 -0
- package/Tests/App/Dashboard/AskAiAvailability.test.ts +224 -0
- package/Tests/App/Dashboard/AskAiDisabled.test.tsx +432 -0
- package/Tests/App/Dashboard/BackupCodes.test.tsx +414 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +530 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +195 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +199 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +198 -0
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +215 -0
- package/Tests/App/Dashboard/CloudFleetSummary.test.ts +183 -0
- package/Tests/App/Dashboard/CloudFleetSummaryComponent.test.tsx +248 -0
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +215 -0
- package/Tests/App/Dashboard/CriteriaFilterDefaults.test.ts +3 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +441 -0
- package/Tests/App/Dashboard/DashboardLabelVariables.test.tsx +580 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +458 -0
- package/Tests/App/Dashboard/DashboardMonitorLabelVariable.test.tsx +438 -0
- package/Tests/App/Dashboard/DashboardToolbarPopupLayering.test.tsx +566 -0
- package/Tests/App/Dashboard/DashboardVariableAllContract.test.tsx +5 -2
- package/Tests/App/Dashboard/DeviceAttachmentCard.test.tsx +273 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +505 -0
- package/Tests/App/Dashboard/DiscoveryScanLivePage.test.tsx +376 -0
- package/Tests/App/Dashboard/DiscoveryScanLiveUpdates.test.tsx +642 -0
- package/Tests/App/Dashboard/DiscoveryScanProgress.test.tsx +267 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +69 -231
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +163 -0
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +244 -0
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +724 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +401 -0
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +232 -0
- package/Tests/App/Dashboard/InventoryItems.test.tsx +201 -0
- package/Tests/App/Dashboard/InventoryTypeAndStatusFacets.test.tsx +798 -0
- package/Tests/App/Dashboard/MonitorTemplateSyncFields.test.tsx +539 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +320 -0
- package/Tests/App/Dashboard/NetworkTopologyToolbar.test.tsx +275 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedEmptyState.test.tsx +975 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +63 -0
- package/Tests/App/Dashboard/OnCallLayerCardOverrides.test.tsx +24 -7
- package/Tests/App/Dashboard/OnCallOverridePresentation.test.ts +496 -0
- package/Tests/App/Dashboard/OnCallScheduleOverrideClarity.test.tsx +677 -0
- package/Tests/App/Dashboard/OnCallSchedulePreviewOverrides.test.tsx +31 -3
- package/Tests/App/Dashboard/PaidUsageConsent.test.tsx +180 -0
- package/Tests/App/Dashboard/PasskeySettings.test.tsx +1220 -0
- package/Tests/App/Dashboard/PayAsYouGoConsentGate.test.tsx +176 -275
- package/Tests/App/Dashboard/PayAsYouGoNotices.test.tsx +380 -233
- package/Tests/App/Dashboard/ProductMenuBreadcrumbs.test.tsx +3 -23
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +1 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +626 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +348 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +331 -0
- package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +260 -0
- package/Tests/App/Dashboard/UserSettingsEmailPreferences.test.tsx +603 -0
- package/Tests/App/Dashboard/UserSettingsNotificationSettings.test.tsx +324 -0
- package/Tests/App/Dashboard/VMwareDashboardWidgets.test.ts +573 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +2 -0
- package/Tests/App/Dashboard/WorkflowVariablesTable.test.tsx +768 -0
- package/Tests/App/PublicDashboard/DashboardVariableSelector.test.tsx +13 -4
- package/Tests/App/StatusPage/StatusPageOidcOrigin.test.tsx +223 -0
- package/Tests/App/StatusPage/StatusPageOverviewLiveAndSearch.test.tsx +532 -40
- package/Tests/App/StatusPage/StatusPageResourceSearchBox.test.tsx +19 -2
- package/Tests/Fixtures/MobilePasskeyUser.json +8 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +25 -6
- package/Tests/Models/DatabaseModels/VMwareModels.test.ts +1134 -0
- package/Tests/Models/InventoryItemStatus.test.ts +147 -0
- package/Tests/Models/NetworkDeviceMacAddressColumn.test.ts +294 -0
- package/Tests/Models/RunnerVersionLabel.test.ts +4 -2
- package/Tests/Server/API/AIChatProvidersAIEnabled.test.ts +259 -0
- package/Tests/Server/API/AIChatRouteAuthorization.test.ts +31 -2
- package/Tests/Server/API/BillingPayAsYouGoStatus.test.ts +116 -0
- package/Tests/Server/API/DashboardPublicResourceListAPI.test.ts +158 -1
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +13 -2
- package/Tests/Server/API/GitHubWebhookSignature.test.ts +368 -0
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +248 -0
- package/Tests/Server/API/UserWebAuthnAuthenticationOptionsRoute.test.ts +330 -0
- package/Tests/Server/API/UserWebAuthnPasskeyAPI.test.ts +172 -0
- package/Tests/Server/API/VMwareResourceAPI.test.ts +546 -0
- package/Tests/Server/EnvironmentConfigValkey.test.ts +227 -0
- package/Tests/Server/Infrastructure/Postgres/AddMacAddressToNetworkDeviceMigration.test.ts +365 -0
- package/Tests/Server/Infrastructure/Postgres/CustomFieldValueMappingMigration.test.ts +62 -23
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupMetadataMigration.test.ts +85 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +34 -3
- package/Tests/Server/Infrastructure/ValkeyDeploymentConfig.test.ts +265 -0
- package/Tests/Server/Middleware/HttpMetricsMiddleware.test.ts +382 -0
- package/Tests/Server/Middleware/PasskeyRateLimit.test.ts +141 -0
- package/Tests/Server/Middleware/SCIMAuthorization.test.ts +525 -0
- package/Tests/Server/Services/AutoImportRuleRearmRecentScans.test.ts +343 -0
- package/Tests/Server/Services/AutoImportRuleWriteRearmsScans.test.ts +381 -0
- package/Tests/Server/Services/BillingPaymentMethodServiceSync.test.ts +175 -0
- package/Tests/Server/Services/BillingService.test.ts +26 -11
- package/Tests/Server/Services/BillingServiceMeteredPaymentAuthorization.test.ts +245 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +362 -0
- package/Tests/Server/Services/CloudResourceInstanceStalePrune.test.ts +188 -0
- package/Tests/Server/Services/DatabaseServiceAggregateBy.test.ts +291 -56
- package/Tests/Server/Services/DatabaseServiceSortTiebreaker.test.ts +151 -0
- package/Tests/Server/Services/DiscoveryScanClaimHookFreeSafety.test.ts +16 -2
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +153 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +13 -0
- package/Tests/Server/Services/InventoryItemManualCreate.test.ts +105 -0
- package/Tests/Server/Services/InventoryItemPromotionGate.test.ts +183 -0
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +36 -0
- package/Tests/Server/Services/InventoryUpsertTruncationGuard.test.ts +151 -0
- package/Tests/Server/Services/MobilePasskeyLoginIntegration.test.ts +231 -0
- package/Tests/Server/Services/MobilePasskeyLoginService.test.ts +315 -0
- package/Tests/Server/Services/MonitorPayAsYouGoBilling.test.ts +302 -0
- package/Tests/Server/Services/MonitorTemplateServiceCustomFieldSync.test.ts +502 -0
- package/Tests/Server/Services/MonitorTemplateServiceFieldSync.test.ts +994 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1133 -81
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +22 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanRegistration.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceMacAddressNormalization.test.ts +572 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/PayAsYouGoBillingService.test.ts +857 -0
- package/Tests/Server/Services/PayAsYouGoStripeRateLimitBudget.test.ts +379 -0
- package/Tests/Server/Services/ProjectServiceExtendTrial.test.ts +99 -1
- package/Tests/Server/Services/ProjectServiceSubscriptionSeats.test.ts +134 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +3 -2
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +32 -6
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +363 -175
- package/Tests/Server/Services/ServerlessFunctionInstanceStalePrune.test.ts +200 -0
- package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +3 -0
- package/Tests/Server/Services/TeamMemberBillingSeatSync.test.ts +762 -0
- package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +3 -0
- package/Tests/Server/Services/TelemetryIngestionKeyPolicyResolution.test.ts +72 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +17 -4
- package/Tests/Server/Services/TelemetryPayAsYouGoBilling.test.ts +355 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +41 -4
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +37 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyIntegration.test.ts +401 -0
- package/Tests/Server/Services/UserWebAuthnPasskeyService.test.ts +769 -0
- package/Tests/Server/Services/UserWebAuthnUserVerification.test.ts +649 -0
- package/Tests/Server/Services/VMwareResourceService.test.ts +945 -0
- package/Tests/Server/Services/VMwareVCenterService.test.ts +722 -0
- package/Tests/Server/Services/WorkflowVariableRenameUniqueness.test.ts +842 -0
- package/Tests/Server/TestingUtils/PasskeyHttpIntegration.ts +102 -0
- package/Tests/Server/TestingUtils/SecurityKey.ts +464 -0
- package/Tests/Server/TestingUtils/WebAuthnServiceMocks.ts +60 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +573 -0
- package/Tests/Server/Types/Database/InventoryStatusPostgres.test.ts +368 -0
- package/Tests/Server/Types/Database/Permissions/ProjectCustomerSupportAccessColumn.test.ts +261 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +261 -14
- package/Tests/Server/Types/Database/Permissions/WorkflowVariableColumnPermission.test.ts +95 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroups.test.ts +169 -0
- package/Tests/Server/Types/Database/QueryUtilIncludesAnyOfGroupsPostgres.test.ts +297 -0
- package/Tests/Server/Types/Markdown.test.ts +194 -1
- package/Tests/Server/Types/Workflow/Components/IncomingWebhookUtils.test.ts +279 -0
- package/Tests/Server/Types/Workflow/Components/TextToJson.test.ts +212 -0
- package/Tests/Server/Utils/CodeRepository/GitHubAgentTaskTrigger.test.ts +2101 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandAuthorizer.test.ts +883 -0
- package/Tests/Server/Utils/CodeRepository/GitHubCommandParser.test.ts +1474 -0
- package/Tests/Server/Utils/CodeRepository/GitHubConversation.test.ts +1526 -0
- package/Tests/Server/Utils/CodeRepository/GitHubReplyComposer.test.ts +1389 -0
- package/Tests/Server/Utils/CodeRepository/GitHubRunReply.test.ts +1707 -0
- package/Tests/Server/Utils/CodeRepository/GitHubWebhookHandler.test.ts +2202 -0
- package/Tests/Server/Utils/CustomField/CustomFieldMappingRegistry.test.ts +436 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.test.ts +559 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +896 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1 -1
- package/Tests/Server/Utils/EmailRollup/EmailRollupMetadataIntegration.test.ts +246 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +309 -4
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +6 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +185 -0
- package/Tests/Server/Utils/EventLoop.test.ts +359 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +30 -0
- package/Tests/Server/Utils/LogRedaction.test.ts +33 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +2 -1
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +242 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteriaAggregation.test.ts +13 -7
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +29 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +30 -6
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +246 -0
- package/Tests/Server/Utils/Monitor/Criteria/TelemetryStepMetricAlias.test.ts +10 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +66 -1
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEmailEvalLogAgreement.test.ts +280 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +586 -10
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +570 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilderUnits.test.ts +30 -5
- package/Tests/Server/Utils/Monitor/MonitorCriteriaMessageBuilderUnits.test.ts +68 -21
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +36 -19
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +60 -1
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +60 -0
- package/Tests/Server/Utils/Monitor/MonitorRootCauseTargetResolution.test.ts +423 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +6 -0
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.test.ts +573 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +317 -0
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +46 -2
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +81 -45
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +711 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClickhouseIntegration.test.ts +223 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsClient.test.ts +69 -1
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +838 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsErrorHandling.test.ts +241 -28
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsHttpIntegration.test.ts +651 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +11 -0
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +13 -12
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +112 -127
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsRequestContract.test.ts +12 -18
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsResponseParsing.test.ts +43 -0
- package/Tests/Server/Utils/Telemetry/ContextSpanProcessor.test.ts +281 -0
- package/Tests/Server/Utils/Telemetry/InventoryDuplicateIdentity.test.ts +316 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +691 -8
- package/Tests/Server/Utils/Telemetry/VMwareSnapshotScan.test.ts +1748 -0
- package/Tests/Types/Cloud/CloudPlatform.test.ts +574 -0
- package/Tests/Types/Database/IncludesAnyOfGroups.test.ts +106 -0
- package/Tests/Types/JSONFunctions.test.ts +40 -0
- package/Tests/Types/Monitor/MetricAndProfileDefaultCriteria.test.ts +2 -0
- package/Tests/Types/Monitor/MonitorCriteriaMetricVariables.test.ts +9 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepInfraMonitorUtils.test.ts +53 -8
- package/Tests/Types/Monitor/MonitorStepInfrastructureMonitors.test.ts +97 -0
- package/Tests/Types/Monitor/MonitorStepMetricViewConfigUtil.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorStepTemplateSyncFields.test.ts +107 -0
- package/Tests/Types/Monitor/MonitorTemplateSyncField.test.ts +172 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +2 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationAlertDebuggability.test.ts +1 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +9 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
- package/Tests/Types/Monitor/SeriesContext/SeriesDebugHints.test.ts +131 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +10 -0
- package/Tests/Types/Monitor/VMwareAlertTemplates.test.ts +1608 -0
- package/Tests/Types/Monitor/VMwareMetricCatalog.test.ts +488 -0
- package/Tests/Types/NetworkAutomation/AutoImportRunMerge.test.ts +235 -0
- package/Tests/Types/NetworkAutomation/RuleRunResult.test.ts +66 -0
- package/Tests/Types/NetworkAutomation/RuleRunResultDescribe.test.ts +309 -1
- package/Tests/Types/OnCallDutyPolicy/OverrideProvenance.test.ts +295 -0
- package/Tests/Types/Runner/RunnerLiveStatus.test.ts +2 -2
- package/Tests/Types/SignupPassword.test.ts +205 -0
- package/Tests/Types/StatusPage/StatusPageLanguage.test.ts +44 -0
- package/Tests/Types/SupportedLanguages.test.ts +119 -0
- package/Tests/Types/Telemetry/EntityTypeGroups.test.ts +19 -0
- package/Tests/Types/Telemetry/InventoryLiveness.test.ts +99 -0
- package/Tests/UI/ColorPickerBuild.test.ts +86 -0
- package/Tests/UI/Components/Breadcrumbs.test.tsx +32 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetail.test.tsx +160 -0
- package/Tests/UI/Components/Forms/ModelFormPreservesUserInput.test.tsx +937 -0
- package/Tests/UI/Components/Forms/ModelFormWriteOnlyColumnSelect.test.tsx +230 -0
- package/Tests/UI/Components/Forms/ValidationFormSteps.test.ts +3 -4
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +907 -0
- package/Tests/UI/Components/ModelTable/ModelTableCreateAfterEdit.test.tsx +514 -0
- package/Tests/UI/Components/MonitorGraphs/Uptime.test.tsx +301 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +2 -1
- package/Tests/UI/Components/TooltipLazyContent.test.tsx +373 -0
- package/Tests/UI/MicrosoftTeams/MicrosoftTeamsMessagingEndpointGuidance.test.tsx +43 -12
- package/Tests/UI/ReactDomBuild.test.ts +104 -0
- package/Tests/UI/ReactRouterSingletonBuild.test.ts +143 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +10 -2
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +514 -0
- package/Tests/UI/Rum/ReplayTimeFormat.test.ts +94 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +559 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +153 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +30 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +197 -0
- package/Tests/UI/Utils/LabelRuleImportExport.test.ts +546 -0
- package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +109 -2
- package/Tests/UI/Utils/UseDashboardGridDnd.test.tsx +7 -2
- package/Tests/UI/Utils/UserEmailRegistrationStatus.test.tsx +295 -0
- package/Tests/UI/Utils/WebAuthn.test.ts +265 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +5 -0
- package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +11 -1
- package/Tests/Utils/Dashboard/Components/DashboardVMwareListComponents.test.ts +548 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +17 -3
- package/Tests/Utils/Dashboard/LabelVariable.test.ts +257 -0
- package/Tests/Utils/Dashboard/VariableUrlState.test.ts +144 -14
- package/Tests/Utils/LabelRuleImportExport.test.ts +583 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +81 -0
- package/Tests/Utils/Monitor/DeviceMacLearningUtil.test.ts +497 -0
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +546 -0
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/MonitorTemplateCustomFieldUtil.test.ts +218 -0
- package/Tests/Utils/Monitor/MonitorTemplateSyncUtil.test.ts +590 -0
- package/Tests/Utils/Monitor/NetworkTopologyEndpointAdoption.test.ts +1755 -0
- package/Tests/Utils/NetworkAutomation/AutoImportRunChain.test.ts +320 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +325 -0
- package/Tests/Utils/Telemetry/CloudInstanceIdentity.test.ts +255 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +167 -0
- package/Tests/Utils/WebAuthnTestUtil.ts +79 -0
- package/Tests/__mocks__/simplewebauthn.js +33 -4
- package/Types/AI/CodeFixTaskContext.ts +122 -0
- package/Types/AI/CodeFixTaskType.ts +62 -0
- package/Types/Accounts/AccountsLanguage.ts +1 -0
- package/Types/AdminDashboard/AdminDashboardLanguage.ts +1 -0
- package/Types/BaseDatabase/IncludesAnyOfGroups.ts +77 -0
- package/Types/Calendar/CalendarEvent.ts +16 -0
- package/Types/Cloud/CloudPlatform.ts +372 -0
- package/Types/CodeRepository/GitHubCommand.ts +69 -0
- package/Types/Dashboard/DashboardComponentType.ts +2 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +2 -0
- package/Types/Dashboard/DashboardComponents/DashboardMonitorListComponent.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.ts +23 -0
- package/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.ts +30 -0
- package/Types/Dashboard/DashboardLanguage.ts +1 -0
- package/Types/Dashboard/DashboardTemplates.ts +314 -0
- package/Types/Dashboard/DashboardVariable.ts +8 -0
- package/Types/Docs/DocsLanguage.ts +1 -0
- package/Types/Exception/EgressGuardException.ts +65 -0
- package/Types/Icon/IconProp.ts +1 -0
- package/Types/JSON.ts +4 -0
- package/Types/JSONFunctions.ts +16 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +36 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +1 -0
- package/Types/Monitor/MonitorStep.ts +78 -17
- package/Types/Monitor/MonitorStepMetricViewConfigUtil.ts +1 -0
- package/Types/Monitor/MonitorStepVMwareMonitor.ts +127 -0
- package/Types/Monitor/MonitorTemplateSyncField.ts +291 -0
- package/Types/Monitor/MonitorType.ts +24 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +33 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +2 -0
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +3 -0
- package/Types/Monitor/SeriesContext/SeriesDebugHints.ts +158 -0
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +61 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +13 -0
- package/Types/Monitor/VMwareAlertTemplates.ts +1070 -0
- package/Types/Monitor/VMwareMetricCatalog.ts +914 -0
- package/Types/NetworkAutomation/RuleRunResult.ts +402 -13
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +29 -0
- package/Types/OnCallDutyPolicy/UserOverrideUtil.ts +16 -0
- package/Types/Password.ts +84 -5
- package/Types/Permission.ts +265 -0
- package/Types/Probe/RequestFailedDetails.ts +7 -0
- package/Types/Runner/RunnerLiveStatus.ts +1 -1
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +56 -0
- package/Types/SerializableObjectDictionary.ts +4 -0
- package/Types/StatusPage/StatusPageLanguage.ts +1 -0
- package/Types/Telemetry/EntityType.ts +21 -0
- package/Types/Telemetry/InventoryLiveness.ts +56 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/Typings/Index.d.ts +63 -0
- package/UI/Components/Breadcrumbs/Breadcrumbs.tsx +2 -2
- package/UI/Components/CSVFileUpload/CSVFileUpload.tsx +9 -2
- package/UI/Components/Calendar/Calendar.css +78 -0
- package/UI/Components/Calendar/Calendar.tsx +28 -3
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +46 -21
- package/UI/Components/Dashboard/DashboardVariableControl.tsx +285 -0
- package/UI/Components/Forms/BasicForm.tsx +44 -2
- package/UI/Components/Forms/Fields/ColorPicker.tsx +2 -1
- package/UI/Components/Forms/Fields/FormField.tsx +16 -3
- package/UI/Components/Forms/ModelForm.tsx +159 -5
- package/UI/Components/Forms/Types/Field.ts +8 -1
- package/UI/Components/Graphs/DayUptimeGraph.tsx +8 -10
- package/UI/Components/Icon/Icon.tsx +16 -0
- package/UI/Components/Input/Input.tsx +42 -7
- package/UI/Components/LabelRule/ImportLabelRulesModal.tsx +441 -0
- package/UI/Components/LabelRule/LabelRuleTable.tsx +142 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +22 -5
- package/UI/Components/ModelTable/ModelTable.tsx +14 -6
- package/UI/Components/MonitorGraphs/Uptime.tsx +17 -27
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +3 -1
- package/UI/Components/Tooltip/Tooltip.tsx +52 -6
- package/UI/Utils/DashboardStackingLayers.ts +85 -0
- package/UI/Utils/LabelRuleImportExport.ts +310 -0
- package/UI/Utils/ModelAPI/ModelAPI.ts +4 -3
- package/UI/Utils/TelemetryService.ts +4 -3
- package/UI/Utils/UseDashboardGridDnd.ts +4 -1
- package/UI/Utils/UserEmailRegistrationStatus.ts +33 -5
- package/UI/Utils/WebAuthn.ts +220 -0
- package/UI/esbuild-config.js +10 -0
- package/Utils/API.ts +34 -0
- package/Utils/Dashboard/Components/DashboardMonitorListComponent.ts +12 -1
- package/Utils/Dashboard/Components/DashboardVMwareHostListComponent.ts +38 -0
- package/Utils/Dashboard/Components/DashboardVMwareResourceListShared.ts +70 -0
- package/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.ts +76 -0
- package/Utils/Dashboard/Components/Index.ts +16 -0
- package/Utils/Dashboard/LabelVariable.ts +152 -0
- package/Utils/Dashboard/VariableUrlState.ts +27 -5
- package/Utils/LabelRuleImportExport.ts +496 -0
- package/Utils/MetricUnitUtil.ts +34 -0
- package/Utils/Monitor/DeviceMacLearningUtil.ts +177 -0
- package/Utils/Monitor/MetricValueFormatter.ts +342 -0
- package/Utils/Monitor/MonitorTemplateCustomFieldUtil.ts +124 -0
- package/Utils/Monitor/MonitorTemplateSyncUtil.ts +164 -0
- package/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.ts +7 -2
- package/Utils/Monitor/NetworkTopologyUtil.ts +693 -0
- package/Utils/NetworkAutomation/AutoImportRunChain.ts +138 -0
- package/Utils/NetworkDiscovery/DiscoveryScanStatus.ts +8 -0
- package/Utils/Telemetry/CloudInstanceIdentity.ts +94 -0
- package/Utils/Telemetry/EntityKey.ts +19 -0
- package/Utils/Telemetry/EntityRelationship.ts +19 -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/CloudResource.js +44 -7
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CodeRepository.js +87 -0
- package/build/dist/Models/DatabaseModels/CodeRepository.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +12 -12
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +60 -7
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js +287 -0
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.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/InventoryItem.js +34 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +128 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.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/User.js +57 -4
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +47 -2
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js +18 -0
- package/build/dist/Models/DatabaseModels/UserWebAuthn.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareResource.js +1201 -0
- package/build/dist/Models/DatabaseModels/VMwareResource.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +1149 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js +503 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js +502 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js +22 -1
- package/build/dist/Models/DatabaseModels/WorkflowVariable.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +63 -3
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/AIAgentGitHubAPI.js +363 -0
- package/build/dist/Server/API/AIAgentGitHubAPI.js.map +1 -0
- package/build/dist/Server/API/AIChatAPI.js +19 -1
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/BillingAPI.js +22 -0
- package/build/dist/Server/API/BillingAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +10 -0
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/GitHubAPI.js +33 -5
- package/build/dist/Server/API/GitHubAPI.js.map +1 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +56 -0
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/UserWebAuthnAPI.js +17 -1
- package/build/dist/Server/API/UserWebAuthnAPI.js.map +1 -1
- package/build/dist/Server/API/VMwareResourceAPI.js +106 -0
- package/build/dist/Server/API/VMwareResourceAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +44 -12
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791700000000-AddMacAddressToNetworkDevice.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791800000000-SplitWebAuthnChallengeByPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791900000000-AddSeverityAndStateToNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js +241 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792000000000-AddVMwareTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792100000000-AddGitHubCommandSettingsToCodeRepository.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792200000000-AddUserWebAuthnPurpose.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792300000000-AddGoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Redis.js +8 -8
- package/build/dist/Server/Infrastructure/Redis.js.map +1 -1
- package/build/dist/Server/Infrastructure/Status.js +10 -4
- package/build/dist/Server/Infrastructure/Status.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +80 -0
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Services/AIRunService.js +14 -1
- package/build/dist/Server/Services/AIRunService.js.map +1 -1
- package/build/dist/Server/Services/BillingPaymentMethodService.js +71 -21
- package/build/dist/Server/Services/BillingPaymentMethodService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +210 -22
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceInstanceService.js +66 -0
- package/build/dist/Server/Services/CloudResourceInstanceService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +58 -13
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +1 -0
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js +9 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +7 -0
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.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 +28 -1
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +1 -0
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +1 -0
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MobilePasskeyLoginService.js +137 -0
- package/build/dist/Server/Services/MobilePasskeyLoginService.js.map +1 -0
- package/build/dist/Server/Services/MonitorService.js +34 -1
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +167 -30
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +394 -38
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +142 -2
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js +65 -0
- package/build/dist/Server/Services/NetworkDeviceDiscoveryScanService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +54 -0
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +28 -13
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PayAsYouGoBillingService.js +297 -0
- package/build/dist/Server/Services/PayAsYouGoBillingService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +38 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +66 -0
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +85 -28
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js +61 -10
- package/build/dist/Server/Services/TelemetryIngestionKeyService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +62 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +5 -4
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +60 -25
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserWebAuthnService.js +345 -113
- package/build/dist/Server/Services/UserWebAuthnService.js.map +1 -1
- package/build/dist/Server/Services/VMwareResourceService.js +395 -0
- package/build/dist/Server/Services/VMwareResourceService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js +89 -0
- package/build/dist/Server/Services/VMwareVCenterFeedService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +197 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +214 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js +129 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js +122 -0
- package/build/dist/Server/Services/VMwareVCenterOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/VMwareVCenterService.js +533 -0
- package/build/dist/Server/Services/VMwareVCenterService.js.map +1 -0
- package/build/dist/Server/Services/WorkflowVariableService.js +169 -0
- package/build/dist/Server/Services/WorkflowVariableService.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js +12 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/ActiveMonitoringMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js +25 -2
- package/build/dist/Server/Types/Billing/MeteredPlan/TelemetryMeteredPlan.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js +29 -4
- package/build/dist/Server/Types/Database/Permissions/ReadPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryUtil.js +36 -0
- package/build/dist/Server/Types/Database/QueryUtil.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +75 -0
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHub.js.map +1 -1
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubAgentTaskTrigger.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js +226 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandAuthorizer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js +297 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubCommandParser.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js +582 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubConversation.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js +275 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubReplyComposer.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js +365 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubRunReply.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js +103 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.js.map +1 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js +661 -0
- package/build/dist/Server/Utils/CodeRepository/GitHub/GitHubWebhookHandler.js.map +1 -0
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +166 -18
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +99 -15
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +12 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +20 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +31 -2
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +2 -1
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +58 -35
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +29 -5
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +382 -36
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +58 -9
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js +9 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js +26 -12
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaMessageFormatter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +74 -33
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +12 -4
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +22 -9
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js +114 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +25 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +21 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +21 -6
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/ResourceFeed/ResourceFeedUtil.js +3 -3
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +9 -9
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js +92 -71
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +428 -143
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js +376 -0
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +14 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceHeartbeat.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +206 -14
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js +933 -0
- package/build/dist/Server/Utils/Telemetry/VMwareSnapshotScan.js.map +1 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js +40 -0
- package/build/dist/Types/AI/CodeFixTaskContext.js.map +1 -1
- package/build/dist/Types/AI/CodeFixTaskType.js +57 -0
- package/build/dist/Types/AI/CodeFixTaskType.js.map +1 -1
- package/build/dist/Types/Accounts/AccountsLanguage.js +1 -0
- package/build/dist/Types/Accounts/AccountsLanguage.js.map +1 -1
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js +1 -0
- package/build/dist/Types/AdminDashboard/AdminDashboardLanguage.js.map +1 -1
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js +54 -0
- package/build/dist/Types/BaseDatabase/IncludesAnyOfGroups.js.map +1 -0
- package/build/dist/Types/Cloud/CloudPlatform.js +277 -0
- package/build/dist/Types/Cloud/CloudPlatform.js.map +1 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js +52 -0
- package/build/dist/Types/CodeRepository/GitHubCommand.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js +1 -0
- package/build/dist/Types/Dashboard/DashboardLanguage.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +286 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardVariable.js +1 -0
- package/build/dist/Types/Dashboard/DashboardVariable.js.map +1 -1
- package/build/dist/Types/Docs/DocsLanguage.js +1 -0
- package/build/dist/Types/Docs/DocsLanguage.js.map +1 -1
- package/build/dist/Types/Exception/EgressGuardException.js +59 -0
- package/build/dist/Types/Exception/EgressGuardException.js.map +1 -0
- package/build/dist/Types/Icon/IconProp.js +1 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/JSON.js +1 -0
- package/build/dist/Types/JSON.js.map +1 -1
- package/build/dist/Types/JSONFunctions.js +13 -0
- package/build/dist/Types/JSONFunctions.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +61 -18
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js +1 -0
- package/build/dist/Types/Monitor/MonitorStepMetricViewConfigUtil.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js +71 -0
- package/build/dist/Types/Monitor/MonitorStepVMwareMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js +211 -0
- package/build/dist/Types/Monitor/MonitorTemplateSyncField.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorType.js +23 -0
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +28 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +1 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +2 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js +120 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesDebugHints.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +60 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js +775 -0
- package/build/dist/Types/Monitor/VMwareAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js +799 -0
- package/build/dist/Types/Monitor/VMwareMetricCatalog.js.map +1 -0
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js +291 -6
- package/build/dist/Types/NetworkAutomation/RuleRunResult.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +25 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js +5 -0
- package/build/dist/Types/OnCallDutyPolicy/UserOverrideUtil.js.map +1 -1
- package/build/dist/Types/Password.js +63 -5
- package/build/dist/Types/Password.js.map +1 -1
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Probe/RequestFailedDetails.js +7 -0
- package/build/dist/Types/Probe/RequestFailedDetails.js.map +1 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +2 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +1 -0
- package/build/dist/Types/SerializableObjectDictionary.js +4 -0
- package/build/dist/Types/SerializableObjectDictionary.js.map +1 -1
- package/build/dist/Types/StatusPage/StatusPageLanguage.js +1 -0
- package/build/dist/Types/StatusPage/StatusPageLanguage.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +21 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +37 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js +2 -2
- package/build/dist/UI/Components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js +7 -0
- package/build/dist/UI/Components/CSVFileUpload/CSVFileUpload.js.map +1 -1
- package/build/dist/UI/Components/Calendar/Calendar.js +24 -4
- package/build/dist/UI/Components/Calendar/Calendar.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +9 -2
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js +137 -0
- package/build/dist/UI/Components/Dashboard/DashboardVariableControl.js.map +1 -0
- package/build/dist/UI/Components/Forms/BasicForm.js +28 -3
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js +1 -1
- package/build/dist/UI/Components/Forms/Fields/ColorPicker.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +10 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +89 -6
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +5 -6
- package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +14 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +37 -8
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js +228 -0
- package/build/dist/UI/Components/LabelRule/ImportLabelRulesModal.js.map +1 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +102 -0
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +15 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +13 -5
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js +14 -15
- package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +2 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Tooltip/Tooltip.js +33 -4
- package/build/dist/UI/Components/Tooltip/Tooltip.js.map +1 -1
- package/build/dist/UI/Utils/DashboardStackingLayers.js +44 -0
- package/build/dist/UI/Utils/DashboardStackingLayers.js.map +1 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js +195 -0
- package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +4 -4
- package/build/dist/UI/Utils/ModelAPI/ModelAPI.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/UI/Utils/UseDashboardGridDnd.js +2 -1
- package/build/dist/UI/Utils/UseDashboardGridDnd.js.map +1 -1
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js +21 -4
- package/build/dist/UI/Utils/UserEmailRegistrationStatus.js.map +1 -1
- package/build/dist/UI/Utils/WebAuthn.js +121 -0
- package/build/dist/UI/Utils/WebAuthn.js.map +1 -0
- package/build/dist/Utils/API.js +29 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js +9 -1
- package/build/dist/Utils/Dashboard/Components/DashboardMonitorListComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js +33 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareHostListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js +54 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareResourceListShared.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js +60 -0
- package/build/dist/Utils/Dashboard/Components/DashboardVMwareVirtualMachineListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +8 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/LabelVariable.js +96 -0
- package/build/dist/Utils/Dashboard/LabelVariable.js.map +1 -0
- package/build/dist/Utils/Dashboard/VariableUrlState.js +19 -4
- package/build/dist/Utils/Dashboard/VariableUrlState.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +356 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -0
- package/build/dist/Utils/MetricUnitUtil.js +26 -0
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js +112 -0
- package/build/dist/Utils/Monitor/DeviceMacLearningUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +276 -0
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js +101 -0
- package/build/dist/Utils/Monitor/MonitorTemplateCustomFieldUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js +110 -0
- package/build/dist/Utils/Monitor/MonitorTemplateSyncUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js +7 -2
- package/build/dist/Utils/Monitor/NetworkDeviceMonitorTemplateUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +484 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js +59 -0
- package/build/dist/Utils/NetworkAutomation/AutoImportRunChain.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js +6 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveryScanStatus.js.map +1 -1
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js +88 -0
- package/build/dist/Utils/Telemetry/CloudInstanceIdentity.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +15 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +13 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/jest.config.json +2 -0
- package/package.json +1 -1
- package/test-setup.sh +9 -9
- package/tsconfig.json +51 -11
- package/Tests/App/Dashboard/NotificationEmailPreferences.test.tsx +0 -399
|
@@ -0,0 +1,1352 @@
|
|
|
1
|
+
import ColumnLength from "../../../Types/Database/ColumnLength";
|
|
2
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
3
|
+
import { JSONArray, JSONObject, JSONValue } from "../../../Types/JSON";
|
|
4
|
+
import { VMwareResourceKind } from "../../../Types/Monitor/MonitorStepVMwareMonitor";
|
|
5
|
+
import logger from "../Logger";
|
|
6
|
+
import crypto from "crypto";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* ------------------------------------------------------------------
|
|
10
|
+
* VMware snapshot scan — pure fold & derive helpers
|
|
11
|
+
* ------------------------------------------------------------------
|
|
12
|
+
*
|
|
13
|
+
* Modelled on ProxmoxCephSnapshotScan.ts (the Proxmox half). The
|
|
14
|
+
* ingest service owns the I/O: it walks the OTLP payload, calls
|
|
15
|
+
* bufferVMwareSnapshotMetric per datapoint, and at flush time maps the
|
|
16
|
+
* folded buffers through computeVMwareIsPoweredOn /
|
|
17
|
+
* deriveVMwareResourceLatestMetric / deriveVMwareVCenterSnapshotExtras
|
|
18
|
+
* before handing the results to VMwareResourceService /
|
|
19
|
+
* VMwareVCenterService. Everything in this module is pure (Map/object
|
|
20
|
+
* mutation only — no DB, no network), which is what makes the
|
|
21
|
+
* snapshot-scan semantics unit-testable:
|
|
22
|
+
*
|
|
23
|
+
* - identity attributes fold first-non-null-wins; status/metric
|
|
24
|
+
* fields fold newest-observedAt-wins,
|
|
25
|
+
* - count metrics that fan out over datapoint attributes (status,
|
|
26
|
+
* power_state, effective) are SUMMED across the datapoints of the
|
|
27
|
+
* newest timestamp — never "newest datapoint wins",
|
|
28
|
+
* - vCenter count columns are only derived when the batch carried at
|
|
29
|
+
* least one resource of that kind (never zero a count on a partial
|
|
30
|
+
* batch — the COALESCE-per-column contract),
|
|
31
|
+
* - non-allow-listed metric names are skipped via the exported
|
|
32
|
+
* VMWARE_SNAPSHOT_METRIC_NAMES set,
|
|
33
|
+
* - every externalId is length-bound to VMwareResource.externalId's
|
|
34
|
+
* ShortText (100) column by boundVMwareExternalId: an id longer
|
|
35
|
+
* than 100 chars becomes an 83-char prefix + "~" + the first 16 hex
|
|
36
|
+
* chars of the sha1 of the FULL id, so two distinct long inventory
|
|
37
|
+
* paths (sibling sub-pools under a deep cluster path, the
|
|
38
|
+
* vm/<dc>/<host>/<name> fallback) can never clamp to the same
|
|
39
|
+
* unique-index key downstream. The full path stays in the LongText
|
|
40
|
+
* resourcePoolPath column for display.
|
|
41
|
+
*
|
|
42
|
+
* KEY DIFFERENCE from Proxmox: the OpenTelemetry Collector `vcenter`
|
|
43
|
+
* receiver emits one OTLP resource per vSphere object and carries the
|
|
44
|
+
* object's identity in that resource's attributes
|
|
45
|
+
* (vcenter.datacenter.name, vcenter.cluster.name, vcenter.host.name,
|
|
46
|
+
* vcenter.vm.name / vcenter.vm.id, vcenter.vm_template.*,
|
|
47
|
+
* vcenter.datastore.name, vcenter.resource_pool.*, vcenter.virtual_app.*)
|
|
48
|
+
* — not in datapoint labels the way pve-exporter does. The buffer
|
|
49
|
+
* function therefore takes the resource attribute map alongside the
|
|
50
|
+
* datapoint; the datapoint attributes only carry the fan-out
|
|
51
|
+
* dimensions (disk_state, power_state, status, effective, type).
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* Every metric the §3 metric → column table references. The ingest
|
|
56
|
+
* service gates on this Set before calling bufferVMwareSnapshotMetric so
|
|
57
|
+
* the ~40 perf series (latency, throughput, packet rates, vSAN, …) that
|
|
58
|
+
* only live in ClickHouse never pay for a fold.
|
|
59
|
+
*
|
|
60
|
+
* vcenter.vm.cpu.* are also the powered-on signal: the receiver emits
|
|
61
|
+
* them ONLY for powered-on virtual machines (see computeVMwareIsPoweredOn).
|
|
62
|
+
*/
|
|
63
|
+
export const VMWARE_SNAPSHOT_METRIC_NAMES: ReadonlySet<string> = new Set([
|
|
64
|
+
// ESXi host
|
|
65
|
+
"vcenter.host.cpu.utilization",
|
|
66
|
+
"vcenter.host.cpu.usage",
|
|
67
|
+
"vcenter.host.cpu.capacity",
|
|
68
|
+
"vcenter.host.memory.usage",
|
|
69
|
+
"vcenter.host.memory.capacity",
|
|
70
|
+
"vcenter.host.memory.utilization",
|
|
71
|
+
// Virtual machine (and VM template: vcenter.vm.disk.usage only)
|
|
72
|
+
"vcenter.vm.cpu.utilization",
|
|
73
|
+
"vcenter.vm.cpu.usage",
|
|
74
|
+
"vcenter.vm.cpu.readiness",
|
|
75
|
+
"vcenter.vm.memory.usage",
|
|
76
|
+
"vcenter.vm.memory.utilization",
|
|
77
|
+
"vcenter.vm.memory.ballooned",
|
|
78
|
+
"vcenter.vm.memory.swapped",
|
|
79
|
+
"vcenter.vm.disk.usage",
|
|
80
|
+
"vcenter.vm.disk.utilization",
|
|
81
|
+
// Datastore
|
|
82
|
+
"vcenter.datastore.disk.usage",
|
|
83
|
+
"vcenter.datastore.disk.utilization",
|
|
84
|
+
// Cluster
|
|
85
|
+
"vcenter.cluster.cpu.limit",
|
|
86
|
+
"vcenter.cluster.cpu.effective",
|
|
87
|
+
"vcenter.cluster.memory.limit",
|
|
88
|
+
"vcenter.cluster.memory.effective",
|
|
89
|
+
"vcenter.cluster.host.count",
|
|
90
|
+
"vcenter.cluster.vm.count",
|
|
91
|
+
"vcenter.cluster.vm_template.count",
|
|
92
|
+
// Datacenter
|
|
93
|
+
"vcenter.datacenter.cpu.limit",
|
|
94
|
+
"vcenter.datacenter.memory.limit",
|
|
95
|
+
"vcenter.datacenter.disk.space",
|
|
96
|
+
"vcenter.datacenter.host.count",
|
|
97
|
+
"vcenter.datacenter.vm.count",
|
|
98
|
+
"vcenter.datacenter.cluster.count",
|
|
99
|
+
"vcenter.datacenter.datastore.count",
|
|
100
|
+
// Resource pool
|
|
101
|
+
"vcenter.resource_pool.cpu.usage",
|
|
102
|
+
"vcenter.resource_pool.memory.usage",
|
|
103
|
+
"vcenter.resource_pool.memory.ballooned",
|
|
104
|
+
"vcenter.resource_pool.memory.swapped",
|
|
105
|
+
]);
|
|
106
|
+
|
|
107
|
+
// The receiver reports host / VM / resource-pool memory in MiBy.
|
|
108
|
+
const MEBIBYTE: number = 1024 * 1024;
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
* A count that fans out over datapoint attribute values (one datapoint
|
|
112
|
+
* per status × power_state, per effective flag, …). Folded per
|
|
113
|
+
* (resource, column): a newer timestamp resets the sum, an equal
|
|
114
|
+
* timestamp adds, an older one is ignored — so the column always holds
|
|
115
|
+
* the complete sum of the newest collection in the batch.
|
|
116
|
+
*/
|
|
117
|
+
export interface VMwareSummedCount {
|
|
118
|
+
value: number;
|
|
119
|
+
observedAt: Date;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/*
|
|
123
|
+
* The identity of one vSphere object, resolved from the OTLP resource
|
|
124
|
+
* attributes the vcenter receiver stamps. `kind` / `externalId` are the
|
|
125
|
+
* buffer key and the unique-index members of VMwareResource.
|
|
126
|
+
*/
|
|
127
|
+
export interface VMwareResourceIdentity {
|
|
128
|
+
kind: string; // VMwareResourceKind
|
|
129
|
+
externalId: string;
|
|
130
|
+
name: string | null;
|
|
131
|
+
datacenterName: string | null;
|
|
132
|
+
clusterName: string | null;
|
|
133
|
+
hostName: string | null;
|
|
134
|
+
resourcePoolName: string | null;
|
|
135
|
+
resourcePoolPath: string | null;
|
|
136
|
+
virtualAppName: string | null;
|
|
137
|
+
vmInstanceUuid: string | null;
|
|
138
|
+
isTemplate: boolean | null; // VirtualMachine rows only
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* One VMware resource (Datacenter / Cluster / Host / VirtualMachine /
|
|
143
|
+
* Datastore / ResourcePool) folded across a batch. Identity attributes
|
|
144
|
+
* are first-non-null-wins (stable for the lifetime of the object);
|
|
145
|
+
* status / metric fields are newest-observedAt-wins; count fields are
|
|
146
|
+
* summed per VMwareSummedCount.
|
|
147
|
+
*/
|
|
148
|
+
export interface VMwareResourceBufferEntry extends VMwareResourceIdentity {
|
|
149
|
+
/*
|
|
150
|
+
* Powered-on inference inputs (VirtualMachine rows only). The receiver
|
|
151
|
+
* emits vcenter.vm.cpu.* solely for powered-on VMs, and the agent
|
|
152
|
+
* config forbids splitting one collection across exports, so within
|
|
153
|
+
* one batch "carried a CPU point" ⇔ "powered on". See
|
|
154
|
+
* computeVMwareIsPoweredOn.
|
|
155
|
+
*/
|
|
156
|
+
sawCpuMetric: boolean;
|
|
157
|
+
sawNonCpuMetric: boolean;
|
|
158
|
+
// Latest-metric mirror (VMwareResource columns).
|
|
159
|
+
latestCpuPercent: number | null;
|
|
160
|
+
latestCpuMhz: number | null;
|
|
161
|
+
cpuCapacityMhz: number | null;
|
|
162
|
+
cpuEffectiveMhz: number | null;
|
|
163
|
+
latestMemoryBytes: number | null;
|
|
164
|
+
/*
|
|
165
|
+
* host.memory.capacity / cluster|datacenter.memory.limit as reported.
|
|
166
|
+
* Host and VM rows may derive a fallback from usage ÷ utilization at
|
|
167
|
+
* flush time — see deriveVMwareResourceLatestMetric.
|
|
168
|
+
*/
|
|
169
|
+
maxMemoryBytes: number | null;
|
|
170
|
+
memoryEffectiveBytes: number | null;
|
|
171
|
+
latestMemoryPercent: number | null;
|
|
172
|
+
/*
|
|
173
|
+
* vm|datastore.disk.usage / datacenter.disk.space fan out over
|
|
174
|
+
* disk_state (used | available); kept separately so the pair can
|
|
175
|
+
* arrive in either order. latestDiskBytes = used, maxDiskBytes =
|
|
176
|
+
* used + available (derived at flush).
|
|
177
|
+
*/
|
|
178
|
+
diskUsedBytes: number | null;
|
|
179
|
+
diskAvailableBytes: number | null;
|
|
180
|
+
latestDiskPercent: number | null;
|
|
181
|
+
cpuReadinessPercent: number | null;
|
|
182
|
+
memoryBalloonedBytes: number | null;
|
|
183
|
+
memorySwappedBytes: number | null;
|
|
184
|
+
// Summed counts (Cluster / Datacenter rows).
|
|
185
|
+
hostCount: VMwareSummedCount | null;
|
|
186
|
+
effectiveHostCount: VMwareSummedCount | null;
|
|
187
|
+
poweredOnHostCount: VMwareSummedCount | null;
|
|
188
|
+
vmCount: VMwareSummedCount | null;
|
|
189
|
+
poweredOnVmCount: VMwareSummedCount | null;
|
|
190
|
+
vmTemplateCount: VMwareSummedCount | null;
|
|
191
|
+
datastoreCount: VMwareSummedCount | null;
|
|
192
|
+
clusterCount: VMwareSummedCount | null;
|
|
193
|
+
observedAt: Date;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/*
|
|
197
|
+
* Per-vCenter snapshot state. The saw* flags implement the
|
|
198
|
+
* never-zero-a-count-on-a-partial-batch contract: a vCenter count
|
|
199
|
+
* column is only written when the batch carried at least one resource
|
|
200
|
+
* of that kind.
|
|
201
|
+
*/
|
|
202
|
+
export interface VMwareVCenterSnapshotBufferEntry {
|
|
203
|
+
sawDatacenter: boolean;
|
|
204
|
+
sawCluster: boolean;
|
|
205
|
+
sawHost: boolean;
|
|
206
|
+
sawVirtualMachine: boolean; // VM or template rows
|
|
207
|
+
sawDatastore: boolean;
|
|
208
|
+
sawResourcePool: boolean;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// The VMwareVCenter snapshot columns derived from one folded batch.
|
|
212
|
+
export interface VMwareVCenterSnapshotExtras {
|
|
213
|
+
datacenterCount?: number | undefined;
|
|
214
|
+
clusterCount?: number | undefined;
|
|
215
|
+
hostCount?: number | undefined;
|
|
216
|
+
vmCount?: number | undefined;
|
|
217
|
+
poweredOnVmCount?: number | undefined;
|
|
218
|
+
datastoreCount?: number | undefined;
|
|
219
|
+
resourcePoolCount?: number | undefined;
|
|
220
|
+
datastoreCapacityBytes?: number | undefined;
|
|
221
|
+
datastoreUsedBytes?: number | undefined;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/*
|
|
225
|
+
* The latest-metric mirror derived from one folded entry — structurally
|
|
226
|
+
* identical to VMwareResourceService's VMwareResourceLatestMetric, kept
|
|
227
|
+
* local so this module stays free of service imports.
|
|
228
|
+
*/
|
|
229
|
+
export interface VMwareResourceLatestMetricSnapshot {
|
|
230
|
+
kind: string;
|
|
231
|
+
externalId: string;
|
|
232
|
+
cpuPercent: number | null;
|
|
233
|
+
cpuMhz: number | null;
|
|
234
|
+
cpuCapacityMhz: number | null;
|
|
235
|
+
cpuEffectiveMhz: number | null;
|
|
236
|
+
memoryBytes: number | null;
|
|
237
|
+
maxMemoryBytes: number | null;
|
|
238
|
+
memoryEffectiveBytes: number | null;
|
|
239
|
+
memoryPercent: number | null;
|
|
240
|
+
diskBytes: number | null;
|
|
241
|
+
maxDiskBytes: number | null;
|
|
242
|
+
diskPercent: number | null;
|
|
243
|
+
cpuReadinessPercent: number | null;
|
|
244
|
+
memoryBalloonedBytes: number | null;
|
|
245
|
+
memorySwappedBytes: number | null;
|
|
246
|
+
hostCount: number | null;
|
|
247
|
+
effectiveHostCount: number | null;
|
|
248
|
+
poweredOnHostCount: number | null;
|
|
249
|
+
vmCount: number | null;
|
|
250
|
+
poweredOnVmCount: number | null;
|
|
251
|
+
vmTemplateCount: number | null;
|
|
252
|
+
datastoreCount: number | null;
|
|
253
|
+
clusterCount: number | null;
|
|
254
|
+
observedAt: Date;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/*
|
|
258
|
+
* Same finite-or-null coercion contract as the ingest service's
|
|
259
|
+
* toNumberOrNull (NaN / ±Infinity fold to null so a malformed
|
|
260
|
+
* datapoint is skipped rather than poisoning a snapshot column).
|
|
261
|
+
*/
|
|
262
|
+
function toNumberOrNull(value: unknown): number | null {
|
|
263
|
+
if (typeof value === "number") {
|
|
264
|
+
return Number.isFinite(value) ? value : null;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
if (typeof value === "string") {
|
|
268
|
+
const parsed: number = Number.parseFloat(value);
|
|
269
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/*
|
|
276
|
+
* Same fall-back-to-now parse contract as the ingest service's
|
|
277
|
+
* safeParseUnixNano — only the Date is needed on the snapshot path.
|
|
278
|
+
*/
|
|
279
|
+
function parseUnixNanoToDate(
|
|
280
|
+
value: string | number | undefined,
|
|
281
|
+
context: string,
|
|
282
|
+
): Date {
|
|
283
|
+
if (value !== undefined && value !== null) {
|
|
284
|
+
try {
|
|
285
|
+
if (typeof value === "string") {
|
|
286
|
+
const trimmed: string = value.trim();
|
|
287
|
+
if (trimmed === "" || isNaN(Number(trimmed))) {
|
|
288
|
+
throw new Error(`Invalid timestamp string: ${value}`);
|
|
289
|
+
}
|
|
290
|
+
/*
|
|
291
|
+
* Hand the raw nanosecond string to fromUnixNano so it can divide
|
|
292
|
+
* with BigInt — nanosecond epochs exceed Number.MAX_SAFE_INTEGER, so
|
|
293
|
+
* parsing to a float here would drop up to a full millisecond.
|
|
294
|
+
*/
|
|
295
|
+
return OneUptimeDate.fromUnixNano(trimmed);
|
|
296
|
+
}
|
|
297
|
+
if (typeof value === "number") {
|
|
298
|
+
if (!Number.isFinite(value)) {
|
|
299
|
+
throw new Error(`Invalid timestamp number: ${value}`);
|
|
300
|
+
}
|
|
301
|
+
return OneUptimeDate.fromUnixNano(value);
|
|
302
|
+
}
|
|
303
|
+
} catch (error) {
|
|
304
|
+
logger.warn(
|
|
305
|
+
`Error processing ${context}: ${error instanceof Error ? error.message : String(error)}, using current time`,
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
return OneUptimeDate.getCurrentDate();
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/*
|
|
314
|
+
* Read one OTLP AnyValue as a trimmed string. Unlike the Proxmox reader
|
|
315
|
+
* this also accepts boolValue / intValue / doubleValue: the vcenter
|
|
316
|
+
* receiver's `effective` dimension is a real boolean on the wire and
|
|
317
|
+
* OneUptime stores it as the string "true" / "false" (which is also how
|
|
318
|
+
* monitor criteria filter it).
|
|
319
|
+
*/
|
|
320
|
+
function anyValueToString(value: JSONValue | undefined): string | null {
|
|
321
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
const anyValue: JSONObject = value as JSONObject;
|
|
325
|
+
if (typeof anyValue["stringValue"] === "string") {
|
|
326
|
+
const trimmed: string = (anyValue["stringValue"] as string).trim();
|
|
327
|
+
return trimmed ? trimmed : null;
|
|
328
|
+
}
|
|
329
|
+
if (typeof anyValue["boolValue"] === "boolean") {
|
|
330
|
+
return anyValue["boolValue"] ? "true" : "false";
|
|
331
|
+
}
|
|
332
|
+
if (
|
|
333
|
+
typeof anyValue["intValue"] === "number" ||
|
|
334
|
+
typeof anyValue["intValue"] === "string"
|
|
335
|
+
) {
|
|
336
|
+
const trimmed: string = String(anyValue["intValue"]).trim();
|
|
337
|
+
return trimmed ? trimmed : null;
|
|
338
|
+
}
|
|
339
|
+
if (typeof anyValue["doubleValue"] === "number") {
|
|
340
|
+
return String(anyValue["doubleValue"]);
|
|
341
|
+
}
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Same trim-or-null read contract as OtelIngestBaseService.getStringAttribute.
|
|
346
|
+
function getDatapointAttribute(
|
|
347
|
+
attributes: JSONArray,
|
|
348
|
+
key: string,
|
|
349
|
+
): string | null {
|
|
350
|
+
for (const attribute of attributes) {
|
|
351
|
+
if (attribute["key"] === key) {
|
|
352
|
+
const parsed: string | null = anyValueToString(attribute["value"]);
|
|
353
|
+
if (parsed !== null) {
|
|
354
|
+
return parsed;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/*
|
|
362
|
+
* Build the UNprefixed resource attribute map the buffer function reads
|
|
363
|
+
* from the raw OTLP resource attribute array. Only scalar values are
|
|
364
|
+
* kept (identity attributes are all strings); nested / array values are
|
|
365
|
+
* not vSphere identity and are dropped.
|
|
366
|
+
*/
|
|
367
|
+
export function toVMwareResourceAttributeMap(
|
|
368
|
+
attributes: JSONArray | undefined | null,
|
|
369
|
+
): Record<string, unknown> {
|
|
370
|
+
const map: Record<string, unknown> = {};
|
|
371
|
+
if (!attributes) {
|
|
372
|
+
return map;
|
|
373
|
+
}
|
|
374
|
+
for (const attribute of attributes) {
|
|
375
|
+
const key: JSONValue | undefined = attribute["key"];
|
|
376
|
+
if (typeof key !== "string" || !key) {
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
const parsed: string | null = anyValueToString(attribute["value"]);
|
|
380
|
+
if (parsed !== null) {
|
|
381
|
+
map[key] = parsed;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return map;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/*
|
|
388
|
+
* Read a resource attribute by its semconv-native key. Accepts both the
|
|
389
|
+
* bare key (the map toVMwareResourceAttributeMap builds) and the
|
|
390
|
+
* `resource.`-prefixed spelling (the merged metricAttributes map the
|
|
391
|
+
* K8s / cloud scans read), so either input shape resolves identically.
|
|
392
|
+
*/
|
|
393
|
+
function readResourceAttribute(
|
|
394
|
+
attributes: Record<string, unknown>,
|
|
395
|
+
key: string,
|
|
396
|
+
): string | null {
|
|
397
|
+
const candidates: Array<unknown> = [
|
|
398
|
+
attributes[key],
|
|
399
|
+
attributes[`resource.${key}`],
|
|
400
|
+
];
|
|
401
|
+
for (const raw of candidates) {
|
|
402
|
+
if (typeof raw === "string") {
|
|
403
|
+
const trimmed: string = raw.trim();
|
|
404
|
+
if (trimmed) {
|
|
405
|
+
return trimmed;
|
|
406
|
+
}
|
|
407
|
+
} else if (typeof raw === "number" && Number.isFinite(raw)) {
|
|
408
|
+
return String(raw);
|
|
409
|
+
} else if (typeof raw === "boolean") {
|
|
410
|
+
return raw ? "true" : "false";
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
/*
|
|
417
|
+
* Hex chars of sha1 kept in a bound externalId. 16 hex = 64 bits: the
|
|
418
|
+
* chance of two distinct paths in one vCenter sharing a prefix AND a
|
|
419
|
+
* suffix is negligible, and the id stays readable at a glance.
|
|
420
|
+
*/
|
|
421
|
+
const BOUND_EXTERNAL_ID_HASH_CHARS: number = 16;
|
|
422
|
+
const BOUND_EXTERNAL_ID_SEPARATOR: string = "~";
|
|
423
|
+
|
|
424
|
+
/*
|
|
425
|
+
* Bound an externalId to VMwareResource.externalId's ShortText (100)
|
|
426
|
+
* column WITHOUT letting two distinct ids collapse onto the same key.
|
|
427
|
+
*
|
|
428
|
+
* VMwareResourceService clamps identity to 100 chars with
|
|
429
|
+
* truncateShortText, and the ingest buffer keys on the raw id, so a
|
|
430
|
+
* plain clamp would let two vSphere objects whose ids only differ past
|
|
431
|
+
* character 100 (sibling sub-pools under a long
|
|
432
|
+
* `/<dc>/host/<cluster>/Resources/<pool>/<subpool>` path — vSphere
|
|
433
|
+
* allows 80-char datacenter / cluster / pool names — or the
|
|
434
|
+
* vm/<dc>/<host>/<name> fallback) share one row: bulkUpsert would merge
|
|
435
|
+
* them (or, when both land in the same INSERT chunk, fail the whole
|
|
436
|
+
* chunk with Postgres 21000 "ON CONFLICT DO UPDATE command cannot
|
|
437
|
+
* affect row a second time"), and the vCenter resourcePoolCount would
|
|
438
|
+
* disagree with the inventory list.
|
|
439
|
+
*
|
|
440
|
+
* Ids of <= 100 chars are returned unchanged (every Proxmox-style short
|
|
441
|
+
* id, every vm/<instance uuid>). Longer ids become a deterministic
|
|
442
|
+
* `<first 83 chars>~<first 16 hex of sha1(full id)>` — exactly 100
|
|
443
|
+
* chars, stable across calls and processes, collision-resistant because
|
|
444
|
+
* the suffix hashes the FULL id. The full inventory path is still
|
|
445
|
+
* stored in the LongText resourcePoolPath column for display.
|
|
446
|
+
*/
|
|
447
|
+
export function boundVMwareExternalId(id: string): string {
|
|
448
|
+
const maxLength: number = ColumnLength.ShortText;
|
|
449
|
+
if (id.length <= maxLength) {
|
|
450
|
+
return id;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
const digest: string = crypto
|
|
454
|
+
.createHash("sha1")
|
|
455
|
+
.update(id)
|
|
456
|
+
.digest("hex")
|
|
457
|
+
.substring(0, BOUND_EXTERNAL_ID_HASH_CHARS);
|
|
458
|
+
const prefixLength: number =
|
|
459
|
+
maxLength - BOUND_EXTERNAL_ID_SEPARATOR.length - digest.length;
|
|
460
|
+
|
|
461
|
+
return `${id.substring(0, prefixLength)}${BOUND_EXTERNAL_ID_SEPARATOR}${digest}`;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
/*
|
|
465
|
+
* externalId scheme (immutable, collision-free within a vCenter; the
|
|
466
|
+
* detail route URL-encodes it as a path param):
|
|
467
|
+
* datacenter/<dc> cluster/<dc>/<cluster>
|
|
468
|
+
* host/<dc>/<host> vm/<vcenter.vm.id | vcenter.vm_template.id>
|
|
469
|
+
* datastore/<dc>/<datastore> resourcepool/<inventory path>
|
|
470
|
+
* A missing component (a receiver build that omits an attribute) is
|
|
471
|
+
* dropped rather than rendered as an empty segment, so the id stays
|
|
472
|
+
* deterministic and readable ("host/esx1" instead of "host//esx1").
|
|
473
|
+
* The joined id is then passed through boundVMwareExternalId, so every
|
|
474
|
+
* kind — not just resource pools — fits the 100-char column without
|
|
475
|
+
* two long ids ever clamping to the same key.
|
|
476
|
+
*/
|
|
477
|
+
function joinExternalId(
|
|
478
|
+
prefix: string,
|
|
479
|
+
...parts: Array<string | null>
|
|
480
|
+
): string {
|
|
481
|
+
const present: Array<string> = parts.filter((part: string | null) => {
|
|
482
|
+
return part !== null && part !== "";
|
|
483
|
+
}) as Array<string>;
|
|
484
|
+
return boundVMwareExternalId([prefix, ...present].join("/"));
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
/*
|
|
488
|
+
* Resolve which vSphere object an OTLP resource describes, most specific
|
|
489
|
+
* first (a VM resource also carries vcenter.host.name, a host resource
|
|
490
|
+
* also carries vcenter.cluster.name, and everything carries
|
|
491
|
+
* vcenter.datacenter.name):
|
|
492
|
+
* 1. vcenter.vm.id / vcenter.vm.name → VirtualMachine (isTemplate=false)
|
|
493
|
+
* 2. vcenter.vm_template.id / .name → VirtualMachine (isTemplate=true)
|
|
494
|
+
* 3. vcenter.resource_pool.inventory_path → ResourcePool
|
|
495
|
+
* 4. vcenter.host.name → Host
|
|
496
|
+
* 5. vcenter.datastore.name → Datastore
|
|
497
|
+
* 6. vcenter.cluster.name → Cluster
|
|
498
|
+
* 7. only vcenter.datacenter.name → Datacenter
|
|
499
|
+
* Anything with none of these is not an inventory row (null).
|
|
500
|
+
*/
|
|
501
|
+
export function resolveVMwareResourceIdentity(
|
|
502
|
+
resourceAttributes: Record<string, unknown>,
|
|
503
|
+
): VMwareResourceIdentity | null {
|
|
504
|
+
const read: (key: string) => string | null = (key: string) => {
|
|
505
|
+
return readResourceAttribute(resourceAttributes, key);
|
|
506
|
+
};
|
|
507
|
+
|
|
508
|
+
const datacenterName: string | null = read("vcenter.datacenter.name");
|
|
509
|
+
const clusterName: string | null = read("vcenter.cluster.name");
|
|
510
|
+
const hostName: string | null = read("vcenter.host.name");
|
|
511
|
+
const resourcePoolName: string | null = read("vcenter.resource_pool.name");
|
|
512
|
+
const resourcePoolPath: string | null = read(
|
|
513
|
+
"vcenter.resource_pool.inventory_path",
|
|
514
|
+
);
|
|
515
|
+
const virtualAppName: string | null = read("vcenter.virtual_app.name");
|
|
516
|
+
const virtualAppPath: string | null = read(
|
|
517
|
+
"vcenter.virtual_app.inventory_path",
|
|
518
|
+
);
|
|
519
|
+
|
|
520
|
+
const base: Omit<VMwareResourceIdentity, "kind" | "externalId" | "name"> = {
|
|
521
|
+
datacenterName,
|
|
522
|
+
clusterName,
|
|
523
|
+
hostName,
|
|
524
|
+
resourcePoolName,
|
|
525
|
+
/*
|
|
526
|
+
* The inventory path column doubles for vApps: a VM inside a vApp
|
|
527
|
+
* carries vcenter.virtual_app.* instead of vcenter.resource_pool.*.
|
|
528
|
+
*/
|
|
529
|
+
resourcePoolPath: resourcePoolPath ?? virtualAppPath,
|
|
530
|
+
virtualAppName,
|
|
531
|
+
vmInstanceUuid: null,
|
|
532
|
+
isTemplate: null,
|
|
533
|
+
};
|
|
534
|
+
|
|
535
|
+
// 1. Virtual machine.
|
|
536
|
+
const vmId: string | null = read("vcenter.vm.id");
|
|
537
|
+
const vmName: string | null = read("vcenter.vm.name");
|
|
538
|
+
if (vmId || vmName) {
|
|
539
|
+
return {
|
|
540
|
+
...base,
|
|
541
|
+
kind: VMwareResourceKind.VirtualMachine,
|
|
542
|
+
externalId: vmId
|
|
543
|
+
? joinExternalId("vm", vmId)
|
|
544
|
+
: joinExternalId("vm", datacenterName, hostName, vmName),
|
|
545
|
+
name: vmName,
|
|
546
|
+
vmInstanceUuid: vmId,
|
|
547
|
+
isTemplate: false,
|
|
548
|
+
};
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
// 2. VM template.
|
|
552
|
+
const templateId: string | null = read("vcenter.vm_template.id");
|
|
553
|
+
const templateName: string | null = read("vcenter.vm_template.name");
|
|
554
|
+
if (templateId || templateName) {
|
|
555
|
+
return {
|
|
556
|
+
...base,
|
|
557
|
+
kind: VMwareResourceKind.VirtualMachine,
|
|
558
|
+
externalId: templateId
|
|
559
|
+
? joinExternalId("vm", templateId)
|
|
560
|
+
: joinExternalId("vm", datacenterName, hostName, templateName),
|
|
561
|
+
name: templateName,
|
|
562
|
+
vmInstanceUuid: templateId,
|
|
563
|
+
isTemplate: true,
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
// 3. Resource pool (under a cluster, or on a standalone ESXi host).
|
|
568
|
+
if (resourcePoolPath) {
|
|
569
|
+
return {
|
|
570
|
+
...base,
|
|
571
|
+
kind: VMwareResourceKind.ResourcePool,
|
|
572
|
+
externalId: joinExternalId("resourcepool", resourcePoolPath),
|
|
573
|
+
name: resourcePoolName,
|
|
574
|
+
};
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// 4. ESXi host.
|
|
578
|
+
if (hostName) {
|
|
579
|
+
return {
|
|
580
|
+
...base,
|
|
581
|
+
kind: VMwareResourceKind.Host,
|
|
582
|
+
externalId: joinExternalId("host", datacenterName, hostName),
|
|
583
|
+
name: hostName,
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
// 5. Datastore.
|
|
588
|
+
const datastoreName: string | null = read("vcenter.datastore.name");
|
|
589
|
+
if (datastoreName) {
|
|
590
|
+
return {
|
|
591
|
+
...base,
|
|
592
|
+
kind: VMwareResourceKind.Datastore,
|
|
593
|
+
externalId: joinExternalId("datastore", datacenterName, datastoreName),
|
|
594
|
+
name: datastoreName,
|
|
595
|
+
};
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// 6. Cluster.
|
|
599
|
+
if (clusterName) {
|
|
600
|
+
return {
|
|
601
|
+
...base,
|
|
602
|
+
kind: VMwareResourceKind.Cluster,
|
|
603
|
+
externalId: joinExternalId("cluster", datacenterName, clusterName),
|
|
604
|
+
name: clusterName,
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// 7. Datacenter.
|
|
609
|
+
if (datacenterName) {
|
|
610
|
+
return {
|
|
611
|
+
...base,
|
|
612
|
+
kind: VMwareResourceKind.Datacenter,
|
|
613
|
+
externalId: joinExternalId("datacenter", datacenterName),
|
|
614
|
+
name: datacenterName,
|
|
615
|
+
};
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
return null;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
export function getOrCreateVMwareVCenterSnapshot(
|
|
622
|
+
buffer: Map<string, VMwareVCenterSnapshotBufferEntry>,
|
|
623
|
+
vcenterIdStr: string,
|
|
624
|
+
): VMwareVCenterSnapshotBufferEntry {
|
|
625
|
+
let entry: VMwareVCenterSnapshotBufferEntry | undefined =
|
|
626
|
+
buffer.get(vcenterIdStr);
|
|
627
|
+
if (!entry) {
|
|
628
|
+
entry = {
|
|
629
|
+
sawDatacenter: false,
|
|
630
|
+
sawCluster: false,
|
|
631
|
+
sawHost: false,
|
|
632
|
+
sawVirtualMachine: false,
|
|
633
|
+
sawDatastore: false,
|
|
634
|
+
sawResourcePool: false,
|
|
635
|
+
};
|
|
636
|
+
buffer.set(vcenterIdStr, entry);
|
|
637
|
+
}
|
|
638
|
+
return entry;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
function emptyPatch(
|
|
642
|
+
identity: VMwareResourceIdentity,
|
|
643
|
+
observedAt: Date,
|
|
644
|
+
): VMwareResourceBufferEntry {
|
|
645
|
+
return {
|
|
646
|
+
...identity,
|
|
647
|
+
sawCpuMetric: false,
|
|
648
|
+
sawNonCpuMetric: false,
|
|
649
|
+
latestCpuPercent: null,
|
|
650
|
+
latestCpuMhz: null,
|
|
651
|
+
cpuCapacityMhz: null,
|
|
652
|
+
cpuEffectiveMhz: null,
|
|
653
|
+
latestMemoryBytes: null,
|
|
654
|
+
maxMemoryBytes: null,
|
|
655
|
+
memoryEffectiveBytes: null,
|
|
656
|
+
latestMemoryPercent: null,
|
|
657
|
+
diskUsedBytes: null,
|
|
658
|
+
diskAvailableBytes: null,
|
|
659
|
+
latestDiskPercent: null,
|
|
660
|
+
cpuReadinessPercent: null,
|
|
661
|
+
memoryBalloonedBytes: null,
|
|
662
|
+
memorySwappedBytes: null,
|
|
663
|
+
hostCount: null,
|
|
664
|
+
effectiveHostCount: null,
|
|
665
|
+
poweredOnHostCount: null,
|
|
666
|
+
vmCount: null,
|
|
667
|
+
poweredOnVmCount: null,
|
|
668
|
+
vmTemplateCount: null,
|
|
669
|
+
datastoreCount: null,
|
|
670
|
+
clusterCount: null,
|
|
671
|
+
observedAt,
|
|
672
|
+
};
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
function wholeBytes(value: number): number {
|
|
676
|
+
return Math.max(0, Math.trunc(value));
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
function mebibytesToBytes(value: number): number {
|
|
680
|
+
return wholeBytes(value * MEBIBYTE);
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
function wholeCount(value: number): number {
|
|
684
|
+
return Math.max(0, Math.trunc(value));
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
/*
|
|
688
|
+
* The vSphere object kind a metric name belongs to, by its second
|
|
689
|
+
* segment. A metric folded onto a resource of another kind (impossible
|
|
690
|
+
* from the stock receiver, but cheap to guard) is dropped rather than
|
|
691
|
+
* mis-mapped: a VM resource carries vcenter.host.name too, so the guard
|
|
692
|
+
* is what keeps a hand-rolled vcenter.host.* series from polluting a
|
|
693
|
+
* VM row.
|
|
694
|
+
*/
|
|
695
|
+
function metricKindOf(metricName: string): string | null {
|
|
696
|
+
if (metricName.startsWith("vcenter.host.")) {
|
|
697
|
+
return VMwareResourceKind.Host;
|
|
698
|
+
}
|
|
699
|
+
if (metricName.startsWith("vcenter.vm.")) {
|
|
700
|
+
return VMwareResourceKind.VirtualMachine;
|
|
701
|
+
}
|
|
702
|
+
if (metricName.startsWith("vcenter.datastore.")) {
|
|
703
|
+
return VMwareResourceKind.Datastore;
|
|
704
|
+
}
|
|
705
|
+
if (metricName.startsWith("vcenter.cluster.")) {
|
|
706
|
+
return VMwareResourceKind.Cluster;
|
|
707
|
+
}
|
|
708
|
+
if (metricName.startsWith("vcenter.datacenter.")) {
|
|
709
|
+
return VMwareResourceKind.Datacenter;
|
|
710
|
+
}
|
|
711
|
+
if (metricName.startsWith("vcenter.resource_pool.")) {
|
|
712
|
+
return VMwareResourceKind.ResourcePool;
|
|
713
|
+
}
|
|
714
|
+
return null;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
function markKindSeen(
|
|
718
|
+
snap: VMwareVCenterSnapshotBufferEntry,
|
|
719
|
+
kind: string,
|
|
720
|
+
): void {
|
|
721
|
+
switch (kind) {
|
|
722
|
+
case VMwareResourceKind.Datacenter:
|
|
723
|
+
snap.sawDatacenter = true;
|
|
724
|
+
break;
|
|
725
|
+
case VMwareResourceKind.Cluster:
|
|
726
|
+
snap.sawCluster = true;
|
|
727
|
+
break;
|
|
728
|
+
case VMwareResourceKind.Host:
|
|
729
|
+
snap.sawHost = true;
|
|
730
|
+
break;
|
|
731
|
+
case VMwareResourceKind.VirtualMachine:
|
|
732
|
+
snap.sawVirtualMachine = true;
|
|
733
|
+
break;
|
|
734
|
+
case VMwareResourceKind.Datastore:
|
|
735
|
+
snap.sawDatastore = true;
|
|
736
|
+
break;
|
|
737
|
+
case VMwareResourceKind.ResourcePool:
|
|
738
|
+
snap.sawResourcePool = true;
|
|
739
|
+
break;
|
|
740
|
+
default:
|
|
741
|
+
break;
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/*
|
|
746
|
+
* Fold one vcenter.* datapoint into the per-vCenter buffers. Identity
|
|
747
|
+
* comes from the RESOURCE attributes (pass the raw, unprefixed map from
|
|
748
|
+
* toVMwareResourceAttributeMap — the `resource.`-prefixed spelling is
|
|
749
|
+
* accepted too); the datapoint attributes only carry fan-out dimensions.
|
|
750
|
+
*/
|
|
751
|
+
export function bufferVMwareSnapshotMetric(data: {
|
|
752
|
+
vcenterIdStr: string;
|
|
753
|
+
metricName: string;
|
|
754
|
+
resourceAttributes: Record<string, unknown>;
|
|
755
|
+
datapoint: JSONObject;
|
|
756
|
+
resourceBuffer: Map<string, Map<string, VMwareResourceBufferEntry>>;
|
|
757
|
+
vcenterBuffer: Map<string, VMwareVCenterSnapshotBufferEntry>;
|
|
758
|
+
}): void {
|
|
759
|
+
const valueFromInt: number | null = toNumberOrNull(data.datapoint["asInt"]);
|
|
760
|
+
const valueFromDouble: number | null = toNumberOrNull(
|
|
761
|
+
data.datapoint["asDouble"],
|
|
762
|
+
);
|
|
763
|
+
const rawValue: number | null = valueFromDouble ?? valueFromInt;
|
|
764
|
+
if (rawValue === null) {
|
|
765
|
+
return;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
const identity: VMwareResourceIdentity | null = resolveVMwareResourceIdentity(
|
|
769
|
+
data.resourceAttributes,
|
|
770
|
+
);
|
|
771
|
+
if (!identity) {
|
|
772
|
+
return;
|
|
773
|
+
}
|
|
774
|
+
|
|
775
|
+
const metricKind: string | null = metricKindOf(data.metricName);
|
|
776
|
+
if (metricKind === null || metricKind !== identity.kind) {
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
const observedAt: Date = parseUnixNanoToDate(
|
|
781
|
+
data.datapoint["timeUnixNano"] as string | number | undefined,
|
|
782
|
+
"vcenter snapshot timeUnixNano",
|
|
783
|
+
);
|
|
784
|
+
|
|
785
|
+
const dpAttributes: JSONArray =
|
|
786
|
+
(data.datapoint["attributes"] as JSONArray) || [];
|
|
787
|
+
|
|
788
|
+
const patch: VMwareResourceBufferEntry = emptyPatch(identity, observedAt);
|
|
789
|
+
const summed: (matches: boolean) => VMwareSummedCount = (
|
|
790
|
+
matches: boolean,
|
|
791
|
+
) => {
|
|
792
|
+
return { value: matches ? wholeCount(rawValue) : 0, observedAt };
|
|
793
|
+
};
|
|
794
|
+
|
|
795
|
+
switch (data.metricName) {
|
|
796
|
+
// ---- ESXi host -------------------------------------------------
|
|
797
|
+
case "vcenter.host.cpu.utilization": {
|
|
798
|
+
patch.latestCpuPercent = rawValue;
|
|
799
|
+
break;
|
|
800
|
+
}
|
|
801
|
+
case "vcenter.host.cpu.usage": {
|
|
802
|
+
patch.latestCpuMhz = wholeCount(rawValue);
|
|
803
|
+
break;
|
|
804
|
+
}
|
|
805
|
+
case "vcenter.host.cpu.capacity": {
|
|
806
|
+
patch.cpuCapacityMhz = wholeCount(rawValue);
|
|
807
|
+
break;
|
|
808
|
+
}
|
|
809
|
+
case "vcenter.host.memory.usage": {
|
|
810
|
+
patch.latestMemoryBytes = mebibytesToBytes(rawValue);
|
|
811
|
+
break;
|
|
812
|
+
}
|
|
813
|
+
case "vcenter.host.memory.capacity": {
|
|
814
|
+
patch.maxMemoryBytes = mebibytesToBytes(rawValue);
|
|
815
|
+
break;
|
|
816
|
+
}
|
|
817
|
+
case "vcenter.host.memory.utilization": {
|
|
818
|
+
patch.latestMemoryPercent = rawValue;
|
|
819
|
+
break;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
// ---- Virtual machine ------------------------------------------
|
|
823
|
+
case "vcenter.vm.cpu.utilization": {
|
|
824
|
+
patch.latestCpuPercent = rawValue;
|
|
825
|
+
patch.sawCpuMetric = true;
|
|
826
|
+
break;
|
|
827
|
+
}
|
|
828
|
+
case "vcenter.vm.cpu.usage": {
|
|
829
|
+
patch.latestCpuMhz = wholeCount(rawValue);
|
|
830
|
+
patch.sawCpuMetric = true;
|
|
831
|
+
break;
|
|
832
|
+
}
|
|
833
|
+
case "vcenter.vm.cpu.readiness": {
|
|
834
|
+
patch.cpuReadinessPercent = rawValue;
|
|
835
|
+
patch.sawCpuMetric = true;
|
|
836
|
+
break;
|
|
837
|
+
}
|
|
838
|
+
case "vcenter.vm.memory.usage": {
|
|
839
|
+
patch.latestMemoryBytes = mebibytesToBytes(rawValue);
|
|
840
|
+
patch.sawNonCpuMetric = true;
|
|
841
|
+
break;
|
|
842
|
+
}
|
|
843
|
+
case "vcenter.vm.memory.utilization": {
|
|
844
|
+
patch.latestMemoryPercent = rawValue;
|
|
845
|
+
patch.sawNonCpuMetric = true;
|
|
846
|
+
break;
|
|
847
|
+
}
|
|
848
|
+
case "vcenter.vm.memory.ballooned": {
|
|
849
|
+
patch.memoryBalloonedBytes = mebibytesToBytes(rawValue);
|
|
850
|
+
patch.sawNonCpuMetric = true;
|
|
851
|
+
break;
|
|
852
|
+
}
|
|
853
|
+
case "vcenter.vm.memory.swapped": {
|
|
854
|
+
patch.memorySwappedBytes = mebibytesToBytes(rawValue);
|
|
855
|
+
patch.sawNonCpuMetric = true;
|
|
856
|
+
break;
|
|
857
|
+
}
|
|
858
|
+
case "vcenter.vm.disk.usage":
|
|
859
|
+
case "vcenter.datastore.disk.usage":
|
|
860
|
+
case "vcenter.datacenter.disk.space": {
|
|
861
|
+
/*
|
|
862
|
+
* Fan-out over disk_state: one datapoint for `used`, one for
|
|
863
|
+
* `available`. Any other (or missing) state carries no signal.
|
|
864
|
+
*/
|
|
865
|
+
const diskState: string | null = getDatapointAttribute(
|
|
866
|
+
dpAttributes,
|
|
867
|
+
"disk_state",
|
|
868
|
+
);
|
|
869
|
+
if (diskState === "used") {
|
|
870
|
+
patch.diskUsedBytes = wholeBytes(rawValue);
|
|
871
|
+
} else if (diskState === "available") {
|
|
872
|
+
patch.diskAvailableBytes = wholeBytes(rawValue);
|
|
873
|
+
} else {
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
if (identity.kind === VMwareResourceKind.VirtualMachine) {
|
|
877
|
+
patch.sawNonCpuMetric = true;
|
|
878
|
+
}
|
|
879
|
+
break;
|
|
880
|
+
}
|
|
881
|
+
case "vcenter.vm.disk.utilization":
|
|
882
|
+
case "vcenter.datastore.disk.utilization": {
|
|
883
|
+
patch.latestDiskPercent = rawValue;
|
|
884
|
+
if (identity.kind === VMwareResourceKind.VirtualMachine) {
|
|
885
|
+
patch.sawNonCpuMetric = true;
|
|
886
|
+
}
|
|
887
|
+
break;
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
// ---- Cluster ---------------------------------------------------
|
|
891
|
+
case "vcenter.cluster.cpu.limit":
|
|
892
|
+
case "vcenter.datacenter.cpu.limit": {
|
|
893
|
+
patch.cpuCapacityMhz = wholeCount(rawValue);
|
|
894
|
+
break;
|
|
895
|
+
}
|
|
896
|
+
case "vcenter.cluster.cpu.effective": {
|
|
897
|
+
patch.cpuEffectiveMhz = wholeCount(rawValue);
|
|
898
|
+
break;
|
|
899
|
+
}
|
|
900
|
+
case "vcenter.cluster.memory.limit":
|
|
901
|
+
case "vcenter.datacenter.memory.limit": {
|
|
902
|
+
// Already bytes (unlike host / VM memory, which is MiBy).
|
|
903
|
+
patch.maxMemoryBytes = wholeBytes(rawValue);
|
|
904
|
+
break;
|
|
905
|
+
}
|
|
906
|
+
case "vcenter.cluster.memory.effective": {
|
|
907
|
+
patch.memoryEffectiveBytes = wholeBytes(rawValue);
|
|
908
|
+
break;
|
|
909
|
+
}
|
|
910
|
+
case "vcenter.cluster.host.count": {
|
|
911
|
+
const effective: string | null = getDatapointAttribute(
|
|
912
|
+
dpAttributes,
|
|
913
|
+
"effective",
|
|
914
|
+
);
|
|
915
|
+
patch.hostCount = summed(true);
|
|
916
|
+
patch.effectiveHostCount = summed(effective === "true");
|
|
917
|
+
break;
|
|
918
|
+
}
|
|
919
|
+
case "vcenter.cluster.vm.count": {
|
|
920
|
+
const powerState: string | null = getDatapointAttribute(
|
|
921
|
+
dpAttributes,
|
|
922
|
+
"power_state",
|
|
923
|
+
);
|
|
924
|
+
patch.vmCount = summed(true);
|
|
925
|
+
patch.poweredOnVmCount = summed(powerState === "on");
|
|
926
|
+
break;
|
|
927
|
+
}
|
|
928
|
+
case "vcenter.cluster.vm_template.count": {
|
|
929
|
+
patch.vmTemplateCount = summed(true);
|
|
930
|
+
break;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
// ---- Datacenter ------------------------------------------------
|
|
934
|
+
case "vcenter.datacenter.host.count": {
|
|
935
|
+
const powerState: string | null = getDatapointAttribute(
|
|
936
|
+
dpAttributes,
|
|
937
|
+
"power_state",
|
|
938
|
+
);
|
|
939
|
+
patch.hostCount = summed(true);
|
|
940
|
+
patch.poweredOnHostCount = summed(powerState === "on");
|
|
941
|
+
break;
|
|
942
|
+
}
|
|
943
|
+
case "vcenter.datacenter.vm.count": {
|
|
944
|
+
const powerState: string | null = getDatapointAttribute(
|
|
945
|
+
dpAttributes,
|
|
946
|
+
"power_state",
|
|
947
|
+
);
|
|
948
|
+
patch.vmCount = summed(true);
|
|
949
|
+
patch.poweredOnVmCount = summed(powerState === "on");
|
|
950
|
+
break;
|
|
951
|
+
}
|
|
952
|
+
case "vcenter.datacenter.cluster.count": {
|
|
953
|
+
patch.clusterCount = summed(true);
|
|
954
|
+
break;
|
|
955
|
+
}
|
|
956
|
+
case "vcenter.datacenter.datastore.count": {
|
|
957
|
+
patch.datastoreCount = summed(true);
|
|
958
|
+
break;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
// ---- Resource pool ---------------------------------------------
|
|
962
|
+
case "vcenter.resource_pool.cpu.usage": {
|
|
963
|
+
patch.latestCpuMhz = wholeCount(rawValue);
|
|
964
|
+
break;
|
|
965
|
+
}
|
|
966
|
+
case "vcenter.resource_pool.memory.usage": {
|
|
967
|
+
/*
|
|
968
|
+
* Fans out over `type` (guest | host | overhead). The guest
|
|
969
|
+
* consumption is the pool's memory usage; a receiver build without
|
|
970
|
+
* the dimension reports the same number untyped.
|
|
971
|
+
*/
|
|
972
|
+
const type: string | null = getDatapointAttribute(dpAttributes, "type");
|
|
973
|
+
if (type !== null && type !== "guest") {
|
|
974
|
+
return;
|
|
975
|
+
}
|
|
976
|
+
patch.latestMemoryBytes = mebibytesToBytes(rawValue);
|
|
977
|
+
break;
|
|
978
|
+
}
|
|
979
|
+
case "vcenter.resource_pool.memory.ballooned": {
|
|
980
|
+
patch.memoryBalloonedBytes = mebibytesToBytes(rawValue);
|
|
981
|
+
break;
|
|
982
|
+
}
|
|
983
|
+
case "vcenter.resource_pool.memory.swapped": {
|
|
984
|
+
patch.memorySwappedBytes = mebibytesToBytes(rawValue);
|
|
985
|
+
break;
|
|
986
|
+
}
|
|
987
|
+
default: {
|
|
988
|
+
return;
|
|
989
|
+
}
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
const snap: VMwareVCenterSnapshotBufferEntry =
|
|
993
|
+
getOrCreateVMwareVCenterSnapshot(data.vcenterBuffer, data.vcenterIdStr);
|
|
994
|
+
markKindSeen(snap, identity.kind);
|
|
995
|
+
|
|
996
|
+
foldVMwareResourceSnapshot({
|
|
997
|
+
buffer: data.resourceBuffer,
|
|
998
|
+
vcenterIdStr: data.vcenterIdStr,
|
|
999
|
+
patch,
|
|
1000
|
+
});
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
/*
|
|
1004
|
+
* Summed-count fold: a newer timestamp resets the sum, an equal
|
|
1005
|
+
* timestamp adds, an older one is ignored.
|
|
1006
|
+
*/
|
|
1007
|
+
function foldSummedCount(
|
|
1008
|
+
existing: VMwareSummedCount | null,
|
|
1009
|
+
patch: VMwareSummedCount | null,
|
|
1010
|
+
): VMwareSummedCount | null {
|
|
1011
|
+
if (patch === null) {
|
|
1012
|
+
return existing;
|
|
1013
|
+
}
|
|
1014
|
+
if (existing === null) {
|
|
1015
|
+
return { value: patch.value, observedAt: patch.observedAt };
|
|
1016
|
+
}
|
|
1017
|
+
if (patch.observedAt > existing.observedAt) {
|
|
1018
|
+
return { value: patch.value, observedAt: patch.observedAt };
|
|
1019
|
+
}
|
|
1020
|
+
if (patch.observedAt.getTime() === existing.observedAt.getTime()) {
|
|
1021
|
+
existing.value += patch.value;
|
|
1022
|
+
}
|
|
1023
|
+
return existing;
|
|
1024
|
+
}
|
|
1025
|
+
|
|
1026
|
+
/*
|
|
1027
|
+
* Merge a patch into the per-vCenter buffer: identity attributes are
|
|
1028
|
+
* first-non-null-wins (stable, and a batch missing an attribute must
|
|
1029
|
+
* not blank them), status/metric fields are newest-observedAt-wins
|
|
1030
|
+
* (K8s buffer semantics), counts fold per foldSummedCount, and the
|
|
1031
|
+
* powered-on flags are sticky for the batch.
|
|
1032
|
+
*/
|
|
1033
|
+
export function foldVMwareResourceSnapshot(data: {
|
|
1034
|
+
buffer: Map<string, Map<string, VMwareResourceBufferEntry>>;
|
|
1035
|
+
vcenterIdStr: string;
|
|
1036
|
+
patch: VMwareResourceBufferEntry;
|
|
1037
|
+
}): void {
|
|
1038
|
+
let perVCenter: Map<string, VMwareResourceBufferEntry> | undefined =
|
|
1039
|
+
data.buffer.get(data.vcenterIdStr);
|
|
1040
|
+
if (!perVCenter) {
|
|
1041
|
+
perVCenter = new Map();
|
|
1042
|
+
data.buffer.set(data.vcenterIdStr, perVCenter);
|
|
1043
|
+
}
|
|
1044
|
+
const key: string = `${data.patch.kind}|${data.patch.externalId}`;
|
|
1045
|
+
const existing: VMwareResourceBufferEntry | undefined = perVCenter.get(key);
|
|
1046
|
+
if (!existing) {
|
|
1047
|
+
perVCenter.set(key, data.patch);
|
|
1048
|
+
return;
|
|
1049
|
+
}
|
|
1050
|
+
|
|
1051
|
+
const patch: VMwareResourceBufferEntry = data.patch;
|
|
1052
|
+
const newer: boolean = patch.observedAt >= existing.observedAt;
|
|
1053
|
+
|
|
1054
|
+
// Identity: first-non-null wins.
|
|
1055
|
+
const identityFields: Array<
|
|
1056
|
+
| "name"
|
|
1057
|
+
| "datacenterName"
|
|
1058
|
+
| "clusterName"
|
|
1059
|
+
| "hostName"
|
|
1060
|
+
| "resourcePoolName"
|
|
1061
|
+
| "resourcePoolPath"
|
|
1062
|
+
| "virtualAppName"
|
|
1063
|
+
| "vmInstanceUuid"
|
|
1064
|
+
> = [
|
|
1065
|
+
"name",
|
|
1066
|
+
"datacenterName",
|
|
1067
|
+
"clusterName",
|
|
1068
|
+
"hostName",
|
|
1069
|
+
"resourcePoolName",
|
|
1070
|
+
"resourcePoolPath",
|
|
1071
|
+
"virtualAppName",
|
|
1072
|
+
"vmInstanceUuid",
|
|
1073
|
+
];
|
|
1074
|
+
for (const field of identityFields) {
|
|
1075
|
+
if (existing[field] === null && patch[field] !== null) {
|
|
1076
|
+
existing[field] = patch[field];
|
|
1077
|
+
}
|
|
1078
|
+
}
|
|
1079
|
+
if (existing.isTemplate === null && patch.isTemplate !== null) {
|
|
1080
|
+
existing.isTemplate = patch.isTemplate;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
// Powered-on evidence accumulates across the batch.
|
|
1084
|
+
existing.sawCpuMetric = existing.sawCpuMetric || patch.sawCpuMetric;
|
|
1085
|
+
existing.sawNonCpuMetric = existing.sawNonCpuMetric || patch.sawNonCpuMetric;
|
|
1086
|
+
|
|
1087
|
+
// Status / metrics: newest observation wins.
|
|
1088
|
+
const metricFields: Array<
|
|
1089
|
+
| "latestCpuPercent"
|
|
1090
|
+
| "latestCpuMhz"
|
|
1091
|
+
| "cpuCapacityMhz"
|
|
1092
|
+
| "cpuEffectiveMhz"
|
|
1093
|
+
| "latestMemoryBytes"
|
|
1094
|
+
| "maxMemoryBytes"
|
|
1095
|
+
| "memoryEffectiveBytes"
|
|
1096
|
+
| "latestMemoryPercent"
|
|
1097
|
+
| "diskUsedBytes"
|
|
1098
|
+
| "diskAvailableBytes"
|
|
1099
|
+
| "latestDiskPercent"
|
|
1100
|
+
| "cpuReadinessPercent"
|
|
1101
|
+
| "memoryBalloonedBytes"
|
|
1102
|
+
| "memorySwappedBytes"
|
|
1103
|
+
> = [
|
|
1104
|
+
"latestCpuPercent",
|
|
1105
|
+
"latestCpuMhz",
|
|
1106
|
+
"cpuCapacityMhz",
|
|
1107
|
+
"cpuEffectiveMhz",
|
|
1108
|
+
"latestMemoryBytes",
|
|
1109
|
+
"maxMemoryBytes",
|
|
1110
|
+
"memoryEffectiveBytes",
|
|
1111
|
+
"latestMemoryPercent",
|
|
1112
|
+
"diskUsedBytes",
|
|
1113
|
+
"diskAvailableBytes",
|
|
1114
|
+
"latestDiskPercent",
|
|
1115
|
+
"cpuReadinessPercent",
|
|
1116
|
+
"memoryBalloonedBytes",
|
|
1117
|
+
"memorySwappedBytes",
|
|
1118
|
+
];
|
|
1119
|
+
for (const field of metricFields) {
|
|
1120
|
+
if (patch[field] !== null && newer) {
|
|
1121
|
+
existing[field] = patch[field];
|
|
1122
|
+
}
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
// Counts: summed across the newest timestamp.
|
|
1126
|
+
existing.hostCount = foldSummedCount(existing.hostCount, patch.hostCount);
|
|
1127
|
+
existing.effectiveHostCount = foldSummedCount(
|
|
1128
|
+
existing.effectiveHostCount,
|
|
1129
|
+
patch.effectiveHostCount,
|
|
1130
|
+
);
|
|
1131
|
+
existing.poweredOnHostCount = foldSummedCount(
|
|
1132
|
+
existing.poweredOnHostCount,
|
|
1133
|
+
patch.poweredOnHostCount,
|
|
1134
|
+
);
|
|
1135
|
+
existing.vmCount = foldSummedCount(existing.vmCount, patch.vmCount);
|
|
1136
|
+
existing.poweredOnVmCount = foldSummedCount(
|
|
1137
|
+
existing.poweredOnVmCount,
|
|
1138
|
+
patch.poweredOnVmCount,
|
|
1139
|
+
);
|
|
1140
|
+
existing.vmTemplateCount = foldSummedCount(
|
|
1141
|
+
existing.vmTemplateCount,
|
|
1142
|
+
patch.vmTemplateCount,
|
|
1143
|
+
);
|
|
1144
|
+
existing.datastoreCount = foldSummedCount(
|
|
1145
|
+
existing.datastoreCount,
|
|
1146
|
+
patch.datastoreCount,
|
|
1147
|
+
);
|
|
1148
|
+
existing.clusterCount = foldSummedCount(
|
|
1149
|
+
existing.clusterCount,
|
|
1150
|
+
patch.clusterCount,
|
|
1151
|
+
);
|
|
1152
|
+
|
|
1153
|
+
if (patch.observedAt > existing.observedAt) {
|
|
1154
|
+
existing.observedAt = patch.observedAt;
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
|
|
1158
|
+
/*
|
|
1159
|
+
* Power state is inferred, not reported: the vcenter receiver emits
|
|
1160
|
+
* vcenter.vm.cpu.usage / .cpu.utilization / .cpu.readiness ONLY for
|
|
1161
|
+
* powered-on virtual machines, and the agent config forbids splitting a
|
|
1162
|
+
* collection across exports (no send_batch_max_size), so within one
|
|
1163
|
+
* batch:
|
|
1164
|
+
* - a VM whose resource carried any vcenter.vm.cpu.* point → true,
|
|
1165
|
+
* - a VM whose resource carried memory / disk points but no CPU
|
|
1166
|
+
* point → false (off or suspended — the receiver does not
|
|
1167
|
+
* distinguish; the UI says "Powered off"),
|
|
1168
|
+
* - a template, a non-VM row, or a VM with no VM points at all →
|
|
1169
|
+
* null (the upsert COALESCE keeps the last-known value).
|
|
1170
|
+
*/
|
|
1171
|
+
export function computeVMwareIsPoweredOn(
|
|
1172
|
+
entry: VMwareResourceBufferEntry,
|
|
1173
|
+
): boolean | null {
|
|
1174
|
+
if (entry.kind !== VMwareResourceKind.VirtualMachine) {
|
|
1175
|
+
return null;
|
|
1176
|
+
}
|
|
1177
|
+
if (entry.isTemplate === true) {
|
|
1178
|
+
return null;
|
|
1179
|
+
}
|
|
1180
|
+
if (entry.sawCpuMetric) {
|
|
1181
|
+
return true;
|
|
1182
|
+
}
|
|
1183
|
+
if (entry.sawNonCpuMetric) {
|
|
1184
|
+
return false;
|
|
1185
|
+
}
|
|
1186
|
+
return null;
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
function countValue(count: VMwareSummedCount | null): number | null {
|
|
1190
|
+
return count === null ? null : count.value;
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
/*
|
|
1194
|
+
* Project one folded entry onto the VMwareResource latest-metric mirror
|
|
1195
|
+
* columns, applying the derivations the §3 table specifies:
|
|
1196
|
+
* - maxDiskBytes = used + available (null unless both arrived),
|
|
1197
|
+
* - Datacenter latestDiskPercent = used ÷ (used + available) × 100,
|
|
1198
|
+
* - Host maxMemoryBytes falls back to usage × 100 ÷ utilization when
|
|
1199
|
+
* vcenter.host.memory.capacity is not enabled on the receiver,
|
|
1200
|
+
* - VirtualMachine maxMemoryBytes is always that derivation (the
|
|
1201
|
+
* receiver has no vm.memory.capacity metric).
|
|
1202
|
+
*/
|
|
1203
|
+
export function deriveVMwareResourceLatestMetric(
|
|
1204
|
+
entry: VMwareResourceBufferEntry,
|
|
1205
|
+
): VMwareResourceLatestMetricSnapshot {
|
|
1206
|
+
const diskBytes: number | null = entry.diskUsedBytes;
|
|
1207
|
+
const maxDiskBytes: number | null =
|
|
1208
|
+
entry.diskUsedBytes !== null && entry.diskAvailableBytes !== null
|
|
1209
|
+
? entry.diskUsedBytes + entry.diskAvailableBytes
|
|
1210
|
+
: null;
|
|
1211
|
+
|
|
1212
|
+
let diskPercent: number | null = entry.latestDiskPercent;
|
|
1213
|
+
if (
|
|
1214
|
+
diskPercent === null &&
|
|
1215
|
+
entry.kind === VMwareResourceKind.Datacenter &&
|
|
1216
|
+
diskBytes !== null &&
|
|
1217
|
+
maxDiskBytes !== null &&
|
|
1218
|
+
maxDiskBytes > 0
|
|
1219
|
+
) {
|
|
1220
|
+
diskPercent = (diskBytes / maxDiskBytes) * 100;
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
let maxMemoryBytes: number | null = entry.maxMemoryBytes;
|
|
1224
|
+
if (
|
|
1225
|
+
maxMemoryBytes === null &&
|
|
1226
|
+
(entry.kind === VMwareResourceKind.Host ||
|
|
1227
|
+
entry.kind === VMwareResourceKind.VirtualMachine) &&
|
|
1228
|
+
entry.latestMemoryBytes !== null &&
|
|
1229
|
+
entry.latestMemoryPercent !== null &&
|
|
1230
|
+
entry.latestMemoryPercent > 0
|
|
1231
|
+
) {
|
|
1232
|
+
maxMemoryBytes = Math.trunc(
|
|
1233
|
+
(entry.latestMemoryBytes * 100) / entry.latestMemoryPercent,
|
|
1234
|
+
);
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
return {
|
|
1238
|
+
kind: entry.kind,
|
|
1239
|
+
externalId: entry.externalId,
|
|
1240
|
+
cpuPercent: entry.latestCpuPercent,
|
|
1241
|
+
cpuMhz: entry.latestCpuMhz,
|
|
1242
|
+
cpuCapacityMhz: entry.cpuCapacityMhz,
|
|
1243
|
+
cpuEffectiveMhz: entry.cpuEffectiveMhz,
|
|
1244
|
+
memoryBytes: entry.latestMemoryBytes,
|
|
1245
|
+
maxMemoryBytes,
|
|
1246
|
+
memoryEffectiveBytes: entry.memoryEffectiveBytes,
|
|
1247
|
+
memoryPercent: entry.latestMemoryPercent,
|
|
1248
|
+
diskBytes,
|
|
1249
|
+
maxDiskBytes,
|
|
1250
|
+
diskPercent,
|
|
1251
|
+
cpuReadinessPercent: entry.cpuReadinessPercent,
|
|
1252
|
+
memoryBalloonedBytes: entry.memoryBalloonedBytes,
|
|
1253
|
+
memorySwappedBytes: entry.memorySwappedBytes,
|
|
1254
|
+
hostCount: countValue(entry.hostCount),
|
|
1255
|
+
effectiveHostCount: countValue(entry.effectiveHostCount),
|
|
1256
|
+
poweredOnHostCount: countValue(entry.poweredOnHostCount),
|
|
1257
|
+
vmCount: countValue(entry.vmCount),
|
|
1258
|
+
poweredOnVmCount: countValue(entry.poweredOnVmCount),
|
|
1259
|
+
vmTemplateCount: countValue(entry.vmTemplateCount),
|
|
1260
|
+
datastoreCount: countValue(entry.datastoreCount),
|
|
1261
|
+
clusterCount: countValue(entry.clusterCount),
|
|
1262
|
+
observedAt: entry.observedAt,
|
|
1263
|
+
};
|
|
1264
|
+
}
|
|
1265
|
+
|
|
1266
|
+
/*
|
|
1267
|
+
* Derive the VMwareVCenter snapshot columns from one folded batch.
|
|
1268
|
+
* Every count is only set when the batch carried at least one resource
|
|
1269
|
+
* of that kind (the saw* flags) — never zero a count on a partial
|
|
1270
|
+
* batch. Datastore capacity / used totals additionally require at
|
|
1271
|
+
* least one datastore row that actually carried a disk_state series,
|
|
1272
|
+
* so a batch of utilization-only datastore points cannot collapse the
|
|
1273
|
+
* totals to 0. Returns an object whose keys are exactly the columns to
|
|
1274
|
+
* write (empty object = nothing to write).
|
|
1275
|
+
*/
|
|
1276
|
+
export function deriveVMwareVCenterSnapshotExtras(
|
|
1277
|
+
entries: Array<VMwareResourceBufferEntry>,
|
|
1278
|
+
snap: VMwareVCenterSnapshotBufferEntry | undefined,
|
|
1279
|
+
): VMwareVCenterSnapshotExtras {
|
|
1280
|
+
const extras: VMwareVCenterSnapshotExtras = {};
|
|
1281
|
+
|
|
1282
|
+
const ofKind: (kind: string) => Array<VMwareResourceBufferEntry> = (
|
|
1283
|
+
kind: string,
|
|
1284
|
+
) => {
|
|
1285
|
+
return entries.filter((e: VMwareResourceBufferEntry) => {
|
|
1286
|
+
return e.kind === kind;
|
|
1287
|
+
});
|
|
1288
|
+
};
|
|
1289
|
+
|
|
1290
|
+
if (snap?.sawDatacenter) {
|
|
1291
|
+
extras.datacenterCount = ofKind(VMwareResourceKind.Datacenter).length;
|
|
1292
|
+
}
|
|
1293
|
+
if (snap?.sawCluster) {
|
|
1294
|
+
extras.clusterCount = ofKind(VMwareResourceKind.Cluster).length;
|
|
1295
|
+
}
|
|
1296
|
+
if (snap?.sawHost) {
|
|
1297
|
+
extras.hostCount = ofKind(VMwareResourceKind.Host).length;
|
|
1298
|
+
}
|
|
1299
|
+
if (snap?.sawVirtualMachine) {
|
|
1300
|
+
const vms: Array<VMwareResourceBufferEntry> = ofKind(
|
|
1301
|
+
VMwareResourceKind.VirtualMachine,
|
|
1302
|
+
).filter((e: VMwareResourceBufferEntry) => {
|
|
1303
|
+
return e.isTemplate !== true;
|
|
1304
|
+
});
|
|
1305
|
+
extras.vmCount = vms.length;
|
|
1306
|
+
extras.poweredOnVmCount = vms.filter((e: VMwareResourceBufferEntry) => {
|
|
1307
|
+
return computeVMwareIsPoweredOn(e) === true;
|
|
1308
|
+
}).length;
|
|
1309
|
+
}
|
|
1310
|
+
if (snap?.sawDatastore) {
|
|
1311
|
+
const datastores: Array<VMwareResourceBufferEntry> = ofKind(
|
|
1312
|
+
VMwareResourceKind.Datastore,
|
|
1313
|
+
);
|
|
1314
|
+
extras.datastoreCount = datastores.length;
|
|
1315
|
+
|
|
1316
|
+
const withCapacity: Array<VMwareResourceLatestMetricSnapshot> = datastores
|
|
1317
|
+
.map((e: VMwareResourceBufferEntry) => {
|
|
1318
|
+
return deriveVMwareResourceLatestMetric(e);
|
|
1319
|
+
})
|
|
1320
|
+
.filter((m: VMwareResourceLatestMetricSnapshot) => {
|
|
1321
|
+
return m.maxDiskBytes !== null;
|
|
1322
|
+
});
|
|
1323
|
+
if (withCapacity.length > 0) {
|
|
1324
|
+
extras.datastoreCapacityBytes = withCapacity.reduce(
|
|
1325
|
+
(sum: number, m: VMwareResourceLatestMetricSnapshot) => {
|
|
1326
|
+
return sum + (m.maxDiskBytes as number);
|
|
1327
|
+
},
|
|
1328
|
+
0,
|
|
1329
|
+
);
|
|
1330
|
+
}
|
|
1331
|
+
const withUsed: Array<VMwareResourceLatestMetricSnapshot> = datastores
|
|
1332
|
+
.map((e: VMwareResourceBufferEntry) => {
|
|
1333
|
+
return deriveVMwareResourceLatestMetric(e);
|
|
1334
|
+
})
|
|
1335
|
+
.filter((m: VMwareResourceLatestMetricSnapshot) => {
|
|
1336
|
+
return m.diskBytes !== null;
|
|
1337
|
+
});
|
|
1338
|
+
if (withUsed.length > 0) {
|
|
1339
|
+
extras.datastoreUsedBytes = withUsed.reduce(
|
|
1340
|
+
(sum: number, m: VMwareResourceLatestMetricSnapshot) => {
|
|
1341
|
+
return sum + (m.diskBytes as number);
|
|
1342
|
+
},
|
|
1343
|
+
0,
|
|
1344
|
+
);
|
|
1345
|
+
}
|
|
1346
|
+
}
|
|
1347
|
+
if (snap?.sawResourcePool) {
|
|
1348
|
+
extras.resourcePoolCount = ofKind(VMwareResourceKind.ResourcePool).length;
|
|
1349
|
+
}
|
|
1350
|
+
|
|
1351
|
+
return extras;
|
|
1352
|
+
}
|