@oneuptime/common 11.6.0 → 11.6.2
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/AnalyticsBaseModel/AnalyticsBaseModel.ts +41 -24
- package/Models/AnalyticsModels/Index.ts +4 -0
- package/Models/AnalyticsModels/KubernetesCostAllocation.ts +842 -0
- package/Models/AnalyticsModels/MetricBaselineHourly.ts +2 -0
- package/Models/AnalyticsModels/MetricItemAggMV1m.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +5 -2
- package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +5 -2
- package/Models/AnalyticsModels/NetworkFlow.ts +54 -0
- package/Models/AnalyticsModels/SloHistory.ts +240 -0
- package/Models/DatabaseModels/Index.ts +20 -0
- package/Models/DatabaseModels/NetworkDevice.ts +453 -6
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +7 -6
- package/Models/DatabaseModels/NetworkEndpoint.ts +753 -0
- package/Models/DatabaseModels/NetworkSite.ts +1155 -0
- package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +517 -0
- package/Models/DatabaseModels/NetworkSiteLink.ts +611 -0
- package/Models/DatabaseModels/NetworkSiteStatusTimeline.ts +520 -0
- package/Models/DatabaseModels/NetworkSiteType.ts +499 -0
- package/Models/DatabaseModels/ServiceLevelObjective.ts +1106 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +762 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.ts +444 -0
- package/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.ts +443 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.ts +359 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.ts +48 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.ts +65 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.ts +88 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.ts +391 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
- package/Server/Services/AnalyticsDatabaseService.ts +38 -10
- package/Server/Services/Index.ts +24 -0
- package/Server/Services/KubernetesCostAllocationService.ts +14 -0
- package/Server/Services/MetricService.ts +21 -2
- package/Server/Services/MonitorService.ts +22 -0
- package/Server/Services/NetworkDeviceService.ts +438 -2
- package/Server/Services/NetworkEndpointService.ts +414 -0
- package/Server/Services/NetworkSiteAssignmentRuleService.ts +98 -0
- package/Server/Services/NetworkSiteLinkService.ts +10 -0
- package/Server/Services/NetworkSiteService.ts +1254 -0
- package/Server/Services/NetworkSiteStatusTimelineService.ts +10 -0
- package/Server/Services/NetworkSiteTypeService.ts +10 -0
- package/Server/Services/ProjectService.ts +122 -2
- package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +457 -0
- package/Server/Services/ServiceLevelObjectiveOwnerTeamService.ts +10 -0
- package/Server/Services/ServiceLevelObjectiveOwnerUserService.ts +10 -0
- package/Server/Services/ServiceLevelObjectiveService.ts +677 -0
- package/Server/Services/SloHistoryService.ts +101 -0
- package/Server/Services/UserNotificationSettingService.ts +37 -0
- package/Server/Types/AnalyticsDatabase/AggregateBy.ts +9 -0
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +15 -0
- package/Server/Utils/AnalyticsDatabase/Statement.ts +39 -3
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +128 -52
- package/Server/Utils/Memory.ts +9 -1
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +190 -12
- package/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
- package/Server/Utils/Monitor/DnsResolutionCache.ts +129 -0
- package/Server/Utils/Monitor/MonitorResource.ts +4 -30
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +214 -39
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +343 -0
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +251 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +176 -142
- package/Server/Utils/Monitor/OuiLookupUtil.ts +49 -0
- package/Server/Utils/Monitor/SnmpInterfaceRateUtil.ts +17 -13
- package/Server/Utils/WhatsAppTemplateUtil.ts +7 -3
- package/Tests/Models/AnalyticsModels/AnalyticsBaseModel.test.ts +122 -0
- package/Tests/Models/AnalyticsModels/KubernetesCostAllocation.test.ts +135 -0
- package/Tests/Models/NetworkSiteHierarchy.test.ts +134 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +239 -0
- package/Tests/Server/Services/KubernetesCostAllocationAggregate.test.ts +338 -0
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +142 -0
- package/Tests/Server/Services/NetworkDeviceSiteAssignment.test.ts +484 -0
- package/Tests/Server/Services/NetworkEndpointServiceUpsert.test.ts +686 -0
- package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +185 -0
- package/Tests/Server/Services/NetworkSiteService.test.ts +1354 -0
- package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +1313 -0
- package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +1988 -0
- package/Tests/Server/Utils/AnalyticsDatabase/ClusterAwareSchema.test.ts +164 -3
- package/Tests/Server/Utils/AnalyticsDatabase/Statement.test.ts +22 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +503 -0
- package/Tests/Server/Utils/Encryption.test.ts +70 -0
- package/Tests/Server/Utils/FileAttachmentMarkdownUtil.test.ts +225 -0
- package/Tests/Server/Utils/JsonWebToken.test.ts +175 -0
- package/Tests/Server/Utils/LocalFile.test.ts +258 -0
- package/Tests/Server/Utils/Memory.test.ts +213 -0
- package/Tests/Server/Utils/Monitor/Criteria/LogMonitorCriteria.test.ts +30 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +385 -0
- package/Tests/Server/Utils/Monitor/DnsResolutionCache.test.ts +194 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +155 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +600 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +151 -124
- package/Tests/Server/Utils/Monitor/SnmpInterfaceRateUtil.test.ts +496 -0
- package/Tests/Server/Utils/MonitorCriteriaDataExtractor.test.ts +175 -0
- package/Tests/Server/Utils/MonitorCriteriaMessageFormatter.test.ts +282 -0
- package/Tests/Server/Utils/OuiLookupUtil.test.ts +59 -0
- package/Tests/Server/Utils/SeriesResourceLabels.test.ts +117 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +370 -0
- package/Tests/Server/Utils/Stream.test.ts +87 -0
- package/Tests/Server/Utils/ValidateGlobalProviderProjectTeams.test.ts +221 -0
- package/Tests/Server/Utils/WhatsAppTemplateUtil.test.ts +199 -0
- package/Tests/Types/Database/CompareOperatorWireSerialization.test.ts +33 -0
- package/Tests/Types/Email.test.ts +198 -0
- package/Tests/Types/HashCode.test.ts +41 -0
- package/Tests/Types/Kubernetes/KubernetesObjectParser.test.ts +177 -0
- package/Tests/Types/Log/LogQueryParser.test.ts +186 -0
- package/Tests/Types/Log/LogQueryToFilter.test.ts +111 -0
- package/Tests/Types/Monitor/MonitorStepNetworkDeviceMonitor.test.ts +141 -1
- package/Tests/Types/Monitor/MonitorType.test.ts +59 -1
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +97 -0
- package/Tests/Types/Monitor/SnmpEndpointDiscovery.test.ts +151 -0
- package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +110 -6
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +129 -0
- package/Tests/Types/SerializableObjectDictionary.test.ts +166 -0
- package/Tests/Types/Time/RangeStartAndEndDateTime.test.ts +98 -0
- package/Tests/Types/WebsiteRequest.test.ts +230 -0
- package/Tests/UI/Components/EntityFilterRoundTrip.test.tsx +103 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableUrlState.test.tsx +612 -0
- package/Tests/UI/Components/ModelTable/FilterDataToQuery.test.ts +275 -0
- package/Tests/UI/Utils/LogExport.test.ts +159 -0
- package/Tests/UI/Utils/Navigation.test.ts +183 -0
- package/Tests/UI/Utils/TableFilterUrlState.test.ts +539 -0
- package/Tests/UI/Utils/TableViewUrlState.test.ts +272 -0
- package/Tests/Utils/Base64.test.ts +51 -0
- package/Tests/Utils/Boolean.test.ts +76 -0
- package/Tests/Utils/Crypto.test.ts +48 -0
- package/Tests/Utils/Dashboard/DashboardSloComponent.test.ts +259 -0
- package/Tests/Utils/Dashboard/ModelQueryVariableInterpolation.test.ts +162 -0
- package/Tests/Utils/Dashboard/VariableInterpolation.test.ts +197 -0
- package/Tests/Utils/Enum.test.ts +54 -0
- package/Tests/Utils/IpCanonicalUtil.test.ts +85 -0
- package/Tests/Utils/Metrics/MetricSeriesFingerprint.test.ts +160 -0
- package/Tests/Utils/Monitor/EndpointAttachmentUtil.test.ts +836 -0
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +218 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +447 -0
- package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +440 -0
- package/Tests/Utils/NetworkSite/MaterializedPathUtil.test.ts +205 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +221 -0
- package/Tests/Utils/NetworkSite/SiteUptimeUtil.test.ts +283 -0
- package/Tests/Utils/ObjectUtil.test.ts +30 -0
- package/Tests/Utils/Slo/SloStatusColor.test.ts +89 -0
- package/Tests/Utils/Slo/SloUtil.test.ts +1980 -0
- package/Tests/Utils/Slo/SloWidgetFormat.test.ts +605 -0
- package/Tests/Utils/TechStack.test.ts +50 -0
- package/Tests/Utils/Traces/CriticalPath.test.ts +178 -0
- package/Tests/Utils/ValueFormatter.test.ts +305 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +10 -0
- package/Types/AnalyticsDatabase/TableColumn.ts +23 -0
- package/Types/BaseDatabase/EqualTo.ts +9 -1
- package/Types/BaseDatabase/EqualToOrNull.ts +9 -1
- package/Types/BaseDatabase/NotEqual.ts +9 -1
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/ComponentArgument.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardSloComponent.ts +42 -0
- package/Types/Dashboard/DashboardTemplates.ts +214 -0
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/Kubernetes/KubernetesCostIngest.ts +79 -0
- package/Types/Monitor/CriteriaFilter.ts +9 -0
- package/Types/Monitor/MonitorStep.ts +5 -8
- package/Types/Monitor/MonitorStepNetworkDeviceMonitor.ts +27 -5
- package/Types/Monitor/MonitorType.ts +15 -5
- package/Types/Monitor/SnmpMonitor/ArpEntry.ts +14 -0
- package/Types/Monitor/SnmpMonitor/FdbEntry.ts +18 -0
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +10 -3
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +31 -5
- package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +12 -0
- package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +231 -3
- package/Types/NetworkSite/DefaultNetworkSiteType.ts +20 -0
- package/Types/NotificationSetting/NotificationSettingEventType.ts +4 -0
- package/Types/Permission.ts +449 -0
- package/Types/ServiceLevelObjective/SliType.ts +6 -0
- package/Types/ServiceLevelObjective/SloMultiMonitorMode.ts +6 -0
- package/Types/ServiceLevelObjective/SloStatus.ts +9 -0
- package/Types/ServiceLevelObjective/SloWindowType.ts +6 -0
- package/Types/Telemetry/ServiceType.ts +1 -0
- package/UI/Components/Filters/EntityFilter.tsx +16 -0
- package/UI/Components/Filters/FilterViewer.tsx +22 -5
- package/UI/Components/List/List.tsx +8 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +309 -106
- package/UI/Components/ModelTable/FilterDataToQuery.ts +172 -0
- package/UI/Components/Navbar/NavBar.tsx +16 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +3 -3
- package/UI/Utils/Navigation.ts +10 -0
- package/UI/Utils/TableFilterUrlState.ts +204 -17
- package/UI/Utils/TableViewUrlState.ts +165 -0
- package/Utils/Dashboard/Components/DashboardSloComponent.ts +114 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/IpCanonicalUtil.ts +134 -0
- package/Utils/Monitor/EndpointAttachmentUtil.ts +508 -0
- package/Utils/Monitor/NetworkTopologyUtil.ts +157 -5
- package/Utils/NetworkSite/CidrMatchUtil.ts +296 -0
- package/Utils/NetworkSite/MaterializedPathUtil.ts +115 -0
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +97 -0
- package/Utils/NetworkSite/SiteUptimeUtil.ts +111 -0
- package/Utils/Slo/SloStatusColor.ts +54 -0
- package/Utils/Slo/SloUtil.ts +637 -0
- package/Utils/Slo/SloWidgetFormat.ts +383 -0
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js +25 -20
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Index.js +4 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js +713 -0
- package/build/dist/Models/AnalyticsModels/KubernetesCostAllocation.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js +2 -0
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +5 -2
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js +44 -0
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/SloHistory.js +215 -0
- package/build/dist/Models/AnalyticsModels/SloHistory.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Index.js +20 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +458 -6
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +0 -6
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkEndpoint.js +779 -0
- package/build/dist/Models/DatabaseModels/NetworkEndpoint.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js +1180 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +534 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteLink.js +629 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteLink.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js +538 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteStatusTimeline.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +522 -0
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js +1124 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjective.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +769 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js +460 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js +459 -0
- package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerUser.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js +130 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784757142154-AddNetworkSiteHierarchyAndEndpoints.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js +31 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784897317860-AddNetworkSiteAlerting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js +36 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784970388777-AddNetworkDevicePollingColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js +49 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784986826214-AddNetworkSiteTypeTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js +140 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784987015619-AddServiceLevelObjective.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +32 -7
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +24 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/KubernetesCostAllocationService.js +12 -0
- package/build/dist/Server/Services/KubernetesCostAllocationService.js.map +1 -0
- package/build/dist/Server/Services/MetricService.js +21 -3
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +19 -0
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +351 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkEndpointService.js +319 -0
- package/build/dist/Server/Services/NetworkEndpointService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +90 -0
- package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteLinkService.js +9 -0
- package/build/dist/Server/Services/NetworkSiteLinkService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteService.js +1038 -0
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js +9 -0
- package/build/dist/Server/Services/NetworkSiteStatusTimelineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js +9 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -0
- package/build/dist/Server/Services/ProjectService.js +98 -2
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +358 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js +9 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js +9 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js +582 -0
- package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -0
- package/build/dist/Server/Services/SloHistoryService.js +77 -0
- package/build/dist/Server/Services/SloHistoryService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +20 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +9 -0
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +15 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js +31 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/Statement.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +105 -52
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Memory.js +9 -1
- package/build/dist/Server/Utils/Memory.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +132 -10
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Data/OuiVendors.json +6920 -0
- package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js +77 -0
- package/build/dist/Server/Utils/Monitor/DnsResolutionCache.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +21 -41
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +152 -40
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +262 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +152 -120
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js +44 -0
- package/build/dist/Server/Utils/Monitor/OuiLookupUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js +10 -10
- package/build/dist/Server/Utils/Monitor/SnmpInterfaceRateUtil.js.map +1 -1
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js +5 -0
- package/build/dist/Server/Utils/WhatsAppTemplateUtil.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +10 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/TableColumn.js +7 -0
- package/build/dist/Types/AnalyticsDatabase/TableColumn.js.map +1 -1
- package/build/dist/Types/BaseDatabase/EqualTo.js +9 -1
- package/build/dist/Types/BaseDatabase/EqualTo.js.map +1 -1
- package/build/dist/Types/BaseDatabase/EqualToOrNull.js +9 -1
- package/build/dist/Types/BaseDatabase/EqualToOrNull.js.map +1 -1
- package/build/dist/Types/BaseDatabase/NotEqual.js +9 -1
- package/build/dist/Types/BaseDatabase/NotEqual.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 +1 -0
- package/build/dist/Types/Dashboard/DashboardComponents/ComponentArgument.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js +23 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardSloComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +205 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js +21 -0
- package/build/dist/Types/Kubernetes/KubernetesCostIngest.js.map +1 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js +1 -0
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +5 -5
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js +8 -0
- package/build/dist/Types/Monitor/MonitorStepNetworkDeviceMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +15 -5
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/ArpEntry.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/FdbEntry.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +9 -3
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +217 -3
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.js +21 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteType.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/Permission.js +409 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ServiceLevelObjective/SliType.js +7 -0
- package/build/dist/Types/ServiceLevelObjective/SliType.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js +7 -0
- package/build/dist/Types/ServiceLevelObjective/SloMultiMonitorMode.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloStatus.js +10 -0
- package/build/dist/Types/ServiceLevelObjective/SloStatus.js.map +1 -0
- package/build/dist/Types/ServiceLevelObjective/SloWindowType.js +7 -0
- package/build/dist/Types/ServiceLevelObjective/SloWindowType.js.map +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js +1 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Filters/EntityFilter.js +15 -0
- package/build/dist/UI/Components/Filters/EntityFilter.js.map +1 -1
- package/build/dist/UI/Components/Filters/FilterViewer.js +19 -4
- package/build/dist/UI/Components/Filters/FilterViewer.js.map +1 -1
- package/build/dist/UI/Components/List/List.js +1 -1
- package/build/dist/UI/Components/List/List.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +235 -89
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js +96 -0
- package/build/dist/UI/Components/ModelTable/FilterDataToQuery.js.map +1 -0
- package/build/dist/UI/Components/Navbar/NavBar.js +14 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +3 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +9 -0
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/TableFilterUrlState.js +159 -15
- package/build/dist/UI/Utils/TableFilterUrlState.js.map +1 -1
- package/build/dist/UI/Utils/TableViewUrlState.js +103 -0
- package/build/dist/UI/Utils/TableViewUrlState.js.map +1 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.js +93 -0
- package/build/dist/Utils/Dashboard/Components/DashboardSloComponent.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/IpCanonicalUtil.js +110 -0
- package/build/dist/Utils/IpCanonicalUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js +311 -0
- package/build/dist/Utils/Monitor/EndpointAttachmentUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +98 -5
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +222 -0
- package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js +89 -0
- package/build/dist/Utils/NetworkSite/MaterializedPathUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +60 -0
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -0
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js +76 -0
- package/build/dist/Utils/NetworkSite/SiteUptimeUtil.js.map +1 -0
- package/build/dist/Utils/Slo/SloStatusColor.js +18 -0
- package/build/dist/Utils/Slo/SloStatusColor.js.map +1 -0
- package/build/dist/Utils/Slo/SloUtil.js +393 -0
- package/build/dist/Utils/Slo/SloUtil.js.map +1 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js +174 -0
- package/build/dist/Utils/Slo/SloWidgetFormat.js.map +1 -0
- package/package.json +2 -2
- package/Types/Dashboard/DashboardComponents/Index.ts +0 -7
- package/build/dist/Types/Dashboard/DashboardComponents/Index.js +0 -8
- package/build/dist/Types/Dashboard/DashboardComponents/Index.js.map +0 -1
|
@@ -1,68 +1,60 @@
|
|
|
1
|
-
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
2
1
|
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
3
2
|
import NetworkInterface from "../../../Models/DatabaseModels/NetworkInterface";
|
|
4
3
|
import NetworkDeviceService from "../../Services/NetworkDeviceService";
|
|
4
|
+
import NetworkEndpointService from "../../Services/NetworkEndpointService";
|
|
5
5
|
import NetworkInterfaceService from "../../Services/NetworkInterfaceService";
|
|
6
6
|
import LIMIT_MAX from "../../../Types/Database/LimitMax";
|
|
7
|
-
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
8
7
|
import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
|
|
8
|
+
import SnmpMonitorResponse from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
9
9
|
import LldpNeighbor from "../../../Types/Monitor/SnmpMonitor/LldpNeighbor";
|
|
10
10
|
import CdpNeighbor from "../../../Types/Monitor/SnmpMonitor/CdpNeighbor";
|
|
11
|
+
import ArpEntry from "../../../Types/Monitor/SnmpMonitor/ArpEntry";
|
|
12
|
+
import FdbEntry from "../../../Types/Monitor/SnmpMonitor/FdbEntry";
|
|
13
|
+
import EndpointAttachmentUtil, {
|
|
14
|
+
EndpointAttachmentResult,
|
|
15
|
+
} from "../../../Utils/Monitor/EndpointAttachmentUtil";
|
|
11
16
|
import SnmpSystemInfo from "../../../Types/Monitor/SnmpMonitor/SnmpSystemInfo";
|
|
12
17
|
import SnmpEntityInfo from "../../../Types/Monitor/SnmpMonitor/SnmpEntityInfo";
|
|
13
18
|
import SnmpVendorTemplateUtil from "../../../Types/Monitor/SnmpMonitor/SnmpVendorTemplate";
|
|
14
|
-
import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
|
|
15
19
|
import ObjectID from "../../../Types/ObjectID";
|
|
16
20
|
import OneUptimeDate from "../../../Types/Date";
|
|
17
21
|
import logger from "../Logger";
|
|
18
22
|
|
|
19
23
|
/*
|
|
20
24
|
* Keeps the NetworkDevice / NetworkInterface inventory in sync with each
|
|
21
|
-
*
|
|
25
|
+
* device walk, then prunes the in-flight response down to MONITORED
|
|
22
26
|
* interfaces so criteria and metrics only consider ports the user cares
|
|
23
27
|
* about. Inventory rows always reflect every walked interface; the
|
|
24
28
|
* isMonitored flag is user-owned and never overwritten here.
|
|
29
|
+
*
|
|
30
|
+
* Called from the device polling pipeline (NetworkDeviceWalkUtil): the
|
|
31
|
+
* device's assigned probe walks it on the device's own schedule, so this
|
|
32
|
+
* runs for every registered device — no Monitor required.
|
|
25
33
|
*/
|
|
26
34
|
export default class NetworkInventoryUtil {
|
|
27
35
|
public static async updateFromWalk(data: {
|
|
28
|
-
|
|
29
|
-
|
|
36
|
+
projectId: ObjectID;
|
|
37
|
+
deviceId: ObjectID;
|
|
38
|
+
snmpResponse: SnmpMonitorResponse | undefined;
|
|
39
|
+
isOnline: boolean | undefined;
|
|
30
40
|
}): Promise<void> {
|
|
31
|
-
const
|
|
32
|
-
data.monitor.monitorSteps?.data?.monitorStepsInstanceArray?.find(
|
|
33
|
-
(monitorStep: MonitorStep) => {
|
|
34
|
-
return (
|
|
35
|
-
monitorStep.id.toString() ===
|
|
36
|
-
data.dataToProcess.monitorStepId.toString()
|
|
37
|
-
);
|
|
38
|
-
},
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
const deviceIdAsString: string | undefined =
|
|
42
|
-
step?.data?.networkDeviceMonitor?.networkDeviceId;
|
|
43
|
-
|
|
44
|
-
if (!deviceIdAsString || !data.monitor.projectId) {
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const deviceId: ObjectID = new ObjectID(deviceIdAsString);
|
|
41
|
+
const deviceId: ObjectID = data.deviceId;
|
|
49
42
|
|
|
50
43
|
/*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
-
* this guard a crafted step could point at another project's device and
|
|
56
|
-
* overwrite its inventory (or spawn interfaces under it).
|
|
44
|
+
* Confirm the device belongs to the given project before writing
|
|
45
|
+
* anything with isRoot — the walk pipeline resolves projectId from the
|
|
46
|
+
* device row itself, but keep the guard so no future caller can cross
|
|
47
|
+
* project boundaries.
|
|
57
48
|
*/
|
|
58
49
|
const ownedDevice: NetworkDevice | null =
|
|
59
50
|
await NetworkDeviceService.findOneBy({
|
|
60
51
|
query: {
|
|
61
52
|
_id: deviceId,
|
|
62
|
-
projectId: data.
|
|
53
|
+
projectId: data.projectId,
|
|
63
54
|
},
|
|
64
55
|
select: {
|
|
65
56
|
_id: true,
|
|
57
|
+
siteId: true,
|
|
66
58
|
},
|
|
67
59
|
props: {
|
|
68
60
|
isRoot: true,
|
|
@@ -74,15 +66,19 @@ export default class NetworkInventoryUtil {
|
|
|
74
66
|
}
|
|
75
67
|
|
|
76
68
|
const walkedInterfaces: Array<SnmpInterface> =
|
|
77
|
-
data.
|
|
69
|
+
data.snmpResponse?.interfaces || [];
|
|
78
70
|
const systemInfo: SnmpSystemInfo | undefined =
|
|
79
|
-
data.
|
|
71
|
+
data.snmpResponse?.systemInfo;
|
|
80
72
|
const entityInfo: SnmpEntityInfo | undefined =
|
|
81
|
-
data.
|
|
73
|
+
data.snmpResponse?.entityInfo;
|
|
82
74
|
const lldpNeighbors: Array<LldpNeighbor> | undefined =
|
|
83
|
-
data.
|
|
75
|
+
data.snmpResponse?.lldpNeighbors;
|
|
84
76
|
const cdpNeighbors: Array<CdpNeighbor> | undefined =
|
|
85
|
-
data.
|
|
77
|
+
data.snmpResponse?.cdpNeighbors;
|
|
78
|
+
const arpEntries: Array<ArpEntry> | undefined =
|
|
79
|
+
data.snmpResponse?.arpEntries;
|
|
80
|
+
const fdbEntries: Array<FdbEntry> | undefined =
|
|
81
|
+
data.snmpResponse?.fdbEntries;
|
|
86
82
|
|
|
87
83
|
const now: Date = OneUptimeDate.getCurrentDate();
|
|
88
84
|
|
|
@@ -92,9 +88,9 @@ export default class NetworkInventoryUtil {
|
|
|
92
88
|
* derive up/down from its freshness, so bumping it on a failed poll
|
|
93
89
|
* would paint an unreachable device green. A poll where the probe could
|
|
94
90
|
* not reach the device reports isOnline === false; treat anything else
|
|
95
|
-
* (reachable, or a
|
|
91
|
+
* (reachable, or a walk that reports no reachability) as seen.
|
|
96
92
|
*/
|
|
97
|
-
const isDeviceReachable: boolean = data.
|
|
93
|
+
const isDeviceReachable: boolean = data.isOnline !== false;
|
|
98
94
|
|
|
99
95
|
try {
|
|
100
96
|
// --- Device enrichment + cached counts ---
|
|
@@ -196,129 +192,167 @@ export default class NetworkInventoryUtil {
|
|
|
196
192
|
});
|
|
197
193
|
}
|
|
198
194
|
|
|
199
|
-
if (walkedInterfaces.length
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
isRoot: true,
|
|
218
|
-
},
|
|
219
|
-
});
|
|
195
|
+
if (walkedInterfaces.length > 0) {
|
|
196
|
+
// --- Interface upsert ---
|
|
197
|
+
const existingInterfaces: Array<NetworkInterface> =
|
|
198
|
+
await NetworkInterfaceService.findBy({
|
|
199
|
+
query: {
|
|
200
|
+
networkDeviceId: deviceId,
|
|
201
|
+
},
|
|
202
|
+
select: {
|
|
203
|
+
_id: true,
|
|
204
|
+
interfaceIndex: true,
|
|
205
|
+
isMonitored: true,
|
|
206
|
+
},
|
|
207
|
+
limit: LIMIT_MAX,
|
|
208
|
+
skip: 0,
|
|
209
|
+
props: {
|
|
210
|
+
isRoot: true,
|
|
211
|
+
},
|
|
212
|
+
});
|
|
220
213
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
214
|
+
const existingByIndex: Map<number, NetworkInterface> = new Map();
|
|
215
|
+
for (const existing of existingInterfaces) {
|
|
216
|
+
if (existing.interfaceIndex !== undefined) {
|
|
217
|
+
existingByIndex.set(existing.interfaceIndex, existing);
|
|
218
|
+
}
|
|
225
219
|
}
|
|
226
|
-
}
|
|
227
220
|
|
|
228
|
-
|
|
221
|
+
const unmonitoredIndexes: Set<number> = new Set();
|
|
229
222
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
223
|
+
for (const walked of walkedInterfaces) {
|
|
224
|
+
const existing: NetworkInterface | undefined = existingByIndex.get(
|
|
225
|
+
walked.interfaceIndex,
|
|
226
|
+
);
|
|
234
227
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
228
|
+
if (existing && existing.isMonitored === false) {
|
|
229
|
+
unmonitoredIndexes.add(walked.interfaceIndex);
|
|
230
|
+
}
|
|
238
231
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
: null,
|
|
245
|
-
interfaceType: walked.interfaceType ?? null,
|
|
246
|
-
isOperationallyUp: walked.isOperationallyUp,
|
|
247
|
-
isAdministrativelyUp: walked.isAdministrativelyUp,
|
|
248
|
-
speedInMbps:
|
|
249
|
-
walked.speedInBitsPerSecond !== undefined
|
|
250
|
-
? walked.speedInBitsPerSecond / 1000000
|
|
251
|
-
: null,
|
|
252
|
-
inRateMbps:
|
|
253
|
-
walked.inBitsPerSecond !== undefined
|
|
254
|
-
? Math.round((walked.inBitsPerSecond / 1000000) * 1000) / 1000
|
|
232
|
+
const interfaceData: Record<string, unknown> = {
|
|
233
|
+
name: (walked.name || "").substring(0, 100),
|
|
234
|
+
alias: walked.alias ? walked.alias.substring(0, 100) : null,
|
|
235
|
+
macAddress: walked.macAddress
|
|
236
|
+
? walked.macAddress.substring(0, 100)
|
|
255
237
|
: null,
|
|
256
|
-
|
|
257
|
-
walked.
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
238
|
+
interfaceType: walked.interfaceType ?? null,
|
|
239
|
+
isOperationallyUp: walked.isOperationallyUp,
|
|
240
|
+
isAdministrativelyUp: walked.isAdministrativelyUp,
|
|
241
|
+
speedInMbps:
|
|
242
|
+
walked.speedInBitsPerSecond !== undefined
|
|
243
|
+
? walked.speedInBitsPerSecond / 1000000
|
|
244
|
+
: null,
|
|
245
|
+
inRateMbps:
|
|
246
|
+
walked.inBitsPerSecond !== undefined
|
|
247
|
+
? Math.round((walked.inBitsPerSecond / 1000000) * 1000) / 1000
|
|
248
|
+
: null,
|
|
249
|
+
outRateMbps:
|
|
250
|
+
walked.outBitsPerSecond !== undefined
|
|
251
|
+
? Math.round((walked.outBitsPerSecond / 1000000) * 1000) / 1000
|
|
252
|
+
: null,
|
|
253
|
+
utilizationPercent: walked.utilizationPercent ?? null,
|
|
254
|
+
errorsPerSecond: walked.errorsPerSecond ?? null,
|
|
255
|
+
lastSeenAt: now,
|
|
256
|
+
};
|
|
264
257
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
258
|
+
if (existing && existing.id) {
|
|
259
|
+
await NetworkInterfaceService.updateOneById({
|
|
260
|
+
id: existing.id,
|
|
261
|
+
data: interfaceData as any,
|
|
262
|
+
props: {
|
|
263
|
+
isRoot: true,
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
} else {
|
|
267
|
+
const newInterface: NetworkInterface = new NetworkInterface();
|
|
268
|
+
newInterface.projectId = data.projectId;
|
|
269
|
+
newInterface.networkDeviceId = deviceId;
|
|
270
|
+
newInterface.interfaceIndex = walked.interfaceIndex;
|
|
271
|
+
newInterface.name = (walked.name || "").substring(0, 100);
|
|
272
|
+
if (walked.alias) {
|
|
273
|
+
newInterface.alias = walked.alias.substring(0, 100);
|
|
274
|
+
}
|
|
275
|
+
if (walked.macAddress) {
|
|
276
|
+
newInterface.macAddress = walked.macAddress.substring(0, 100);
|
|
277
|
+
}
|
|
278
|
+
if (walked.interfaceType !== undefined) {
|
|
279
|
+
newInterface.interfaceType = walked.interfaceType;
|
|
280
|
+
}
|
|
281
|
+
newInterface.isMonitored = true;
|
|
282
|
+
newInterface.isOperationallyUp = walked.isOperationallyUp;
|
|
283
|
+
newInterface.isAdministrativelyUp = walked.isAdministrativelyUp;
|
|
284
|
+
if (walked.speedInBitsPerSecond !== undefined) {
|
|
285
|
+
newInterface.speedInMbps = walked.speedInBitsPerSecond / 1000000;
|
|
286
|
+
}
|
|
287
|
+
newInterface.lastSeenAt = now;
|
|
288
|
+
|
|
289
|
+
await NetworkInterfaceService.create({
|
|
290
|
+
data: newInterface,
|
|
291
|
+
props: {
|
|
292
|
+
isRoot: true,
|
|
293
|
+
},
|
|
294
|
+
});
|
|
293
295
|
}
|
|
294
|
-
|
|
296
|
+
}
|
|
295
297
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
298
|
+
/*
|
|
299
|
+
* Prune the in-flight response to monitored interfaces only, so
|
|
300
|
+
* criteria (interface down / utilization / errors) and per-interface
|
|
301
|
+
* metrics ignore ports the user muted. The inventory above keeps the
|
|
302
|
+
* full picture.
|
|
303
|
+
*/
|
|
304
|
+
if (unmonitoredIndexes.size > 0 && data.snmpResponse) {
|
|
305
|
+
data.snmpResponse.interfaces = walkedInterfaces.filter(
|
|
306
|
+
(walked: SnmpInterface) => {
|
|
307
|
+
return !unmonitoredIndexes.has(walked.interfaceIndex);
|
|
300
308
|
},
|
|
301
|
-
|
|
309
|
+
);
|
|
302
310
|
}
|
|
303
311
|
}
|
|
304
312
|
|
|
305
313
|
/*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
314
|
+
* --- Endpoint discovery (ARP/FDB) ---
|
|
315
|
+
* Only when the walk carries the endpoint arrays — walks with endpoint
|
|
316
|
+
* collection off omit them and must flow through this function exactly
|
|
317
|
+
* as before. The pure attachment logic strips uplink/self/transit
|
|
318
|
+
* MACs; the service applies the FDB-over-ARP precedence rules per
|
|
319
|
+
* (project, MAC).
|
|
310
320
|
*/
|
|
311
|
-
if (
|
|
312
|
-
|
|
313
|
-
(
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
321
|
+
if (fdbEntries !== undefined || arpEntries !== undefined) {
|
|
322
|
+
const endpointResult: EndpointAttachmentResult =
|
|
323
|
+
EndpointAttachmentUtil.computeEndpointAttachments({
|
|
324
|
+
deviceId: deviceId.toString(),
|
|
325
|
+
fdbEntries: fdbEntries,
|
|
326
|
+
arpEntries: arpEntries,
|
|
327
|
+
lldpNeighbors: lldpNeighbors,
|
|
328
|
+
cdpNeighbors: cdpNeighbors,
|
|
329
|
+
interfaces: walkedInterfaces.map((walked: SnmpInterface) => {
|
|
330
|
+
return {
|
|
331
|
+
interfaceIndex: walked.interfaceIndex,
|
|
332
|
+
name: walked.name,
|
|
333
|
+
macAddress: walked.macAddress,
|
|
334
|
+
};
|
|
335
|
+
}),
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
if (
|
|
339
|
+
endpointResult.attachments.length > 0 ||
|
|
340
|
+
endpointResult.ipBindings.length > 0
|
|
341
|
+
) {
|
|
342
|
+
await NetworkEndpointService.upsertDiscoveredEndpoints({
|
|
343
|
+
projectId: data.projectId,
|
|
344
|
+
deviceId: deviceId,
|
|
345
|
+
deviceSiteId: ownedDevice.siteId,
|
|
346
|
+
attachments: endpointResult.attachments,
|
|
347
|
+
ipBindings: endpointResult.ipBindings,
|
|
348
|
+
now: now,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
317
351
|
}
|
|
318
352
|
} catch (err) {
|
|
319
|
-
// Inventory bookkeeping must never fail the
|
|
353
|
+
// Inventory bookkeeping must never fail the walk pipeline.
|
|
320
354
|
logger.error(
|
|
321
|
-
`Failed to update network inventory for device ${
|
|
355
|
+
`Failed to update network inventory for device ${deviceId.toString()}:`,
|
|
322
356
|
);
|
|
323
357
|
logger.error(err);
|
|
324
358
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { normalizeMac } from "../../../Utils/Monitor/EndpointAttachmentUtil";
|
|
2
|
+
import OuiVendorsJson from "./Data/OuiVendors.json";
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* MAC OUI → hardware vendor lookup for discovered network endpoints.
|
|
6
|
+
*
|
|
7
|
+
* Data/OuiVendors.json is generated from the IEEE MA-L registry:
|
|
8
|
+
* source: https://standards-oui.ieee.org/oui/oui.csv
|
|
9
|
+
* fetched: 2026-07-22
|
|
10
|
+
* filter: organization name contains (case-insensitive substring) any of:
|
|
11
|
+
* Cisco, Meraki, Aruba, Hewlett Packard, HPE, Ubiquiti, MikroTik,
|
|
12
|
+
* Juniper, Fortinet, Palo Alto, Ruckus, Extreme, Netgear, TP-Link,
|
|
13
|
+
* D-Link, Zyxel, Dell, Intel, VMware, Raspberry Pi, NCR, Toshiba,
|
|
14
|
+
* Elo Touch, Epson, Star Micronics, Zebra, Honeywell, Datalogic,
|
|
15
|
+
* Verifone, Ingenico, PAX, Clover, Samsung, LG Electronics, Sony,
|
|
16
|
+
* Apple, Microsoft, Axis Communications, Bose, Sonos, Brother,
|
|
17
|
+
* Canon, Xerox, Lexmark
|
|
18
|
+
* shape: { "<6 lowercase hex chars, no separators>": "<Organization
|
|
19
|
+
* Name from the registry row>" }, keys sorted ascending.
|
|
20
|
+
*
|
|
21
|
+
* Values are the registry's own organization names ("Cisco Systems, Inc",
|
|
22
|
+
* "Raspberry Pi Foundation", …), not the filter labels. To refresh, re-run
|
|
23
|
+
* the same fetch + filter and regenerate the file; keep it well under 400KB
|
|
24
|
+
* (the network/POS-focused filter above lands around 240KB).
|
|
25
|
+
*
|
|
26
|
+
* Only 24-bit MA-L (OUI) prefixes are supported — the 28/36-bit MA-M/MA-S
|
|
27
|
+
* registries are intentionally out of scope.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
const vendorByOuiPrefix: Record<string, string> = OuiVendorsJson as Record<
|
|
31
|
+
string,
|
|
32
|
+
string
|
|
33
|
+
>;
|
|
34
|
+
|
|
35
|
+
export default class OuiLookupUtil {
|
|
36
|
+
/*
|
|
37
|
+
* Returns the registered vendor for a MAC address, or undefined when the
|
|
38
|
+
* MAC is malformed or its OUI is not in the (filtered) registry data.
|
|
39
|
+
* Accepts any spelling normalizeMac understands.
|
|
40
|
+
*/
|
|
41
|
+
public static lookupVendor(mac: string | undefined): string | undefined {
|
|
42
|
+
const normalized: string | undefined = normalizeMac(mac);
|
|
43
|
+
if (!normalized) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const prefix: string = normalized.replace(/:/g, "").substring(0, 6);
|
|
47
|
+
return vendorByOuiPrefix[prefix];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -1,35 +1,39 @@
|
|
|
1
1
|
import { JSONObject } from "../../../Types/JSON";
|
|
2
2
|
import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
|
|
3
|
-
import
|
|
3
|
+
import SnmpMonitorResponse from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
4
4
|
import OneUptimeDate from "../../../Types/Date";
|
|
5
5
|
import logger from "../Logger";
|
|
6
6
|
|
|
7
7
|
/*
|
|
8
8
|
* Computes per-interface rates (bandwidth, utilization, errors) for SNMP
|
|
9
|
-
*
|
|
10
|
-
* against the previous
|
|
9
|
+
* walks by comparing the cumulative IF-MIB counters of the current walk
|
|
10
|
+
* against the previous walk stored in NetworkDevice.lastWalkLog.
|
|
11
11
|
*
|
|
12
12
|
* Probes stay stateless — the delta is computed here, on ingest, before the
|
|
13
|
-
*
|
|
14
|
-
* skipped for that interface; rates resume on the following
|
|
13
|
+
* walk is persisted. Negative deltas (counter wrap or device reboot) are
|
|
14
|
+
* skipped for that interface; rates resume on the following walk.
|
|
15
15
|
*/
|
|
16
16
|
export default class SnmpInterfaceRateUtil {
|
|
17
17
|
public static attachInterfaceRates(data: {
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
snmpResponse: SnmpMonitorResponse | undefined;
|
|
19
|
+
/*
|
|
20
|
+
* The device's previous walk: `{ snmpResponse, monitoredAt }` as stored
|
|
21
|
+
* in NetworkDevice.lastWalkLog. Undefined on a device's first walk.
|
|
22
|
+
*/
|
|
23
|
+
previousWalkLog: JSONObject | undefined;
|
|
20
24
|
}): void {
|
|
21
25
|
const interfaces: Array<SnmpInterface> | undefined =
|
|
22
|
-
data.
|
|
26
|
+
data.snmpResponse?.interfaces;
|
|
23
27
|
|
|
24
28
|
if (!interfaces || interfaces.length === 0) {
|
|
25
29
|
return;
|
|
26
30
|
}
|
|
27
31
|
|
|
28
|
-
if (!data.
|
|
32
|
+
if (!data.previousWalkLog) {
|
|
29
33
|
return;
|
|
30
34
|
}
|
|
31
35
|
|
|
32
|
-
const previousSnmpResponse: JSONObject | undefined = data.
|
|
36
|
+
const previousSnmpResponse: JSONObject | undefined = data.previousWalkLog[
|
|
33
37
|
"snmpResponse"
|
|
34
38
|
] as JSONObject | undefined;
|
|
35
39
|
|
|
@@ -37,7 +41,7 @@ export default class SnmpInterfaceRateUtil {
|
|
|
37
41
|
previousSnmpResponse?.["interfaces"] as Array<JSONObject> | undefined;
|
|
38
42
|
|
|
39
43
|
const previousMonitoredAtValue: unknown =
|
|
40
|
-
data.
|
|
44
|
+
data.previousWalkLog["monitoredAt"];
|
|
41
45
|
|
|
42
46
|
if (
|
|
43
47
|
!previousInterfaces ||
|
|
@@ -56,7 +60,7 @@ export default class SnmpInterfaceRateUtil {
|
|
|
56
60
|
}
|
|
57
61
|
|
|
58
62
|
/*
|
|
59
|
-
*
|
|
63
|
+
* lastWalkLog stores server receipt time as monitoredAt, so the
|
|
60
64
|
* current side of the delta uses server time too.
|
|
61
65
|
*/
|
|
62
66
|
const elapsedSeconds: number =
|
|
@@ -163,7 +167,7 @@ export default class SnmpInterfaceRateUtil {
|
|
|
163
167
|
}
|
|
164
168
|
|
|
165
169
|
logger.debug(
|
|
166
|
-
`Attached SNMP interface rates
|
|
170
|
+
`Attached SNMP interface rates over ${round(elapsedSeconds)}s window`,
|
|
167
171
|
);
|
|
168
172
|
}
|
|
169
173
|
}
|
|
@@ -68,9 +68,13 @@ const templateDashboardLinkVariableMap: Partial<
|
|
|
68
68
|
[WhatsAppTemplateIds.VerificationCode]: "dashboard_link",
|
|
69
69
|
};
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
71
|
+
/*
|
|
72
|
+
* Partial: not every notification event type has a WhatsApp template (e.g.
|
|
73
|
+
* SLO status changes). getWhatsAppTemplateIdForEventType throws for event
|
|
74
|
+
* types without a registered template.
|
|
75
|
+
*/
|
|
76
|
+
const templateIdByEventType: Partial<
|
|
77
|
+
Record<NotificationSettingEventType, WhatsAppTemplateId>
|
|
74
78
|
> = {
|
|
75
79
|
[NotificationSettingEventType.SEND_INCIDENT_CREATED_OWNER_NOTIFICATION]:
|
|
76
80
|
WhatsAppTemplateIds.IncidentCreatedOwnerNotification,
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { describe, expect, test } from "@jest/globals";
|
|
2
|
+
import AnalyticsBaseModel from "../../../Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel";
|
|
3
|
+
import AnalyticsTableEngine from "../../../Types/AnalyticsDatabase/AnalyticsTableEngine";
|
|
4
|
+
import AnalyticsTableColumn from "../../../Types/AnalyticsDatabase/TableColumn";
|
|
5
|
+
import TableColumnType from "../../../Types/AnalyticsDatabase/TableColumnType";
|
|
6
|
+
|
|
7
|
+
type ModelOptions = ConstructorParameters<typeof AnalyticsBaseModel>[0];
|
|
8
|
+
|
|
9
|
+
function projectIdColumn(): AnalyticsTableColumn {
|
|
10
|
+
return new AnalyticsTableColumn({
|
|
11
|
+
key: "projectId",
|
|
12
|
+
title: "Project ID",
|
|
13
|
+
description: "Tenant",
|
|
14
|
+
required: true,
|
|
15
|
+
type: TableColumnType.Text,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function modelOptions(overrides: Partial<ModelOptions> = {}): ModelOptions {
|
|
20
|
+
return {
|
|
21
|
+
tableName: "TestAnalyticsTable",
|
|
22
|
+
singularName: "Test row",
|
|
23
|
+
pluralName: "Test rows",
|
|
24
|
+
tableColumns: [projectIdColumn()],
|
|
25
|
+
primaryKeys: ["projectId"],
|
|
26
|
+
sortKeys: ["projectId"],
|
|
27
|
+
partitionKey: "projectId",
|
|
28
|
+
tableEngine: AnalyticsTableEngine.MergeTree,
|
|
29
|
+
...overrides,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
describe("AnalyticsBaseModel base-column policy", () => {
|
|
34
|
+
test("adds _id and createdAt by default for regular analytics models", () => {
|
|
35
|
+
const suppliedColumns: Array<AnalyticsTableColumn> = [projectIdColumn()];
|
|
36
|
+
const model: AnalyticsBaseModel = new AnalyticsBaseModel(
|
|
37
|
+
modelOptions({ tableColumns: suppliedColumns }),
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
expect(
|
|
41
|
+
model.tableColumns.map((column: AnalyticsTableColumn) => {
|
|
42
|
+
return column.key;
|
|
43
|
+
}),
|
|
44
|
+
).toEqual(["projectId", "_id", "createdAt"]);
|
|
45
|
+
expect(model.getTableColumn("_id")?.type).toBe(TableColumnType.ObjectID);
|
|
46
|
+
expect(model.getTableColumn("_id")?.codec).toEqual({
|
|
47
|
+
codec: "ZSTD",
|
|
48
|
+
level: 1,
|
|
49
|
+
});
|
|
50
|
+
expect(model.getTableColumn("createdAt")?.type).toBe(TableColumnType.Date);
|
|
51
|
+
|
|
52
|
+
// Construction copies the caller's array instead of mutating it.
|
|
53
|
+
expect(
|
|
54
|
+
suppliedColumns.map((column: AnalyticsTableColumn) => {
|
|
55
|
+
return column.key;
|
|
56
|
+
}),
|
|
57
|
+
).toEqual(["projectId"]);
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
test("omits synthetic columns when includeBaseColumns is false", () => {
|
|
61
|
+
const model: AnalyticsBaseModel = new AnalyticsBaseModel(
|
|
62
|
+
modelOptions({
|
|
63
|
+
includeBaseColumns: false,
|
|
64
|
+
defaultSortColumn: "projectId",
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
expect(
|
|
69
|
+
model.tableColumns.map((column: AnalyticsTableColumn) => {
|
|
70
|
+
return column.key;
|
|
71
|
+
}),
|
|
72
|
+
).toEqual(["projectId"]);
|
|
73
|
+
expect(model.getTableColumn("_id")).toBeNull();
|
|
74
|
+
expect(model.getTableColumn("createdAt")).toBeNull();
|
|
75
|
+
expect(model.defaultSortColumn).toBe("projectId");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("requires a real default sort column when base columns are omitted", () => {
|
|
79
|
+
expect(() => {
|
|
80
|
+
return new AnalyticsBaseModel(
|
|
81
|
+
modelOptions({
|
|
82
|
+
includeBaseColumns: false,
|
|
83
|
+
}),
|
|
84
|
+
);
|
|
85
|
+
}).toThrow(
|
|
86
|
+
"defaultSortColumn is required when includeBaseColumns is false",
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("rejects createdAt as a strict model's default sort because it is absent", () => {
|
|
91
|
+
expect(() => {
|
|
92
|
+
return new AnalyticsBaseModel(
|
|
93
|
+
modelOptions({
|
|
94
|
+
includeBaseColumns: false,
|
|
95
|
+
defaultSortColumn: "createdAt",
|
|
96
|
+
}),
|
|
97
|
+
);
|
|
98
|
+
}).toThrow("defaultSortColumn createdAt is not part of tableColumns");
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("still validates primary and sort keys against the strict column set", () => {
|
|
102
|
+
expect(() => {
|
|
103
|
+
return new AnalyticsBaseModel(
|
|
104
|
+
modelOptions({
|
|
105
|
+
includeBaseColumns: false,
|
|
106
|
+
defaultSortColumn: "projectId",
|
|
107
|
+
sortKeys: ["projectId", "createdAt"],
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
}).toThrow("Sort key createdAt is not part of tableColumns");
|
|
111
|
+
|
|
112
|
+
expect(() => {
|
|
113
|
+
return new AnalyticsBaseModel(
|
|
114
|
+
modelOptions({
|
|
115
|
+
includeBaseColumns: false,
|
|
116
|
+
defaultSortColumn: "projectId",
|
|
117
|
+
primaryKeys: ["_id"],
|
|
118
|
+
}),
|
|
119
|
+
);
|
|
120
|
+
}).toThrow("Primary key _id is not part of tableColumns");
|
|
121
|
+
});
|
|
122
|
+
});
|