@oneuptime/common 12.0.29 → 12.0.31
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/SecurityEvent.ts +48 -16
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
- package/Models/DatabaseModels/AlertSeverity.ts +44 -0
- package/Models/DatabaseModels/DetectionRule.ts +16 -5
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
- package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
- package/Models/DatabaseModels/Index.ts +13 -0
- package/Models/DatabaseModels/NetworkDevice.ts +113 -3
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
- package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +43 -0
- package/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.ts +662 -0
- package/Models/DatabaseModels/ProjectOnCallCalendarFeed.ts +584 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
- package/Models/DatabaseModels/UserOnCallCalendarFeed.ts +546 -0
- package/Models/DatabaseModels/UserOnCallShiftReminder.ts +231 -0
- package/Models/DatabaseModels/UserOnCallShiftReminderLog.ts +331 -0
- package/Server/API/GlobalConfigAPI.ts +362 -183
- package/Server/API/OnCallCalendarAPI.ts +2194 -0
- package/Server/API/TelemetryAPI.ts +42 -4
- package/Server/EnvironmentConfig.ts +250 -0
- package/Server/Infrastructure/OnCallCalendarFeedCache.ts +1050 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.ts +253 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
- package/Server/Middleware/MultipartFormData.ts +118 -32
- package/Server/Middleware/OnCallCalendarFeedRateLimit.ts +487 -0
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertGroupingEngineService.ts +9 -1
- package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertReminderRuleService.ts +9 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
- package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/HostLabelRuleEngineService.ts +9 -1
- package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentGroupingEngineService.ts +9 -1
- package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentReminderRuleService.ts +9 -1
- package/Server/Services/IncidentSlaRuleService.ts +9 -1
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/Index.ts +14 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesResourceService.ts +5 -1
- package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
- package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceService.ts +209 -1
- package/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.ts +32 -0
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.ts +260 -0
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleLayerService.ts +70 -3
- package/Server/Services/OnCallDutyPolicyScheduleLayerUserService.ts +138 -3
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleService.ts +1465 -134
- package/Server/Services/OnCallDutyPolicyUserOverrideService.ts +167 -31
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ProjectOnCallCalendarFeedService.ts +192 -0
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
- package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
- package/Server/Services/TeamMemberService.ts +489 -1
- package/Server/Services/TeamService.ts +50 -0
- package/Server/Services/TelemetrySourceMapService.ts +266 -23
- package/Server/Services/UserNotificationSettingService.ts +44 -1
- package/Server/Services/UserOnCallCalendarFeedService.ts +159 -0
- package/Server/Services/UserOnCallShiftReminderLogService.ts +151 -0
- package/Server/Services/UserOnCallShiftReminderService.ts +112 -0
- package/Server/Services/UserService.ts +27 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
- package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
- package/Server/Utils/OnCall/CalendarFeedToken.ts +241 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedRenderer.ts +1488 -0
- package/Server/Utils/OnCall/OnCallCalendarFeedUrls.ts +230 -0
- package/Server/Utils/OnCall/OnCallShiftChangeListeners.ts +227 -0
- package/Server/Utils/OnCall/OnCallShiftMaterializer.ts +1127 -0
- package/Server/Utils/OnCall/OnCallShiftReminderListener.ts +174 -0
- package/Server/Utils/OnCall/OnCallShiftReminderRunner.ts +2584 -0
- package/Server/Utils/Response.ts +134 -0
- package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
- package/Server/Utils/StartServer.ts +10 -0
- package/Server/Utils/Telemetry/AppMetrics.ts +51 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
- package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
- package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
- package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedLinks.test.tsx +229 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedPlanGate.test.tsx +489 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedSideMenus.test.tsx +149 -0
- package/Tests/App/Dashboard/OnCallCalendarFeedUtil.test.ts +855 -0
- package/Tests/App/Dashboard/OnCallPersonalCalendarFeed.test.tsx +1209 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
- package/Tests/App/Dashboard/OnCallSharedCalendarFeedCard.test.tsx +1019 -0
- package/Tests/App/Dashboard/OnCallShiftRemindersAndUpcomingShifts.test.tsx +655 -0
- package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
- package/Tests/App/Dashboard/UserSettingsSetupChecklistModel.test.ts +73 -0
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
- package/Tests/Models/OnCallCalendarFeedModels.test.ts +642 -0
- package/Tests/Models/OnCallDutyPolicyScheduleCalendarFeed.test.ts +288 -0
- package/Tests/Models/OnCallDutyPolicyScheduleShiftConfigVersion.test.ts +88 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
- package/Tests/Models/UserOnCallShiftReminderModels.test.ts +368 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
- package/Tests/Server/API/Helpers.ts +8 -0
- package/Tests/Server/API/OnCallCalendarAPI.test.ts +4461 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
- package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
- package/Tests/Server/EnvironmentConfigOnCallCalendarFeed.test.ts +357 -0
- package/Tests/Server/Infrastructure/OnCallCalendarFeedCache.test.ts +1589 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +394 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
- package/Tests/Server/Middleware/OnCallCalendarFeedRateLimit.test.ts +1365 -0
- package/Tests/Server/Services/FeedRetentionConsistency.test.ts +70 -0
- package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
- package/Tests/Server/Services/OnCallCalendarFeedServices.test.ts +1103 -0
- package/Tests/Server/Services/OnCallDutyPolicyScheduleResolver.test.ts +1037 -0
- package/Tests/Server/Services/OnCallShiftConfigPropagation.test.ts +1270 -0
- package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
- package/Tests/Server/Services/TeamDeleteMemberCleanup.test.ts +156 -0
- package/Tests/Server/Services/TeamMemberOnCallCleanup.test.ts +755 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
- package/Tests/Server/Services/UserNotificationSettingShiftReminderDefaults.test.ts +267 -0
- package/Tests/Server/Services/UserOnCallShiftReminderServices.test.ts +583 -0
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
- package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
- package/Tests/Server/Types/Database/Permissions/OnCallCalendarFeedPermissions.test.ts +254 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
- package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
- package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
- package/Tests/Server/Utils/OnCall/CalendarFeedToken.test.ts +467 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedRenderer.test.ts +2142 -0
- package/Tests/Server/Utils/OnCall/OnCallCalendarFeedUrls.test.ts +278 -0
- package/Tests/Server/Utils/OnCall/OnCallResolverTestHarness.ts +440 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftChangeListeners.test.ts +314 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftMaterializer.test.ts +1502 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderListener.test.ts +491 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderRunner.test.ts +3088 -0
- package/Tests/Server/Utils/OnCall/OnCallShiftReminderTestHarness.ts +910 -0
- package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
- package/Tests/Server/Utils/ResponseSendCalendarResponse.test.ts +561 -0
- package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
- package/Tests/Server/Utils/StartServerEncryptionSecretWarning.test.ts +64 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +29 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
- package/Tests/Types/Calendar/ICalendar.test.ts +488 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
- package/Tests/Types/NotificationSetting/NotificationSettingEventType.test.ts +53 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedTestFixtures.ts +310 -0
- package/Tests/Types/OnCallDutyPolicy/CalendarFeedWindow.test.ts +205 -0
- package/Tests/Types/OnCallDutyPolicy/LayerUtilLayerMetaAndIterationCap.test.ts +458 -0
- package/Tests/Types/OnCallDutyPolicy/MaterializedShift.test.ts +197 -0
- package/Tests/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.test.ts +1986 -0
- package/Tests/Types/OnCallDutyPolicy/ScheduleShiftUtilGroupKey.test.ts +678 -0
- package/Tests/Types/OnCallDutyPolicy/ShiftSeamUtil.test.ts +417 -0
- package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
- package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
- package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
- package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
- package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
- package/Tests/UI/Components/XAxis.test.ts +270 -5
- package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
- package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
- package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
- package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +10 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +2 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
- package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
- package/Types/Calendar/ICalendar.ts +442 -0
- package/Types/Date.ts +39 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/OnCallDutyPolicy/CalendarFeedWindow.ts +140 -0
- package/Types/OnCallDutyPolicy/Layer.ts +190 -35
- package/Types/OnCallDutyPolicy/MaterializedShift.ts +274 -0
- package/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.ts +1415 -0
- package/Types/OnCallDutyPolicy/ScheduleShiftUtil.ts +159 -4
- package/Types/OnCallDutyPolicy/ShiftSeamUtil.ts +106 -0
- package/Types/Permission.ts +96 -0
- package/Types/Rum/SessionReplay.ts +21 -0
- package/Types/Telemetry/SourceMap.ts +8 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
- package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
- package/UI/Components/Charts/Utils/XAxis.ts +125 -18
- package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
- package/UI/Components/Feed/FeedItem.tsx +4 -5
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
- package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
- package/UI/Components/Image/Image.tsx +20 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
- package/UI/Components/Table/TableHeader.tsx +64 -48
- package/UI/Components/Table/TableRow.tsx +13 -3
- package/UI/Styles/Theme.css +38 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
- package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
- package/Utils/Rules/RuleEngineLimits.ts +32 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +13 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +44 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js +699 -0
- package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js +620 -0
- package/build/dist/Models/DatabaseModels/ProjectOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js +585 -0
- package/build/dist/Models/DatabaseModels/UserOnCallCalendarFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js +247 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminder.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js +355 -0
- package/build/dist/Models/DatabaseModels/UserOnCallShiftReminderLog.js.map +1 -0
- package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/OnCallCalendarAPI.js +1371 -0
- package/build/dist/Server/API/OnCallCalendarAPI.js.map +1 -0
- package/build/dist/Server/API/TelemetryAPI.js +31 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +185 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js +663 -0
- package/build/dist/Server/Infrastructure/OnCallCalendarFeedCache.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js +103 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790400000000-AddOnCallCalendarFeeds.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js +342 -0
- package/build/dist/Server/Middleware/OnCallCalendarFeedRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +14 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js +20 -0
- package/build/dist/Server/Services/OnCallDutyPolicyEscalationRuleScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js +219 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js +47 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js +112 -3
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLayerUserService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js +955 -9
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js +93 -6
- package/build/dist/Server/Services/OnCallDutyPolicyUserOverrideService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js +157 -0
- package/build/dist/Server/Services/ProjectOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +396 -1
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/TeamService.js +43 -0
- package/build/dist/Server/Services/TeamService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +26 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js +140 -0
- package/build/dist/Server/Services/UserOnCallCalendarFeedService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js +116 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderLogService.js.map +1 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js +92 -0
- package/build/dist/Server/Services/UserOnCallShiftReminderService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +25 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js +161 -0
- package/build/dist/Server/Utils/OnCall/CalendarFeedToken.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js +983 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedRenderer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js +155 -0
- package/build/dist/Server/Utils/OnCall/OnCallCalendarFeedUrls.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js +145 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftChangeListeners.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js +752 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftMaterializer.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js +92 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderListener.js.map +1 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js +1786 -0
- package/build/dist/Server/Utils/OnCall/OnCallShiftReminderRunner.js.map +1 -0
- package/build/dist/Server/Utils/Response.js +97 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +9 -1
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js +41 -0
- package/build/dist/Server/Utils/Telemetry/AppMetrics.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
- package/build/dist/Types/Calendar/ICalendar.js +290 -0
- package/build/dist/Types/Calendar/ICalendar.js.map +1 -0
- package/build/dist/Types/Date.js +27 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js +3 -0
- package/build/dist/Types/NotificationSetting/NotificationSettingEventType.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js +97 -0
- package/build/dist/Types/OnCallDutyPolicy/CalendarFeedWindow.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/Layer.js +113 -19
- package/build/dist/Types/OnCallDutyPolicy/Layer.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js +134 -0
- package/build/dist/Types/OnCallDutyPolicy/MaterializedShift.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js +800 -0
- package/build/dist/Types/OnCallDutyPolicy/OnCallCalendarFeedUtil.js.map +1 -0
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js +97 -3
- package/build/dist/Types/OnCallDutyPolicy/ScheduleShiftUtil.js.map +1 -1
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js +77 -0
- package/build/dist/Types/OnCallDutyPolicy/ShiftSeamUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +86 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +19 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
- package/build/dist/UI/Components/Image/Image.js +6 -1
- package/build/dist/UI/Components/Image/Image.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +20 -22
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +13 -4
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,503 @@
|
|
|
1
|
+
import Label from "../../../../Models/DatabaseModels/Label";
|
|
2
|
+
import MetricType from "../../../../Models/DatabaseModels/MetricType";
|
|
3
|
+
import GlobalConfigService from "../../../../Server/Services/GlobalConfigService";
|
|
4
|
+
import MetricService from "../../../../Server/Services/MetricService";
|
|
5
|
+
import ServiceService from "../../../../Server/Services/ServiceService";
|
|
6
|
+
import { getJestSpyOn } from "../../../Spy";
|
|
7
|
+
import MonitorMetricUtil from "../../../../Server/Utils/Monitor/MonitorMetricUtil";
|
|
8
|
+
import logger from "../../../../Server/Utils/Logger";
|
|
9
|
+
import { MaxCapturedMetricAttributes } from "../../../../Server/Utils/Monitor/CapturedMetricAttributeUtil";
|
|
10
|
+
import { AllResourceIdentityLabelKeys } from "../../../../Server/Utils/Monitor/SeriesResourceLabels";
|
|
11
|
+
import TelemetryUtil from "../../../../Server/Utils/Telemetry/Telemetry";
|
|
12
|
+
import Dictionary from "../../../../Types/Dictionary";
|
|
13
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
14
|
+
import CapturedMetric from "../../../../Types/Monitor/CustomCodeMonitor/CapturedMetric";
|
|
15
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
16
|
+
import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
|
|
17
|
+
import ServiceType from "../../../../Types/Telemetry/ServiceType";
|
|
18
|
+
import {
|
|
19
|
+
afterEach,
|
|
20
|
+
beforeEach,
|
|
21
|
+
describe,
|
|
22
|
+
expect,
|
|
23
|
+
jest,
|
|
24
|
+
test,
|
|
25
|
+
} from "@jest/globals";
|
|
26
|
+
|
|
27
|
+
/*
|
|
28
|
+
* ---------------------------------------------------------------------------
|
|
29
|
+
* Regression suite for GitHub issue #3514
|
|
30
|
+
* ---------------------------------------------------------------------------
|
|
31
|
+
*
|
|
32
|
+
* The report was that a Custom JavaScript Code Monitor calling only
|
|
33
|
+
* `oneuptime.captureMetric()` auto-created a phantom Service row. It does not,
|
|
34
|
+
* and the first block below pins that down end to end: everything this path
|
|
35
|
+
* writes is a ClickHouse Metric row owned by the MONITOR
|
|
36
|
+
* (primaryEntityType = ServiceType.Monitor, primaryEntityId = the monitor id),
|
|
37
|
+
* and the MetricType it catalogues is never associated with any Service.
|
|
38
|
+
*
|
|
39
|
+
* What the investigation DID find in that path is the inverse problem, and it
|
|
40
|
+
* is the reason the rest of this file exists. Script-supplied attribute keys
|
|
41
|
+
* were copied into the metric row with only five names reserved, so a script
|
|
42
|
+
* could stamp `service.name` / `oneuptime.host.id` / `k8s.cluster.name` on its
|
|
43
|
+
* own datapoints. Those are not decoration — SeriesResourceLabels treats them
|
|
44
|
+
* as the series' resource identity. A stamped `resource.service.name` files
|
|
45
|
+
* the monitor's datapoints straight onto an unrelated Service's Metrics tab,
|
|
46
|
+
* which pins that raw attribute rather than the owning entity id; and any
|
|
47
|
+
* metric monitor grouped by one of these keys turns it into a series label,
|
|
48
|
+
* from where SeriesResourceLinker attaches the named resource to the alerts
|
|
49
|
+
* and incidents that series opens, AlertOwnerRuleEngineService pages that
|
|
50
|
+
* resource's owners, and MonitorMaintenanceSuppression silences the series
|
|
51
|
+
* during a maintenance window on it.
|
|
52
|
+
*/
|
|
53
|
+
|
|
54
|
+
const PROJECT_ID: ObjectID = new ObjectID(
|
|
55
|
+
"11111111-1111-4111-8111-111111111111",
|
|
56
|
+
);
|
|
57
|
+
const MONITOR_ID: ObjectID = new ObjectID(
|
|
58
|
+
"22222222-2222-4222-8222-222222222222",
|
|
59
|
+
);
|
|
60
|
+
const PROBE_ID: ObjectID = new ObjectID("33333333-3333-4333-8333-333333333333");
|
|
61
|
+
|
|
62
|
+
const CUSTOM_METRIC_NAME: string = "cursor.usage.lines_accepted";
|
|
63
|
+
const CUSTOM_ROW_NAME: string = `custom.monitor.${CUSTOM_METRIC_NAME}`;
|
|
64
|
+
|
|
65
|
+
function makeLabel(name: string): Label {
|
|
66
|
+
const label: Label = new Label();
|
|
67
|
+
label.name = name;
|
|
68
|
+
return label;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
describe("MonitorMetricUtil custom metric attributes (issue #3514)", () => {
|
|
72
|
+
let insertedRows: Array<JSONObject>;
|
|
73
|
+
let indexedMetricNames: Dictionary<MetricType>;
|
|
74
|
+
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
insertedRows = [];
|
|
77
|
+
indexedMetricNames = {};
|
|
78
|
+
|
|
79
|
+
jest
|
|
80
|
+
.spyOn(GlobalConfigService, "findOneBy")
|
|
81
|
+
.mockResolvedValue(null as never);
|
|
82
|
+
jest
|
|
83
|
+
.spyOn(MetricService, "insertJsonRows")
|
|
84
|
+
.mockImplementation(async (rows: Array<JSONObject>): Promise<void> => {
|
|
85
|
+
insertedRows.push(...rows);
|
|
86
|
+
});
|
|
87
|
+
jest
|
|
88
|
+
.spyOn(TelemetryUtil, "indexMetricNameServiceNameMap")
|
|
89
|
+
.mockImplementation(
|
|
90
|
+
async (data: {
|
|
91
|
+
projectId: ObjectID;
|
|
92
|
+
metricNameServiceNameMap: Dictionary<MetricType>;
|
|
93
|
+
}): Promise<void> => {
|
|
94
|
+
Object.assign(indexedMetricNames, data.metricNameServiceNameMap);
|
|
95
|
+
return undefined;
|
|
96
|
+
},
|
|
97
|
+
);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
afterEach(() => {
|
|
101
|
+
jest.restoreAllMocks();
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
async function captureMetrics(
|
|
105
|
+
capturedMetrics: Array<CapturedMetric>,
|
|
106
|
+
options: {
|
|
107
|
+
monitorLabels?: Array<Label>;
|
|
108
|
+
monitorCustomFields?: JSONObject;
|
|
109
|
+
} = {},
|
|
110
|
+
): Promise<void> {
|
|
111
|
+
const response: ProbeMonitorResponse = {
|
|
112
|
+
projectId: PROJECT_ID,
|
|
113
|
+
monitorId: MONITOR_ID,
|
|
114
|
+
monitorStepId: ObjectID.generate(),
|
|
115
|
+
probeId: PROBE_ID,
|
|
116
|
+
failureCause: "",
|
|
117
|
+
monitoredAt: new Date("2026-08-10T12:00:00.000Z"),
|
|
118
|
+
customCodeMonitorResponse: {
|
|
119
|
+
logMessages: [],
|
|
120
|
+
scriptError: undefined,
|
|
121
|
+
result: undefined,
|
|
122
|
+
executionTimeInMS: 10,
|
|
123
|
+
capturedMetrics: capturedMetrics,
|
|
124
|
+
},
|
|
125
|
+
} as unknown as ProbeMonitorResponse;
|
|
126
|
+
|
|
127
|
+
await MonitorMetricUtil.saveMonitorMetrics({
|
|
128
|
+
monitorId: MONITOR_ID,
|
|
129
|
+
projectId: PROJECT_ID,
|
|
130
|
+
dataToProcess: response,
|
|
131
|
+
monitorName: "Cursor usage ingest — daily",
|
|
132
|
+
probeName: "London Probe",
|
|
133
|
+
monitorLabels: options.monitorLabels,
|
|
134
|
+
monitorCustomFields: options.monitorCustomFields,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function customMetricRow(): JSONObject {
|
|
139
|
+
const row: JSONObject | undefined = insertedRows.find(
|
|
140
|
+
(candidate: JSONObject) => {
|
|
141
|
+
return candidate["name"] === CUSTOM_ROW_NAME;
|
|
142
|
+
},
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
expect(row).toBeDefined();
|
|
146
|
+
|
|
147
|
+
return row as JSONObject;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function customMetricAttributes(): JSONObject {
|
|
151
|
+
return customMetricRow()["attributes"] as JSONObject;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
describe("the reported behaviour: captureMetric and Service rows", () => {
|
|
155
|
+
test("owns its metric rows by MONITOR, never by a Service", async () => {
|
|
156
|
+
await captureMetrics([
|
|
157
|
+
{ name: CUSTOM_METRIC_NAME, value: 1234, attributes: {} },
|
|
158
|
+
]);
|
|
159
|
+
|
|
160
|
+
const row: JSONObject = customMetricRow();
|
|
161
|
+
|
|
162
|
+
expect(row["primaryEntityType"]).toBe(ServiceType.Monitor);
|
|
163
|
+
expect(row["primaryEntityId"]).toBe(MONITOR_ID.toString());
|
|
164
|
+
|
|
165
|
+
/*
|
|
166
|
+
* The columns ingest fills in for an OTLP resource. A monitor metric has
|
|
167
|
+
* no OTel resource, so leaving them unset is what keeps this row out of
|
|
168
|
+
* the entity registry — and out of the Services list.
|
|
169
|
+
*/
|
|
170
|
+
expect(row["entityKeys"]).toBeUndefined();
|
|
171
|
+
expect(row["serviceEntityKey"]).toBeUndefined();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
test("catalogues the metric name without associating any Service", async () => {
|
|
175
|
+
await captureMetrics([
|
|
176
|
+
{ name: CUSTOM_METRIC_NAME, value: 1234, attributes: {} },
|
|
177
|
+
]);
|
|
178
|
+
|
|
179
|
+
const metricType: MetricType | undefined =
|
|
180
|
+
indexedMetricNames[CUSTOM_ROW_NAME];
|
|
181
|
+
|
|
182
|
+
expect(metricType).toBeDefined();
|
|
183
|
+
expect(metricType?.name).toBe(CUSTOM_ROW_NAME);
|
|
184
|
+
|
|
185
|
+
/*
|
|
186
|
+
* `services` left unset is what makes TelemetryUtil's junction insert a
|
|
187
|
+
* no-op. A Service attached here would be the closest this path could
|
|
188
|
+
* ever come to the reported phantom service.
|
|
189
|
+
*/
|
|
190
|
+
expect(metricType?.services).toBeUndefined();
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
test("stamps no attribute that names a Service, even when the script tries", async () => {
|
|
194
|
+
await captureMetrics([
|
|
195
|
+
{
|
|
196
|
+
name: CUSTOM_METRIC_NAME,
|
|
197
|
+
value: 1234,
|
|
198
|
+
attributes: {
|
|
199
|
+
"service.name": "Cursor",
|
|
200
|
+
"resource.service.name": "Cursor",
|
|
201
|
+
"oneuptime.service.name": "Cursor",
|
|
202
|
+
"oneuptime.service.id": "44444444-4444-4444-8444-444444444444",
|
|
203
|
+
"ai.tool": "cursor",
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
]);
|
|
207
|
+
|
|
208
|
+
const attributes: JSONObject = customMetricAttributes();
|
|
209
|
+
|
|
210
|
+
expect(attributes["service.name"]).toBeUndefined();
|
|
211
|
+
expect(attributes["resource.service.name"]).toBeUndefined();
|
|
212
|
+
expect(attributes["oneuptime.service.name"]).toBeUndefined();
|
|
213
|
+
expect(attributes["oneuptime.service.id"]).toBeUndefined();
|
|
214
|
+
|
|
215
|
+
// The script's own dimension is untouched.
|
|
216
|
+
expect(attributes["ai.tool"]).toBe("cursor");
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
test("creates no Service row — the literal claim in the issue", async () => {
|
|
220
|
+
/*
|
|
221
|
+
* The narrowest possible statement of what was reported. Postgres has
|
|
222
|
+
* exactly one automatic Service creator
|
|
223
|
+
* (OpenTelemetryIngestService.findOrCreateTelemetryService, itself the
|
|
224
|
+
* only production caller of ServiceService.create), so a spy on that
|
|
225
|
+
* one method is a complete assertion for this path.
|
|
226
|
+
*/
|
|
227
|
+
const create: jest.SpyInstance<any, any> = getJestSpyOn(
|
|
228
|
+
ServiceService,
|
|
229
|
+
"create",
|
|
230
|
+
);
|
|
231
|
+
|
|
232
|
+
await captureMetrics([
|
|
233
|
+
{
|
|
234
|
+
name: CUSTOM_METRIC_NAME,
|
|
235
|
+
value: 1234,
|
|
236
|
+
attributes: { "service.name": "Cursor", "ai.tool": "cursor" },
|
|
237
|
+
},
|
|
238
|
+
]);
|
|
239
|
+
|
|
240
|
+
expect(create).not.toHaveBeenCalled();
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
describe("resource identity cannot be claimed by a script", () => {
|
|
245
|
+
test("drops every key the series-label resolver reads as resource identity", async () => {
|
|
246
|
+
const attributes: JSONObject = {};
|
|
247
|
+
for (const key of AllResourceIdentityLabelKeys) {
|
|
248
|
+
attributes[key] = "borrowed";
|
|
249
|
+
}
|
|
250
|
+
attributes["region"] = "us-east-1";
|
|
251
|
+
|
|
252
|
+
await captureMetrics([
|
|
253
|
+
{ name: CUSTOM_METRIC_NAME, value: 1, attributes: attributes },
|
|
254
|
+
]);
|
|
255
|
+
|
|
256
|
+
const recorded: JSONObject = customMetricAttributes();
|
|
257
|
+
|
|
258
|
+
for (const key of AllResourceIdentityLabelKeys) {
|
|
259
|
+
expect(recorded[key]).toBeUndefined();
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
expect(recorded["region"]).toBe("us-east-1");
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test("drops the monitor's own identity attributes so a script cannot re-file its data", async () => {
|
|
266
|
+
await captureMetrics([
|
|
267
|
+
{
|
|
268
|
+
name: CUSTOM_METRIC_NAME,
|
|
269
|
+
value: 1,
|
|
270
|
+
attributes: {
|
|
271
|
+
monitorId: "99999999-9999-4999-8999-999999999999",
|
|
272
|
+
projectId: "88888888-8888-4888-8888-888888888888",
|
|
273
|
+
monitorName: "Some Other Monitor",
|
|
274
|
+
probeName: "Some Other Probe",
|
|
275
|
+
probeId: "77777777-7777-4777-8777-777777777777",
|
|
276
|
+
isCustomMetric: "false",
|
|
277
|
+
},
|
|
278
|
+
},
|
|
279
|
+
]);
|
|
280
|
+
|
|
281
|
+
const attributes: JSONObject = customMetricAttributes();
|
|
282
|
+
|
|
283
|
+
expect(attributes["monitorId"]).toBe(MONITOR_ID.toString());
|
|
284
|
+
expect(attributes["projectId"]).toBe(PROJECT_ID.toString());
|
|
285
|
+
expect(attributes["monitorName"]).toBe("Cursor usage ingest — daily");
|
|
286
|
+
expect(attributes["probeName"]).toBe("London Probe");
|
|
287
|
+
expect(attributes["probeId"]).toBe(PROBE_ID.toString());
|
|
288
|
+
expect(attributes["isCustomMetric"]).toBe("true");
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
test("drops a spoofed oneuptime.label.* even when the monitor has NO labels of its own", async () => {
|
|
292
|
+
/*
|
|
293
|
+
* The old guarantee came from merging the monitor's real labels last,
|
|
294
|
+
* which does nothing at all for a monitor that has none — so this case
|
|
295
|
+
* used to record the spoofed value verbatim.
|
|
296
|
+
*/
|
|
297
|
+
await captureMetrics([
|
|
298
|
+
{
|
|
299
|
+
name: CUSTOM_METRIC_NAME,
|
|
300
|
+
value: 1,
|
|
301
|
+
attributes: { "oneuptime.label.product": "spoofed" },
|
|
302
|
+
},
|
|
303
|
+
]);
|
|
304
|
+
|
|
305
|
+
expect(
|
|
306
|
+
customMetricAttributes()["oneuptime.label.product"],
|
|
307
|
+
).toBeUndefined();
|
|
308
|
+
});
|
|
309
|
+
|
|
310
|
+
test("still lets the monitor's real labels through", async () => {
|
|
311
|
+
await captureMetrics(
|
|
312
|
+
[{ name: CUSTOM_METRIC_NAME, value: 1, attributes: { q: "1" } }],
|
|
313
|
+
{ monitorLabels: [makeLabel("product:checkout")] },
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
const attributes: JSONObject = customMetricAttributes();
|
|
317
|
+
|
|
318
|
+
expect(attributes["oneuptime.label.product"]).toBe("checkout");
|
|
319
|
+
expect(attributes["q"]).toBe("1");
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
test("names every dropped key in ONE log line for the whole check", async () => {
|
|
323
|
+
/*
|
|
324
|
+
* The diagnostic is the whole reason a user can tell a refused
|
|
325
|
+
* attribute from a bug in their script. One line per check, not one per
|
|
326
|
+
* datapoint, or a script emitting 100 metrics floods the log.
|
|
327
|
+
*/
|
|
328
|
+
const warn: jest.SpyInstance<any, any> = getJestSpyOn(
|
|
329
|
+
logger,
|
|
330
|
+
"warn",
|
|
331
|
+
).mockImplementation((): void => {
|
|
332
|
+
return undefined;
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
await captureMetrics([
|
|
336
|
+
{
|
|
337
|
+
name: CUSTOM_METRIC_NAME,
|
|
338
|
+
value: 1,
|
|
339
|
+
attributes: { "service.name": "Cursor", region: "us-east-1" },
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
name: CUSTOM_METRIC_NAME,
|
|
343
|
+
value: 2,
|
|
344
|
+
attributes: { "service.name": "Cursor", "host.name": "web-01" },
|
|
345
|
+
},
|
|
346
|
+
]);
|
|
347
|
+
|
|
348
|
+
expect(warn).toHaveBeenCalledTimes(1);
|
|
349
|
+
|
|
350
|
+
const message: string = String(warn.mock.calls[0]?.[0]);
|
|
351
|
+
|
|
352
|
+
expect(message).toContain(MONITOR_ID.toString());
|
|
353
|
+
// Deduped across the two metrics, and sorted so the line is stable.
|
|
354
|
+
expect(message).toContain("host.name, service.name");
|
|
355
|
+
expect(message).not.toContain("region");
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
test("says nothing when the script writes only attributes it owns", async () => {
|
|
359
|
+
const warn: jest.SpyInstance<any, any> = getJestSpyOn(
|
|
360
|
+
logger,
|
|
361
|
+
"warn",
|
|
362
|
+
).mockImplementation((): void => {
|
|
363
|
+
return undefined;
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
await captureMetrics([
|
|
367
|
+
{
|
|
368
|
+
name: CUSTOM_METRIC_NAME,
|
|
369
|
+
value: 1,
|
|
370
|
+
attributes: { region: "us-east-1", "ai.tool": "cursor" },
|
|
371
|
+
},
|
|
372
|
+
]);
|
|
373
|
+
|
|
374
|
+
expect(warn).not.toHaveBeenCalled();
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
test("republishes attributeKeys so a dropped key is not left behind in the filter list", async () => {
|
|
378
|
+
await captureMetrics([
|
|
379
|
+
{
|
|
380
|
+
name: CUSTOM_METRIC_NAME,
|
|
381
|
+
value: 1,
|
|
382
|
+
attributes: { "service.name": "Cursor", region: "us-east-1" },
|
|
383
|
+
},
|
|
384
|
+
]);
|
|
385
|
+
|
|
386
|
+
const row: JSONObject = customMetricRow();
|
|
387
|
+
const attributes: JSONObject = row["attributes"] as JSONObject;
|
|
388
|
+
const attributeKeys: Array<string> = row[
|
|
389
|
+
"attributeKeys"
|
|
390
|
+
] as Array<string>;
|
|
391
|
+
|
|
392
|
+
expect(attributeKeys).toEqual(Object.keys(attributes).sort());
|
|
393
|
+
expect(attributeKeys).not.toContain("service.name");
|
|
394
|
+
expect(attributeKeys).toContain("region");
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
|
|
398
|
+
describe("values and limits", () => {
|
|
399
|
+
test("records numbers and booleans instead of silently dropping them", async () => {
|
|
400
|
+
await captureMetrics([
|
|
401
|
+
{
|
|
402
|
+
name: CUSTOM_METRIC_NAME,
|
|
403
|
+
value: 1,
|
|
404
|
+
attributes: {
|
|
405
|
+
seats: 42,
|
|
406
|
+
active: true,
|
|
407
|
+
suspended: false,
|
|
408
|
+
tool: "cursor",
|
|
409
|
+
},
|
|
410
|
+
},
|
|
411
|
+
]);
|
|
412
|
+
|
|
413
|
+
const attributes: JSONObject = customMetricAttributes();
|
|
414
|
+
|
|
415
|
+
expect(attributes["seats"]).toBe("42");
|
|
416
|
+
expect(attributes["active"]).toBe("true");
|
|
417
|
+
expect(attributes["suspended"]).toBe("false");
|
|
418
|
+
expect(attributes["tool"]).toBe("cursor");
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
test("caps the number of script-supplied attributes on one metric", async () => {
|
|
422
|
+
const attributes: JSONObject = {};
|
|
423
|
+
for (let i: number = 0; i < MaxCapturedMetricAttributes + 30; i++) {
|
|
424
|
+
attributes[`dimension${i}`] = "value";
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
await captureMetrics([
|
|
428
|
+
{ name: CUSTOM_METRIC_NAME, value: 1, attributes: attributes },
|
|
429
|
+
]);
|
|
430
|
+
|
|
431
|
+
const recorded: JSONObject = customMetricAttributes();
|
|
432
|
+
const scriptKeys: Array<string> = Object.keys(recorded).filter(
|
|
433
|
+
(key: string) => {
|
|
434
|
+
return key.startsWith("dimension");
|
|
435
|
+
},
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
expect(scriptKeys).toHaveLength(MaxCapturedMetricAttributes);
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
test("does not pollute Object.prototype through a dotted __proto__ key", async () => {
|
|
442
|
+
await captureMetrics([
|
|
443
|
+
{
|
|
444
|
+
name: CUSTOM_METRIC_NAME,
|
|
445
|
+
value: 1,
|
|
446
|
+
attributes: {
|
|
447
|
+
"__proto__.polluted": "pwned",
|
|
448
|
+
region: "us-east-1",
|
|
449
|
+
},
|
|
450
|
+
},
|
|
451
|
+
]);
|
|
452
|
+
|
|
453
|
+
expect(({} as JSONObject)["polluted"]).toBeUndefined();
|
|
454
|
+
expect(customMetricAttributes()["region"]).toBe("us-east-1");
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
test("the guard applies to synthetic monitor captured metrics too", async () => {
|
|
458
|
+
/*
|
|
459
|
+
* Probes are separately deployed processes. The synthetic runtime caps
|
|
460
|
+
* and coerces in-sandbox, but the server must not take a probe's word
|
|
461
|
+
* for what a script was allowed to write.
|
|
462
|
+
*/
|
|
463
|
+
const response: ProbeMonitorResponse = {
|
|
464
|
+
projectId: PROJECT_ID,
|
|
465
|
+
monitorId: MONITOR_ID,
|
|
466
|
+
monitorStepId: ObjectID.generate(),
|
|
467
|
+
probeId: PROBE_ID,
|
|
468
|
+
failureCause: "",
|
|
469
|
+
monitoredAt: new Date("2026-08-10T12:00:00.000Z"),
|
|
470
|
+
syntheticMonitorResponse: [
|
|
471
|
+
{
|
|
472
|
+
logMessages: [],
|
|
473
|
+
scriptError: undefined,
|
|
474
|
+
result: undefined,
|
|
475
|
+
executionTimeInMS: 10,
|
|
476
|
+
browserType: "Chromium",
|
|
477
|
+
screenSizeType: "Desktop",
|
|
478
|
+
capturedMetrics: [
|
|
479
|
+
{
|
|
480
|
+
name: CUSTOM_METRIC_NAME,
|
|
481
|
+
value: 5,
|
|
482
|
+
attributes: { "host.name": "web-01", page: "checkout" },
|
|
483
|
+
},
|
|
484
|
+
],
|
|
485
|
+
},
|
|
486
|
+
],
|
|
487
|
+
} as unknown as ProbeMonitorResponse;
|
|
488
|
+
|
|
489
|
+
await MonitorMetricUtil.saveMonitorMetrics({
|
|
490
|
+
monitorId: MONITOR_ID,
|
|
491
|
+
projectId: PROJECT_ID,
|
|
492
|
+
dataToProcess: response,
|
|
493
|
+
monitorName: "Checkout journey",
|
|
494
|
+
probeName: "London Probe",
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
const attributes: JSONObject = customMetricAttributes();
|
|
498
|
+
|
|
499
|
+
expect(attributes["host.name"]).toBeUndefined();
|
|
500
|
+
expect(attributes["page"]).toBe("checkout");
|
|
501
|
+
});
|
|
502
|
+
});
|
|
503
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import MonitorTemplateUtil from "../../../../Server/Utils/Monitor/MonitorTemplateUtil";
|
|
2
|
+
import { JSONObject } from "../../../../Types/JSON";
|
|
3
|
+
import MonitorType from "../../../../Types/Monitor/MonitorType";
|
|
4
|
+
import ProbeMonitorResponse from "../../../../Types/Probe/ProbeMonitorResponse";
|
|
5
|
+
import ObjectID from "../../../../Types/ObjectID";
|
|
6
|
+
import { afterEach, describe, expect, test } from "@jest/globals";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* A grouped metric monitor renders its incident/alert title per series, and
|
|
10
|
+
* the series' labels are folded onto the template storage map so
|
|
11
|
+
* `{{host.name}}` resolves as a nested path. The fold therefore walks
|
|
12
|
+
* attacker-adjacent input: series label keys are whatever attribute names the
|
|
13
|
+
* emitting telemetry chose, and for a custom code or synthetic monitor a
|
|
14
|
+
* script picks them outright via `oneuptime.captureMetric()`.
|
|
15
|
+
*
|
|
16
|
+
* A key of `__proto__.polluted` used to aim that walk at Object.prototype —
|
|
17
|
+
* `storageMap["__proto__"]` is truthy, an object and not an Array, so the
|
|
18
|
+
* "reset to a fresh object" branch was skipped and the final assignment landed
|
|
19
|
+
* on the prototype itself. This runs in the shared Workers process that
|
|
20
|
+
* renders every project's templates, so one series label polluted every object
|
|
21
|
+
* in it.
|
|
22
|
+
*/
|
|
23
|
+
describe("MonitorTemplateUtil series label fold", () => {
|
|
24
|
+
const monitorId: ObjectID = new ObjectID(
|
|
25
|
+
"22222222-2222-4222-8222-222222222222",
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
function buildStorageMap(seriesLabels: JSONObject): JSONObject {
|
|
29
|
+
return MonitorTemplateUtil.buildTemplateStorageMap({
|
|
30
|
+
monitorType: MonitorType.Metrics,
|
|
31
|
+
dataToProcess: {
|
|
32
|
+
monitorId: monitorId,
|
|
33
|
+
projectId: new ObjectID("11111111-1111-4111-8111-111111111111"),
|
|
34
|
+
} as unknown as ProbeMonitorResponse,
|
|
35
|
+
seriesLabels: seriesLabels,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
afterEach(() => {
|
|
40
|
+
// Never leave a polluted prototype behind for the rest of the suite.
|
|
41
|
+
delete (Object.prototype as unknown as JSONObject)["polluted"];
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("does not pollute Object.prototype through a __proto__ segment", () => {
|
|
45
|
+
buildStorageMap({ "__proto__.polluted": "pwned" });
|
|
46
|
+
|
|
47
|
+
expect(({} as JSONObject)["polluted"]).toBeUndefined();
|
|
48
|
+
expect(
|
|
49
|
+
(Object.prototype as unknown as JSONObject)["polluted"],
|
|
50
|
+
).toBeUndefined();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("does not pollute Object.prototype through a constructor.prototype segment", () => {
|
|
54
|
+
buildStorageMap({ "constructor.prototype.polluted": "pwned" });
|
|
55
|
+
|
|
56
|
+
expect(({} as JSONObject)["polluted"]).toBeUndefined();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("does not pollute through a __proto__ segment buried mid-path", () => {
|
|
60
|
+
buildStorageMap({ "host.__proto__.polluted": "pwned" });
|
|
61
|
+
|
|
62
|
+
expect(({} as JSONObject)["polluted"]).toBeUndefined();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("still exposes a refused label under seriesLabels, so nothing is lost", () => {
|
|
66
|
+
const storageMap: JSONObject = buildStorageMap({
|
|
67
|
+
"__proto__.polluted": "pwned",
|
|
68
|
+
"host.name": "web-01",
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
const seriesLabels: JSONObject = storageMap["seriesLabels"] as JSONObject;
|
|
72
|
+
|
|
73
|
+
expect(seriesLabels["__proto__.polluted"]).toBe("pwned");
|
|
74
|
+
expect(seriesLabels["host.name"]).toBe("web-01");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("still folds ordinary dotted labels into nested paths", () => {
|
|
78
|
+
const storageMap: JSONObject = buildStorageMap({
|
|
79
|
+
"host.name": "web-01",
|
|
80
|
+
"k8s.pod.name": "checkout-abc",
|
|
81
|
+
region: "us-east-1",
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
expect((storageMap["host"] as JSONObject)["name"]).toBe("web-01");
|
|
85
|
+
expect(
|
|
86
|
+
((storageMap["k8s"] as JSONObject)["pod"] as JSONObject)["name"],
|
|
87
|
+
).toBe("checkout-abc");
|
|
88
|
+
expect(storageMap["region"]).toBe("us-east-1");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test("renders a template against a folded label, with the refused one inert", () => {
|
|
92
|
+
const storageMap: JSONObject = buildStorageMap({
|
|
93
|
+
"host.name": "web-01",
|
|
94
|
+
"__proto__.polluted": "pwned",
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
expect(
|
|
98
|
+
MonitorTemplateUtil.processTemplateString({
|
|
99
|
+
value: "Host {{host.name}} is down",
|
|
100
|
+
storageMap: storageMap,
|
|
101
|
+
}),
|
|
102
|
+
).toBe("Host web-01 is down");
|
|
103
|
+
|
|
104
|
+
expect(({} as JSONObject)["polluted"]).toBeUndefined();
|
|
105
|
+
});
|
|
106
|
+
});
|
|
@@ -175,7 +175,7 @@ describe("NetworkDeviceWalkUtil — the lastWalkLog baseline write", () => {
|
|
|
175
175
|
* ports), and a baseline that shrank with it would compute rates for the
|
|
176
176
|
* pruned ports against nothing on the next poll.
|
|
177
177
|
*/
|
|
178
|
-
test("persists a deep JSON snapshot of the
|
|
178
|
+
test("persists a deep JSON snapshot of the INTERFACES, stamped with the server receipt time", async () => {
|
|
179
179
|
mockWalkPipeline();
|
|
180
180
|
const snmpResponse: SnmpMonitorResponse = buildSnmpResponse();
|
|
181
181
|
|
|
@@ -184,14 +184,43 @@ describe("NetworkDeviceWalkUtil — the lastWalkLog baseline write", () => {
|
|
|
184
184
|
const walkLog: JSONObject = (hookFreeCallArgs()["data"] as JSONObject)[
|
|
185
185
|
"lastWalkLog"
|
|
186
186
|
] as JSONObject;
|
|
187
|
+
const storedResponse: JSONObject = walkLog["snmpResponse"] as JSONObject;
|
|
187
188
|
|
|
188
|
-
expect(
|
|
189
|
-
JSON.parse(JSON.stringify(snmpResponse)),
|
|
189
|
+
expect(storedResponse["interfaces"]).toEqual(
|
|
190
|
+
JSON.parse(JSON.stringify(snmpResponse.interfaces)),
|
|
190
191
|
);
|
|
191
|
-
expect(
|
|
192
|
+
expect(storedResponse["interfaces"]).not.toBe(snmpResponse.interfaces);
|
|
192
193
|
expect(walkLog["monitoredAt"]).toEqual(NOW);
|
|
193
194
|
});
|
|
194
195
|
|
|
196
|
+
/*
|
|
197
|
+
* The column stores ONLY what reads it back.
|
|
198
|
+
*
|
|
199
|
+
* SnmpInterfaceRateUtil is the single reader and it touches
|
|
200
|
+
* snmpResponse.interfaces and nothing else, so every other field was dead
|
|
201
|
+
* weight in a jsonb column rewritten on every poll of every device. That
|
|
202
|
+
* became worth fixing when OID Collection Templates made long health-OID
|
|
203
|
+
* lists normal: oidResponses is the field that grows, and storing it here
|
|
204
|
+
* would have added tens of KB per device per poll of TOAST churn on the
|
|
205
|
+
* product's hottest table, for data nothing ever reads.
|
|
206
|
+
*
|
|
207
|
+
* If a future reader needs another field, add it here deliberately — do
|
|
208
|
+
* not go back to storing the whole response.
|
|
209
|
+
*/
|
|
210
|
+
test("stores only the interfaces, not the rest of the walk", async () => {
|
|
211
|
+
mockWalkPipeline();
|
|
212
|
+
|
|
213
|
+
await runWalk(buildSnmpResponse());
|
|
214
|
+
|
|
215
|
+
const walkLog: JSONObject = (hookFreeCallArgs()["data"] as JSONObject)[
|
|
216
|
+
"lastWalkLog"
|
|
217
|
+
] as JSONObject;
|
|
218
|
+
|
|
219
|
+
expect(Object.keys(walkLog["snmpResponse"] as JSONObject)).toEqual([
|
|
220
|
+
"interfaces",
|
|
221
|
+
]);
|
|
222
|
+
});
|
|
223
|
+
|
|
195
224
|
/*
|
|
196
225
|
* The guard rail for everything above. Moving a column into this payload
|
|
197
226
|
* silently stops the hooks that own it: site-assignment rules
|
|
@@ -248,11 +248,21 @@ describe("NetworkDeviceWalkUtil.processWalkResult — happy path", () => {
|
|
|
248
248
|
const lastWalkLog: JSONObject = (updateArgs["data"] as JSONObject)[
|
|
249
249
|
"lastWalkLog"
|
|
250
250
|
] as JSONObject;
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
251
|
+
const storedResponse: JSONObject = lastWalkLog[
|
|
252
|
+
"snmpResponse"
|
|
253
|
+
] as JSONObject;
|
|
254
|
+
|
|
255
|
+
/*
|
|
256
|
+
* A plain-JSON snapshot of the INTERFACES, not the live object and not
|
|
257
|
+
* the whole walk. SnmpInterfaceRateUtil is the only reader of this column
|
|
258
|
+
* and only ever looks at snmpResponse.interfaces; storing the rest was
|
|
259
|
+
* dead weight rewritten on every poll of every device.
|
|
260
|
+
*/
|
|
261
|
+
expect(storedResponse["interfaces"]).toEqual(
|
|
262
|
+
JSON.parse(JSON.stringify(snmpResponse.interfaces)),
|
|
254
263
|
);
|
|
255
|
-
expect(
|
|
264
|
+
expect(storedResponse["interfaces"]).not.toBe(snmpResponse.interfaces);
|
|
265
|
+
expect(Object.keys(storedResponse)).toEqual(["interfaces"]);
|
|
256
266
|
expect(lastWalkLog["monitoredAt"]).toEqual(NOW);
|
|
257
267
|
});
|
|
258
268
|
|