@oneuptime/common 13.0.4 → 13.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/AuditLog.ts +81 -1
- package/Models/AnalyticsModels/SecurityEvent.ts +4 -4
- package/Models/DatabaseModels/Alert.ts +62 -0
- package/Models/DatabaseModels/GlobalConfig.ts +1 -1
- package/Models/DatabaseModels/Incident.ts +66 -0
- package/Models/DatabaseModels/IncidentEpisodePublicNote.ts +74 -0
- package/Models/DatabaseModels/IncidentPublicNote.ts +74 -0
- package/Models/DatabaseModels/Index.ts +10 -4
- package/Models/DatabaseModels/NetworkDevice.ts +67 -0
- package/Models/DatabaseModels/NetworkDeviceDiagnostic.ts +746 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +151 -0
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +1 -1
- package/Models/DatabaseModels/Project.ts +41 -0
- package/Models/DatabaseModels/RumApplication.ts +1 -1
- package/Models/DatabaseModels/ScheduledMaintenancePublicNote.ts +74 -0
- package/Models/DatabaseModels/{GoogleSecOpsConnection.ts → SecurityEventConnection.ts} +61 -51
- package/Models/DatabaseModels/{GoogleSecOpsConnectionRun.ts → SecurityEventConnectionRun.ts} +24 -24
- package/Models/DatabaseModels/ServiceLevelObjective.ts +185 -8
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +746 -43
- package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +575 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +582 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +16 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +16 -0
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +75 -0
- package/Models/DatabaseModels/TelemetryIngestionKey.ts +2 -2
- package/Models/DatabaseModels/ThreatIntelFeed.ts +1 -1
- package/Server/API/AIInvestigationAPI.ts +484 -24
- package/Server/API/BaseAPI.ts +17 -0
- package/Server/API/BillingInvoiceAPI.ts +343 -30
- package/Server/API/BillingPaymentMethodAPI.ts +126 -5
- package/Server/API/DashboardAPI.ts +96 -2
- package/Server/API/SecurityEventConnectionAPI.ts +380 -0
- package/Server/API/StatusPageAPI.ts +308 -199
- package/Server/API/TelemetryAPI.ts +402 -265
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.ts +99 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.ts +83 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.ts +36 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.ts +516 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.ts +98 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.ts +27 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.ts +97 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
- package/Server/Middleware/TelemetryIngest.ts +101 -6
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +138 -67
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +213 -84
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/AlertLabelRuleEngineService.ts +299 -217
- package/Server/Services/AlertOwnerRuleEngineService.ts +572 -396
- package/Server/Services/AlertPrivacyRuleEngineService.ts +116 -40
- package/Server/Services/AlertService.ts +111 -4
- package/Server/Services/AuditLogService.ts +612 -59
- package/Server/Services/BillingInvoiceService.ts +112 -102
- package/Server/Services/BillingService.ts +539 -11
- package/Server/Services/CephClusterLabelRuleEngineService.ts +170 -109
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +233 -115
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +163 -100
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +236 -115
- package/Server/Services/DashboardLabelRuleEngineService.ts +145 -84
- package/Server/Services/DashboardOwnerRuleEngineService.ts +213 -95
- package/Server/Services/DatabaseService.ts +171 -21
- package/Server/Services/DockerHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +233 -115
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/ExceptionAggregationService.ts +7 -16
- package/Server/Services/HostLabelRuleEngineService.ts +167 -106
- package/Server/Services/HostOwnerRuleEngineService.ts +229 -111
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +141 -67
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +272 -72
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +112 -35
- package/Server/Services/IncidentEpisodePublicNoteService.ts +24 -0
- package/Server/Services/IncidentLabelRuleEngineService.ts +279 -204
- package/Server/Services/IncidentOwnerRuleEngineService.ts +595 -425
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +117 -44
- package/Server/Services/IncidentPublicNoteService.ts +24 -0
- package/Server/Services/IncidentService.ts +114 -3
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +147 -83
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +221 -100
- package/Server/Services/Index.ts +10 -4
- package/Server/Services/InventoryItemService.ts +28 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +145 -84
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +213 -95
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +181 -112
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +243 -118
- package/Server/Services/LabelService.ts +23 -28
- package/Server/Services/LogAggregationService.ts +17 -23
- package/Server/Services/MetricAggregationService.ts +4 -14
- package/Server/Services/MonitorLabelRuleEngineService.ts +152 -92
- package/Server/Services/MonitorOwnerRuleEngineService.ts +220 -104
- package/Server/Services/MonitorProbeService.ts +20 -2
- package/Server/Services/MonitorService.ts +11 -9
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +376 -5
- package/Server/Services/NetworkDeviceDiagnosticService.ts +417 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +147 -83
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +218 -97
- package/Server/Services/NetworkDeviceService.ts +39 -2
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +151 -80
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +222 -97
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +154 -83
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +225 -100
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +171 -110
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +235 -115
- package/Server/Services/ProjectService.ts +111 -10
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +174 -110
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +239 -116
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +137 -73
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +200 -83
- package/Server/Services/RunbookLabelRuleEngineService.ts +146 -84
- package/Server/Services/RunbookOwnerRuleEngineService.ts +216 -95
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +324 -230
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +613 -428
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +24 -0
- package/Server/Services/ScheduledMaintenanceService.ts +43 -14
- package/Server/Services/{GoogleSecOpsConnectionRunService.ts → SecurityEventConnectionRunService.ts} +1 -1
- package/Server/Services/SecurityEventConnectionService.ts +590 -0
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +143 -74
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +206 -85
- package/Server/Services/ServiceLabelRuleEngineService.ts +172 -110
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +1057 -18
- package/Server/Services/ServiceLevelObjectiveFeedService.ts +108 -0
- package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +793 -97
- package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +1069 -0
- package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +240 -1
- package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +257 -1
- package/Server/Services/ServiceLevelObjectiveService.ts +1356 -56
- package/Server/Services/ServiceOwnerRuleEngineService.ts +238 -116
- package/Server/Services/StatusPageAnnouncementService.ts +13 -0
- package/Server/Services/StatusPageLabelRuleEngineService.ts +146 -85
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +210 -99
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +28 -232
- package/Server/Services/StatusPageSubscriberService.ts +6 -0
- package/Server/Services/TelemetryUsageBillingService.ts +38 -7
- package/Server/Services/ThreatIntelFeedService.ts +1 -1
- package/Server/Services/TraceAggregationService.ts +77 -28
- package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +173 -110
- package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +238 -116
- package/Server/Services/WorkflowLabelRuleEngineService.ts +145 -84
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +215 -95
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
- package/Server/Types/Database/UpdateByID.ts +3 -0
- package/Server/Types/Database/UpdateOneBy.ts +7 -0
- package/Server/Utils/AI/AlertAIContextBuilder.ts +19 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +13 -1
- package/Server/Utils/AI/IncidentAIContextBuilder.ts +39 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +15 -1
- package/Server/Utils/AI/SRE/InvestigationEvidence.ts +658 -0
- package/Server/Utils/AI/SRE/InvestigationReferences.ts +324 -0
- package/Server/Utils/AI/Toolbox/AlertTools.ts +37 -1
- package/Server/Utils/AI/Toolbox/IncidentTools.ts +22 -1
- package/Server/Utils/AI/Toolbox/Index.ts +38 -0
- package/Server/Utils/AI/Toolbox/SloTools.ts +416 -51
- package/Server/Utils/AI/Toolbox/TimelineTools.ts +9 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +80 -0
- package/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.ts +151 -13
- package/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.ts +17 -4
- package/Server/Utils/Dashboard/PublicDashboardSloWidget.ts +155 -8
- package/Server/Utils/Database/ProjectScopedReferenceValidator.ts +16 -0
- package/Server/Utils/Database/RelationValueUtil.ts +106 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +6 -1
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +22 -27
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +5 -3
- package/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.ts +3 -1
- package/Server/Utils/Monitor/MonitorStepsProjectValidator.ts +50 -20
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +13 -1
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +6 -11
- package/Server/Utils/Rules/MonitorRulePatternValidator.ts +51 -0
- package/Server/Utils/Rules/OwnerRuleAssignment.ts +110 -0
- package/Server/Utils/Rules/RuleRun/RuleApplication.ts +81 -0
- package/Server/Utils/Rules/RuleRun/RuleRunPermission.ts +188 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +803 -0
- package/Server/Utils/Rules/RuleRun/RuleRunner.ts +341 -0
- package/Server/Utils/SecurityEvent/ConnectorErrorMessage.ts +3 -2
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.ts +1108 -0
- package/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.ts +732 -0
- package/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.ts +497 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.ts +689 -0
- package/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.ts +767 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.ts +571 -0
- package/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.ts +827 -0
- package/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.ts +609 -74
- package/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.ts +2101 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.ts +610 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.ts +549 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.ts +830 -0
- package/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.ts +684 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.ts +487 -0
- package/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.ts +778 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.ts +1182 -0
- package/Server/Utils/SecurityEvent/{GoogleSecOps/GoogleSecOpsRunExecutor.ts → Connectors/SecurityEventConnectionRunExecutor.ts} +165 -76
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.ts +306 -0
- package/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.ts +55 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.ts +709 -0
- package/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.ts +596 -0
- package/Server/Utils/SecurityEvent/Connectors/Types.ts +431 -0
- package/Server/Utils/SecurityEvent/DetectionRuleEvaluator.ts +1 -1
- package/Server/Utils/SecurityEvent/SecurityEventDedupe.ts +81 -0
- package/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.ts +2 -2
- package/Server/Utils/SessionReplay/SessionReplayReadService.ts +902 -40
- package/Server/Utils/Slo/SloFeedUtil.ts +200 -0
- package/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.ts +173 -0
- package/Server/Utils/Slo/SloMetricUtil.ts +327 -0
- package/Server/Utils/Slo/SloOwnerReferenceValidator.ts +208 -0
- package/Server/Utils/Slo/SloRecordReferenceValidator.ts +169 -0
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/StatusPage/MonitorRulePatternValidator.ts +6 -43
- package/Server/Utils/StatusPageResource.ts +50 -5
- package/Server/Utils/Telemetry/EntityRegistry.ts +8 -0
- package/Server/Utils/Telemetry/KubernetesResourceAttributes.ts +108 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +174 -93
- package/Server/Utils/Telemetry/ResourceFacetPlanner.ts +251 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +248 -413
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +668 -0
- package/Server/Utils/Telemetry/TraceContextPropagation.ts +348 -0
- package/Server/Utils/Telemetry.ts +18 -0
- package/Tests/App/Dashboard/AIInvestigationHeaderStatus.test.tsx +1063 -1
- package/Tests/App/Dashboard/AIRootCauseFeedItem.test.tsx +285 -0
- package/Tests/App/Dashboard/AddWidgetModal.test.tsx +4 -1
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +242 -0
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +307 -0
- package/Tests/App/Dashboard/AlertEpisodeViewFields.test.tsx +601 -15
- package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +289 -0
- package/Tests/App/Dashboard/AuditLogsTable.test.tsx +598 -0
- package/Tests/App/Dashboard/BillingDefaultPaymentMethod.test.tsx +1046 -0
- package/Tests/App/Dashboard/BillingPaidUsageFlow.test.tsx +3 -0
- package/Tests/App/Dashboard/BillingPaymentMethodForm.test.tsx +201 -7
- package/Tests/App/Dashboard/BooleanSeriesCriteriaFilterText.test.ts +82 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +16 -1
- package/Tests/App/Dashboard/ChangeAlertStateAIHeader.test.tsx +943 -0
- package/Tests/App/Dashboard/ChatActivityFeed.test.tsx +168 -1
- package/Tests/App/Dashboard/CloudResourceTelemetryScope.test.ts +41 -0
- package/Tests/App/Dashboard/ConnectionTestModal.test.tsx +604 -0
- package/Tests/App/Dashboard/ConnectorTestReportView.test.tsx +755 -0
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +1095 -1
- package/Tests/App/Dashboard/CorrelateFilterChips.test.tsx +910 -0
- package/Tests/App/Dashboard/CorrelateGraph.test.tsx +3747 -25
- package/Tests/App/Dashboard/CorrelateGraphHelpers.test.ts +1085 -0
- package/Tests/App/Dashboard/CorrelateInspector.test.tsx +1534 -0
- package/Tests/App/Dashboard/CorrelateNodeCard.test.tsx +965 -0
- package/Tests/App/Dashboard/CorrelateResultSummary.test.tsx +1525 -0
- package/Tests/App/Dashboard/CorrelationGraph.test.ts +1030 -0
- package/Tests/App/Dashboard/CorrelationGraphLayout.test.ts +526 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +153 -6
- package/Tests/App/Dashboard/DeviceDiagnostics.test.tsx +787 -0
- package/Tests/App/Dashboard/DeviceLatencyTrend.test.tsx +278 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +279 -0
- package/Tests/App/Dashboard/DiscoveryScanEditForm.test.tsx +87 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +443 -8
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +165 -0
- package/Tests/App/Dashboard/EntityFilterDropdownArchivedSlos.test.tsx +340 -0
- package/Tests/App/Dashboard/EpisodeChangeState.test.tsx +1069 -0
- package/Tests/App/Dashboard/EpisodeMembersCard.test.tsx +772 -0
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +2450 -0
- package/Tests/App/Dashboard/EventOverviewSkeleton.test.tsx +210 -0
- package/Tests/App/Dashboard/EventStatBar.test.tsx +392 -0
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +247 -0
- package/Tests/App/Dashboard/ExceptionAIAssistance.test.tsx +606 -0
- package/Tests/App/Dashboard/ExceptionBreadcrumbTimeline.test.tsx +273 -0
- package/Tests/App/Dashboard/ExceptionDetailSideMenu.test.tsx +176 -0
- package/Tests/App/Dashboard/ExceptionOverviewCards.test.tsx +366 -0
- package/Tests/App/Dashboard/ExceptionSegmentedControl.test.tsx +1020 -0
- package/Tests/App/Dashboard/ExceptionSignalPages.test.tsx +371 -0
- package/Tests/App/Dashboard/ExceptionStackFrameViewer.test.tsx +440 -0
- package/Tests/App/Dashboard/ExceptionSummary.test.tsx +381 -0
- package/Tests/App/Dashboard/ExceptionTriage.test.tsx +306 -0
- package/Tests/App/Dashboard/ExceptionsResourceFacets.test.tsx +604 -0
- package/Tests/App/Dashboard/ExceptionsViewerEntityChips.test.tsx +706 -0
- package/Tests/App/Dashboard/FeedOrdering.test.ts +32 -0
- package/Tests/App/Dashboard/IncidentEpisodeViewFields.test.tsx +618 -13
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +254 -207
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +303 -135
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +1472 -0
- package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +303 -0
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1931 -25
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +159 -2
- package/Tests/App/Dashboard/InvestigationReferenceLink.test.tsx +177 -0
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +1398 -0
- package/Tests/App/Dashboard/InvestigationRunDetails.test.tsx +1166 -0
- package/Tests/App/Dashboard/InvoicesPayInvoice.test.tsx +437 -0
- package/Tests/App/Dashboard/KubernetesImageReferenceView.test.tsx +114 -0
- package/Tests/App/Dashboard/KubernetesLogsTabChips.test.tsx +285 -0
- package/Tests/App/Dashboard/LogsEntityChipNames.test.tsx +316 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +361 -0
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +65 -0
- package/Tests/App/Dashboard/NetworkTopologyLiveView.test.tsx +5 -0
- package/Tests/App/Dashboard/ProfileTableEntityNames.test.tsx +432 -0
- package/Tests/App/Dashboard/ProfileViewEntityName.test.tsx +250 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +74 -0
- package/Tests/App/Dashboard/ResourceFeed.test.tsx +125 -5
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ResourceLogsTabsBareLayout.test.tsx +700 -0
- package/Tests/App/Dashboard/ResourcePageEntityNameProps.test.tsx +803 -0
- package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +11 -1
- package/Tests/App/Dashboard/ScheduledMaintenanceChangeState.test.tsx +1026 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +436 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +1195 -0
- package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +1764 -0
- package/Tests/App/Dashboard/SecurityEventConnectionFormModal.test.tsx +1958 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsEmptyState.test.tsx +448 -0
- package/Tests/App/Dashboard/SecurityEventConnectionsTable.test.tsx +1455 -0
- package/Tests/App/Dashboard/SecurityEventSeverityPill.test.tsx +233 -0
- package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +282 -0
- package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +247 -0
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +375 -274
- package/Tests/App/Dashboard/SessionReplayAuditTable.test.tsx +410 -0
- package/Tests/App/Dashboard/SloActiveBurnEventsCard.test.tsx +538 -0
- package/Tests/App/Dashboard/SloBulkActionsArchive.test.tsx +252 -0
- package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +322 -518
- package/Tests/App/Dashboard/SloElement.test.tsx +194 -0
- package/Tests/App/Dashboard/SloFeed.test.tsx +289 -0
- package/Tests/App/Dashboard/SloHistoryCharts.test.tsx +471 -0
- package/Tests/App/Dashboard/SloHistorySeries.test.tsx +607 -0
- package/Tests/App/Dashboard/SloListWidget.test.tsx +783 -0
- package/Tests/App/Dashboard/SloMetricsPage.test.tsx +346 -0
- package/Tests/App/Dashboard/SloMonitorsPage.test.tsx +661 -0
- package/Tests/App/Dashboard/SloMonitorsSummaryCard.test.tsx +489 -0
- package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +437 -0
- package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +305 -0
- package/Tests/App/Dashboard/SloOverviewData.test.tsx +563 -0
- package/Tests/App/Dashboard/SloOverviewHero.test.tsx +311 -0
- package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +426 -0
- package/Tests/App/Dashboard/SloOverviewSidebarCards.test.tsx +493 -0
- package/Tests/App/Dashboard/SloSettings.test.tsx +633 -0
- package/Tests/App/Dashboard/SloStatusSummaryCards.test.tsx +403 -0
- package/Tests/App/Dashboard/SloViewSideMenuCounts.test.tsx +373 -0
- package/Tests/App/Dashboard/SloWidgetVariableBinding.test.tsx +689 -0
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +774 -0
- package/Tests/App/Dashboard/TopErrorsPanelResourceNames.test.tsx +316 -0
- package/Tests/App/Dashboard/TopologyConnectivitySection.test.tsx +206 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +30 -0
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +88 -24
- package/Tests/App/Dashboard/TraceExplorer.test.tsx +1590 -0
- package/Tests/App/Dashboard/TraceWaterfall.test.tsx +488 -0
- package/Tests/App/Dashboard/TracesAnalyticsSeriesLabels.test.tsx +367 -0
- package/Tests/App/Dashboard/TracesEntityNames.test.tsx +617 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +613 -0
- package/Tests/App/Dashboard/UseBulkShortenDeviceNames.test.tsx +1312 -0
- package/Tests/App/Dashboard/UseServiceNames.test.tsx +359 -0
- package/Tests/App/Dashboard/WidgetCatalog.test.ts +9 -1
- package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +14 -16
- package/Tests/Models/DatabaseModels/AuditLogModelConfiguration.test.ts +442 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +13 -7
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +48 -1
- package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +835 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +3 -2
- package/Tests/Models/DiscoveryScanNetbiosLookupColumn.test.ts +328 -0
- package/Tests/Models/DiscoveryScanShortDeviceNamesColumn.test.ts +335 -0
- package/Tests/Models/InventoryItemNaming.test.ts +132 -16
- package/Tests/Models/NetworkDeviceDiagnosticContract.test.ts +194 -0
- package/Tests/Models/NetworkDeviceDnsNameColumn.test.ts +321 -0
- package/Tests/Models/ProjectDataResidencyColumn.test.ts +154 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +197 -22
- package/Tests/Server/API/AIInvestigationAPI.test.ts +611 -2
- package/Tests/Server/API/AIInvestigationEvidenceAPI.test.ts +1098 -0
- package/Tests/Server/API/BaseAPI.test.ts +6 -0
- package/Tests/Server/API/BaseAPIUpdateMiscDataProps.test.ts +217 -0
- package/Tests/Server/API/BillingInvoiceAPI.test.ts +7 -0
- package/Tests/Server/API/BillingInvoiceAPIPaymentStates.test.ts +990 -0
- package/Tests/Server/API/BillingPaymentMethodAPI.test.ts +498 -0
- package/Tests/Server/API/DashboardPublicSloAPI.test.ts +405 -0
- package/Tests/Server/API/SecurityEventConnectionAPI.test.ts +1750 -0
- package/Tests/Server/API/SessionReplayAPI.test.ts +644 -1
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +857 -0
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +1084 -0
- package/Tests/Server/API/TelemetryFacetsAPI.test.ts +810 -0
- package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +240 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +33 -3
- package/Tests/Server/Infrastructure/Postgres/AddDataResidencyToProjectMigration.test.ts +202 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetbiosLookupToNetworkDeviceDiscoveryScanMigration.test.ts +330 -0
- package/Tests/Server/Infrastructure/Postgres/AddNetworkDeviceDnsNameAndShortDeviceNamesMigration.test.ts +340 -0
- package/Tests/Server/Infrastructure/Postgres/BackfillSloMonitorRulesAndAffectedResourcesMigration.test.ts +343 -0
- package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +801 -0
- package/Tests/Server/Middleware/TelemetryIngestBrowserKey.test.ts +229 -0
- package/Tests/Server/Services/AddSubscriberUpdateNotificationStatusMigration.test.ts +307 -0
- package/Tests/Server/Services/AuditLogService.test.ts +1124 -0
- package/Tests/Server/Services/AutoImportScanCredentialSelect.test.ts +200 -1
- package/Tests/Server/Services/BillingInvoiceServiceMutexRelease.test.ts +254 -0
- package/Tests/Server/Services/BillingService.test.ts +70 -0
- package/Tests/Server/Services/BillingServicePayInvoiceStates.test.ts +723 -0
- package/Tests/Server/Services/BillingServicePaymentMethodReads.test.ts +14 -2
- package/Tests/Server/Services/BillingServiceSubscriptionPaymentMethodSync.test.ts +1634 -0
- package/Tests/Server/Services/DatabaseServiceAuditRelationDiff.test.ts +492 -0
- package/Tests/Server/Services/DatabaseServicePasswordFieldSecrets.test.ts +629 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +431 -0
- package/Tests/Server/Services/IncidentAlertSloReferenceGuard.test.ts +358 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +66 -0
- package/Tests/Server/Services/MonitorProbeServicePastDueMonitoring.test.ts +362 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +1460 -1
- package/Tests/Server/Services/NetworkDeviceDiagnosticService.test.ts +962 -0
- package/Tests/Server/Services/NetworkDeviceDiscoveryScanService.test.ts +106 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +10 -1
- package/Tests/Server/Services/NetworkDeviceServicePastDueMonitoring.test.ts +335 -0
- package/Tests/Server/Services/NetworkDeviceSiteRuleDnsName.test.ts +568 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/ProjectDataResidencyPostgres.test.ts +344 -0
- package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +187 -0
- package/Tests/Server/Services/ProjectServiceDataResidency.test.ts +369 -0
- package/Tests/Server/Services/ProjectServiceDataResidencySelfHosted.test.ts +176 -0
- package/Tests/Server/Services/ProjectServicePastDueMonitoring.test.ts +289 -0
- package/Tests/Server/Services/ResourceFeedServices.test.ts +24 -8
- package/Tests/Server/Services/RuleRun/IncidentAlertMaintenanceRuleEnginesRun.test.ts +1396 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupARun.test.ts +917 -0
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +1262 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupARun.test.ts +902 -0
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +1163 -0
- package/Tests/Server/Services/RuleRun/PrivacyRuleEnginesRun.test.ts +843 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +465 -0
- package/Tests/Server/Services/SecurityEventConnectionService.test.ts +1754 -0
- package/Tests/Server/Services/SecurityEventLastErrorColumnWidth.test.ts +77 -23
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleFeedWrites.test.ts +777 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleOptions.test.ts +1399 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +67 -74
- package/Tests/Server/Services/ServiceLevelObjectiveChildRowTenancy.test.ts +906 -0
- package/Tests/Server/Services/ServiceLevelObjectiveDeleteTenancy.test.ts +1029 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedService.test.ts +313 -0
- package/Tests/Server/Services/ServiceLevelObjectiveFeedWrites.test.ts +1214 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMarkdownLink.test.ts +289 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +1455 -430
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleLegacyLabelAdoption.test.ts +634 -0
- package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +1193 -0
- package/Tests/Server/Services/{SloMonitorLabelRuleHooks.test.ts → ServiceLevelObjectiveMonitorRuleTriggers.test.ts} +135 -41
- package/Tests/Server/Services/ServiceLevelObjectiveOwnerFeedWrites.test.ts +671 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +180 -85
- package/Tests/Server/Services/ServiceLevelObjectiveServiceArchive.test.ts +537 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceLegacyMonitorLabelWrite.test.ts +870 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceMonitorRuleGuard.test.ts +343 -0
- package/Tests/Server/Services/ServiceLevelObjectiveServiceReEvaluation.test.ts +246 -0
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +501 -0
- package/Tests/Server/Services/SloAffectedResourceLinkContract.test.ts +86 -0
- package/Tests/Server/Services/SloAffectedResourceMetricAttributes.test.ts +547 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +10 -4
- package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +7 -2
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +174 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateServiceVariables.test.ts +40 -0
- package/Tests/Server/Services/SubscriberUpdateNotificationHooks.test.ts +541 -0
- package/Tests/Server/Services/TelemetryIngestionKeyValidation.test.ts +53 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +218 -0
- package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +155 -1
- package/Tests/Server/Services/TelemetryUsageBillingSloExclusion.test.ts +288 -0
- package/Tests/Server/Services/TraceAggregationExceptionScope.test.ts +142 -0
- package/Tests/Server/Services/TraceAnalyticsResourceDisplayNames.test.ts +85 -24
- package/Tests/Server/TestingUtils/PastDueMonitoringClaimSql.ts +177 -0
- package/Tests/Server/TestingUtils/Services/BillingServiceHelper.ts +51 -10
- package/Tests/Server/TestingUtils/__mocks__/Stripe.mock.ts +16 -1
- package/Tests/Server/Types/Database/Permissions/ProjectDataResidencyColumn.test.ts +386 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +34 -11
- package/Tests/Server/Utils/AI/InvestigationEvidence.test.ts +1395 -0
- package/Tests/Server/Utils/AI/InvestigationReferences.test.ts +616 -0
- package/Tests/Server/Utils/AI/SloAffectedResourceAIContext.test.ts +445 -0
- package/Tests/Server/Utils/AI/SloTools.test.ts +423 -1
- package/Tests/Server/Utils/AI/SloToolsArchive.test.ts +294 -0
- package/Tests/Server/Utils/AI/SloToolsRuleReadPermissions.test.ts +297 -0
- package/Tests/Server/Utils/AI/TimelineTools.test.ts +119 -0
- package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +151 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +65 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGeneratorExceptionScope.test.ts +224 -0
- package/Tests/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.test.ts +255 -10
- package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +404 -750
- package/Tests/Server/Utils/Database/ProjectScopedReferenceValidator.test.ts +45 -0
- package/Tests/Server/Utils/Database/RelationValueUtil.test.ts +157 -0
- package/Tests/Server/Utils/Monitor/Criteria/BooleanSeriesEvaluateOverTime.test.ts +260 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +181 -0
- package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +147 -30
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPerSeriesFanout.test.ts +55 -2
- package/Tests/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.test.ts +17 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidator.test.ts +136 -0
- package/Tests/Server/Utils/Monitor/MonitorStepsProjectValidatorLoadOrder.test.ts +472 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +48 -2
- package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +435 -475
- package/Tests/Server/Utils/Rules/MonitorRulePatternValidator.test.ts +77 -0
- package/Tests/Server/Utils/Rules/OwnerRuleAssignment.test.ts +177 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +365 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunRegistry.test.ts +173 -0
- package/Tests/Server/Utils/Rules/RuleRun/RuleRunner.test.ts +675 -0
- package/Tests/Server/Utils/SecurityEvent/ConnectorErrorMessage.test.ts +8 -8
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.test.ts +1240 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.test.ts +1853 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorFetchSummary.test.ts +261 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.test.ts +1184 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.test.ts +1066 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.test.ts +1568 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.test.ts +930 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.test.ts +1409 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsAuth.test.ts → Connectors/GoogleSecOps/GoogleSecOpsAuth.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClient.test.ts → Connectors/GoogleSecOps/GoogleSecOpsClient.test.ts} +9 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.test.ts +483 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorCuratedAndLateAlerts.test.ts +676 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFetchEvents.test.ts +1994 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorFixtures.ts +332 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorHttpIntegration.test.ts +680 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorRequestContract.test.ts +1206 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnectorTestConnection.test.ts +1136 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsCuratedRuleCounts.test.ts +407 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsErrorHandling.test.ts → Connectors/GoogleSecOps/GoogleSecOpsErrorHandling.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingAdaptiveCatchUp.test.ts +730 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsClickhouseIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingClickhouseIntegration.test.ts} +130 -35
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFailureTaxonomy.test.ts +772 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingFixtures.ts +648 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsHttpIntegration.test.ts → Connectors/GoogleSecOps/GoogleSecOpsPollingHttpIntegration.test.ts} +249 -222
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingIntegration.test.ts +1390 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingLoop.test.ts +981 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsPollingNothingImportedRegression.test.ts +290 -0
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsRequestContract.test.ts → Connectors/GoogleSecOps/GoogleSecOpsRequestContract.test.ts} +2 -2
- package/Tests/Server/Utils/SecurityEvent/{GoogleSecOpsResponseParsing.test.ts → Connectors/GoogleSecOps/GoogleSecOpsResponseParsing.test.ts} +5 -5
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsSearchDetections.test.ts +763 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsTesterIntegration.test.ts +421 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.test.ts +763 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.test.ts +1296 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.test.ts +1102 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.test.ts +1174 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.test.ts +1032 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.test.ts +1558 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.test.ts +4483 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.test.ts +1178 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.test.ts +1215 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.test.ts +1068 -0
- package/Tests/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.test.ts +1004 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayOriginAllowlist.test.ts +41 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +1966 -179
- package/Tests/Server/Utils/Slo/SloFeedUtil.test.ts +326 -0
- package/Tests/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.test.ts +260 -0
- package/Tests/Server/Utils/Slo/SloMetricUtil.test.ts +592 -0
- package/Tests/Server/Utils/Slo/SloRecordReferenceValidator.test.ts +311 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +91 -3
- package/Tests/Server/Utils/Telemetry/KubernetesResourceAttributes.test.ts +162 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +460 -13
- package/Tests/Server/Utils/Telemetry/ResourceFacetPlanner.test.ts +678 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +348 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +525 -0
- package/Tests/Server/Utils/Telemetry/TraceContextPropagation.test.ts +420 -0
- package/Tests/Types/Billing/SubscriptionStatus.test.ts +176 -0
- package/Tests/Types/Billing/SubscriptionStatusPastDueMonitoring.test.ts +187 -0
- package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +53 -7
- package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +816 -792
- package/Tests/Types/Monitor/CriteriaFilter.test.ts +216 -24
- package/Tests/Types/Monitor/MonitorStepDnssecMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepDomainMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepExternalStatusPageMonitor.test.ts +14 -1
- package/Tests/Types/Monitor/MonitorStepRetriesParsing.test.ts +201 -0
- package/Tests/Types/Rules/RuleRun.test.ts +315 -0
- package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +133 -0
- package/Tests/Types/Rum/SessionReplayTransportContracts.test.ts +95 -0
- package/Tests/Types/SecurityEvent/Connectors/ConnectorDiagnostics.test.ts +82 -0
- package/Tests/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.test.ts +339 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +217 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +200 -0
- package/Tests/Types/Telemetry/ExceptionSpanScope.test.ts +89 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +96 -0
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +304 -0
- package/Tests/UI/Components/ActiveFilterChipsLockedFilters.test.tsx +411 -0
- package/Tests/UI/Components/AlertBanner.test.tsx +319 -0
- package/Tests/UI/Components/BulkArchiveActionsCopy.test.tsx +310 -0
- package/Tests/UI/Components/Card.test.tsx +312 -1
- package/Tests/UI/Components/CardModelDetailHeaderLayout.test.tsx +253 -0
- package/Tests/UI/Components/CardModelDetailRefresher.test.tsx +342 -0
- package/Tests/UI/Components/Checkbox.test.tsx +79 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +142 -0
- package/Tests/UI/Components/Detail/DetailIdIsUnique.test.tsx +87 -0
- package/Tests/UI/Components/DetailCompactStyle.test.tsx +621 -0
- package/Tests/UI/Components/Dropdown/DropdownClearable.test.tsx +393 -0
- package/Tests/UI/Components/Dropdown/DropdownMultiSelectChipAccessibleName.test.tsx +64 -0
- package/Tests/UI/Components/EmptyState/EmptyState.test.tsx +335 -4
- package/Tests/UI/Components/EmptyState/EmptyStateGuideLinks.test.tsx +337 -0
- package/Tests/UI/Components/ErrorBoundary.test.tsx +60 -0
- package/Tests/UI/Components/FacetSections.test.tsx +581 -0
- package/Tests/UI/Components/FacetSidebarControls.test.tsx +812 -0
- package/Tests/UI/Components/FacetVisibility.test.ts +429 -0
- package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +21 -20
- package/Tests/UI/Components/LabelRuleImportExport.test.tsx +15 -2
- package/Tests/UI/Components/LockedFilterChip.test.tsx +788 -0
- package/Tests/UI/Components/LogsEntityNames.test.ts +1769 -0
- package/Tests/UI/Components/LogsEntityNamesComponents.test.tsx +696 -0
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +600 -0
- package/Tests/UI/Components/LogsViewerEntityNames.test.tsx +713 -0
- package/Tests/UI/Components/MarkdownInlineReferences.test.tsx +2079 -0
- package/Tests/UI/Components/MemberRoleAssignment.test.tsx +446 -0
- package/Tests/UI/Components/ModelDetailRefetch.test.tsx +397 -0
- package/Tests/UI/Components/ModelListRefetch.test.tsx +233 -0
- package/Tests/UI/Components/ModelPageModelChange.test.tsx +409 -0
- package/Tests/UI/Components/MoreMenu.test.tsx +133 -0
- package/Tests/UI/Components/MoreMenuMotion.test.tsx +84 -3
- package/Tests/UI/Components/PaginationIntegration.test.tsx +25 -0
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +172 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/RuleRun/RuleDetailFields.test.tsx +336 -0
- package/Tests/UI/Components/RuleRun/RuleTable.test.tsx +304 -0
- package/Tests/UI/Components/RuleRun/RunRuleNowModal.test.tsx +231 -0
- package/Tests/UI/Components/RuleRun/RunRulesBulkAction.test.ts +213 -0
- package/Tests/UI/Components/SavedViewsSidebarIntegration.test.tsx +32 -14
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +44 -1
- package/Tests/UI/Components/TelemetryActiveFilterChipsLockedFilters.test.tsx +367 -0
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +718 -0
- package/Tests/UI/Monitor/EvaluationLogList.test.tsx +303 -0
- package/Tests/UI/Monitor/MonitorSummarySnapshotRender.test.tsx +55 -1
- package/Tests/UI/Rum/FidelityNotices.test.ts +22 -0
- package/Tests/UI/Rum/RecordingHealthCard.test.tsx +120 -136
- package/Tests/UI/Rum/RecordingHealthDashboard.test.tsx +988 -0
- package/Tests/UI/Rum/ReplayCard.test.tsx +32 -0
- package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +709 -12
- package/Tests/UI/Rum/ReplayEngine.test.ts +154 -0
- package/Tests/UI/Rum/ReplayHeader.test.tsx +284 -124
- package/Tests/UI/Rum/ReplayPinControl.test.tsx +189 -10
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +286 -12
- package/Tests/UI/Rum/ReplayRail.test.tsx +294 -0
- package/Tests/UI/Rum/ReplayScrubber.test.tsx +213 -1
- package/Tests/UI/Rum/ReplayStage.test.tsx +1228 -173
- package/Tests/UI/Rum/ReplayStageOverlays.test.tsx +433 -3
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +1391 -0
- package/Tests/UI/Rum/ReplayTimeline.test.tsx +222 -0
- package/Tests/UI/Rum/ReplayUi.test.tsx +189 -2
- package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +91 -0
- package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +1 -1
- package/Tests/UI/Rum/SessionReplaySettingsPolicyLoading.test.tsx +585 -0
- package/Tests/UI/Rum/SessionReplayTable.test.tsx +844 -51
- package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +29 -1
- package/Tests/UI/Telemetry/TelemetryDetailPanel.test.tsx +288 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +31 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +6 -0
- package/Tests/UI/Utils/Clipboard.test.ts +154 -0
- package/Tests/UI/Utils/DashboardStackingLayers.test.ts +8 -1
- package/Tests/UI/Utils/Navigation.test.ts +24 -0
- package/Tests/UI/Utils/RuleRunClient.test.ts +303 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +2206 -0
- package/Tests/UI/Utils/Telemetry/UseTelemetryEntityNames.test.tsx +844 -0
- package/Tests/Utils/AI/InvestigationReport.test.ts +2430 -0
- package/Tests/Utils/APIOutgoingRequestTracer.test.ts +137 -0
- package/Tests/Utils/Dashboard/Components/DashboardComponentDefaults.test.ts +2 -0
- package/Tests/Utils/Dashboard/Components/DashboardSloListComponent.test.ts +206 -0
- package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +36 -2
- package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +409 -588
- package/Tests/Utils/Dashboard/SloWidgetSource.test.ts +351 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +361 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +1425 -118
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +188 -3
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +661 -13
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +349 -0
- package/Tests/Utils/NetworkDiscovery/RunImportedDeviceNaming.test.ts +656 -0
- package/Tests/Utils/NetworkDiscovery/ShortDeviceNamePlanner.test.ts +1020 -0
- package/Tests/Utils/NetworkDiscovery/ShortHostnameUtil.test.ts +619 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +317 -0
- package/Tests/Utils/Project/DataResidency.test.ts +198 -0
- package/Tests/Utils/Rules/RuleRunSummary.test.ts +394 -0
- package/Tests/Utils/Rum/SessionReplayHealthDiagnosis.test.ts +40 -0
- package/Tests/Utils/Rum/SessionReplayRecordingEnded.test.ts +619 -0
- package/Tests/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.test.ts +631 -0
- package/Tests/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.test.ts +479 -0
- package/Tests/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.test.ts +507 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.test.ts +686 -0
- package/Tests/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.test.ts +474 -0
- package/Tests/Utils/SecurityEvent/Connectors/OktaNormalizer.test.ts +736 -0
- package/Tests/Utils/SecurityEvent/Connectors/SplunkNormalizer.test.ts +407 -0
- package/Tests/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.test.ts +129 -0
- package/Tests/Utils/Slo/SloAffectedResourceMarkdown.test.ts +302 -0
- package/Tests/Utils/Slo/SloBurnRateTemplate.test.ts +468 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +20 -4
- package/Tests/Utils/Slo/SloFeedMarkdown.test.ts +1185 -0
- package/Tests/Utils/Slo/SloHealth.test.ts +262 -0
- package/Tests/Utils/Slo/SloHistoryMetricName.test.ts +102 -0
- package/Tests/Utils/Slo/SloListWidgetFormat.test.ts +522 -0
- package/Tests/Utils/Slo/SloMetricType.test.ts +355 -0
- package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +387 -0
- package/Tests/Utils/Slo/SloMonitorStatusSummary.test.ts +210 -0
- package/Tests/Utils/Slo/SloOverviewText.test.ts +226 -0
- package/Tests/Utils/Slo/SloProjection.test.ts +1039 -0
- package/Tests/Utils/Slo/SloWidgetFormat.test.ts +47 -0
- package/Tests/Utils/Telemetry/CrossSignalScope.test.ts +57 -1
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +36 -0
- package/Tests/Utils/Telemetry/LockedFilterSearch.test.ts +521 -0
- package/Tests/Utils/Telemetry/NetworkHost.test.ts +48 -0
- package/Tests/Utils/Telemetry/OriginAllowList.test.ts +154 -0
- package/Tests/Utils/Traces/CriticalPath.test.ts +25 -0
- package/Types/AI/AIChatTypes.ts +8 -0
- package/Types/AI/InvestigationEvidence.ts +96 -0
- package/Types/BaseDatabase/EnableAuditLogOn.ts +41 -0
- package/Types/Billing/SubscriptionStatus.ts +39 -4
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +5 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +10 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloListComponent.ts +29 -0
- package/Types/Dashboard/DashboardTemplates.ts +290 -297
- package/Types/Database/EnableAuditLog.ts +23 -1
- package/Types/Email/EmailTemplateType.ts +4 -0
- package/Types/Monitor/CriteriaFilter.ts +55 -8
- package/Types/Monitor/MonitorEvaluationSummary.ts +5 -0
- package/Types/Monitor/MonitorStep.ts +5 -2
- package/Types/Monitor/MonitorStepDnsMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDnssecMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepDomainMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepExternalStatusPageMonitor.ts +3 -1
- package/Types/Monitor/MonitorStepRetries.ts +59 -0
- package/Types/Monitor/MonitorStepSnmpMonitor.ts +9 -2
- package/Types/NetworkDevice/NetworkDeviceDiagnosticResult.ts +104 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.ts +47 -0
- package/Types/NetworkDevice/NetworkDeviceDiagnosticType.ts +47 -0
- package/Types/NetworkDevice/NetworkDevicePingMetricNames.ts +20 -0
- package/Types/Permission.ts +129 -2
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +5 -0
- package/Types/Rules/RuleRun.ts +518 -0
- package/Types/Rum/SessionReplay.ts +109 -0
- package/Types/Rum/SessionReplayApi.ts +49 -0
- package/Types/SecurityEvent/Connectors/ConnectorDiagnostics.ts +117 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.ts +113 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.ts +599 -0
- package/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.ts +45 -0
- package/Types/SecurityEvent/GoogleSecOpsRegion.ts +34 -0
- package/Types/ServiceLevelObjective/SloHistoryMetricName.ts +25 -0
- package/Types/ServiceLevelObjective/SloMetricType.ts +49 -0
- package/Types/StatusPage/StatusPageSubscriberNotificationEventType.ts +4 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +331 -0
- package/Types/StatusPage/SubscriberNotificationTrigger.ts +12 -0
- package/Types/StatusPage/SubscriberUpdateNotification.ts +89 -0
- package/Types/Telemetry/EntityType.ts +14 -0
- package/Types/Telemetry/ExceptionSpanScope.ts +83 -0
- package/Types/Telemetry/LockedFilterDetail.ts +25 -0
- package/Types/Telemetry/ResourceEntityFacet.ts +17 -10
- package/Types/Telemetry/ResourceFacetCatalog.ts +171 -0
- package/Types/Telemetry/ServiceType.ts +7 -0
- package/Typings/Index.d.ts +53 -3
- package/UI/Components/AlertBanner/AlertBanner.tsx +85 -27
- package/UI/Components/BulkUpdate/BulkArchiveActions.tsx +21 -2
- package/UI/Components/Card/Card.tsx +118 -83
- package/UI/Components/Checkbox/Checkbox.tsx +8 -5
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +7 -1
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +4 -1
- package/UI/Components/Detail/Detail.tsx +145 -23
- package/UI/Components/Dropdown/Dropdown.tsx +64 -1
- package/UI/Components/EmptyState/EmptyState.tsx +27 -3
- package/UI/Components/EmptyState/EmptyStateGuideLinks.tsx +124 -0
- package/UI/Components/ErrorBoundary.tsx +38 -0
- package/UI/Components/Forms/ModelForm.tsx +6 -5
- package/UI/Components/LabelRule/LabelRuleTable.tsx +8 -2
- package/UI/Components/LogsViewer/LogsEntityNames.ts +912 -0
- package/UI/Components/LogsViewer/LogsViewer.tsx +152 -77
- package/UI/Components/LogsViewer/components/ActiveFilterChips.tsx +17 -11
- package/UI/Components/LogsViewer/components/FacetSection.tsx +66 -79
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +17 -2
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +45 -5
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +100 -19
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +156 -39
- package/UI/Components/LogsViewer/components/LogsTable.tsx +30 -8
- package/UI/Components/LogsViewer/types.ts +6 -0
- package/UI/Components/Markdown.tsx/InlineReferences.tsx +628 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +385 -312
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +50 -22
- package/UI/Components/ModelDetail/CardModelDetail.tsx +15 -0
- package/UI/Components/ModelDetail/ModelDetail.tsx +64 -19
- package/UI/Components/ModelList/ModelList.tsx +33 -8
- package/UI/Components/MoreMenu/MoreMenu.tsx +14 -3
- package/UI/Components/Page/ModelPage.tsx +119 -54
- package/UI/Components/RuleRun/RuleDetailFields.tsx +359 -0
- package/UI/Components/RuleRun/RuleTable.tsx +183 -0
- package/UI/Components/RuleRun/RuleView.tsx +170 -0
- package/UI/Components/RuleRun/RunRuleNowModal.tsx +147 -0
- package/UI/Components/RuleRun/RunRulesBulkAction.ts +103 -0
- package/UI/Components/Table/Table.tsx +8 -0
- package/UI/Components/Table/TableRow.tsx +13 -5
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +229 -0
- package/UI/Components/TelemetryViewer/ResourceFacetConfigs.ts +46 -0
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +7 -0
- package/UI/Components/TelemetryViewer/components/FacetSearchInput.tsx +79 -0
- package/UI/Components/TelemetryViewer/components/FacetSectionHeader.tsx +69 -0
- package/UI/Components/TelemetryViewer/components/FacetShowMoreButton.tsx +36 -0
- package/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.tsx +88 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +430 -0
- package/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.tsx +14 -10
- package/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.tsx +203 -10
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSection.tsx +60 -73
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +94 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +17 -2
- package/UI/Components/TelemetryViewer/types.ts +19 -0
- package/UI/Components/TelemetryViewer/useFacetSearchExemptions.ts +158 -0
- package/UI/Components/TelemetryViewer/useFacetSectionSearch.ts +102 -0
- package/UI/Utils/Clipboard.ts +68 -2
- package/UI/Utils/Navigation.ts +17 -2
- package/UI/Utils/Rules/RuleRunClient.ts +178 -0
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +628 -0
- package/UI/Utils/Telemetry/UseTelemetryEntityNames.ts +151 -0
- package/Utils/AI/InvestigationReport.ts +1789 -0
- package/Utils/API.ts +90 -1
- package/Utils/Dashboard/Components/DashboardSloComponent.ts +19 -2
- package/Utils/Dashboard/Components/DashboardSloListComponent.ts +126 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/Dashboard/SloWidgetSource.ts +188 -0
- package/Utils/Markdown/MarkdownEscape.ts +63 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +161 -36
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +25 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +146 -0
- package/Utils/NetworkDiscovery/RunImportedDeviceNaming.ts +390 -0
- package/Utils/NetworkDiscovery/ShortDeviceNamePlanner.ts +291 -0
- package/Utils/NetworkDiscovery/ShortHostnameUtil.ts +91 -0
- package/Utils/NetworkSite/CidrMatchUtil.ts +37 -12
- package/Utils/Project/DataResidency.ts +63 -0
- package/Utils/Rules/RuleRunSummary.ts +323 -0
- package/Utils/Rum/SessionReplayHealth.ts +11 -0
- package/Utils/Rum/SessionReplayRecordingEnded.ts +134 -0
- package/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.ts +427 -0
- package/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.ts +197 -0
- package/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.ts +464 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.ts +567 -0
- package/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.ts +299 -0
- package/Utils/SecurityEvent/Connectors/OktaNormalizer.ts +467 -0
- package/Utils/SecurityEvent/Connectors/SplunkNormalizer.ts +439 -0
- package/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.ts +124 -12
- package/Utils/Slo/SloAffectedResourceMarkdown.ts +123 -0
- package/Utils/Slo/SloBurnRateTemplate.ts +373 -0
- package/Utils/Slo/SloFeedMarkdown.ts +1507 -0
- package/Utils/Slo/SloHealth.ts +96 -9
- package/Utils/Slo/SloListWidgetFormat.ts +370 -0
- package/Utils/Slo/SloMetricType.ts +237 -0
- package/Utils/Slo/SloMonitorRuleCriteria.ts +364 -0
- package/Utils/Slo/SloMonitorStatusSummary.ts +210 -0
- package/Utils/Slo/SloOverviewText.ts +265 -0
- package/Utils/Slo/SloProjection.ts +967 -0
- package/Utils/Slo/SloWidgetFormat.ts +12 -2
- package/Utils/Telemetry/CrossSignalScope.ts +22 -8
- package/Utils/Telemetry/EntityRelationship.ts +8 -0
- package/Utils/Telemetry/LockedFilterSearch.ts +366 -0
- package/Utils/Telemetry/NetworkHost.ts +43 -0
- package/Utils/Telemetry/OriginAllowList.ts +139 -4
- package/Utils/Traces/CriticalPath.ts +10 -4
- package/build/dist/Models/AnalyticsModels/AuditLog.js +70 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +4 -4
- package/build/dist/Models/DatabaseModels/Alert.js +60 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +64 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisodePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/IncidentPublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +10 -4
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +68 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js +772 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +140 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +42 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js +75 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenancePublicNote.js.map +1 -1
- package/build/dist/Models/DatabaseModels/{GoogleSecOpsConnection.js → SecurityEventConnection.js} +87 -75
- package/build/dist/Models/DatabaseModels/SecurityEventConnection.js.map +1 -0
- package/build/dist/Models/DatabaseModels/{GoogleSecOpsConnectionRun.js → SecurityEventConnectionRun.js} +37 -37
- package/build/dist/Models/DatabaseModels/SecurityEventConnectionRun.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +192 -10
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +798 -96
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +596 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +590 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +16 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +75 -0
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js +2 -2
- package/build/dist/Models/DatabaseModels/TelemetryIngestionKey.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +336 -27
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/BaseAPI.js +14 -0
- package/build/dist/Server/API/BaseAPI.js.map +1 -1
- package/build/dist/Server/API/BillingInvoiceAPI.js +233 -19
- package/build/dist/Server/API/BillingInvoiceAPI.js.map +1 -1
- package/build/dist/Server/API/BillingPaymentMethodAPI.js +86 -5
- package/build/dist/Server/API/BillingPaymentMethodAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +72 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/SecurityEventConnectionAPI.js +263 -0
- package/build/dist/Server/API/SecurityEventConnectionAPI.js.map +1 -0
- package/build/dist/Server/API/StatusPageAPI.js +236 -154
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +248 -170
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792700000000-AddSecurityEventConnections.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js +34 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792800000000-AddNetworkDeviceDiagnostic.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792900000000-AddNetworkDeviceDnsNameAndShortDeviceNames.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793000000000-AddNetbiosLookupToNetworkDeviceDiscoveryScan.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js +207 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793100000000-SloProductOverhaul.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js +72 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793200000000-BackfillSloMonitorRulesAndAffectedResources.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793300000000-AddDataResidencyToProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js +46 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793400000000-AddSubscriberUpdateNotificationStatus.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +57 -4
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +167 -68
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +270 -203
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +498 -354
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +97 -34
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +91 -8
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AuditLogService.js +408 -44
- package/build/dist/Server/Services/AuditLogService.js.map +1 -1
- package/build/dist/Server/Services/BillingInvoiceService.js +94 -85
- package/build/dist/Server/Services/BillingInvoiceService.js.map +1 -1
- package/build/dist/Server/Services/BillingService.js +406 -14
- package/build/dist/Server/Services/BillingService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +135 -86
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +189 -100
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +125 -18
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +7 -16
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +190 -102
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +112 -56
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +220 -63
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +87 -26
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +258 -192
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +519 -376
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +95 -32
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +90 -5
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +113 -65
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -4
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +22 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +145 -91
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +191 -101
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/LabelService.js +20 -25
- package/build/dist/Server/Services/LabelService.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +8 -17
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +4 -14
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +123 -77
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +167 -82
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorProbeService.js +18 -2
- package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +11 -9
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +287 -5
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js +333 -0
- package/build/dist/Server/Services/NetworkDeviceDiagnosticService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +36 -2
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +117 -64
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +173 -83
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +116 -65
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +82 -10
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +111 -63
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +161 -77
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +280 -209
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +521 -376
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +24 -0
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +24 -8
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/{GoogleSecOpsConnectionRunService.js → SecurityEventConnectionRunService.js} +2 -2
- package/build/dist/Server/Services/SecurityEventConnectionRunService.js.map +1 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js +396 -0
- package/build/dist/Server/Services/SecurityEventConnectionService.js.map +1 -0
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +115 -62
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +163 -77
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +769 -18
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js +96 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveFeedService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +614 -87
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +844 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +207 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +221 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +997 -50
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +191 -102
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageAnnouncementService.js +12 -0
- package/build/dist/Server/Services/StatusPageAnnouncementService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +118 -70
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +158 -76
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +19 -215
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +6 -0
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -5
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/ThreatIntelFeedService.js +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +51 -25
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +141 -92
- package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +189 -101
- package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +117 -69
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +171 -83
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js +17 -0
- package/build/dist/Server/Utils/AI/AlertAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +3 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js +31 -0
- package/build/dist/Server/Utils/AI/IncidentAIContextBuilder.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +14 -7
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js +468 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationEvidence.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js +230 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationReferences.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +24 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js +21 -1
- package/build/dist/Server/Utils/AI/Toolbox/IncidentTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/Index.js +32 -0
- package/build/dist/Server/Utils/AI/Toolbox/Index.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +337 -53
- package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js +6 -2
- package/build/dist/Server/Utils/AI/Toolbox/TimelineTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +59 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js +108 -15
- package/build/dist/Server/Utils/Dashboard/PublicDashboardResourceListPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js +2 -2
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloHistoryPolicy.js.map +1 -1
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js +115 -6
- package/build/dist/Server/Utils/Dashboard/PublicDashboardSloWidget.js.map +1 -1
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js +13 -0
- package/build/dist/Server/Utils/Database/ProjectScopedReferenceValidator.js.map +1 -1
- package/build/dist/Server/Utils/Database/RelationValueUtil.js +82 -0
- package/build/dist/Server/Utils/Database/RelationValueUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +10 -6
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +17 -21
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +5 -3
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js +5 -4
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaExpectationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js +50 -10
- package/build/dist/Server/Utils/Monitor/MonitorStepsProjectValidator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +13 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +6 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js +34 -0
- package/build/dist/Server/Utils/Rules/MonitorRulePatternValidator.js.map +1 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js +69 -0
- package/build/dist/Server/Utils/Rules/OwnerRuleAssignment.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleApplication.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js +128 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunPermission.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +746 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js +221 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunner.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js +3 -2
- package/build/dist/Server/Utils/SecurityEvent/ConnectorErrorMessage.js.map +1 -1
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js +752 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js +493 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/AwsSecurityHub/AwsSecurityHubConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js +354 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ConnectorPlatformHealth.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js +405 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js +466 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/CrowdStrikeFalcon/CrowdStrikeFalconConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js +344 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js +511 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/ElasticSecurity/ElasticSecurityConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps → Connectors/GoogleSecOps}/GoogleSecOpsClient.js +401 -68
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js +1417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/GoogleSecOps/GoogleSecOpsConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js +406 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js +336 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdr/MicrosoftDefenderXdrConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js +474 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js +417 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/MicrosoftSentinel/MicrosoftSentinelConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js +314 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Okta/OktaConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js +839 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionPoller.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/{GoogleSecOps/GoogleSecOpsRunExecutor.js → Connectors/SecurityEventConnectionRunExecutor.js} +77 -50
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionRunExecutor.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js +214 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectionTester.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js +42 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/SecurityEventConnectorRegistry.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js +494 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkClient.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js +379 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Splunk/SplunkConnector.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js +122 -0
- package/build/dist/Server/Utils/SecurityEvent/Connectors/Types.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/DetectionRuleEvaluator.js +1 -1
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js +52 -0
- package/build/dist/Server/Utils/SecurityEvent/SecurityEventDedupe.js.map +1 -0
- package/build/dist/Server/Utils/SecurityEvent/ThreatIntel/ThreatIntelFeedPoller.js +2 -2
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +599 -32
- package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js +150 -0
- package/build/dist/Server/Utils/Slo/SloFeedUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js +136 -0
- package/build/dist/Server/Utils/Slo/SloLegacyMonitorLabelAdoption.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js +269 -0
- package/build/dist/Server/Utils/Slo/SloMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js +134 -0
- package/build/dist/Server/Utils/Slo/SloOwnerReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js +137 -0
- package/build/dist/Server/Utils/Slo/SloRecordReferenceValidator.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +10 -0
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js +6 -26
- package/build/dist/Server/Utils/StatusPage/MonitorRulePatternValidator.js.map +1 -1
- package/build/dist/Server/Utils/StatusPageResource.js +31 -5
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +8 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js +80 -0
- package/build/dist/Server/Utils/Telemetry/KubernetesResourceAttributes.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +122 -67
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js +146 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetPlanner.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +174 -248
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +492 -0
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js +259 -0
- package/build/dist/Server/Utils/Telemetry/TraceContextPropagation.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry.js +11 -5
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/InvestigationEvidence.js +2 -0
- package/build/dist/Types/AI/InvestigationEvidence.js.map +1 -0
- package/build/dist/Types/Billing/SubscriptionStatus.js +37 -3
- package/build/dist/Types/Billing/SubscriptionStatus.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponentType.js +1 -0
- package/build/dist/Types/Dashboard/DashboardComponentType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js +5 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +275 -286
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Database/EnableAuditLog.js +19 -1
- package/build/dist/Types/Database/EnableAuditLog.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +4 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -6
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +2 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnsMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDnssecMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepDomainMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepExternalStatusPageMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepRetries.js +47 -0
- package/build/dist/Types/Monitor/MonitorStepRetries.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js +3 -1
- package/build/dist/Types/Monitor/MonitorStepSnmpMonitor.js.map +1 -1
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js +29 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticResult.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js +37 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticStatus.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js +42 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceDiagnosticType.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js +20 -0
- package/build/dist/Types/NetworkDevice/NetworkDevicePingMetricNames.js.map +1 -0
- package/build/dist/Types/Permission.js +116 -2
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +5 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +267 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -0
- package/build/dist/Types/Rum/SessionReplay.js +95 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js +18 -0
- package/build/dist/Types/SecurityEvent/Connectors/ConnectorDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js +17 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectionDiagnostics.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js +439 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorCatalog.js.map +1 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js +39 -0
- package/build/dist/Types/SecurityEvent/Connectors/SecurityEventConnectorProvider.js.map +1 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js +35 -0
- package/build/dist/Types/SecurityEvent/GoogleSecOpsRegion.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js +26 -0
- package/build/dist/Types/ServiceLevelObjective/SloHistoryMetricName.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js +45 -0
- package/build/dist/Types/ServiceLevelObjective/SloMetricType.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js +4 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberNotificationEventType.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +295 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js +13 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTrigger.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +67 -0
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +14 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js +59 -0
- package/build/dist/Types/Telemetry/ExceptionSpanScope.js.map +1 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js +16 -0
- package/build/dist/Types/Telemetry/LockedFilterDetail.js.map +1 -0
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js +16 -10
- package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +119 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +7 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js +48 -19
- package/build/dist/UI/Components/AlertBanner/AlertBanner.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js +10 -2
- package/build/dist/UI/Components/BulkUpdate/BulkArchiveActions.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +34 -17
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Checkbox/Checkbox.js +6 -4
- package/build/dist/UI/Components/Checkbox/Checkbox.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Detail/Detail.js +74 -15
- package/build/dist/UI/Components/Detail/Detail.js.map +1 -1
- package/build/dist/UI/Components/Dropdown/Dropdown.js +33 -5
- package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyState.js +3 -3
- package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js +47 -0
- package/build/dist/UI/Components/EmptyState/EmptyStateGuideLinks.js.map +1 -0
- package/build/dist/UI/Components/ErrorBoundary.js +34 -0
- package/build/dist/UI/Components/ErrorBoundary.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +6 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js +6 -2
- package/build/dist/UI/Components/LabelRule/LabelRuleTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js +535 -0
- package/build/dist/UI/Components/LogsViewer/LogsEntityNames.js.map +1 -0
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +117 -57
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js +3 -7
- package/build/dist/UI/Components/LogsViewer/components/ActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js +31 -44
- package/build/dist/UI/Components/LogsViewer/components/FacetSection.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +17 -3
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +19 -3
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +64 -18
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +100 -41
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +13 -5
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/types.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js +403 -0
- package/build/dist/UI/Components/Markdown.tsx/InlineReferences.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +197 -179
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +30 -21
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +12 -0
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js +46 -12
- package/build/dist/UI/Components/ModelDetail/ModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelList/ModelList.js +26 -7
- package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js +3 -1
- package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +62 -34
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js +226 -0
- package/build/dist/UI/Components/RuleRun/RuleDetailFields.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js +97 -0
- package/build/dist/UI/Components/RuleRun/RuleTable.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js +83 -0
- package/build/dist/UI/Components/RuleRun/RuleView.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js +74 -0
- package/build/dist/UI/Components/RuleRun/RunRuleNowModal.js.map +1 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js +78 -0
- package/build/dist/UI/Components/RuleRun/RunRulesBulkAction.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +3 -1
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +8 -1
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +111 -0
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js +22 -0
- package/build/dist/UI/Components/TelemetryViewer/ResourceFacetConfigs.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js +36 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSearchInput.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js +21 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetSectionHeader.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js +14 -0
- package/build/dist/UI/Components/TelemetryViewer/components/FacetShowMoreButton.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js +27 -0
- package/build/dist/UI/Components/TelemetryViewer/components/HiddenFacetsFooter.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +202 -0
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js +2 -6
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryActiveFilterChips.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js +111 -12
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryDetailPanel.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js +27 -40
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSection.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +70 -10
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +17 -3
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/types.js +0 -4
- package/build/dist/UI/Components/TelemetryViewer/types.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js +70 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSearchExemptions.js.map +1 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js +52 -0
- package/build/dist/UI/Components/TelemetryViewer/useFacetSectionSearch.js.map +1 -0
- package/build/dist/UI/Utils/Clipboard.js +59 -2
- package/build/dist/UI/Utils/Clipboard.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +11 -2
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Rules/RuleRunClient.js +98 -0
- package/build/dist/UI/Utils/Rules/RuleRunClient.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +479 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js +113 -0
- package/build/dist/UI/Utils/Telemetry/UseTelemetryEntityNames.js.map +1 -0
- package/build/dist/Utils/AI/InvestigationReport.js +1241 -0
- package/build/dist/Utils/AI/InvestigationReport.js.map +1 -0
- package/build/dist/Utils/API.js +25 -0
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +16 -2
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js +94 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloListComponent.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/Index.js +4 -0
- package/build/dist/Utils/Dashboard/Components/Index.js.map +1 -1
- package/build/dist/Utils/Dashboard/SloWidgetSource.js +125 -0
- package/build/dist/Utils/Dashboard/SloWidgetSource.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +49 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +112 -34
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +22 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +129 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js +255 -0
- package/build/dist/Utils/NetworkDiscovery/RunImportedDeviceNaming.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js +184 -0
- package/build/dist/Utils/NetworkDiscovery/ShortDeviceNamePlanner.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js +79 -0
- package/build/dist/Utils/NetworkDiscovery/ShortHostnameUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +21 -12
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
- package/build/dist/Utils/Project/DataResidency.js +51 -0
- package/build/dist/Utils/Project/DataResidency.js.map +1 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js +197 -0
- package/build/dist/Utils/Rules/RuleRunSummary.js.map +1 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js +10 -0
- package/build/dist/Utils/Rum/SessionReplayHealth.js.map +1 -1
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js +54 -0
- package/build/dist/Utils/Rum/SessionReplayRecordingEnded.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js +311 -0
- package/build/dist/Utils/SecurityEvent/Connectors/AwsSecurityHubNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js +150 -0
- package/build/dist/Utils/SecurityEvent/Connectors/CrowdStrikeFalconNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js +328 -0
- package/build/dist/Utils/SecurityEvent/Connectors/ElasticSecurityNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js +405 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftDefenderXdrNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js +212 -0
- package/build/dist/Utils/SecurityEvent/Connectors/MicrosoftSentinelNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js +351 -0
- package/build/dist/Utils/SecurityEvent/Connectors/OktaNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js +348 -0
- package/build/dist/Utils/SecurityEvent/Connectors/SplunkNormalizer.js.map +1 -0
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js +103 -10
- package/build/dist/Utils/SecurityEvent/GoogleSecOpsAlertNormalizer.js.map +1 -1
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js +51 -0
- package/build/dist/Utils/Slo/SloAffectedResourceMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js +228 -0
- package/build/dist/Utils/Slo/SloBurnRateTemplate.js.map +1 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js +934 -0
- package/build/dist/Utils/Slo/SloFeedMarkdown.js.map +1 -0
- package/build/dist/Utils/Slo/SloHealth.js +75 -9
- package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
- package/build/dist/Utils/Slo/SloListWidgetFormat.js +217 -0
- package/build/dist/Utils/Slo/SloListWidgetFormat.js.map +1 -0
- package/build/dist/Utils/Slo/SloMetricType.js +212 -0
- package/build/dist/Utils/Slo/SloMetricType.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +216 -0
- package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js +129 -0
- package/build/dist/Utils/Slo/SloMonitorStatusSummary.js.map +1 -0
- package/build/dist/Utils/Slo/SloOverviewText.js +110 -0
- package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -0
- package/build/dist/Utils/Slo/SloProjection.js +448 -0
- package/build/dist/Utils/Slo/SloProjection.js.map +1 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js +4 -2
- package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -1
- package/build/dist/Utils/Telemetry/CrossSignalScope.js +16 -5
- package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
- package/build/dist/Utils/Telemetry/EntityRelationship.js +7 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -1
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js +252 -0
- package/build/dist/Utils/Telemetry/LockedFilterSearch.js.map +1 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js +39 -0
- package/build/dist/Utils/Telemetry/NetworkHost.js.map +1 -0
- package/build/dist/Utils/Telemetry/OriginAllowList.js +105 -4
- package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
- package/build/dist/Utils/Traces/CriticalPath.js +9 -4
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
- package/package.json +1 -1
- package/Server/API/GoogleSecOpsConnectionAPI.ts +0 -79
- package/Server/Services/GoogleSecOpsConnectionService.ts +0 -101
- package/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.ts +0 -774
- package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +0 -423
- package/Tests/App/Dashboard/GoogleSecOpsDiagnostics.test.tsx +0 -724
- package/Tests/Server/API/GoogleSecOpsConnectionAPI.test.ts +0 -248
- package/Tests/Server/Services/GoogleSecOpsDiagnosticsModel.test.ts +0 -153
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.test.ts +0 -711
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsDiagnostics.test.ts +0 -838
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPoller.test.ts +0 -716
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerFailureTaxonomy.test.ts +0 -860
- package/Tests/Server/Utils/SecurityEvent/GoogleSecOpsPollerHardening.test.ts +0 -1231
- package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +0 -600
- package/Types/SecurityEvent/GoogleSecOpsDiagnostics.ts +0 -56
- package/UI/Components/GanttChart/Bar/BarLabel.tsx +0 -17
- package/UI/Components/GanttChart/Bar/Index.tsx +0 -149
- package/UI/Components/GanttChart/ChartContainer.tsx +0 -50
- package/UI/Components/GanttChart/Index.tsx +0 -90
- package/UI/Components/GanttChart/Row/Index.tsx +0 -22
- package/UI/Components/GanttChart/Row/Row.tsx +0 -231
- package/UI/Components/GanttChart/Row/RowLabel.tsx +0 -30
- package/UI/Components/GanttChart/Rows.tsx +0 -59
- package/UI/Components/GanttChart/Timeline/Index.tsx +0 -46
- package/UI/Components/GanttChart/Timeline/TimelineInterval.tsx +0 -33
- package/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.tsx +0 -43
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +0 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnectionRun.js.map +0 -1
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js +0 -56
- package/build/dist/Server/API/GoogleSecOpsConnectionAPI.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionRunService.js.map +0 -1
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js +0 -62
- package/build/dist/Server/Services/GoogleSecOpsConnectionService.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsClient.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js +0 -577
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsPoller.js.map +0 -1
- package/build/dist/Server/Utils/SecurityEvent/GoogleSecOps/GoogleSecOpsRunExecutor.js.map +0 -1
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js +0 -2
- package/build/dist/Types/SecurityEvent/GoogleSecOpsDiagnostics.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js +0 -8
- package/build/dist/UI/Components/GanttChart/Bar/BarLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Bar/Index.js +0 -77
- package/build/dist/UI/Components/GanttChart/Bar/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/ChartContainer.js +0 -33
- package/build/dist/UI/Components/GanttChart/ChartContainer.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Index.js +0 -39
- package/build/dist/UI/Components/GanttChart/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Index.js +0 -7
- package/build/dist/UI/Components/GanttChart/Row/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/Row.js +0 -106
- package/build/dist/UI/Components/GanttChart/Row/Row.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js +0 -10
- package/build/dist/UI/Components/GanttChart/Row/RowLabel.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Rows.js +0 -19
- package/build/dist/UI/Components/GanttChart/Rows.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js +0 -16
- package/build/dist/UI/Components/GanttChart/Timeline/Index.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineInterval.js.map +0 -1
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js +0 -13
- package/build/dist/UI/Components/GanttChart/Timeline/TimelineIntervalMarks.js.map +0 -1
|
@@ -17,71 +17,64 @@ import {
|
|
|
17
17
|
DashboardTemplateType,
|
|
18
18
|
getDashboardTemplatesByCategory,
|
|
19
19
|
getTemplateConfig,
|
|
20
|
+
SLO_TEMPLATE_CHART_GROUP_BY_KEYS,
|
|
20
21
|
} from "../../../Types/Dashboard/DashboardTemplates";
|
|
21
22
|
import IconProp from "../../../Types/Icon/IconProp";
|
|
22
23
|
import AlertMetricType from "../../../Types/Alerts/AlertMetricType";
|
|
23
24
|
import IncidentMetricType from "../../../Types/Incident/IncidentMetricType";
|
|
25
|
+
import MonitorMetricType from "../../../Types/Monitor/MonitorMetricType";
|
|
26
|
+
import SloMetricType from "../../../Types/ServiceLevelObjective/SloMetricType";
|
|
27
|
+
import DashboardSloComponentUtil from "../../../Utils/Dashboard/Components/DashboardSloComponent";
|
|
28
|
+
import DashboardSloListComponentUtil from "../../../Utils/Dashboard/Components/DashboardSloListComponent";
|
|
29
|
+
import {
|
|
30
|
+
resolveSloWidgetSource,
|
|
31
|
+
SloWidgetSourceState,
|
|
32
|
+
} from "../../../Utils/Dashboard/SloWidgetSource";
|
|
33
|
+
import {
|
|
34
|
+
SLO_LIST_ATTRIBUTE_TO_COLUMN,
|
|
35
|
+
SLO_LIST_DEFAULT_MAX_ROWS,
|
|
36
|
+
} from "../../../Utils/Slo/SloListWidgetFormat";
|
|
37
|
+
import SloMetricTypeUtil, {
|
|
38
|
+
SLO_METRIC_SLO_NAME_ATTRIBUTE,
|
|
39
|
+
} from "../../../Utils/Slo/SloMetricType";
|
|
24
40
|
import { describe, expect, it } from "@jest/globals";
|
|
25
41
|
|
|
26
42
|
/*
|
|
27
|
-
* Editorial invariants for the SLO template specifically. The structural
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
43
|
+
* Editorial invariants for the SLO template specifically. The structural rules
|
|
44
|
+
* every template must satisfy (grid bounds, overlap, unique ids, aggregation
|
|
45
|
+
* spelling) live in DashboardTemplateInvariants and the reading rules in
|
|
46
|
+
* DashboardTemplateEditorialInvariants — this file pins what makes THIS the SLO
|
|
47
|
+
* dashboard:
|
|
48
|
+
*
|
|
49
|
+
* - it opens on the fleet and is useful with zero configuration,
|
|
50
|
+
* - one toolbar variable scopes every section,
|
|
51
|
+
* - the per-SLO widgets follow that variable instead of waiting for edit
|
|
52
|
+
* mode, so the template carries no instruction row and no inert widget,
|
|
53
|
+
* - and nothing on it is project-wide data presented beside an objective.
|
|
34
54
|
*/
|
|
35
55
|
|
|
36
56
|
/*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
* rather than as enum members so that rename fails here instead of
|
|
41
|
-
* shipping.
|
|
57
|
+
* Persisted strings, pinned as literals rather than enum members: they are
|
|
58
|
+
* written verbatim into every saved dashboard and every metric row, so a
|
|
59
|
+
* renamed VALUE must fail here instead of silently blanking saved widgets.
|
|
42
60
|
*/
|
|
43
61
|
const SLI_METRIC: string = "Sli";
|
|
44
62
|
const ERROR_BUDGET_REMAINING_METRIC: string = "ErrorBudgetRemaining";
|
|
45
63
|
const BURN_RATE_METRIC: string = "BurnRate";
|
|
46
|
-
|
|
47
64
|
const TILE_DISPLAY: string = "Tile";
|
|
48
65
|
const CHART_DISPLAY: string = "Chart";
|
|
49
66
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const IS_ONLINE_METRIC: string = "oneuptime.monitor.online";
|
|
56
|
-
const RESPONSE_TIME_METRIC: string = "oneuptime.monitor.response.time";
|
|
57
|
-
|
|
58
|
-
/*
|
|
59
|
-
* Every incident and alert metric, taken from the enums so a member added
|
|
60
|
-
* later is covered without editing this list.
|
|
61
|
-
*
|
|
62
|
-
* Neither family survives this template's Monitor variable.
|
|
63
|
-
* IncidentService stamps its metrics with `monitorNames` (plural,
|
|
64
|
-
* comma-joined) rather than `monitorName`, so a pick would empty every
|
|
65
|
-
* incident tile while the uptime tiles beside them stayed populated.
|
|
66
|
-
* AlertService does write the singular key — but a burn-rate alert is
|
|
67
|
-
* declared with no monitor attached at all, so it carries no `monitorName`
|
|
68
|
-
* and a scoped alert tile would hide precisely the alerts an SLO dashboard
|
|
69
|
-
* exists for.
|
|
70
|
-
*/
|
|
71
|
-
const MONITOR_VARIABLE_HOSTILE_METRICS: Array<string> = [
|
|
72
|
-
...Object.values(IncidentMetricType),
|
|
73
|
-
...Object.values(AlertMetricType),
|
|
74
|
-
];
|
|
67
|
+
const BUDGET_PERCENT_SERIES: string =
|
|
68
|
+
"oneuptime.slo.error.budget.remaining.percent";
|
|
69
|
+
const BUDGET_SECONDS_SERIES: string =
|
|
70
|
+
"oneuptime.slo.error.budget.remaining.seconds";
|
|
71
|
+
const BURN_RATE_SERIES: string = "oneuptime.slo.burn.rate";
|
|
75
72
|
|
|
76
73
|
/*
|
|
77
|
-
* The bare attribute key
|
|
78
|
-
*
|
|
79
|
-
* "resource.monitorName" would compile and offer an empty picker.
|
|
74
|
+
* The bare attribute key SloMetricUtil stamps on every `oneuptime.slo.*` row.
|
|
75
|
+
* A `resource.`-prefixed key would compile and offer an empty picker.
|
|
80
76
|
*/
|
|
81
|
-
const
|
|
82
|
-
|
|
83
|
-
const AVG_AGGREGATION: string = "Avg";
|
|
84
|
-
const MAX_AGGREGATION: string = "Max";
|
|
77
|
+
const SLO_NAME_ATTRIBUTE: string = "sloName";
|
|
85
78
|
|
|
86
79
|
const GRID_WIDTH_IN_UNITS: number = 12;
|
|
87
80
|
|
|
@@ -103,9 +96,8 @@ function argumentsOf(component: DashboardBaseComponent): WidgetArguments {
|
|
|
103
96
|
|
|
104
97
|
/*
|
|
105
98
|
* Every widget family stores its title under a different argument key, and
|
|
106
|
-
* titles are the only stable handle: ids
|
|
107
|
-
*
|
|
108
|
-
* uses `widgetTitle`, which no other family does.
|
|
99
|
+
* titles are the only stable handle: ids regenerate on every call and array
|
|
100
|
+
* positions move whenever a row is inserted.
|
|
109
101
|
*/
|
|
110
102
|
const TITLE_ARGUMENT_KEYS: Array<string> = [
|
|
111
103
|
"title",
|
|
@@ -141,7 +133,7 @@ function findWidget(
|
|
|
141
133
|
},
|
|
142
134
|
);
|
|
143
135
|
|
|
144
|
-
expect(matches).
|
|
136
|
+
expect(`${title}: ${matches.length} widget(s)`).toBe(`${title}: 1 widget(s)`);
|
|
145
137
|
return matches[0] as DashboardBaseComponent;
|
|
146
138
|
}
|
|
147
139
|
|
|
@@ -156,21 +148,28 @@ function componentsOfType(
|
|
|
156
148
|
);
|
|
157
149
|
}
|
|
158
150
|
|
|
159
|
-
function
|
|
160
|
-
|
|
161
|
-
)
|
|
162
|
-
|
|
151
|
+
function queryDataOf(component: DashboardBaseComponent): WidgetArguments {
|
|
152
|
+
const queryConfig: WidgetArguments =
|
|
153
|
+
(argumentsOf(component)["metricQueryConfig"] as
|
|
154
|
+
| WidgetArguments
|
|
155
|
+
| undefined) || {};
|
|
156
|
+
|
|
157
|
+
return (queryConfig["metricQueryData"] as WidgetArguments | undefined) || {};
|
|
163
158
|
}
|
|
164
159
|
|
|
165
160
|
function filterDataOf(component: DashboardBaseComponent): WidgetArguments {
|
|
161
|
+
return (
|
|
162
|
+
(queryDataOf(component)["filterData"] as WidgetArguments | undefined) || {}
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function aliasDataOf(component: DashboardBaseComponent): WidgetArguments {
|
|
166
167
|
const queryConfig: WidgetArguments =
|
|
167
168
|
(argumentsOf(component)["metricQueryConfig"] as
|
|
168
169
|
| WidgetArguments
|
|
169
170
|
| undefined) || {};
|
|
170
|
-
const queryData: WidgetArguments =
|
|
171
|
-
(queryConfig["metricQueryData"] as WidgetArguments | undefined) || {};
|
|
172
171
|
|
|
173
|
-
return (
|
|
172
|
+
return (queryConfig["metricAliasData"] as WidgetArguments | undefined) || {};
|
|
174
173
|
}
|
|
175
174
|
|
|
176
175
|
function metricNameOf(component: DashboardBaseComponent): string | undefined {
|
|
@@ -178,14 +177,21 @@ function metricNameOf(component: DashboardBaseComponent): string | undefined {
|
|
|
178
177
|
return typeof value === "string" ? value : undefined;
|
|
179
178
|
}
|
|
180
179
|
|
|
181
|
-
|
|
182
|
-
* The aggregation is stored under the MISSPELLED key `aggegationType`.
|
|
183
|
-
* That misspelling is what the fetch layer reads, so it is the contract.
|
|
184
|
-
*/
|
|
180
|
+
// The MISSPELLED key is what the fetch layer reads, so it is the contract.
|
|
185
181
|
function aggregationOf(component: DashboardBaseComponent): unknown {
|
|
186
182
|
return filterDataOf(component)["aggegationType"];
|
|
187
183
|
}
|
|
188
184
|
|
|
185
|
+
function metricWidgets(
|
|
186
|
+
config: DashboardViewConfig,
|
|
187
|
+
): Array<DashboardBaseComponent> {
|
|
188
|
+
return config.components.filter(
|
|
189
|
+
(component: DashboardBaseComponent): boolean => {
|
|
190
|
+
return metricNameOf(component) !== undefined;
|
|
191
|
+
},
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
189
195
|
function lowestOccupiedEdge(config: DashboardViewConfig): number {
|
|
190
196
|
return Math.max(
|
|
191
197
|
...config.components.map((component: DashboardBaseComponent): number => {
|
|
@@ -194,18 +200,28 @@ function lowestOccupiedEdge(config: DashboardViewConfig): number {
|
|
|
194
200
|
);
|
|
195
201
|
}
|
|
196
202
|
|
|
203
|
+
function onlyVariable(config: DashboardViewConfig): DashboardVariable {
|
|
204
|
+
const variables: Array<DashboardVariable> = config.variables || [];
|
|
205
|
+
|
|
206
|
+
expect(variables).toHaveLength(1);
|
|
207
|
+
return variables[0] as DashboardVariable;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// A one-line layout record, so a moved widget reads as a plain diff.
|
|
211
|
+
function placementOf(component: DashboardBaseComponent): string {
|
|
212
|
+
return `${component.componentType} "${titleOf(component)}" @ row ${component.topInDashboardUnits}, col ${component.leftInDashboardUnits}, ${component.widthInDashboardUnits}x${component.heightInDashboardUnits}`;
|
|
213
|
+
}
|
|
214
|
+
|
|
197
215
|
// -- Tests -----------------------------------------------------------------
|
|
198
216
|
|
|
199
217
|
describe("SLO dashboard template", () => {
|
|
200
218
|
describe("catalog entry", () => {
|
|
201
219
|
it("is registered exactly once", () => {
|
|
202
|
-
|
|
203
|
-
(template: DashboardTemplate): boolean => {
|
|
220
|
+
expect(
|
|
221
|
+
DashboardTemplates.filter((template: DashboardTemplate): boolean => {
|
|
204
222
|
return template.type === DashboardTemplateType.Slo;
|
|
205
|
-
},
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
expect(entries).toHaveLength(1);
|
|
223
|
+
}),
|
|
224
|
+
).toHaveLength(1);
|
|
209
225
|
});
|
|
210
226
|
|
|
211
227
|
it("is filed under Monitoring with the percent icon the SLO pages use", () => {
|
|
@@ -218,962 +234,970 @@ describe("SLO dashboard template", () => {
|
|
|
218
234
|
expect(entry.name).toBe("SLO Dashboard");
|
|
219
235
|
expect(entry.category).toBe(DashboardTemplateCategory.Monitoring);
|
|
220
236
|
expect(entry.icon).toBe(IconProp.Percent);
|
|
221
|
-
expect(
|
|
237
|
+
expect(
|
|
238
|
+
getDashboardTemplatesByCategory(DashboardTemplateCategory.Monitoring),
|
|
239
|
+
).toContain(entry);
|
|
222
240
|
});
|
|
223
241
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
242
|
+
/*
|
|
243
|
+
* The card is the whole of what the modal tells a reader. It used to end
|
|
244
|
+
* "Pick the SLO on each widget after creating it" — a chore. It must now
|
|
245
|
+
* describe a dashboard that works on creation and is scoped from the
|
|
246
|
+
* toolbar, and must not promise the monitor, incident or alert widgets the
|
|
247
|
+
* template no longer carries.
|
|
248
|
+
*/
|
|
249
|
+
it("describes the fleet view and the toolbar, and promises nothing the template does not ship", () => {
|
|
250
|
+
const description: string = (
|
|
251
|
+
DashboardTemplates.find((template: DashboardTemplate): boolean => {
|
|
252
|
+
return template.type === DashboardTemplateType.Slo;
|
|
253
|
+
}) as DashboardTemplate
|
|
254
|
+
).description;
|
|
231
255
|
|
|
232
|
-
expect(
|
|
233
|
-
|
|
256
|
+
expect(description).toContain("Every SLO");
|
|
257
|
+
expect(description).toContain("toolbar");
|
|
234
258
|
|
|
235
|
-
|
|
236
|
-
|
|
259
|
+
for (const stale of [
|
|
260
|
+
"monitor",
|
|
261
|
+
"incident",
|
|
262
|
+
"alert",
|
|
263
|
+
"Pick the SLO on each widget",
|
|
264
|
+
]) {
|
|
265
|
+
expect(
|
|
266
|
+
`description mentions "${stale}": ${description.toLowerCase().includes(stale.toLowerCase())}`,
|
|
267
|
+
).toBe(`description mentions "${stale}": false`);
|
|
268
|
+
}
|
|
237
269
|
});
|
|
238
270
|
|
|
239
|
-
/*
|
|
240
|
-
* The enum value is persisted on the Dashboard row that records which
|
|
241
|
-
* template it was created from, so it is a wire string, not a label.
|
|
242
|
-
*/
|
|
243
271
|
it("uses the persisted enum value 'Slo'", () => {
|
|
244
272
|
expect(DashboardTemplateType.Slo).toBe("Slo");
|
|
245
273
|
});
|
|
246
274
|
});
|
|
247
275
|
|
|
248
|
-
describe("
|
|
276
|
+
describe("layout", () => {
|
|
249
277
|
/*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
278
|
+
* The whole board as one table. Each row of the table is a placement; a
|
|
279
|
+
* widget that moves, resizes, changes type or is renamed fails here with
|
|
280
|
+
* a readable diff, and the per-section tests below say WHY each placement
|
|
281
|
+
* is what it is.
|
|
254
282
|
*/
|
|
255
|
-
it("
|
|
256
|
-
expect(
|
|
283
|
+
it("lays the dashboard out exactly as designed", () => {
|
|
284
|
+
expect(getConfig().components.map(placementOf)).toEqual([
|
|
285
|
+
'Text "SLO Dashboard" @ row 0, col 0, 12x1',
|
|
286
|
+
'SloList "Service Level Objectives" @ row 1, col 0, 12x5',
|
|
287
|
+
'Text "Error Budget & Burn Rate" @ row 6, col 0, 12x1',
|
|
288
|
+
'Value "Lowest Error Budget Remaining" @ row 7, col 0, 4x1',
|
|
289
|
+
'Value "Least Error Budget Time Left" @ row 7, col 4, 4x1',
|
|
290
|
+
'Value "Peak Burn Rate" @ row 7, col 8, 4x1',
|
|
291
|
+
'Chart "Error Budget Remaining by SLO" @ row 8, col 0, 6x4',
|
|
292
|
+
'Chart "Burn Rate by SLO" @ row 8, col 6, 6x4',
|
|
293
|
+
'Text "Selected SLO" @ row 12, col 0, 12x1',
|
|
294
|
+
'Slo "SLI" @ row 13, col 0, 4x3',
|
|
295
|
+
'Slo "Error Budget Remaining" @ row 13, col 4, 4x3',
|
|
296
|
+
'Slo "Burn Rate" @ row 13, col 8, 4x3',
|
|
297
|
+
'Slo "SLI History" @ row 16, col 0, 4x4',
|
|
298
|
+
'Slo "Error Budget History" @ row 16, col 4, 4x4',
|
|
299
|
+
'Slo "Burn Rate History" @ row 16, col 8, 4x4',
|
|
300
|
+
]);
|
|
257
301
|
});
|
|
258
302
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
const expected: Array<[string, string, string]> = [
|
|
270
|
-
["SLI", SLI_METRIC, TILE_DISPLAY],
|
|
271
|
-
["Error Budget Remaining", ERROR_BUDGET_REMAINING_METRIC, TILE_DISPLAY],
|
|
272
|
-
["Burn Rate", BURN_RATE_METRIC, TILE_DISPLAY],
|
|
273
|
-
["SLI Over Time", SLI_METRIC, CHART_DISPLAY],
|
|
274
|
-
[
|
|
275
|
-
"Error Budget Remaining Over Time",
|
|
276
|
-
ERROR_BUDGET_REMAINING_METRIC,
|
|
277
|
-
CHART_DISPLAY,
|
|
278
|
-
],
|
|
279
|
-
["Burn Rate Over Time", BURN_RATE_METRIC, CHART_DISPLAY],
|
|
280
|
-
];
|
|
281
|
-
|
|
282
|
-
for (const [title, metric, display] of expected) {
|
|
283
|
-
const args: WidgetArguments = argumentsOf(findWidget(config, title));
|
|
284
|
-
|
|
285
|
-
expect(`${title} -> ${String(args["sloMetric"])}`).toBe(
|
|
286
|
-
`${title} -> ${metric}`,
|
|
287
|
-
);
|
|
288
|
-
expect(`${title} -> ${String(args["displayType"])}`).toBe(
|
|
289
|
-
`${title} -> ${display}`,
|
|
290
|
-
);
|
|
303
|
+
it("keeps every widget inside the 12-unit grid", () => {
|
|
304
|
+
for (const component of getConfig().components) {
|
|
305
|
+
expect(component.leftInDashboardUnits).toBeGreaterThanOrEqual(0);
|
|
306
|
+
expect(component.topInDashboardUnits).toBeGreaterThanOrEqual(0);
|
|
307
|
+
expect(component.widthInDashboardUnits).toBeGreaterThan(0);
|
|
308
|
+
expect(component.heightInDashboardUnits).toBeGreaterThan(0);
|
|
309
|
+
expect(
|
|
310
|
+
component.leftInDashboardUnits + component.widthInDashboardUnits,
|
|
311
|
+
).toBeLessThanOrEqual(GRID_WIDTH_IN_UNITS);
|
|
291
312
|
}
|
|
292
|
-
|
|
293
|
-
// Nothing beyond that table is on the dashboard.
|
|
294
|
-
expect(sloWidgets(config)).toHaveLength(expected.length);
|
|
295
|
-
});
|
|
296
|
-
|
|
297
|
-
/*
|
|
298
|
-
* The titles themselves are the contract the table above is written
|
|
299
|
-
* against, so assert the set independently: a renamed widget must fail
|
|
300
|
-
* here rather than silently making the table above vacuous.
|
|
301
|
-
*/
|
|
302
|
-
it("ships exactly the six SLO widget titles the template documents", () => {
|
|
303
|
-
expect(sloWidgets(getConfig()).map(titleOf).sort()).toEqual(
|
|
304
|
-
[
|
|
305
|
-
"SLI",
|
|
306
|
-
"Error Budget Remaining",
|
|
307
|
-
"Burn Rate",
|
|
308
|
-
"SLI Over Time",
|
|
309
|
-
"Error Budget Remaining Over Time",
|
|
310
|
-
"Burn Rate Over Time",
|
|
311
|
-
].sort(),
|
|
312
|
-
);
|
|
313
313
|
});
|
|
314
314
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
* up on the template that exists to report SLO numbers, and this fails
|
|
319
|
-
* when it does not.
|
|
320
|
-
*/
|
|
321
|
-
it("leaves none of the widget's supported metrics off the dashboard", () => {
|
|
322
|
-
const metrics: Set<string> = new Set<string>(
|
|
323
|
-
sloWidgets(getConfig()).map(
|
|
324
|
-
(component: DashboardBaseComponent): string => {
|
|
325
|
-
return String(argumentsOf(component)["sloMetric"]);
|
|
326
|
-
},
|
|
327
|
-
),
|
|
328
|
-
);
|
|
315
|
+
it("places no two widgets on the same grid cell", () => {
|
|
316
|
+
const occupied: Map<string, string> = new Map<string, string>();
|
|
317
|
+
const collisions: Array<string> = [];
|
|
329
318
|
|
|
330
|
-
for (const
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
319
|
+
for (const component of getConfig().components) {
|
|
320
|
+
for (
|
|
321
|
+
let row: number = component.topInDashboardUnits;
|
|
322
|
+
row <
|
|
323
|
+
component.topInDashboardUnits + component.heightInDashboardUnits;
|
|
324
|
+
row++
|
|
325
|
+
) {
|
|
326
|
+
for (
|
|
327
|
+
let column: number = component.leftInDashboardUnits;
|
|
328
|
+
column <
|
|
329
|
+
component.leftInDashboardUnits + component.widthInDashboardUnits;
|
|
330
|
+
column++
|
|
331
|
+
) {
|
|
332
|
+
const cell: string = `${row}:${column}`;
|
|
333
|
+
const existing: string | undefined = occupied.get(cell);
|
|
336
334
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
*/
|
|
343
|
-
it("ships every SLO widget unconfigured, with no SLO id baked in", () => {
|
|
344
|
-
const configured: Array<string> = [];
|
|
335
|
+
if (existing) {
|
|
336
|
+
collisions.push(
|
|
337
|
+
`cell ${cell} shared by "${existing}" and "${titleOf(component)}"`,
|
|
338
|
+
);
|
|
339
|
+
}
|
|
345
340
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
configured.push(titleOf(component));
|
|
341
|
+
occupied.set(cell, titleOf(component));
|
|
342
|
+
}
|
|
349
343
|
}
|
|
350
344
|
}
|
|
351
345
|
|
|
352
|
-
expect(
|
|
346
|
+
expect(collisions).toEqual([]);
|
|
353
347
|
});
|
|
354
348
|
|
|
355
349
|
/*
|
|
356
|
-
*
|
|
357
|
-
*
|
|
358
|
-
*
|
|
359
|
-
* cannot yet tell apart.
|
|
350
|
+
* Stronger than "no empty row": every row of the board is covered edge to
|
|
351
|
+
* edge. A ragged row — two tiles and a gap — reads as a widget that failed
|
|
352
|
+
* to render, which is exactly what a half-edited template leaves behind.
|
|
360
353
|
*/
|
|
361
|
-
it("
|
|
362
|
-
const
|
|
354
|
+
it("fills every row of the grid edge to edge, with no holes", () => {
|
|
355
|
+
const config: DashboardViewConfig = getConfig();
|
|
356
|
+
const covered: Set<string> = new Set<string>();
|
|
363
357
|
|
|
364
|
-
|
|
358
|
+
for (const component of config.components) {
|
|
359
|
+
for (
|
|
360
|
+
let row: number = component.topInDashboardUnits;
|
|
361
|
+
row <
|
|
362
|
+
component.topInDashboardUnits + component.heightInDashboardUnits;
|
|
363
|
+
row++
|
|
364
|
+
) {
|
|
365
|
+
for (
|
|
366
|
+
let column: number = component.leftInDashboardUnits;
|
|
367
|
+
column <
|
|
368
|
+
component.leftInDashboardUnits + component.widthInDashboardUnits;
|
|
369
|
+
column++
|
|
370
|
+
) {
|
|
371
|
+
covered.add(`${row}:${column}`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
365
375
|
|
|
366
|
-
|
|
367
|
-
const title: unknown = argumentsOf(component)["widgetTitle"];
|
|
376
|
+
const holes: Array<string> = [];
|
|
368
377
|
|
|
369
|
-
|
|
370
|
-
|
|
378
|
+
for (let row: number = 0; row < lowestOccupiedEdge(config); row++) {
|
|
379
|
+
for (let column: number = 0; column < GRID_WIDTH_IN_UNITS; column++) {
|
|
380
|
+
if (!covered.has(`${row}:${column}`)) {
|
|
381
|
+
holes.push(`${row}:${column}`);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
371
384
|
}
|
|
385
|
+
|
|
386
|
+
expect(holes).toEqual([]);
|
|
372
387
|
});
|
|
373
388
|
|
|
374
|
-
it("
|
|
375
|
-
const
|
|
376
|
-
const validDisplays: Array<string> = Object.values(SloWidgetDisplayType);
|
|
389
|
+
it("is exactly as tall as its content", () => {
|
|
390
|
+
const config: DashboardViewConfig = getConfig();
|
|
377
391
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
392
|
+
expect(config.heightInDashboardUnits).toBeGreaterThanOrEqual(
|
|
393
|
+
lowestOccupiedEdge(config),
|
|
394
|
+
);
|
|
395
|
+
expect(lowestOccupiedEdge(config)).toBe(20);
|
|
396
|
+
});
|
|
383
397
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
398
|
+
it("renders no widget smaller than the minimum it declares", () => {
|
|
399
|
+
for (const component of getConfig().components) {
|
|
400
|
+
expect(component.widthInDashboardUnits).toBeGreaterThanOrEqual(
|
|
401
|
+
component.minWidthInDashboardUnits,
|
|
388
402
|
);
|
|
389
|
-
expect(
|
|
390
|
-
|
|
391
|
-
validDisplays.includes(display)
|
|
392
|
-
? display
|
|
393
|
-
: "<not a SloWidgetDisplayType>"
|
|
394
|
-
}`,
|
|
403
|
+
expect(component.heightInDashboardUnits).toBeGreaterThanOrEqual(
|
|
404
|
+
component.minHeightInDashboardUnits,
|
|
395
405
|
);
|
|
396
406
|
}
|
|
397
407
|
});
|
|
398
408
|
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
*/
|
|
404
|
-
it("pins the persisted metric and display strings", () => {
|
|
405
|
-
expect(SloWidgetMetric.Sli).toBe(SLI_METRIC);
|
|
406
|
-
expect(SloWidgetMetric.ErrorBudgetRemaining).toBe(
|
|
407
|
-
ERROR_BUDGET_REMAINING_METRIC,
|
|
409
|
+
it("opens with a bold, full-width title row", () => {
|
|
410
|
+
const title: DashboardBaseComponent = findWidget(
|
|
411
|
+
getConfig(),
|
|
412
|
+
"SLO Dashboard",
|
|
408
413
|
);
|
|
409
|
-
expect(SloWidgetMetric.BurnRate).toBe(BURN_RATE_METRIC);
|
|
410
|
-
expect(SloWidgetDisplayType.Tile).toBe(TILE_DISPLAY);
|
|
411
|
-
expect(SloWidgetDisplayType.Chart).toBe(CHART_DISPLAY);
|
|
412
|
-
expect(DashboardComponentType.Slo).toBe("Slo");
|
|
413
|
-
});
|
|
414
414
|
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
}
|
|
415
|
+
expect(title.componentType).toBe(DashboardComponentType.Text);
|
|
416
|
+
expect(title.topInDashboardUnits).toBe(0);
|
|
417
|
+
expect(title.widthInDashboardUnits).toBe(GRID_WIDTH_IN_UNITS);
|
|
418
|
+
expect(argumentsOf(title)["isBold"]).toBe(true);
|
|
420
419
|
});
|
|
421
420
|
|
|
422
421
|
/*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
*
|
|
426
|
-
*
|
|
422
|
+
* Like the Monitor and Kubernetes templates, the board opens on its
|
|
423
|
+
* headline band directly under the title. The SLO List card carries its
|
|
424
|
+
* own title, so a section heading above it would stack three titles on
|
|
425
|
+
* one card.
|
|
427
426
|
*/
|
|
428
|
-
it("
|
|
427
|
+
it("opens on the fleet list directly under the title, with no heading between them", () => {
|
|
429
428
|
const config: DashboardViewConfig = getConfig();
|
|
430
|
-
const
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
);
|
|
435
|
-
const charts: Array<DashboardBaseComponent> = sloWidgets(config).filter(
|
|
436
|
-
(component: DashboardBaseComponent): boolean => {
|
|
437
|
-
return argumentsOf(component)["displayType"] === CHART_DISPLAY;
|
|
438
|
-
},
|
|
429
|
+
const title: DashboardBaseComponent = findWidget(config, "SLO Dashboard");
|
|
430
|
+
const list: DashboardBaseComponent = findWidget(
|
|
431
|
+
config,
|
|
432
|
+
"Service Level Objectives",
|
|
439
433
|
);
|
|
440
434
|
|
|
441
|
-
expect(
|
|
442
|
-
|
|
435
|
+
expect(list.topInDashboardUnits).toBe(
|
|
436
|
+
title.topInDashboardUnits + title.heightInDashboardUnits,
|
|
437
|
+
);
|
|
443
438
|
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
439
|
+
const headingsAboveTheList: Array<string> = componentsOfType(
|
|
440
|
+
config,
|
|
441
|
+
DashboardComponentType.Text,
|
|
442
|
+
)
|
|
443
|
+
.filter((component: DashboardBaseComponent): boolean => {
|
|
444
|
+
return (
|
|
445
|
+
component !== title &&
|
|
446
|
+
component.topInDashboardUnits < list.topInDashboardUnits
|
|
447
|
+
);
|
|
448
|
+
})
|
|
449
|
+
.map(titleOf);
|
|
448
450
|
|
|
449
|
-
|
|
450
|
-
expect(chart.widthInDashboardUnits).toBeGreaterThanOrEqual(6);
|
|
451
|
-
expect(chart.heightInDashboardUnits).toBeGreaterThanOrEqual(4);
|
|
452
|
-
}
|
|
451
|
+
expect(headingsAboveTheList).toEqual([]);
|
|
453
452
|
});
|
|
454
453
|
|
|
455
454
|
/*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
*
|
|
459
|
-
* scoped by the Monitor variable, which is not what it reports on.
|
|
455
|
+
* The reading order of the whole product: the fleet, how its budget is
|
|
456
|
+
* being spent, then the one objective the reader picks. The budget band's
|
|
457
|
+
* heading names burn rate too, because two of its widgets are burn rate.
|
|
460
458
|
*/
|
|
461
|
-
it("
|
|
462
|
-
for (const component of sloWidgets(getConfig())) {
|
|
463
|
-
expect(argumentsOf(component)["metricQueryConfig"]).toBeUndefined();
|
|
464
|
-
expect(metricNameOf(component)).toBeUndefined();
|
|
465
|
-
}
|
|
466
|
-
});
|
|
467
|
-
|
|
468
|
-
it("reads the objective before the trend: tiles sit above the charts", () => {
|
|
469
|
-
const config: DashboardViewConfig = getConfig();
|
|
470
|
-
const lowestTileEdge: number = Math.max(
|
|
471
|
-
...sloWidgets(config)
|
|
472
|
-
.filter((component: DashboardBaseComponent): boolean => {
|
|
473
|
-
return argumentsOf(component)["displayType"] === TILE_DISPLAY;
|
|
474
|
-
})
|
|
475
|
-
.map((component: DashboardBaseComponent): number => {
|
|
476
|
-
return (
|
|
477
|
-
component.topInDashboardUnits + component.heightInDashboardUnits
|
|
478
|
-
);
|
|
479
|
-
}),
|
|
480
|
-
);
|
|
481
|
-
const highestChartTop: number = Math.min(
|
|
482
|
-
...sloWidgets(config)
|
|
483
|
-
.filter((component: DashboardBaseComponent): boolean => {
|
|
484
|
-
return argumentsOf(component)["displayType"] === CHART_DISPLAY;
|
|
485
|
-
})
|
|
486
|
-
.map((component: DashboardBaseComponent): number => {
|
|
487
|
-
return component.topInDashboardUnits;
|
|
488
|
-
}),
|
|
489
|
-
);
|
|
490
|
-
|
|
491
|
-
expect(highestChartTop).toBeGreaterThanOrEqual(lowestTileEdge);
|
|
492
|
-
});
|
|
493
|
-
});
|
|
494
|
-
|
|
495
|
-
describe("metric queries", () => {
|
|
496
|
-
it("queries only the two monitor series that carry monitorName", () => {
|
|
459
|
+
it("labels its two sections in reading order, each directly above its band", () => {
|
|
497
460
|
const config: DashboardViewConfig = getConfig();
|
|
461
|
+
const headers: Array<[string, number]> = [
|
|
462
|
+
["Error Budget & Burn Rate", 6],
|
|
463
|
+
["Selected SLO", 12],
|
|
464
|
+
];
|
|
498
465
|
|
|
499
|
-
expect(
|
|
500
|
-
|
|
501
|
-
)
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
);
|
|
508
|
-
expect(metricNameOf(findWidget(config, "Monitor Uptime Over Time"))).toBe(
|
|
509
|
-
IS_ONLINE_METRIC,
|
|
510
|
-
);
|
|
511
|
-
expect(metricNameOf(findWidget(config, "Response Time Over Time"))).toBe(
|
|
512
|
-
RESPONSE_TIME_METRIC,
|
|
513
|
-
);
|
|
514
|
-
|
|
515
|
-
const metrics: Array<string> = [];
|
|
466
|
+
expect(
|
|
467
|
+
componentsOfType(config, DashboardComponentType.Text).map(titleOf),
|
|
468
|
+
).toEqual([
|
|
469
|
+
"SLO Dashboard",
|
|
470
|
+
...headers.map((header: [string, number]): string => {
|
|
471
|
+
return header[0];
|
|
472
|
+
}),
|
|
473
|
+
]);
|
|
516
474
|
|
|
517
|
-
for (const
|
|
518
|
-
const
|
|
475
|
+
for (const [heading, expectedTop] of headers) {
|
|
476
|
+
const header: DashboardBaseComponent = findWidget(config, heading);
|
|
519
477
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
478
|
+
expect(header.componentType).toBe(DashboardComponentType.Text);
|
|
479
|
+
expect(header.widthInDashboardUnits).toBe(GRID_WIDTH_IN_UNITS);
|
|
480
|
+
expect(header.heightInDashboardUnits).toBe(1);
|
|
481
|
+
expect(argumentsOf(header)["isBold"]).toBe(true);
|
|
482
|
+
expect(`${heading} top=${header.topInDashboardUnits}`).toBe(
|
|
483
|
+
`${heading} top=${expectedTop}`,
|
|
484
|
+
);
|
|
485
|
+
expect(
|
|
486
|
+
config.components.some(
|
|
487
|
+
(component: DashboardBaseComponent): boolean => {
|
|
488
|
+
return component.topInDashboardUnits === expectedTop + 1;
|
|
489
|
+
},
|
|
490
|
+
),
|
|
491
|
+
).toBe(true);
|
|
523
492
|
}
|
|
524
|
-
|
|
525
|
-
expect(metrics.length).toBeGreaterThan(0);
|
|
526
|
-
expect(Array.from(new Set(metrics)).sort()).toEqual(
|
|
527
|
-
[IS_ONLINE_METRIC, RESPONSE_TIME_METRIC].sort(),
|
|
528
|
-
);
|
|
529
493
|
});
|
|
530
494
|
|
|
531
495
|
/*
|
|
532
|
-
*
|
|
533
|
-
*
|
|
534
|
-
*
|
|
535
|
-
*
|
|
536
|
-
* comma-joined) and never the singular key, so picking a monitor in
|
|
537
|
-
* this template's variable empties every incident tile while the
|
|
538
|
-
* uptime tile beside it stays populated — two widgets side by side
|
|
539
|
-
* disagreeing about what is selected.
|
|
540
|
-
*
|
|
541
|
-
* AlertService DOES write the singular `monitorName`, so alert metrics
|
|
542
|
-
* scope correctly for any monitor-attached alert. They are excluded
|
|
543
|
-
* anyway: createBurnRateAlert never sets a monitor, so the burn-rate
|
|
544
|
-
* alerts this dashboard exists for carry no `monitorName` and would be
|
|
545
|
-
* the rows a scoped tile dropped.
|
|
546
|
-
*
|
|
547
|
-
* The incident and alert LISTS read Postgres and are immune to
|
|
548
|
-
* telemetry variables, which is why they are the form those signals
|
|
549
|
-
* take here.
|
|
496
|
+
* The old template needed a non-bold "Edit this dashboard to pick an
|
|
497
|
+
* objective on each SLO widget" row, because six widgets were inert until
|
|
498
|
+
* edit mode. Every Text widget now is a heading: nothing on a freshly
|
|
499
|
+
* created board needs explaining.
|
|
550
500
|
*/
|
|
551
|
-
it("carries no
|
|
552
|
-
const
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
}
|
|
501
|
+
it("carries no instruction row — every Text widget is a bold heading", () => {
|
|
502
|
+
const nonHeadings: Array<string> = componentsOfType(
|
|
503
|
+
getConfig(),
|
|
504
|
+
DashboardComponentType.Text,
|
|
505
|
+
)
|
|
506
|
+
.filter((component: DashboardBaseComponent): boolean => {
|
|
507
|
+
return argumentsOf(component)["isBold"] !== true;
|
|
508
|
+
})
|
|
509
|
+
.map(titleOf);
|
|
561
510
|
|
|
562
|
-
expect(
|
|
511
|
+
expect(nonHeadings).toEqual([]);
|
|
563
512
|
});
|
|
564
513
|
|
|
565
|
-
it("
|
|
514
|
+
it("puts the fleet above the selected objective", () => {
|
|
566
515
|
const config: DashboardViewConfig = getConfig();
|
|
516
|
+
const selectedHeaderTop: number = findWidget(
|
|
517
|
+
config,
|
|
518
|
+
"Selected SLO",
|
|
519
|
+
).topInDashboardUnits;
|
|
567
520
|
|
|
568
|
-
for (const
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
"Monitor Uptime Over Time",
|
|
572
|
-
"Response Time Over Time",
|
|
521
|
+
for (const component of [
|
|
522
|
+
...componentsOfType(config, DashboardComponentType.SloList),
|
|
523
|
+
...metricWidgets(config),
|
|
573
524
|
]) {
|
|
574
|
-
expect(
|
|
525
|
+
expect(
|
|
526
|
+
component.topInDashboardUnits + component.heightInDashboardUnits,
|
|
527
|
+
).toBeLessThanOrEqual(selectedHeaderTop);
|
|
575
528
|
}
|
|
576
529
|
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
530
|
+
for (const component of componentsOfType(
|
|
531
|
+
config,
|
|
532
|
+
DashboardComponentType.Slo,
|
|
533
|
+
)) {
|
|
534
|
+
expect(component.topInDashboardUnits).toBeGreaterThan(
|
|
535
|
+
selectedHeaderTop,
|
|
536
|
+
);
|
|
537
|
+
}
|
|
580
538
|
});
|
|
581
539
|
|
|
582
540
|
/*
|
|
583
|
-
*
|
|
584
|
-
*
|
|
585
|
-
* for a service that was up all window.
|
|
541
|
+
* Each Selected SLO column reads "now, and how it got here": the tile's
|
|
542
|
+
* history sits directly beneath it, at the same width.
|
|
586
543
|
*/
|
|
587
|
-
it("
|
|
544
|
+
it("stacks each tile's history directly beneath it", () => {
|
|
588
545
|
const config: DashboardViewConfig = getConfig();
|
|
546
|
+
const tiles: Array<DashboardBaseComponent> = componentsOfType(
|
|
547
|
+
config,
|
|
548
|
+
DashboardComponentType.Slo,
|
|
549
|
+
).filter((component: DashboardBaseComponent): boolean => {
|
|
550
|
+
return argumentsOf(component)["displayType"] === TILE_DISPLAY;
|
|
551
|
+
});
|
|
589
552
|
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
553
|
+
expect(tiles).toHaveLength(3);
|
|
554
|
+
|
|
555
|
+
for (const tile of tiles) {
|
|
556
|
+
const metric: unknown = argumentsOf(tile)["sloMetric"];
|
|
557
|
+
const history: Array<DashboardBaseComponent> = componentsOfType(
|
|
558
|
+
config,
|
|
559
|
+
DashboardComponentType.Slo,
|
|
560
|
+
).filter((component: DashboardBaseComponent): boolean => {
|
|
561
|
+
return (
|
|
562
|
+
argumentsOf(component)["displayType"] === CHART_DISPLAY &&
|
|
563
|
+
argumentsOf(component)["sloMetric"] === metric
|
|
564
|
+
);
|
|
565
|
+
});
|
|
600
566
|
|
|
601
|
-
|
|
567
|
+
expect(history).toHaveLength(1);
|
|
602
568
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
569
|
+
const chart: DashboardBaseComponent =
|
|
570
|
+
history[0] as DashboardBaseComponent;
|
|
571
|
+
|
|
572
|
+
expect(
|
|
573
|
+
`${titleOf(tile)} -> ${titleOf(chart)}: left ${chart.leftInDashboardUnits}, width ${chart.widthInDashboardUnits}, top ${chart.topInDashboardUnits}`,
|
|
574
|
+
).toBe(
|
|
575
|
+
`${titleOf(tile)} -> ${titleOf(chart)}: left ${tile.leftInDashboardUnits}, width ${tile.widthInDashboardUnits}, top ${tile.topInDashboardUnits + tile.heightInDashboardUnits}`,
|
|
606
576
|
);
|
|
607
|
-
// "(avg)" or "Over Time" — either way it must not read as a percent.
|
|
608
|
-
expect(title.trim().length).toBeGreaterThan(0);
|
|
609
577
|
}
|
|
610
|
-
|
|
611
|
-
// The single-number tile has to say it is an average outright.
|
|
612
|
-
expect(titleOf(findWidget(config, "Monitor Uptime (avg)"))).toContain(
|
|
613
|
-
"(avg)",
|
|
614
|
-
);
|
|
615
578
|
});
|
|
616
579
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
* the only percentage-valued numbers here (SLI, error budget) are
|
|
620
|
-
* rendered by the Slo widget, which formats its own units. A metric
|
|
621
|
-
* widget titled with a "%" would be claiming a unit its series does
|
|
622
|
-
* not carry.
|
|
623
|
-
*/
|
|
624
|
-
it("puts no percent sign in any metric widget's title", () => {
|
|
625
|
-
const offenders: Array<string> = [];
|
|
580
|
+
it("gives every widget a distinct, non-empty title", () => {
|
|
581
|
+
const titles: Array<string> = getConfig().components.map(titleOf);
|
|
626
582
|
|
|
627
|
-
for (const
|
|
628
|
-
|
|
629
|
-
offenders.push(titleOf(component));
|
|
630
|
-
}
|
|
583
|
+
for (const title of titles) {
|
|
584
|
+
expect(title.trim().length).toBeGreaterThan(0);
|
|
631
585
|
}
|
|
632
586
|
|
|
633
|
-
expect(
|
|
587
|
+
expect(new Set(titles).size).toBe(titles.length);
|
|
634
588
|
});
|
|
589
|
+
});
|
|
635
590
|
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
591
|
+
describe("what is not on the template", () => {
|
|
592
|
+
it("uses only the widget kinds that can be scoped to an objective", () => {
|
|
593
|
+
const types: Set<string> = new Set<string>(
|
|
594
|
+
getConfig().components.map(
|
|
595
|
+
(component: DashboardBaseComponent): string => {
|
|
596
|
+
return component.componentType;
|
|
597
|
+
},
|
|
598
|
+
),
|
|
599
|
+
);
|
|
644
600
|
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
601
|
+
expect(Array.from(types).sort()).toEqual(
|
|
602
|
+
[
|
|
603
|
+
DashboardComponentType.Chart,
|
|
604
|
+
DashboardComponentType.Slo,
|
|
605
|
+
DashboardComponentType.SloList,
|
|
606
|
+
DashboardComponentType.Text,
|
|
607
|
+
DashboardComponentType.Value,
|
|
608
|
+
].sort(),
|
|
609
|
+
);
|
|
650
610
|
});
|
|
651
611
|
|
|
652
|
-
|
|
612
|
+
/*
|
|
613
|
+
* Project-wide lists beside an objective read as that objective's
|
|
614
|
+
* incidents, alerts and monitors. None of them can be narrowed to an SLO,
|
|
615
|
+
* so none of them belongs here.
|
|
616
|
+
*/
|
|
617
|
+
it("ships no project-wide incident, alert or monitor list", () => {
|
|
653
618
|
const config: DashboardViewConfig = getConfig();
|
|
654
|
-
let metricWidgets: number = 0;
|
|
655
|
-
|
|
656
|
-
for (const component of config.components) {
|
|
657
|
-
if (!metricNameOf(component)) {
|
|
658
|
-
continue;
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
metricWidgets++;
|
|
662
619
|
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
).toBe(false);
|
|
620
|
+
for (const listType of [
|
|
621
|
+
DashboardComponentType.IncidentList,
|
|
622
|
+
DashboardComponentType.AlertList,
|
|
623
|
+
DashboardComponentType.MonitorList,
|
|
624
|
+
]) {
|
|
625
|
+
expect(componentsOfType(config, listType)).toHaveLength(0);
|
|
670
626
|
}
|
|
671
|
-
|
|
672
|
-
expect(metricWidgets).toBeGreaterThan(0);
|
|
673
627
|
});
|
|
674
628
|
|
|
675
629
|
/*
|
|
676
|
-
*
|
|
677
|
-
*
|
|
678
|
-
*
|
|
679
|
-
* repeat — so the check is on (family, metric, aggregation).
|
|
630
|
+
* Monitor series carry `monitorName` and incident / alert metrics their
|
|
631
|
+
* own monitor keys — none carries `sloName`, so the SLO variable would
|
|
632
|
+
* leave them showing the whole project under a toolbar naming one SLO.
|
|
680
633
|
*/
|
|
681
|
-
it("
|
|
682
|
-
const
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
634
|
+
it("queries no monitor, incident or alert series", () => {
|
|
635
|
+
const foreignSeries: Array<string> = [
|
|
636
|
+
...Object.values(MonitorMetricType),
|
|
637
|
+
...Object.values(IncidentMetricType),
|
|
638
|
+
...Object.values(AlertMetricType),
|
|
639
|
+
];
|
|
687
640
|
|
|
688
|
-
|
|
689
|
-
continue;
|
|
690
|
-
}
|
|
641
|
+
const offenders: Array<string> = [];
|
|
691
642
|
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
)}`;
|
|
695
|
-
const existing: string | undefined = seen.get(key);
|
|
643
|
+
for (const component of metricWidgets(getConfig())) {
|
|
644
|
+
const metric: string = metricNameOf(component) as string;
|
|
696
645
|
|
|
697
|
-
if (
|
|
698
|
-
|
|
699
|
-
`${key} on "${existing}" and "${titleOf(component)}"`,
|
|
700
|
-
);
|
|
646
|
+
if (foreignSeries.includes(metric)) {
|
|
647
|
+
offenders.push(`${titleOf(component)} -> ${metric}`);
|
|
701
648
|
}
|
|
702
|
-
|
|
703
|
-
seen.set(key, titleOf(component));
|
|
704
649
|
}
|
|
705
650
|
|
|
706
|
-
expect(
|
|
651
|
+
expect(offenders).toEqual([]);
|
|
707
652
|
});
|
|
653
|
+
});
|
|
708
654
|
|
|
709
|
-
|
|
710
|
-
|
|
655
|
+
describe("the Objectives list", () => {
|
|
656
|
+
it("is one full-width SLO List of every active objective", () => {
|
|
657
|
+
const lists: Array<DashboardBaseComponent> = componentsOfType(
|
|
658
|
+
getConfig(),
|
|
659
|
+
DashboardComponentType.SloList,
|
|
660
|
+
);
|
|
711
661
|
|
|
712
|
-
expect(
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
).toBe(
|
|
717
|
-
expect(
|
|
662
|
+
expect(lists).toHaveLength(1);
|
|
663
|
+
|
|
664
|
+
const list: DashboardBaseComponent = lists[0] as DashboardBaseComponent;
|
|
665
|
+
|
|
666
|
+
expect(titleOf(list)).toBe("Service Level Objectives");
|
|
667
|
+
expect(list.widthInDashboardUnits).toBe(GRID_WIDTH_IN_UNITS);
|
|
718
668
|
});
|
|
719
|
-
});
|
|
720
669
|
|
|
721
|
-
describe("the entity lists", () => {
|
|
722
670
|
/*
|
|
723
|
-
*
|
|
724
|
-
*
|
|
725
|
-
* store, so unlike a metric tile they stay correct whatever the
|
|
726
|
-
* Monitor variable is set to.
|
|
671
|
+
* The fleet view has to show the fleet: a stored status or label filter
|
|
672
|
+
* would hide objectives on a board the reader has not configured yet.
|
|
727
673
|
*/
|
|
728
|
-
it("
|
|
729
|
-
const
|
|
674
|
+
it("pre-filters nothing and caps its rows at the widget's own default", () => {
|
|
675
|
+
const args: WidgetArguments = argumentsOf(
|
|
676
|
+
findWidget(getConfig(), "Service Level Objectives"),
|
|
677
|
+
);
|
|
730
678
|
|
|
731
|
-
expect(
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
).toHaveLength(1);
|
|
737
|
-
expect(
|
|
738
|
-
componentsOfType(config, DashboardComponentType.AlertList),
|
|
739
|
-
).toHaveLength(1);
|
|
679
|
+
expect(args).toEqual({
|
|
680
|
+
title: "Service Level Objectives",
|
|
681
|
+
maxRows: SLO_LIST_DEFAULT_MAX_ROWS,
|
|
682
|
+
viewMode: "list",
|
|
683
|
+
});
|
|
740
684
|
});
|
|
741
685
|
|
|
742
|
-
it("
|
|
743
|
-
const
|
|
686
|
+
it("declares the same floors the widget's own default does", () => {
|
|
687
|
+
const list: DashboardBaseComponent = findWidget(
|
|
688
|
+
getConfig(),
|
|
689
|
+
"Service Level Objectives",
|
|
690
|
+
);
|
|
744
691
|
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
692
|
+
expect(list.minWidthInDashboardUnits).toBe(
|
|
693
|
+
DashboardSloListComponentUtil.getDefaultComponent()
|
|
694
|
+
.minWidthInDashboardUnits,
|
|
695
|
+
);
|
|
696
|
+
expect(list.minHeightInDashboardUnits).toBe(
|
|
697
|
+
DashboardSloListComponentUtil.getDefaultComponent()
|
|
698
|
+
.minHeightInDashboardUnits,
|
|
699
|
+
);
|
|
700
|
+
});
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
describe("the Error Budget row", () => {
|
|
704
|
+
it("charts and totals exactly the designed series, with the designed aggregations", () => {
|
|
705
|
+
expect(
|
|
706
|
+
metricWidgets(getConfig()).map(
|
|
707
|
+
(component: DashboardBaseComponent): string => {
|
|
708
|
+
return `${component.componentType} "${titleOf(component)}": ${metricNameOf(
|
|
709
|
+
component,
|
|
710
|
+
)} ${String(aggregationOf(component))}`;
|
|
711
|
+
},
|
|
712
|
+
),
|
|
713
|
+
).toEqual([
|
|
714
|
+
`Value "Lowest Error Budget Remaining": ${BUDGET_PERCENT_SERIES} Min`,
|
|
715
|
+
`Value "Least Error Budget Time Left": ${BUDGET_SECONDS_SERIES} Min`,
|
|
716
|
+
`Value "Peak Burn Rate": ${BURN_RATE_SERIES} Max`,
|
|
717
|
+
`Chart "Error Budget Remaining by SLO": ${BUDGET_PERCENT_SERIES} Avg`,
|
|
718
|
+
`Chart "Burn Rate by SLO": ${BURN_RATE_SERIES} Max`,
|
|
719
|
+
]);
|
|
720
|
+
});
|
|
721
|
+
|
|
722
|
+
it("names every series through SloMetricType", () => {
|
|
723
|
+
const known: Array<string> = Object.values(SloMetricType);
|
|
751
724
|
|
|
752
|
-
|
|
753
|
-
expect(
|
|
754
|
-
expect(Number.isInteger(args["maxRows"] as number)).toBe(true);
|
|
755
|
-
expect(args["maxRows"] as number).toBeGreaterThan(0);
|
|
725
|
+
for (const component of metricWidgets(getConfig())) {
|
|
726
|
+
expect(known).toContain(metricNameOf(component) as string);
|
|
756
727
|
}
|
|
757
728
|
});
|
|
758
729
|
|
|
759
730
|
/*
|
|
760
|
-
*
|
|
761
|
-
*
|
|
762
|
-
*
|
|
763
|
-
* already been closed, which is most of the budget.
|
|
731
|
+
* The fleet charts must aggregate each series the way the series is meant
|
|
732
|
+
* to be read — the same table the SLO Metrics page and the MetricType
|
|
733
|
+
* catalog use — so a burn-rate spike is a Max, never averaged away.
|
|
764
734
|
*/
|
|
765
|
-
it("
|
|
766
|
-
const
|
|
735
|
+
it("aggregates, labels and units each chart from SloMetricTypeUtil", () => {
|
|
736
|
+
const charts: Array<DashboardBaseComponent> = componentsOfType(
|
|
737
|
+
getConfig(),
|
|
738
|
+
DashboardComponentType.Chart,
|
|
739
|
+
);
|
|
740
|
+
|
|
741
|
+
expect(charts.length).toBeGreaterThan(0);
|
|
742
|
+
|
|
743
|
+
for (const chart of charts) {
|
|
744
|
+
const metric: SloMetricType = metricNameOf(chart) as SloMetricType;
|
|
745
|
+
const label: string = titleOf(chart);
|
|
767
746
|
|
|
768
|
-
|
|
747
|
+
expect(`${label} aggregation=${String(aggregationOf(chart))}`).toBe(
|
|
748
|
+
`${label} aggregation=${SloMetricTypeUtil.getAggregationType(metric)}`,
|
|
749
|
+
);
|
|
750
|
+
expect(`${label} legend=${String(aliasDataOf(chart)["legend"])}`).toBe(
|
|
751
|
+
`${label} legend=${SloMetricTypeUtil.getLegend(metric)}`,
|
|
752
|
+
);
|
|
769
753
|
expect(
|
|
770
|
-
|
|
771
|
-
).
|
|
754
|
+
`${label} legendUnit=${String(aliasDataOf(chart)["legendUnit"])}`,
|
|
755
|
+
).toBe(
|
|
756
|
+
`${label} legendUnit=${SloMetricTypeUtil.getLegendUnit(metric)}`,
|
|
757
|
+
);
|
|
772
758
|
}
|
|
773
759
|
});
|
|
774
760
|
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
* list opens on all of them; the reader narrows it with the widget's
|
|
778
|
-
* own Labels filter.
|
|
779
|
-
*/
|
|
780
|
-
it("does not pin the monitor list to a monitor type or status", () => {
|
|
781
|
-
const args: WidgetArguments = argumentsOf(
|
|
782
|
-
findWidget(getConfig(), "All Monitors"),
|
|
783
|
-
);
|
|
761
|
+
it("prints percent and multiplier units on the charts", () => {
|
|
762
|
+
const config: DashboardViewConfig = getConfig();
|
|
784
763
|
|
|
785
|
-
expect(
|
|
786
|
-
|
|
764
|
+
expect(
|
|
765
|
+
aliasDataOf(findWidget(config, "Error Budget Remaining by SLO"))[
|
|
766
|
+
"legendUnit"
|
|
767
|
+
],
|
|
768
|
+
).toBe("%");
|
|
769
|
+
expect(
|
|
770
|
+
aliasDataOf(findWidget(config, "Burn Rate by SLO"))["legendUnit"],
|
|
771
|
+
).toBe("x");
|
|
787
772
|
});
|
|
788
|
-
});
|
|
789
773
|
|
|
790
|
-
describe("variables", () => {
|
|
791
774
|
/*
|
|
792
|
-
* The
|
|
793
|
-
*
|
|
794
|
-
*
|
|
775
|
+
* The tiles read Min / Max, not the series' own Avg, because they must be
|
|
776
|
+
* true in BOTH states of the toolbar: across the fleet an average of
|
|
777
|
+
* several objectives' budgets is nobody's budget, while the lowest budget
|
|
778
|
+
* and the peak burn are the numbers someone acts on.
|
|
795
779
|
*/
|
|
796
|
-
it("
|
|
797
|
-
const
|
|
780
|
+
it("totals the worst case, and says so in each title", () => {
|
|
781
|
+
const config: DashboardViewConfig = getConfig();
|
|
798
782
|
|
|
799
783
|
expect(
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
784
|
+
aggregationOf(findWidget(config, "Lowest Error Budget Remaining")),
|
|
785
|
+
).toBe("Min");
|
|
786
|
+
expect(
|
|
787
|
+
aggregationOf(findWidget(config, "Least Error Budget Time Left")),
|
|
788
|
+
).toBe("Min");
|
|
789
|
+
expect(aggregationOf(findWidget(config, "Peak Burn Rate"))).toBe("Max");
|
|
790
|
+
});
|
|
804
791
|
|
|
805
|
-
|
|
792
|
+
it("colours each tile's trend the right way round", () => {
|
|
793
|
+
const config: DashboardViewConfig = getConfig();
|
|
806
794
|
|
|
807
|
-
expect(
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
795
|
+
expect(
|
|
796
|
+
argumentsOf(findWidget(config, "Lowest Error Budget Remaining"))[
|
|
797
|
+
"trendDirection"
|
|
798
|
+
],
|
|
799
|
+
).toBe(DashboardValueTrendDirection.HigherIsBetter);
|
|
800
|
+
expect(
|
|
801
|
+
argumentsOf(findWidget(config, "Least Error Budget Time Left"))[
|
|
802
|
+
"trendDirection"
|
|
803
|
+
],
|
|
804
|
+
).toBe(DashboardValueTrendDirection.HigherIsBetter);
|
|
805
|
+
expect(
|
|
806
|
+
argumentsOf(findWidget(config, "Peak Burn Rate"))["trendDirection"],
|
|
807
|
+
).toBe(DashboardValueTrendDirection.HigherIsWorse);
|
|
811
808
|
});
|
|
812
809
|
|
|
813
810
|
/*
|
|
814
|
-
*
|
|
815
|
-
*
|
|
816
|
-
*
|
|
817
|
-
* one
|
|
818
|
-
*
|
|
811
|
+
* One line per OBJECTIVE. By the attribute the toolbar variable binds to,
|
|
812
|
+
* leading so the legend reads by name — and by sloId, because SLO names
|
|
813
|
+
* are not unique: grouped by name alone, two same-named SLOs were drawn as
|
|
814
|
+
* one averaged line under one legend entry (regression). A whole-map
|
|
815
|
+
* `groupBy: { attributes: true }` would split every line by every label.
|
|
819
816
|
*/
|
|
820
|
-
it("
|
|
821
|
-
|
|
822
|
-
|
|
817
|
+
it("fans each chart out by sloName then sloId, and nothing else", () => {
|
|
818
|
+
expect([...SLO_TEMPLATE_CHART_GROUP_BY_KEYS]).toEqual([
|
|
819
|
+
SLO_NAME_ATTRIBUTE,
|
|
820
|
+
"sloId",
|
|
821
|
+
]);
|
|
822
|
+
|
|
823
|
+
for (const chart of componentsOfType(
|
|
824
|
+
getConfig(),
|
|
825
|
+
DashboardComponentType.Chart,
|
|
826
|
+
)) {
|
|
827
|
+
expect(queryDataOf(chart)["groupByAttributeKeys"]).toEqual([
|
|
828
|
+
SLO_NAME_ATTRIBUTE,
|
|
829
|
+
"sloId",
|
|
830
|
+
]);
|
|
831
|
+
expect(queryDataOf(chart)["groupBy"]).toBeUndefined();
|
|
832
|
+
expect(argumentsOf(chart)["chartType"]).toBe(DashboardChartType.Line);
|
|
833
|
+
}
|
|
834
|
+
});
|
|
823
835
|
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
836
|
+
it("leaves the tiles ungrouped, so each prints ONE number", () => {
|
|
837
|
+
for (const tile of componentsOfType(
|
|
838
|
+
getConfig(),
|
|
839
|
+
DashboardComponentType.Value,
|
|
840
|
+
)) {
|
|
841
|
+
expect(queryDataOf(tile)["groupByAttributeKeys"]).toBeUndefined();
|
|
842
|
+
}
|
|
827
843
|
});
|
|
828
844
|
|
|
829
845
|
/*
|
|
830
|
-
*
|
|
831
|
-
*
|
|
832
|
-
* would look scoped behind a control reading "unfiltered".
|
|
846
|
+
* With the toolbar on All the row must describe the fleet; a filter baked
|
|
847
|
+
* into a widget would describe a subset behind a toolbar reading "All".
|
|
833
848
|
*/
|
|
834
|
-
it("
|
|
835
|
-
const
|
|
836
|
-
[])
|
|
837
|
-
|
|
838
|
-
expect(variable.defaultValue ?? "").toBe("");
|
|
849
|
+
it("stores no attribute filter on any metric widget", () => {
|
|
850
|
+
for (const component of metricWidgets(getConfig())) {
|
|
851
|
+
expect(filterDataOf(component)["attributes"]).toBeUndefined();
|
|
852
|
+
}
|
|
839
853
|
});
|
|
840
|
-
});
|
|
841
854
|
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
component
|
|
851
|
-
|
|
855
|
+
/*
|
|
856
|
+
* Objectives run at different targets, so one axis of SLIs reads as a
|
|
857
|
+
* flat line and a dot. The SLI is shown per objective, against its own
|
|
858
|
+
* target, in the Selected SLO section — never fleet-wide.
|
|
859
|
+
*/
|
|
860
|
+
it("does not chart the SLI, the target or the status series fleet-wide", () => {
|
|
861
|
+
const queried: Array<string> = metricWidgets(getConfig()).map(
|
|
862
|
+
(component: DashboardBaseComponent): string => {
|
|
863
|
+
return metricNameOf(component) as string;
|
|
864
|
+
},
|
|
865
|
+
);
|
|
866
|
+
|
|
867
|
+
for (const series of [
|
|
868
|
+
SloMetricType.SliPercent,
|
|
869
|
+
SloMetricType.TargetPercent,
|
|
870
|
+
SloMetricType.Status,
|
|
871
|
+
]) {
|
|
872
|
+
expect(queried).not.toContain(series);
|
|
852
873
|
}
|
|
853
874
|
});
|
|
854
875
|
|
|
855
|
-
it("
|
|
856
|
-
const
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
let row: number = component.topInDashboardUnits;
|
|
862
|
-
row <
|
|
863
|
-
component.topInDashboardUnits + component.heightInDashboardUnits;
|
|
864
|
-
row++
|
|
865
|
-
) {
|
|
866
|
-
for (
|
|
867
|
-
let column: number = component.leftInDashboardUnits;
|
|
868
|
-
column <
|
|
869
|
-
component.leftInDashboardUnits + component.widthInDashboardUnits;
|
|
870
|
-
column++
|
|
871
|
-
) {
|
|
872
|
-
const cell: string = `${row}:${column}`;
|
|
873
|
-
const existing: string | undefined = occupied.get(cell);
|
|
876
|
+
it("puts no percent sign in a metric widget's title — the unit comes from the catalog", () => {
|
|
877
|
+
const offenders: Array<string> = metricWidgets(getConfig())
|
|
878
|
+
.map(titleOf)
|
|
879
|
+
.filter((title: string): boolean => {
|
|
880
|
+
return title.includes("%");
|
|
881
|
+
});
|
|
874
882
|
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
`cell ${cell} shared by "${existing}" and "${titleOf(component)}"`,
|
|
878
|
-
);
|
|
879
|
-
}
|
|
883
|
+
expect(offenders).toEqual([]);
|
|
884
|
+
});
|
|
880
885
|
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
886
|
+
it("stores every aggregation under the misspelled key the fetch layer reads", () => {
|
|
887
|
+
for (const component of metricWidgets(getConfig())) {
|
|
888
|
+
expect(typeof aggregationOf(component)).toBe("string");
|
|
889
|
+
expect(
|
|
890
|
+
Object.prototype.hasOwnProperty.call(
|
|
891
|
+
filterDataOf(component),
|
|
892
|
+
"aggregationType",
|
|
893
|
+
),
|
|
894
|
+
).toBe(false);
|
|
884
895
|
}
|
|
885
|
-
|
|
886
|
-
expect(collisions).toEqual([]);
|
|
887
896
|
});
|
|
897
|
+
});
|
|
888
898
|
|
|
899
|
+
describe("the Selected SLO widgets", () => {
|
|
889
900
|
/*
|
|
890
|
-
*
|
|
891
|
-
*
|
|
901
|
+
* Title, metric and display asserted TOGETHER per widget: a permutation of
|
|
902
|
+
* titles across metrics — a "Burn Rate" tile reporting the SLI — is the
|
|
903
|
+
* worst way this template can be wrong and the one a reader cannot see.
|
|
892
904
|
*/
|
|
893
|
-
it("
|
|
905
|
+
it("labels each SLO widget with the number it actually reports", () => {
|
|
894
906
|
const config: DashboardViewConfig = getConfig();
|
|
895
|
-
const
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
) {
|
|
904
|
-
occupiedRows.add(row);
|
|
905
|
-
}
|
|
906
|
-
}
|
|
907
|
+
const expected: Array<[string, string, string]> = [
|
|
908
|
+
["SLI", SLI_METRIC, TILE_DISPLAY],
|
|
909
|
+
["Error Budget Remaining", ERROR_BUDGET_REMAINING_METRIC, TILE_DISPLAY],
|
|
910
|
+
["Burn Rate", BURN_RATE_METRIC, TILE_DISPLAY],
|
|
911
|
+
["SLI History", SLI_METRIC, CHART_DISPLAY],
|
|
912
|
+
["Error Budget History", ERROR_BUDGET_REMAINING_METRIC, CHART_DISPLAY],
|
|
913
|
+
["Burn Rate History", BURN_RATE_METRIC, CHART_DISPLAY],
|
|
914
|
+
];
|
|
907
915
|
|
|
908
|
-
const
|
|
916
|
+
for (const [title, metric, display] of expected) {
|
|
917
|
+
const args: WidgetArguments = argumentsOf(findWidget(config, title));
|
|
909
918
|
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
}
|
|
919
|
+
expect(
|
|
920
|
+
`${title} -> ${String(args["sloMetric"])}/${String(args["displayType"])}`,
|
|
921
|
+
).toBe(`${title} -> ${metric}/${display}`);
|
|
914
922
|
}
|
|
915
923
|
|
|
916
|
-
expect(
|
|
924
|
+
expect(componentsOfType(config, DashboardComponentType.Slo)).toHaveLength(
|
|
925
|
+
expected.length,
|
|
926
|
+
);
|
|
917
927
|
});
|
|
918
928
|
|
|
919
|
-
it("
|
|
920
|
-
const
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
929
|
+
it("shows every metric the widget supports, as both a tile and a history", () => {
|
|
930
|
+
const pairs: Set<string> = new Set<string>(
|
|
931
|
+
componentsOfType(getConfig(), DashboardComponentType.Slo).map(
|
|
932
|
+
(component: DashboardBaseComponent): string => {
|
|
933
|
+
const args: WidgetArguments = argumentsOf(component);
|
|
934
|
+
return `${String(args["sloMetric"])}/${String(args["displayType"])}`;
|
|
935
|
+
},
|
|
936
|
+
),
|
|
924
937
|
);
|
|
925
|
-
});
|
|
926
938
|
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
component.minHeightInDashboardUnits,
|
|
934
|
-
);
|
|
939
|
+
for (const metric of Object.values(SloWidgetMetric)) {
|
|
940
|
+
for (const display of Object.values(SloWidgetDisplayType)) {
|
|
941
|
+
expect(
|
|
942
|
+
`${metric}/${display} on the board: ${pairs.has(`${metric}/${display}`)}`,
|
|
943
|
+
).toBe(`${metric}/${display} on the board: true`);
|
|
944
|
+
}
|
|
935
945
|
}
|
|
936
946
|
});
|
|
937
947
|
|
|
938
|
-
|
|
939
|
-
|
|
948
|
+
/*
|
|
949
|
+
* A template cannot know a project's SLO ids: a baked-in id would point at
|
|
950
|
+
* nothing elsewhere, and on a public dashboard a stored id is the
|
|
951
|
+
* authorization decision.
|
|
952
|
+
*/
|
|
953
|
+
it("pins no SLO id on any widget", () => {
|
|
954
|
+
for (const component of componentsOfType(
|
|
940
955
|
getConfig(),
|
|
941
|
-
|
|
942
|
-
)
|
|
956
|
+
DashboardComponentType.Slo,
|
|
957
|
+
)) {
|
|
958
|
+
expect(
|
|
959
|
+
argumentsOf(component)["serviceLevelObjectiveId"],
|
|
960
|
+
).toBeUndefined();
|
|
961
|
+
}
|
|
962
|
+
});
|
|
943
963
|
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
964
|
+
it("binds every SLO widget to the template's own SLO variable", () => {
|
|
965
|
+
const config: DashboardViewConfig = getConfig();
|
|
966
|
+
const variableId: string = onlyVariable(config).id;
|
|
967
|
+
|
|
968
|
+
for (const component of componentsOfType(
|
|
969
|
+
config,
|
|
970
|
+
DashboardComponentType.Slo,
|
|
971
|
+
)) {
|
|
972
|
+
expect(
|
|
973
|
+
`${titleOf(component)} follows ${String(
|
|
974
|
+
argumentsOf(component)["serviceLevelObjectiveVariableId"],
|
|
975
|
+
)}`,
|
|
976
|
+
).toBe(`${titleOf(component)} follows ${variableId}`);
|
|
977
|
+
}
|
|
949
978
|
});
|
|
950
979
|
|
|
951
980
|
/*
|
|
952
|
-
*
|
|
953
|
-
*
|
|
954
|
-
*
|
|
981
|
+
* THE property the rewrite exists for, established through the resolver
|
|
982
|
+
* the renderer and the public policy both use: as created, every SLO
|
|
983
|
+
* widget asks for a TOOLBAR pick (never "Click to select an SLO", which
|
|
984
|
+
* does nothing outside edit mode), and one pick resolves all six at once.
|
|
955
985
|
*/
|
|
956
|
-
it("
|
|
986
|
+
it("waits for one toolbar pick — and one pick resolves every SLO widget", () => {
|
|
957
987
|
const config: DashboardViewConfig = getConfig();
|
|
988
|
+
const variable: DashboardVariable = onlyVariable(config);
|
|
989
|
+
const sloWidgets: Array<DashboardBaseComponent> = componentsOfType(
|
|
990
|
+
config,
|
|
991
|
+
DashboardComponentType.Slo,
|
|
992
|
+
);
|
|
958
993
|
|
|
959
|
-
|
|
960
|
-
["Objective Health", 2],
|
|
961
|
-
["Error Budget Trends", 6],
|
|
962
|
-
["Monitor Health", 15],
|
|
963
|
-
];
|
|
994
|
+
expect(sloWidgets.length).toBeGreaterThan(0);
|
|
964
995
|
|
|
965
|
-
for (const
|
|
966
|
-
const
|
|
996
|
+
for (const component of sloWidgets) {
|
|
997
|
+
const args: WidgetArguments = argumentsOf(component);
|
|
967
998
|
|
|
968
|
-
expect(
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
999
|
+
expect(
|
|
1000
|
+
`${titleOf(component)} as created: ${
|
|
1001
|
+
resolveSloWidgetSource({
|
|
1002
|
+
serviceLevelObjectiveId: args["serviceLevelObjectiveId"] as
|
|
1003
|
+
| string
|
|
1004
|
+
| undefined,
|
|
1005
|
+
serviceLevelObjectiveVariableId: args[
|
|
1006
|
+
"serviceLevelObjectiveVariableId"
|
|
1007
|
+
] as string | undefined,
|
|
1008
|
+
variables: config.variables,
|
|
1009
|
+
}).state
|
|
1010
|
+
}`,
|
|
1011
|
+
).toBe(
|
|
1012
|
+
`${titleOf(component)} as created: ${SloWidgetSourceState.NoSelection}`,
|
|
975
1013
|
);
|
|
976
1014
|
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
1015
|
+
expect(
|
|
1016
|
+
resolveSloWidgetSource({
|
|
1017
|
+
serviceLevelObjectiveVariableId: args[
|
|
1018
|
+
"serviceLevelObjectiveVariableId"
|
|
1019
|
+
] as string | undefined,
|
|
1020
|
+
variables: [{ ...variable, selectedValue: "Checkout API" }],
|
|
1021
|
+
}),
|
|
1022
|
+
).toEqual({
|
|
1023
|
+
state: SloWidgetSourceState.FollowsSelection,
|
|
1024
|
+
sloName: "Checkout API",
|
|
1025
|
+
});
|
|
1026
|
+
}
|
|
1027
|
+
});
|
|
987
1028
|
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
)
|
|
1029
|
+
it("titles every SLO widget so the placeholders can be told apart", () => {
|
|
1030
|
+
for (const component of componentsOfType(
|
|
1031
|
+
getConfig(),
|
|
1032
|
+
DashboardComponentType.Slo,
|
|
1033
|
+
)) {
|
|
1034
|
+
expect(
|
|
1035
|
+
String(argumentsOf(component)["widgetTitle"] || "").trim().length,
|
|
1036
|
+
).toBeGreaterThan(0);
|
|
991
1037
|
}
|
|
1038
|
+
});
|
|
992
1039
|
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
},
|
|
1040
|
+
it("stores only real SloWidgetMetric and SloWidgetDisplayType values", () => {
|
|
1041
|
+
expect(SloWidgetMetric.Sli).toBe(SLI_METRIC);
|
|
1042
|
+
expect(SloWidgetMetric.ErrorBudgetRemaining).toBe(
|
|
1043
|
+
ERROR_BUDGET_REMAINING_METRIC,
|
|
998
1044
|
);
|
|
1045
|
+
expect(SloWidgetMetric.BurnRate).toBe(BURN_RATE_METRIC);
|
|
1046
|
+
expect(SloWidgetDisplayType.Tile).toBe(TILE_DISPLAY);
|
|
1047
|
+
expect(SloWidgetDisplayType.Chart).toBe(CHART_DISPLAY);
|
|
999
1048
|
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1049
|
+
for (const component of componentsOfType(
|
|
1050
|
+
getConfig(),
|
|
1051
|
+
DashboardComponentType.Slo,
|
|
1052
|
+
)) {
|
|
1053
|
+
const args: WidgetArguments = argumentsOf(component);
|
|
1054
|
+
|
|
1055
|
+
expect(Object.values(SloWidgetMetric)).toContain(args["sloMetric"]);
|
|
1056
|
+
expect(Object.values(SloWidgetDisplayType)).toContain(
|
|
1057
|
+
args["displayType"],
|
|
1058
|
+
);
|
|
1059
|
+
}
|
|
1005
1060
|
});
|
|
1006
1061
|
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
* says it once, directly under the title, instead of leaving six
|
|
1011
|
-
* identical setup placeholders to explain themselves.
|
|
1012
|
-
*/
|
|
1013
|
-
it("carries exactly one non-bold guidance row, directly under the title", () => {
|
|
1014
|
-
const config: DashboardViewConfig = getConfig();
|
|
1015
|
-
const guidance: Array<DashboardBaseComponent> = componentsOfType(
|
|
1016
|
-
config,
|
|
1017
|
-
DashboardComponentType.Text,
|
|
1018
|
-
).filter((component: DashboardBaseComponent): boolean => {
|
|
1019
|
-
return argumentsOf(component)["isBold"] !== true;
|
|
1020
|
-
});
|
|
1062
|
+
it("declares the same floors the widget's own default does, and gives charts room to be read", () => {
|
|
1063
|
+
const floor: DashboardBaseComponent =
|
|
1064
|
+
DashboardSloComponentUtil.getDefaultComponent();
|
|
1021
1065
|
|
|
1022
|
-
|
|
1066
|
+
for (const component of componentsOfType(
|
|
1067
|
+
getConfig(),
|
|
1068
|
+
DashboardComponentType.Slo,
|
|
1069
|
+
)) {
|
|
1070
|
+
expect(component.minWidthInDashboardUnits).toBe(
|
|
1071
|
+
floor.minWidthInDashboardUnits,
|
|
1072
|
+
);
|
|
1073
|
+
expect(component.minHeightInDashboardUnits).toBe(
|
|
1074
|
+
floor.minHeightInDashboardUnits,
|
|
1075
|
+
);
|
|
1023
1076
|
|
|
1024
|
-
|
|
1077
|
+
const isChart: boolean =
|
|
1078
|
+
argumentsOf(component)["displayType"] === CHART_DISPLAY;
|
|
1025
1079
|
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1080
|
+
expect(component.widthInDashboardUnits).toBeGreaterThanOrEqual(4);
|
|
1081
|
+
expect(component.heightInDashboardUnits).toBeGreaterThanOrEqual(
|
|
1082
|
+
isChart ? 4 : 3,
|
|
1083
|
+
);
|
|
1084
|
+
}
|
|
1085
|
+
});
|
|
1030
1086
|
|
|
1031
|
-
|
|
1087
|
+
// A metric query on an Slo widget would be read by the metric fetch layer.
|
|
1088
|
+
it("carries no metric query on any SLO widget", () => {
|
|
1089
|
+
for (const component of componentsOfType(
|
|
1090
|
+
getConfig(),
|
|
1091
|
+
DashboardComponentType.Slo,
|
|
1092
|
+
)) {
|
|
1093
|
+
expect(argumentsOf(component)["metricQueryConfig"]).toBeUndefined();
|
|
1094
|
+
}
|
|
1095
|
+
});
|
|
1096
|
+
});
|
|
1032
1097
|
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
* click only opens the settings panel in edit mode — and a dashboard
|
|
1037
|
-
* created from a template opens in view mode, where following the
|
|
1038
|
-
* instruction does nothing. A guidance row that repeats "click"
|
|
1039
|
-
* without naming edit sends the reader down a dead end.
|
|
1040
|
-
*/
|
|
1041
|
-
expect(`guidance names SLO: ${text.includes("SLO")}`).toBe(
|
|
1042
|
-
"guidance names SLO: true",
|
|
1043
|
-
);
|
|
1044
|
-
expect(
|
|
1045
|
-
`guidance names edit: ${text.toLowerCase().includes("edit")}`,
|
|
1046
|
-
).toBe("guidance names edit: true");
|
|
1098
|
+
describe("the SLO variable", () => {
|
|
1099
|
+
it("is one single-select Telemetry Attribute variable labelled SLO", () => {
|
|
1100
|
+
const variable: DashboardVariable = onlyVariable(getConfig());
|
|
1047
1101
|
|
|
1102
|
+
expect(variable.name).toBe("slo");
|
|
1103
|
+
expect(variable.label).toBe("SLO");
|
|
1104
|
+
expect(variable.type).toBe(DashboardVariableType.TelemetryAttribute);
|
|
1048
1105
|
/*
|
|
1049
|
-
*
|
|
1050
|
-
*
|
|
1051
|
-
*
|
|
1106
|
+
* Single-select because the Selected SLO widgets can show ONE objective;
|
|
1107
|
+
* a multi-pick would leave six widgets asking for a single pick while
|
|
1108
|
+
* the charts above compared.
|
|
1052
1109
|
*/
|
|
1053
|
-
expect(
|
|
1054
|
-
`guidance length ${Math.min(text.length, 80)} <= 80`,
|
|
1055
|
-
);
|
|
1110
|
+
expect(variable.isMultiSelect).toBe(false);
|
|
1056
1111
|
});
|
|
1057
1112
|
|
|
1058
1113
|
/*
|
|
1059
|
-
*
|
|
1060
|
-
*
|
|
1061
|
-
* above the SLI would make it a monitor dashboard with an SLO on it.
|
|
1114
|
+
* SloMetricUtil stamps a BARE key. `resource.sloName` would compile and
|
|
1115
|
+
* offer an empty picker; `sloId` would offer UUIDs and match no name.
|
|
1062
1116
|
*/
|
|
1063
|
-
it("
|
|
1064
|
-
const
|
|
1065
|
-
const lowestSloEdge: number = Math.max(
|
|
1066
|
-
...sloWidgets(config).map(
|
|
1067
|
-
(component: DashboardBaseComponent): number => {
|
|
1068
|
-
return (
|
|
1069
|
-
component.topInDashboardUnits + component.heightInDashboardUnits
|
|
1070
|
-
);
|
|
1071
|
-
},
|
|
1072
|
-
),
|
|
1073
|
-
);
|
|
1117
|
+
it("binds to the bare sloName key the SLO metrics carry", () => {
|
|
1118
|
+
const variable: DashboardVariable = onlyVariable(getConfig());
|
|
1074
1119
|
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
"Monitor Uptime Over Time",
|
|
1080
|
-
"Response Time Over Time",
|
|
1081
|
-
"All Monitors",
|
|
1082
|
-
"Latest Alerts",
|
|
1083
|
-
]) {
|
|
1084
|
-
expect(
|
|
1085
|
-
`${title} top=${findWidget(config, title).topInDashboardUnits} >= ${lowestSloEdge}`,
|
|
1086
|
-
).toBe(
|
|
1087
|
-
`${title} top=${Math.max(
|
|
1088
|
-
findWidget(config, title).topInDashboardUnits,
|
|
1089
|
-
lowestSloEdge,
|
|
1090
|
-
)} >= ${lowestSloEdge}`,
|
|
1091
|
-
);
|
|
1092
|
-
}
|
|
1120
|
+
expect(variable.attributeKey).toBe(SLO_NAME_ATTRIBUTE);
|
|
1121
|
+
expect(variable.attributeKey).toBe(SLO_METRIC_SLO_NAME_ATTRIBUTE);
|
|
1122
|
+
expect(variable.attributeKey).not.toBe("resource.sloName");
|
|
1123
|
+
expect(variable.attributeKey).not.toBe("sloId");
|
|
1093
1124
|
});
|
|
1094
1125
|
|
|
1095
1126
|
/*
|
|
1096
|
-
*
|
|
1097
|
-
*
|
|
1098
|
-
*
|
|
1127
|
+
* One key, three consumers: the charts group by it, the SLO List maps it
|
|
1128
|
+
* to the name column, and the variable binds to it. If any of the three
|
|
1129
|
+
* spells it differently, a pick narrows some sections and not others.
|
|
1099
1130
|
*/
|
|
1100
|
-
it("
|
|
1131
|
+
it("is the same key the charts group by and the SLO List maps to its name column", () => {
|
|
1101
1132
|
const config: DashboardViewConfig = getConfig();
|
|
1102
|
-
const
|
|
1103
|
-
config,
|
|
1104
|
-
"Burn Rate Over Time",
|
|
1105
|
-
);
|
|
1106
|
-
const incidents: DashboardBaseComponent = findWidget(
|
|
1107
|
-
config,
|
|
1108
|
-
"Latest Incidents",
|
|
1109
|
-
);
|
|
1133
|
+
const key: string = onlyVariable(config).attributeKey as string;
|
|
1110
1134
|
|
|
1111
|
-
expect(
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1135
|
+
expect(SLO_LIST_ATTRIBUTE_TO_COLUMN[key]).toBe("name");
|
|
1136
|
+
|
|
1137
|
+
for (const chart of componentsOfType(
|
|
1138
|
+
config,
|
|
1139
|
+
DashboardComponentType.Chart,
|
|
1140
|
+
)) {
|
|
1141
|
+
// The variable's key leads; sloId after it keeps same-named SLOs apart.
|
|
1142
|
+
expect(
|
|
1143
|
+
(queryDataOf(chart)["groupByAttributeKeys"] as Array<string>)[0],
|
|
1144
|
+
).toBe(key);
|
|
1145
|
+
}
|
|
1118
1146
|
});
|
|
1119
1147
|
|
|
1120
|
-
|
|
1121
|
-
|
|
1148
|
+
// A template cannot know a project's SLO names.
|
|
1149
|
+
it("ships no default and no selection", () => {
|
|
1150
|
+
const variable: DashboardVariable = onlyVariable(getConfig());
|
|
1122
1151
|
|
|
1123
|
-
|
|
1124
|
-
expect(
|
|
1125
|
-
|
|
1126
|
-
"chartType"
|
|
1127
|
-
],
|
|
1128
|
-
).toBe(DashboardChartType.Area);
|
|
1129
|
-
// ...and a line for a latency series read against its own history.
|
|
1130
|
-
expect(
|
|
1131
|
-
argumentsOf(findWidget(config, "Response Time Over Time"))["chartType"],
|
|
1132
|
-
).toBe(DashboardChartType.Line);
|
|
1152
|
+
expect(variable.defaultValue ?? "").toBe("");
|
|
1153
|
+
expect(variable.selectedValue ?? "").toBe("");
|
|
1154
|
+
expect(variable.selectedValues ?? []).toEqual([]);
|
|
1133
1155
|
});
|
|
1134
1156
|
});
|
|
1135
1157
|
|
|
1136
1158
|
describe("freshness", () => {
|
|
1137
|
-
/*
|
|
1138
|
-
* Two dashboards created from this template must not share component
|
|
1139
|
-
* or variable ids — they are independent saved rows from the moment
|
|
1140
|
-
* they are created.
|
|
1141
|
-
*/
|
|
1142
1159
|
it("generates fresh component and variable ids on every call", () => {
|
|
1143
1160
|
const first: DashboardViewConfig = getConfig();
|
|
1144
1161
|
const second: DashboardViewConfig = getConfig();
|
|
1145
1162
|
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
const firstComponentIds: Set<string> = new Set<string>(
|
|
1163
|
+
const firstIds: Set<string> = new Set<string>(
|
|
1149
1164
|
first.components.map((component: DashboardBaseComponent): string => {
|
|
1150
1165
|
return component.componentId.toString();
|
|
1151
1166
|
}),
|
|
1152
1167
|
);
|
|
1168
|
+
|
|
1153
1169
|
for (const component of second.components) {
|
|
1154
|
-
expect(
|
|
1155
|
-
false,
|
|
1156
|
-
);
|
|
1170
|
+
expect(firstIds.has(component.componentId.toString())).toBe(false);
|
|
1157
1171
|
}
|
|
1158
1172
|
|
|
1159
|
-
|
|
1160
|
-
(first.variables || []).map((variable: DashboardVariable): string => {
|
|
1161
|
-
return variable.id;
|
|
1162
|
-
}),
|
|
1163
|
-
);
|
|
1164
|
-
for (const variable of second.variables || []) {
|
|
1165
|
-
expect(firstVariableIds.has(variable.id)).toBe(false);
|
|
1166
|
-
}
|
|
1173
|
+
expect(onlyVariable(second).id).not.toBe(onlyVariable(first).id);
|
|
1167
1174
|
});
|
|
1168
1175
|
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1176
|
+
/*
|
|
1177
|
+
* The binding must point at THIS config's variable. A variable id captured
|
|
1178
|
+
* once at module load would bind every dashboard created afterwards to a
|
|
1179
|
+
* variable it does not have.
|
|
1180
|
+
*/
|
|
1181
|
+
it("binds each call's SLO widgets to that same call's variable", () => {
|
|
1182
|
+
for (let call: number = 0; call < 3; call++) {
|
|
1183
|
+
const config: DashboardViewConfig = getConfig();
|
|
1184
|
+
const variableId: string = onlyVariable(config).id;
|
|
1185
|
+
|
|
1186
|
+
for (const component of componentsOfType(
|
|
1187
|
+
config,
|
|
1188
|
+
DashboardComponentType.Slo,
|
|
1189
|
+
)) {
|
|
1190
|
+
expect(
|
|
1191
|
+
argumentsOf(component)["serviceLevelObjectiveVariableId"],
|
|
1192
|
+
).toBe(variableId);
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
});
|
|
1172
1196
|
|
|
1173
|
-
|
|
1174
|
-
|
|
1197
|
+
it("returns the same layout on every call", () => {
|
|
1198
|
+
expect(getConfig().components.map(placementOf)).toEqual(
|
|
1199
|
+
getConfig().components.map(placementOf),
|
|
1175
1200
|
);
|
|
1176
|
-
expect(second.heightInDashboardUnits).toBe(first.heightInDashboardUnits);
|
|
1177
1201
|
});
|
|
1178
1202
|
});
|
|
1179
1203
|
});
|