@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
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import logger from "../Logger";
|
|
2
|
+
import TelemetryUtil from "../Telemetry/Telemetry";
|
|
3
|
+
import MetricService from "../../Services/MetricService";
|
|
4
|
+
import GlobalConfigService from "../../Services/GlobalConfigService";
|
|
5
|
+
import GlobalConfig from "../../../Models/DatabaseModels/GlobalConfig";
|
|
6
|
+
import { MetricPointType } from "../../../Models/AnalyticsModels/Metric";
|
|
7
|
+
import ServiceType from "../../../Types/Telemetry/ServiceType";
|
|
8
|
+
import MetricType from "../../../Models/DatabaseModels/MetricType";
|
|
9
|
+
import Dictionary from "../../../Types/Dictionary";
|
|
10
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
11
|
+
import MonitorMetricType from "../../../Types/Monitor/MonitorMetricType";
|
|
12
|
+
import SnmpInterface from "../../../Types/Monitor/SnmpMonitor/SnmpInterface";
|
|
13
|
+
import SnmpMonitorResponse, {
|
|
14
|
+
SnmpOidResponse,
|
|
15
|
+
} from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
16
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
17
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
18
|
+
import CaptureSpan from "../Telemetry/CaptureSpan";
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
* Emits device-scoped metrics from each device walk — availability,
|
|
22
|
+
* response time, per-interface status/bandwidth/utilization/errors, and
|
|
23
|
+
* polled health-OID values. Series are keyed to the NetworkDevice
|
|
24
|
+
* (primaryEntityId = deviceId, attributes.networkDeviceId), NOT to a
|
|
25
|
+
* monitor, so the device pages can chart health for every registered
|
|
26
|
+
* device — including devices no monitor watches. Mirrors the SNMP sections
|
|
27
|
+
* of MonitorMetricUtil, which continue to emit monitor-scoped series for
|
|
28
|
+
* monitors that alert on the device.
|
|
29
|
+
*/
|
|
30
|
+
export default class NetworkDeviceMetricUtil {
|
|
31
|
+
/*
|
|
32
|
+
* Caps mirror MonitorMetricUtil: bound what a single walk can write —
|
|
33
|
+
* large routers can expose thousands of subinterfaces.
|
|
34
|
+
*/
|
|
35
|
+
private static readonly maxInterfaceSeries: number = 200;
|
|
36
|
+
private static readonly maxOidSeries: number = 50;
|
|
37
|
+
|
|
38
|
+
// Retention handling mirrors MonitorMetricUtil (shared GlobalConfig knob).
|
|
39
|
+
private static readonly DEFAULT_RETENTION_DAYS: number = 30;
|
|
40
|
+
private static cachedRetentionDays: number | null = null;
|
|
41
|
+
private static lastCacheRefresh: Date | null = null;
|
|
42
|
+
private static readonly CACHE_TTL_MS: number = 5 * 60 * 1000;
|
|
43
|
+
|
|
44
|
+
private static async getRetentionDays(): Promise<number> {
|
|
45
|
+
const now: Date = OneUptimeDate.getCurrentDate();
|
|
46
|
+
|
|
47
|
+
if (
|
|
48
|
+
this.cachedRetentionDays !== null &&
|
|
49
|
+
this.lastCacheRefresh !== null &&
|
|
50
|
+
now.getTime() - this.lastCacheRefresh.getTime() < this.CACHE_TTL_MS
|
|
51
|
+
) {
|
|
52
|
+
return this.cachedRetentionDays;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
try {
|
|
56
|
+
const globalConfig: GlobalConfig | null =
|
|
57
|
+
await GlobalConfigService.findOneBy({
|
|
58
|
+
query: {
|
|
59
|
+
_id: ObjectID.getZeroObjectID().toString(),
|
|
60
|
+
},
|
|
61
|
+
props: {
|
|
62
|
+
isRoot: true,
|
|
63
|
+
},
|
|
64
|
+
select: {
|
|
65
|
+
monitorMetricRetentionInDays: true,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
if (
|
|
70
|
+
globalConfig &&
|
|
71
|
+
globalConfig.monitorMetricRetentionInDays !== undefined &&
|
|
72
|
+
globalConfig.monitorMetricRetentionInDays !== null
|
|
73
|
+
) {
|
|
74
|
+
this.cachedRetentionDays = globalConfig.monitorMetricRetentionInDays;
|
|
75
|
+
} else {
|
|
76
|
+
this.cachedRetentionDays = this.DEFAULT_RETENTION_DAYS;
|
|
77
|
+
}
|
|
78
|
+
} catch (err) {
|
|
79
|
+
logger.error(err);
|
|
80
|
+
this.cachedRetentionDays = this.DEFAULT_RETENTION_DAYS;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
this.lastCacheRefresh = now;
|
|
84
|
+
return this.cachedRetentionDays;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@CaptureSpan()
|
|
88
|
+
public static async saveWalkMetrics(data: {
|
|
89
|
+
projectId: ObjectID;
|
|
90
|
+
networkDeviceId: ObjectID;
|
|
91
|
+
deviceName: string | undefined;
|
|
92
|
+
probeId: ObjectID | undefined;
|
|
93
|
+
snmpResponse: SnmpMonitorResponse | undefined;
|
|
94
|
+
responseTimeInMs: number | undefined;
|
|
95
|
+
isOnline: boolean | undefined;
|
|
96
|
+
}): Promise<void> {
|
|
97
|
+
const metricRows: Array<JSONObject> = [];
|
|
98
|
+
const metricNameServiceNameMap: Dictionary<MetricType> = {};
|
|
99
|
+
|
|
100
|
+
const retentionDays: number =
|
|
101
|
+
await NetworkDeviceMetricUtil.getRetentionDays();
|
|
102
|
+
const retentionDate: Date = OneUptimeDate.addRemoveDays(
|
|
103
|
+
OneUptimeDate.getCurrentDate(),
|
|
104
|
+
retentionDays,
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
const baseAttributes: JSONObject = {
|
|
108
|
+
projectId: data.projectId.toString(),
|
|
109
|
+
networkDeviceId: data.networkDeviceId.toString(),
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
if (data.deviceName) {
|
|
113
|
+
baseAttributes["deviceName"] = data.deviceName;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (data.probeId) {
|
|
117
|
+
baseAttributes["probeId"] = data.probeId.toString();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const pushMetric: (metric: {
|
|
121
|
+
metricName: string;
|
|
122
|
+
value: number | null | undefined;
|
|
123
|
+
description: string;
|
|
124
|
+
unit: string;
|
|
125
|
+
extraAttributes?: JSONObject | undefined;
|
|
126
|
+
}) => void = (metric: {
|
|
127
|
+
metricName: string;
|
|
128
|
+
value: number | null | undefined;
|
|
129
|
+
description: string;
|
|
130
|
+
unit: string;
|
|
131
|
+
extraAttributes?: JSONObject | undefined;
|
|
132
|
+
}) => {
|
|
133
|
+
if (metric.value === undefined || metric.value === null) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (typeof metric.value !== "number" || !isFinite(metric.value)) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
metricRows.push(
|
|
142
|
+
NetworkDeviceMetricUtil.buildDeviceMetricRow({
|
|
143
|
+
projectId: data.projectId,
|
|
144
|
+
networkDeviceId: data.networkDeviceId,
|
|
145
|
+
metricName: metric.metricName,
|
|
146
|
+
value: metric.value,
|
|
147
|
+
retentionDate: retentionDate,
|
|
148
|
+
attributes: {
|
|
149
|
+
...baseAttributes,
|
|
150
|
+
...(metric.extraAttributes || {}),
|
|
151
|
+
},
|
|
152
|
+
}),
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const metricType: MetricType = new MetricType();
|
|
156
|
+
metricType.name = metric.metricName;
|
|
157
|
+
metricType.description = metric.description;
|
|
158
|
+
metricType.unit = metric.unit;
|
|
159
|
+
|
|
160
|
+
metricNameServiceNameMap[metric.metricName] = metricType;
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
if (data.isOnline !== undefined) {
|
|
164
|
+
pushMetric({
|
|
165
|
+
metricName: MonitorMetricType.IsOnline,
|
|
166
|
+
value: data.isOnline ? 1 : 0,
|
|
167
|
+
description: "SNMP reachability of this network device (1 up, 0 down)",
|
|
168
|
+
unit: "",
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (data.responseTimeInMs !== undefined) {
|
|
173
|
+
pushMetric({
|
|
174
|
+
metricName: MonitorMetricType.ResponseTime,
|
|
175
|
+
value: data.responseTimeInMs,
|
|
176
|
+
description: "SNMP response time of this network device",
|
|
177
|
+
unit: "ms",
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const snmpInterfaces: Array<SnmpInterface> | undefined =
|
|
182
|
+
data.snmpResponse?.interfaces;
|
|
183
|
+
|
|
184
|
+
if (snmpInterfaces && snmpInterfaces.length > 0) {
|
|
185
|
+
const interfacesToEmit: Array<SnmpInterface> = snmpInterfaces.slice(
|
|
186
|
+
0,
|
|
187
|
+
NetworkDeviceMetricUtil.maxInterfaceSeries,
|
|
188
|
+
);
|
|
189
|
+
|
|
190
|
+
if (interfacesToEmit.length < snmpInterfaces.length) {
|
|
191
|
+
logger.warn(
|
|
192
|
+
`Device ${data.networkDeviceId.toString()}: emitting metrics for first ${interfacesToEmit.length} of ${snmpInterfaces.length} SNMP interfaces`,
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
for (const snmpInterface of interfacesToEmit) {
|
|
197
|
+
const interfaceAttributes: JSONObject = {
|
|
198
|
+
interfaceName: snmpInterface.name,
|
|
199
|
+
interfaceIndex: snmpInterface.interfaceIndex.toString(),
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
pushMetric({
|
|
203
|
+
metricName: MonitorMetricType.SnmpInterfaceOperStatus,
|
|
204
|
+
value: snmpInterface.isOperationallyUp ? 1 : 0,
|
|
205
|
+
description: "SNMP interface operational status (1 up, 0 down)",
|
|
206
|
+
unit: "",
|
|
207
|
+
extraAttributes: interfaceAttributes,
|
|
208
|
+
});
|
|
209
|
+
pushMetric({
|
|
210
|
+
metricName: MonitorMetricType.SnmpInterfaceInBitsPerSecond,
|
|
211
|
+
value: snmpInterface.inBitsPerSecond,
|
|
212
|
+
description: "SNMP interface inbound bandwidth",
|
|
213
|
+
unit: "bps",
|
|
214
|
+
extraAttributes: interfaceAttributes,
|
|
215
|
+
});
|
|
216
|
+
pushMetric({
|
|
217
|
+
metricName: MonitorMetricType.SnmpInterfaceOutBitsPerSecond,
|
|
218
|
+
value: snmpInterface.outBitsPerSecond,
|
|
219
|
+
description: "SNMP interface outbound bandwidth",
|
|
220
|
+
unit: "bps",
|
|
221
|
+
extraAttributes: interfaceAttributes,
|
|
222
|
+
});
|
|
223
|
+
pushMetric({
|
|
224
|
+
metricName: MonitorMetricType.SnmpInterfaceUtilizationPercent,
|
|
225
|
+
value: snmpInterface.utilizationPercent,
|
|
226
|
+
description: "SNMP interface utilization",
|
|
227
|
+
unit: "%",
|
|
228
|
+
extraAttributes: interfaceAttributes,
|
|
229
|
+
});
|
|
230
|
+
pushMetric({
|
|
231
|
+
metricName: MonitorMetricType.SnmpInterfaceErrorsPerSecond,
|
|
232
|
+
value: snmpInterface.errorsPerSecond,
|
|
233
|
+
description: "SNMP interface errors per second",
|
|
234
|
+
unit: "errors/s",
|
|
235
|
+
extraAttributes: interfaceAttributes,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/*
|
|
241
|
+
* Polled health-OID values (vendor-template CPU/memory/temperature and
|
|
242
|
+
* custom OIDs configured on the device). One series per OID, keyed by
|
|
243
|
+
* the oid/oidName attributes; non-numeric values (strings, OIDs, MACs)
|
|
244
|
+
* are skipped — they carry no chartable signal.
|
|
245
|
+
*/
|
|
246
|
+
const snmpOidResponses: Array<SnmpOidResponse> | undefined =
|
|
247
|
+
data.snmpResponse?.oidResponses;
|
|
248
|
+
|
|
249
|
+
if (snmpOidResponses && snmpOidResponses.length > 0) {
|
|
250
|
+
const oidResponsesToEmit: Array<SnmpOidResponse> = snmpOidResponses.slice(
|
|
251
|
+
0,
|
|
252
|
+
NetworkDeviceMetricUtil.maxOidSeries,
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
if (oidResponsesToEmit.length < snmpOidResponses.length) {
|
|
256
|
+
logger.warn(
|
|
257
|
+
`Device ${data.networkDeviceId.toString()}: emitting metrics for first ${oidResponsesToEmit.length} of ${snmpOidResponses.length} SNMP OID responses`,
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
for (const oidResponse of oidResponsesToEmit) {
|
|
262
|
+
const numericValue: number | undefined =
|
|
263
|
+
typeof oidResponse.value === "number" && isFinite(oidResponse.value)
|
|
264
|
+
? oidResponse.value
|
|
265
|
+
: undefined;
|
|
266
|
+
|
|
267
|
+
if (numericValue === undefined) {
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
pushMetric({
|
|
272
|
+
metricName: MonitorMetricType.SnmpOidValue,
|
|
273
|
+
value: numericValue,
|
|
274
|
+
description: "Value of a polled SNMP OID",
|
|
275
|
+
unit: "",
|
|
276
|
+
extraAttributes: {
|
|
277
|
+
oid: oidResponse.oid,
|
|
278
|
+
oidName: oidResponse.name || oidResponse.oid,
|
|
279
|
+
},
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if (metricRows.length === 0) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
await MetricService.insertJsonRows(metricRows);
|
|
289
|
+
|
|
290
|
+
TelemetryUtil.indexMetricNameServiceNameMap({
|
|
291
|
+
projectId: data.projectId,
|
|
292
|
+
metricNameServiceNameMap: metricNameServiceNameMap,
|
|
293
|
+
}).catch((err: Error) => {
|
|
294
|
+
logger.error(err);
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Row shape must stay in lockstep with MonitorMetricUtil.buildMonitorMetricRow.
|
|
299
|
+
private static buildDeviceMetricRow(data: {
|
|
300
|
+
projectId: ObjectID;
|
|
301
|
+
networkDeviceId: ObjectID;
|
|
302
|
+
metricName: string;
|
|
303
|
+
value: number;
|
|
304
|
+
retentionDate: Date;
|
|
305
|
+
attributes: JSONObject;
|
|
306
|
+
}): JSONObject {
|
|
307
|
+
const ingestionDate: Date = OneUptimeDate.getCurrentDate();
|
|
308
|
+
const ingestionTimestamp: string =
|
|
309
|
+
OneUptimeDate.toClickhouseDateTime(ingestionDate);
|
|
310
|
+
const timeUnixNano: string =
|
|
311
|
+
OneUptimeDate.toUnixNano(ingestionDate).toString();
|
|
312
|
+
|
|
313
|
+
const attributes: JSONObject = { ...data.attributes };
|
|
314
|
+
const attributeKeys: Array<string> =
|
|
315
|
+
TelemetryUtil.getAttributeKeys(attributes);
|
|
316
|
+
|
|
317
|
+
return {
|
|
318
|
+
_id: ObjectID.generateTimeOrdered().toString(),
|
|
319
|
+
createdAt: ingestionTimestamp,
|
|
320
|
+
projectId: data.projectId.toString(),
|
|
321
|
+
primaryEntityId: data.networkDeviceId.toString(),
|
|
322
|
+
primaryEntityType: ServiceType.NetworkDevice,
|
|
323
|
+
name: data.metricName,
|
|
324
|
+
aggregationTemporality: null,
|
|
325
|
+
metricPointType: MetricPointType.Sum,
|
|
326
|
+
time: ingestionTimestamp,
|
|
327
|
+
startTime: null,
|
|
328
|
+
timeUnixNano: timeUnixNano,
|
|
329
|
+
startTimeUnixNano: null,
|
|
330
|
+
attributes: attributes,
|
|
331
|
+
attributeKeys: attributeKeys,
|
|
332
|
+
isMonotonic: null,
|
|
333
|
+
count: null,
|
|
334
|
+
sum: null,
|
|
335
|
+
min: null,
|
|
336
|
+
max: null,
|
|
337
|
+
bucketCounts: [],
|
|
338
|
+
explicitBounds: [],
|
|
339
|
+
value: data.value,
|
|
340
|
+
retentionDate: OneUptimeDate.toClickhouseDateTime(data.retentionDate),
|
|
341
|
+
} as JSONObject;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import Monitor from "../../../Models/DatabaseModels/Monitor";
|
|
2
|
+
import NetworkDevice from "../../../Models/DatabaseModels/NetworkDevice";
|
|
3
|
+
import MonitorService from "../../Services/MonitorService";
|
|
4
|
+
import NetworkDeviceService from "../../Services/NetworkDeviceService";
|
|
5
|
+
import MonitorResourceUtil from "./MonitorResource";
|
|
6
|
+
import NetworkDeviceMetricUtil from "./NetworkDeviceMetricUtil";
|
|
7
|
+
import NetworkInventoryUtil from "./NetworkInventoryUtil";
|
|
8
|
+
import SnmpInterfaceRateUtil from "./SnmpInterfaceRateUtil";
|
|
9
|
+
import LIMIT_MAX from "../../../Types/Database/LimitMax";
|
|
10
|
+
import MonitorStep from "../../../Types/Monitor/MonitorStep";
|
|
11
|
+
import MonitorType from "../../../Types/Monitor/MonitorType";
|
|
12
|
+
import SnmpMonitorResponse from "../../../Types/Monitor/SnmpMonitor/SnmpMonitorResponse";
|
|
13
|
+
import ProbeMonitorResponse from "../../../Types/Probe/ProbeMonitorResponse";
|
|
14
|
+
import { JSONObject } from "../../../Types/JSON";
|
|
15
|
+
import ObjectID from "../../../Types/ObjectID";
|
|
16
|
+
import OneUptimeDate from "../../../Types/Date";
|
|
17
|
+
import logger from "../Logger";
|
|
18
|
+
|
|
19
|
+
/*
|
|
20
|
+
* Server half of device-owned polling.
|
|
21
|
+
*
|
|
22
|
+
* The device's assigned probe walks every polling-enabled NetworkDevice on
|
|
23
|
+
* the device's own schedule and reports each walk here. This util then:
|
|
24
|
+
*
|
|
25
|
+
* 1. computes interface rates against the device's previous walk
|
|
26
|
+
* (NetworkDevice.lastWalkLog),
|
|
27
|
+
* 2. syncs the device/interface/endpoint inventory and lastSeenAt,
|
|
28
|
+
* 3. emits device-scoped metrics (so health charts work with zero
|
|
29
|
+
* monitors), and
|
|
30
|
+
* 4. fans the walk out to every Network Device monitor referencing the
|
|
31
|
+
* device — each gets an event-driven ProbeMonitorResponse evaluated
|
|
32
|
+
* through the ordinary criteria pipeline (incidents, alerts, status).
|
|
33
|
+
*
|
|
34
|
+
* Monitors are pure alerting config here: they never poll, and deleting
|
|
35
|
+
* every monitor leaves the device fully inventoried and charted.
|
|
36
|
+
*/
|
|
37
|
+
export default class NetworkDeviceWalkUtil {
|
|
38
|
+
public static async processWalkResult(data: {
|
|
39
|
+
probeId: ObjectID;
|
|
40
|
+
networkDeviceId: ObjectID;
|
|
41
|
+
snmpResponse: SnmpMonitorResponse;
|
|
42
|
+
monitoredAt: Date;
|
|
43
|
+
}): Promise<void> {
|
|
44
|
+
/*
|
|
45
|
+
* Scope the lookup to the reporting probe (the auth middleware only
|
|
46
|
+
* proves the caller is SOME valid probe) — without this any probe that
|
|
47
|
+
* learned a foreign device id could overwrite another project's
|
|
48
|
+
* inventory or trigger its monitors.
|
|
49
|
+
*/
|
|
50
|
+
const device: NetworkDevice | null = await NetworkDeviceService.findOneBy({
|
|
51
|
+
query: {
|
|
52
|
+
_id: data.networkDeviceId,
|
|
53
|
+
probeId: data.probeId,
|
|
54
|
+
},
|
|
55
|
+
select: {
|
|
56
|
+
_id: true,
|
|
57
|
+
projectId: true,
|
|
58
|
+
name: true,
|
|
59
|
+
siteId: true,
|
|
60
|
+
lastWalkLog: true,
|
|
61
|
+
},
|
|
62
|
+
props: {
|
|
63
|
+
isRoot: true,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
if (!device || !device.id || !device.projectId) {
|
|
68
|
+
logger.warn(
|
|
69
|
+
`Device walk ignored: device ${data.networkDeviceId.toString()} is not assigned to probe ${data.probeId.toString()}.`,
|
|
70
|
+
);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const isOnline: boolean | undefined = data.snmpResponse.isOnline;
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* Interface rates are counter deltas against the previous walk. Compute
|
|
78
|
+
* them on the FULL interface set, before inventory pruning, so muted
|
|
79
|
+
* ports still get fresh rates in the inventory table.
|
|
80
|
+
*/
|
|
81
|
+
SnmpInterfaceRateUtil.attachInterfaceRates({
|
|
82
|
+
snmpResponse: data.snmpResponse,
|
|
83
|
+
previousWalkLog: device.lastWalkLog as JSONObject | undefined,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
/*
|
|
87
|
+
* Persist this walk as the next delta baseline — but only when it
|
|
88
|
+
* actually walked interfaces. Keeping the last GOOD counters across
|
|
89
|
+
* failed polls means rates resume with a correct (longer-window) delta
|
|
90
|
+
* instead of losing a cycle.
|
|
91
|
+
*/
|
|
92
|
+
if (
|
|
93
|
+
data.snmpResponse.interfaces &&
|
|
94
|
+
data.snmpResponse.interfaces.length > 0
|
|
95
|
+
) {
|
|
96
|
+
await NetworkDeviceService.updateOneById({
|
|
97
|
+
id: device.id,
|
|
98
|
+
data: {
|
|
99
|
+
lastWalkLog: {
|
|
100
|
+
snmpResponse: JSON.parse(JSON.stringify(data.snmpResponse)),
|
|
101
|
+
monitoredAt: OneUptimeDate.getCurrentDate(),
|
|
102
|
+
},
|
|
103
|
+
} as any,
|
|
104
|
+
props: {
|
|
105
|
+
isRoot: true,
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/*
|
|
111
|
+
* Inventory sync also prunes data.snmpResponse.interfaces down to
|
|
112
|
+
* monitored ports, so the metrics and criteria below only see ports the
|
|
113
|
+
* user cares about.
|
|
114
|
+
*/
|
|
115
|
+
await NetworkInventoryUtil.updateFromWalk({
|
|
116
|
+
projectId: device.projectId,
|
|
117
|
+
deviceId: device.id,
|
|
118
|
+
snmpResponse: data.snmpResponse,
|
|
119
|
+
isOnline: isOnline,
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
await NetworkDeviceMetricUtil.saveWalkMetrics({
|
|
124
|
+
projectId: device.projectId,
|
|
125
|
+
networkDeviceId: device.id,
|
|
126
|
+
deviceName: device.name,
|
|
127
|
+
probeId: data.probeId,
|
|
128
|
+
snmpResponse: data.snmpResponse,
|
|
129
|
+
responseTimeInMs: data.snmpResponse.responseTimeInMs,
|
|
130
|
+
isOnline: isOnline,
|
|
131
|
+
});
|
|
132
|
+
} catch (err) {
|
|
133
|
+
// Metrics must never fail the walk pipeline.
|
|
134
|
+
logger.error(
|
|
135
|
+
`Failed to save device metrics for ${device.id.toString()}:`,
|
|
136
|
+
);
|
|
137
|
+
logger.error(err);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// --- Fan out to the monitors alerting on this device ---
|
|
141
|
+
const monitors: Array<Monitor> =
|
|
142
|
+
await NetworkDeviceWalkUtil.findMonitorsWatchingDevices({
|
|
143
|
+
projectId: device.projectId,
|
|
144
|
+
deviceIds: [device.id.toString()],
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
for (const monitor of monitors) {
|
|
148
|
+
if (
|
|
149
|
+
monitor.disableActiveMonitoring ||
|
|
150
|
+
monitor.disableActiveMonitoringBecauseOfManualIncident ||
|
|
151
|
+
monitor.disableActiveMonitoringBecauseOfScheduledMaintenanceEvent
|
|
152
|
+
) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (!monitor.id || !monitor.projectId) {
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
for (const monitorStep of monitor.monitorSteps?.data
|
|
161
|
+
?.monitorStepsInstanceArray || []) {
|
|
162
|
+
const referencedDeviceId: string | undefined =
|
|
163
|
+
monitorStep.data?.networkDeviceMonitor?.networkDeviceId;
|
|
164
|
+
|
|
165
|
+
if (
|
|
166
|
+
!referencedDeviceId ||
|
|
167
|
+
referencedDeviceId !== device.id.toString()
|
|
168
|
+
) {
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const walkResponse: ProbeMonitorResponse = {
|
|
173
|
+
projectId: monitor.projectId,
|
|
174
|
+
monitorId: monitor.id,
|
|
175
|
+
monitorStepId: monitorStep.id,
|
|
176
|
+
probeId: data.probeId,
|
|
177
|
+
snmpResponse: data.snmpResponse,
|
|
178
|
+
isOnline: isOnline,
|
|
179
|
+
responseTimeInMs: data.snmpResponse.responseTimeInMs,
|
|
180
|
+
isTimeout: data.snmpResponse.isTimeout,
|
|
181
|
+
failureCause: data.snmpResponse.failureCause || "",
|
|
182
|
+
monitoredAt: data.monitoredAt,
|
|
183
|
+
ingestedAt: OneUptimeDate.getCurrentDate(),
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
try {
|
|
187
|
+
await MonitorResourceUtil.monitorResource(walkResponse);
|
|
188
|
+
} catch (err) {
|
|
189
|
+
logger.error(
|
|
190
|
+
`Error evaluating device walk for monitor ${monitor.id.toString()}:`,
|
|
191
|
+
);
|
|
192
|
+
logger.error(err);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
logger.debug(
|
|
198
|
+
`Device walk for ${device.id.toString()} processed: evaluated ${monitors.length} watching monitor(s).`,
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/*
|
|
203
|
+
* Every enabled Network Device monitor in the project whose steps
|
|
204
|
+
* reference one of the given devices. Shared by the walk fan-out above
|
|
205
|
+
* and the SNMP trap fan-out — the monitor↔device link lives in step JSON,
|
|
206
|
+
* so this fetches the project's Network Device monitors and filters
|
|
207
|
+
* server-side.
|
|
208
|
+
*/
|
|
209
|
+
public static async findMonitorsWatchingDevices(data: {
|
|
210
|
+
projectId: ObjectID;
|
|
211
|
+
deviceIds: Array<string>;
|
|
212
|
+
}): Promise<Array<Monitor>> {
|
|
213
|
+
if (data.deviceIds.length === 0) {
|
|
214
|
+
return [];
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const deviceIdSet: Set<string> = new Set(data.deviceIds);
|
|
218
|
+
|
|
219
|
+
const monitors: Array<Monitor> = await MonitorService.findBy({
|
|
220
|
+
query: {
|
|
221
|
+
projectId: data.projectId,
|
|
222
|
+
monitorType: MonitorType.NetworkDevice,
|
|
223
|
+
},
|
|
224
|
+
select: {
|
|
225
|
+
_id: true,
|
|
226
|
+
projectId: true,
|
|
227
|
+
monitorSteps: true,
|
|
228
|
+
disableActiveMonitoring: true,
|
|
229
|
+
disableActiveMonitoringBecauseOfManualIncident: true,
|
|
230
|
+
disableActiveMonitoringBecauseOfScheduledMaintenanceEvent: true,
|
|
231
|
+
},
|
|
232
|
+
limit: LIMIT_MAX,
|
|
233
|
+
skip: 0,
|
|
234
|
+
props: {
|
|
235
|
+
isRoot: true,
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
return monitors.filter((monitor: Monitor) => {
|
|
240
|
+
return (monitor.monitorSteps?.data?.monitorStepsInstanceArray || []).some(
|
|
241
|
+
(monitorStep: MonitorStep) => {
|
|
242
|
+
const referencedDeviceId: string | undefined =
|
|
243
|
+
monitorStep.data?.networkDeviceMonitor?.networkDeviceId;
|
|
244
|
+
return Boolean(
|
|
245
|
+
referencedDeviceId && deviceIdSet.has(referencedDeviceId),
|
|
246
|
+
);
|
|
247
|
+
},
|
|
248
|
+
);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|