@oneuptime/common 11.5.9 → 11.5.10
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/Index.ts +13 -0
- package/Models/AnalyticsModels/MetricItemAggMV1mByContainer.ts +178 -0
- package/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts +179 -0
- package/Models/AnalyticsModels/MetricItemAggMV1mByService.ts +179 -0
- package/Models/AnalyticsModels/NetworkFlow.ts +397 -0
- package/Models/DatabaseModels/EnterpriseLicenseInstance.ts +18 -0
- package/Models/DatabaseModels/GlobalConfig.ts +36 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/MarketingConversion.ts +198 -0
- package/Models/DatabaseModels/MetricSavedView.ts +34 -0
- package/Models/DatabaseModels/MetricType.ts +74 -0
- package/Models/DatabaseModels/NetworkDevice.ts +332 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +113 -0
- package/Models/DatabaseModels/NetworkInterface.ts +58 -0
- package/Models/DatabaseModels/Project.ts +37 -0
- package/Models/DatabaseModels/User.ts +37 -0
- package/Server/API/BaseAnalyticsAPI.ts +23 -0
- package/Server/API/EnterpriseLicenseAPI.ts +14 -0
- package/Server/EnvironmentConfig.ts +84 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.ts +38 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.ts +28 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.ts +29 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.ts +35 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +12 -0
- package/Server/Services/AnalyticsDatabaseService.ts +70 -1
- package/Server/Services/IncidentService.ts +13 -0
- package/Server/Services/Index.ts +10 -0
- package/Server/Services/MarketingConversionService.ts +10 -0
- package/Server/Services/MetricItemAggMV1mByContainerService.ts +31 -0
- package/Server/Services/MetricItemAggMV1mByK8sClusterService.ts +31 -0
- package/Server/Services/MetricItemAggMV1mByServiceService.ts +31 -0
- package/Server/Services/MetricService.ts +970 -122
- package/Server/Services/MonitorService.ts +14 -0
- package/Server/Services/NetworkDeviceOwnerTeamService.ts +42 -0
- package/Server/Services/NetworkDeviceOwnerUserService.ts +106 -0
- package/Server/Services/NetworkFlowService.ts +11 -0
- package/Server/Services/OnCallDutyPolicyService.ts +11 -1
- package/Server/Services/ProjectService.ts +136 -0
- package/Server/Services/SpanService.ts +13 -9
- package/Server/Services/StatusPageService.ts +10 -0
- package/Server/Services/TeamMemberService.ts +11 -0
- package/Server/Services/UserService.ts +59 -0
- package/Server/Types/AnalyticsDatabase/AggregateBy.ts +37 -7
- package/Server/Utils/Attribution.ts +99 -0
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +103 -0
- package/Server/Utils/Marketing/ConversionUploadProviders.ts +22 -0
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +270 -0
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +147 -0
- package/Server/Utils/Marketing/Providers/Meta.ts +148 -0
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +196 -0
- package/Server/Utils/Marketing/Providers/Reddit.ts +178 -0
- package/Server/Utils/Monitor/MonitorAlert.ts +71 -7
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +31 -19
- package/Server/Utils/Monitor/MonitorIncident.ts +71 -7
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +57 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +94 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +15 -0
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +125 -14
- package/Server/Utils/ProductAnalytics.ts +133 -0
- package/Server/Utils/Telemetry/Telemetry.ts +39 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +21 -0
- package/Tests/Server/API/BaseAnalyticsAPI.test.ts +72 -0
- package/Tests/Server/Infrastructure/SemaphorePermit.test.ts +9 -1
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +21 -2
- package/Tests/Server/Services/MetricEntityMVKeyParity.test.ts +173 -0
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +1391 -0
- package/Tests/Server/Services/NetworkDeviceOwnerServices.test.ts +260 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplateUtilNetworkDevice.test.ts +389 -0
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +764 -0
- package/Tests/Types/BaseDatabase/AggregationIntervalUtil.test.ts +111 -2
- package/Tests/Types/Database/EndsWith.test.ts +64 -0
- package/Tests/Types/Database/GreaterThan.test.ts +62 -0
- package/Tests/Types/Database/GreaterThanOrEqual.test.ts +65 -0
- package/Tests/Types/Database/GreaterThanOrNull.test.ts +63 -0
- package/Tests/Types/Database/Includes.test.ts +65 -0
- package/Tests/Types/Database/IncludesAll.test.ts +65 -0
- package/Tests/Types/Database/IncludesNone.test.ts +65 -0
- package/Tests/Types/Database/IsNull.test.ts +44 -0
- package/Tests/Types/Database/LessThan.test.ts +62 -0
- package/Tests/Types/Database/LessThanOrEqual.test.ts +62 -0
- package/Tests/Types/Database/LessThanOrNull.test.ts +62 -0
- package/Tests/Types/Database/MultiSearch.test.ts +81 -0
- package/Tests/Types/Database/NotContains.test.ts +64 -0
- package/Tests/Types/Database/NotNull.test.ts +44 -0
- package/Tests/Types/Database/StartsWith.test.ts +64 -0
- package/Tests/Types/Monitor/MonitorStepSqlMonitor.test.ts +83 -1
- package/Tests/Types/Monitor/SnmpV3EnumParsing.test.ts +247 -0
- package/Tests/Types/Monitor/SnmpVendorTemplate.test.ts +263 -0
- package/Tests/UI/Components/XAxis.test.ts +5 -3
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +76 -0
- package/Tests/Utils/Metrics/MetricExplorerUrl.test.ts +622 -0
- package/Tests/Utils/Metrics/MetricFormulaEvaluator.test.ts +474 -0
- package/Tests/Utils/Telemetry/HeartbeatAvailability.test.ts +52 -4
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +11 -0
- package/Types/BaseDatabase/AggregateBy.ts +31 -2
- package/Types/BaseDatabase/AggregatedResult.ts +22 -0
- package/Types/BaseDatabase/AggregationInterval.ts +11 -0
- package/Types/BaseDatabase/AggregationIntervalUtil.ts +30 -5
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +16 -0
- package/Types/Email/EmailTemplateType.ts +3 -0
- package/Types/Marketing/MarketingConversion.ts +11 -0
- package/Types/Metrics/MetricQueryConfigData.ts +21 -0
- package/Types/Metrics/MetricQueryData.ts +8 -0
- package/Types/Metrics/MetricViewData.ts +8 -0
- package/Types/Monitor/MonitorMetricType.ts +8 -0
- package/Types/Monitor/MonitorStep.ts +9 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +12 -0
- package/Types/Monitor/MonitorType.ts +2 -1
- package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +17 -12
- package/Types/Monitor/SnmpMonitor/CdpNeighbor.ts +13 -0
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +37 -3
- package/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.ts +46 -0
- package/Types/Monitor/SnmpMonitor/SnmpEntityInfo.ts +15 -0
- package/Types/Monitor/SnmpMonitor/SnmpInterface.ts +8 -0
- package/Types/Monitor/SnmpMonitor/SnmpMonitorResponse.ts +17 -8
- package/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.ts +53 -0
- package/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.ts +43 -0
- package/Types/Monitor/SnmpMonitor/SnmpSystemInfo.ts +16 -0
- package/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.ts +119 -3
- package/Types/NetFlow/NetworkFlowRecord.ts +25 -0
- package/Types/Syslog/SyslogMessage.ts +18 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +9 -0
- package/Types/Telemetry/TelemetrySavedViewType.ts +12 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +51 -0
- package/UI/Components/Charts/Bar/BarChart.tsx +51 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +97 -26
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +328 -1
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +115 -0
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +328 -1
- package/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.ts +7 -0
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +15 -0
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +13 -0
- package/UI/Components/Charts/Line/LineChart.tsx +51 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +12 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +12 -0
- package/UI/Components/Charts/Types/XAxis/XAxisPrecision.ts +1 -0
- package/UI/Components/Charts/Utils/DataPoint.ts +0 -0
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +169 -0
- package/UI/Components/Charts/Utils/XAxis.ts +28 -4
- package/UI/Components/Icon/Icon.tsx +33 -13
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +9 -0
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +67 -0
- package/UI/Components/Page/ModelPage.tsx +6 -1
- package/UI/Components/TelemetryViewer/components/SavedViewsDropdown.tsx +33 -4
- package/UI/Styles/Theme.css +10 -0
- package/UI/Utils/User.ts +41 -2
- package/Utils/Analytics.ts +8 -6
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +74 -0
- package/Utils/Metrics/MetricExplorerUrl.ts +771 -0
- package/Utils/Metrics/MetricFormulaEvaluator.ts +410 -46
- package/Utils/Monitor/NetworkTopologyUtil.ts +261 -49
- package/Utils/ValueFormatter.ts +22 -1
- package/build/dist/Models/AnalyticsModels/Index.js +13 -0
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js +159 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByContainer.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js +158 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js +160 -0
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByService.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js +351 -0
- package/build/dist/Models/AnalyticsModels/NetworkFlow.js.map +1 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js +19 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicenseInstance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalConfig.js +38 -0
- package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +219 -0
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MetricSavedView.js +35 -0
- package/build/dist/Models/DatabaseModels/MetricSavedView.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricType.js +76 -0
- package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +341 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js +116 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkInterface.js +60 -0
- package/build/dist/Models/DatabaseModels/NetworkInterface.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +38 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/User.js +38 -0
- package/build/dist/Models/DatabaseModels/User.js.map +1 -1
- package/build/dist/Server/API/BaseAnalyticsAPI.js +19 -0
- package/build/dist/Server/API/BaseAnalyticsAPI.js.map +1 -1
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +8 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +51 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js +27 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414522-AddCounterSemanticsToMetricType.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js +21 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784191414600-AddViewTypeToMetricSavedView.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js +47 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784211212164-AddNetworkDeviceInventoryAndDiscoverySchedule.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784218257664-AddEnterpriseLicenseNotificationColumns.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784293516000-AddAttributionColumnsToUserAndProject.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js +20 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1784298000000-AddMarketingConversionTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +12 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +58 -4
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +12 -0
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +10 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MarketingConversionService.js +9 -0
- package/build/dist/Server/Services/MarketingConversionService.js.map +1 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js +29 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByContainerService.js.map +1 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js +29 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByK8sClusterService.js.map +1 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js +29 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByServiceService.js.map +1 -0
- package/build/dist/Server/Services/MetricService.js +761 -125
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +18 -5
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js +44 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerTeamService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js +88 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerUserService.js.map +1 -1
- package/build/dist/Server/Services/NetworkFlowService.js +9 -0
- package/build/dist/Server/Services/NetworkFlowService.js.map +1 -0
- package/build/dist/Server/Services/OnCallDutyPolicyService.js +15 -6
- package/build/dist/Server/Services/OnCallDutyPolicyService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +107 -6
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +8 -6
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +10 -0
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamMemberService.js +11 -0
- package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +52 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js +33 -7
- package/build/dist/Server/Types/AnalyticsDatabase/AggregateBy.js.map +1 -1
- package/build/dist/Server/Utils/Attribution.js +74 -0
- package/build/dist/Server/Utils/Attribution.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +40 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js +20 -0
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +177 -0
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +113 -0
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +109 -0
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +130 -0
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +126 -0
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +53 -9
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +21 -10
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +54 -11
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +43 -3
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +68 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +15 -0
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +100 -15
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/ProductAnalytics.js +111 -0
- package/build/dist/Server/Utils/ProductAnalytics.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +32 -5
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +11 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationInterval.js +11 -0
- package/build/dist/Types/BaseDatabase/AggregationInterval.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js +33 -5
- package/build/dist/Types/BaseDatabase/AggregationIntervalUtil.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +2 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Marketing/MarketingConversion.js +13 -0
- package/build/dist/Types/Marketing/MarketingConversion.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js +7 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +6 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js +3 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +2 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/CdpNeighbor.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js +41 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpAuthProtocol.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpEntityInfo.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js +48 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpPrivProtocol.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js +38 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSecurityLevel.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js +2 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpSystemInfo.js.map +1 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js +96 -3
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpVendorTemplate.js.map +1 -1
- package/build/dist/Types/NetFlow/NetworkFlowRecord.js +2 -0
- package/build/dist/Types/NetFlow/NetworkFlowRecord.js.map +1 -0
- package/build/dist/Types/Syslog/SyslogMessage.js +2 -0
- package/build/dist/Types/Syslog/SyslogMessage.js.map +1 -0
- package/build/dist/Types/Telemetry/TelemetrySavedViewState.js +0 -7
- package/build/dist/Types/Telemetry/TelemetrySavedViewState.js.map +1 -1
- package/build/dist/Types/Telemetry/TelemetrySavedViewType.js +13 -0
- package/build/dist/Types/Telemetry/TelemetrySavedViewType.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +25 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +26 -2
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +36 -12
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +208 -6
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +52 -3
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +208 -6
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js +6 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/ChartDataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js +2 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js +2 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +25 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js +2 -0
- package/build/dist/UI/Components/Charts/Types/ReferenceRegionProps.js.map +1 -0
- package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js +2 -0
- package/build/dist/UI/Components/Charts/Types/TimeReferenceLineProps.js.map +1 -0
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js +1 -0
- package/build/dist/UI/Components/Charts/Types/XAxis/XAxisPrecision.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js +0 -0
- package/build/dist/UI/Components/Charts/Utils/DataPoint.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +121 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +27 -4
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +15 -8
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +58 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Page/ModelPage.js +7 -1
- package/build/dist/UI/Components/Page/ModelPage.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js +10 -4
- package/build/dist/UI/Components/TelemetryViewer/components/SavedViewsDropdown.js.map +1 -1
- package/build/dist/UI/Utils/User.js +35 -2
- package/build/dist/UI/Utils/User.js.map +1 -1
- package/build/dist/Utils/Analytics.js +8 -5
- package/build/dist/Utils/Analytics.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +57 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js +418 -0
- package/build/dist/Utils/Metrics/MetricExplorerUrl.js.map +1 -0
- package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js +296 -37
- package/build/dist/Utils/Metrics/MetricFormulaEvaluator.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +176 -40
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +20 -1
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
|
|
2
|
+
import AnalyticsTableEngine from "../../Types/AnalyticsDatabase/AnalyticsTableEngine";
|
|
3
|
+
import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
|
|
4
|
+
import AnalyticsTableColumn from "../../Types/AnalyticsDatabase/TableColumn";
|
|
5
|
+
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
|
|
6
|
+
/**
|
|
7
|
+
* Per-(k8s cluster, minute) pre-aggregated rollup of `MetricItemV3` value
|
|
8
|
+
* samples — sibling of `MetricItemAggMV1mByHostV2`, keyed by the stable
|
|
9
|
+
* 16-hex `k8sClusterEntityKey` the ingest pipeline stamps on every row
|
|
10
|
+
* whose resource carries a Kubernetes cluster identity. Cluster identity
|
|
11
|
+
* is `k8s.cluster.name` ONLY (see `TelemetryEntity.k8sClusterIdentity`),
|
|
12
|
+
* so the read side can derive the key directly from the incoming
|
|
13
|
+
* `resource.k8s.cluster.name` filter via
|
|
14
|
+
* `EntityKey.keyForKubernetesCluster` — no registry lookup needed.
|
|
15
|
+
*
|
|
16
|
+
* Populated by `MetricItemAggMV1mByK8sCluster_mv` (declared below;
|
|
17
|
+
* created idempotently by boot schema-sync — the service is registered
|
|
18
|
+
* in AnalyticsServices — and backfilled from `MetricItemV3` by the
|
|
19
|
+
* AddMetricEntityMinuteAggregateMaterializedViews migration). Rows whose
|
|
20
|
+
* resource carries no cluster entity (`k8sClusterEntityKey = ''`) are
|
|
21
|
+
* filtered out so the rollup stays small.
|
|
22
|
+
*
|
|
23
|
+
* Read access goes through
|
|
24
|
+
* `MetricService.tryBuildEntityAggregateMVStatement` — the dominant path
|
|
25
|
+
* for the Kubernetes cluster detail page's Metrics tab.
|
|
26
|
+
*
|
|
27
|
+
* No CRUD API; read-only infrastructure populated entirely by the MV.
|
|
28
|
+
*/
|
|
29
|
+
export default class MetricItemAggMV1mByK8sCluster extends AnalyticsBaseModel {
|
|
30
|
+
constructor() {
|
|
31
|
+
const projectIdColumn = new AnalyticsTableColumn({
|
|
32
|
+
key: "projectId",
|
|
33
|
+
title: "Project ID",
|
|
34
|
+
description: "ID of project (tenant key, replicated from MetricItemV3)",
|
|
35
|
+
required: true,
|
|
36
|
+
type: TableColumnType.Text,
|
|
37
|
+
isTenantId: true,
|
|
38
|
+
});
|
|
39
|
+
const nameColumn = new AnalyticsTableColumn({
|
|
40
|
+
key: "name",
|
|
41
|
+
title: "Metric Name",
|
|
42
|
+
description: "Metric name (replicated from MetricItemV3)",
|
|
43
|
+
required: true,
|
|
44
|
+
type: TableColumnType.Text,
|
|
45
|
+
});
|
|
46
|
+
const k8sClusterEntityKeyColumn = new AnalyticsTableColumn({
|
|
47
|
+
key: "k8sClusterEntityKey",
|
|
48
|
+
title: "Kubernetes Cluster Entity Key",
|
|
49
|
+
description: "Stable 16-hex k8s cluster entity key (EntityKey.keyForKubernetesCluster) replicated from MetricItemV3.k8sClusterEntityKey at insert time. Rows without one are filtered out by the MV's WHERE clause so this column is always populated for rows that exist.",
|
|
50
|
+
required: true,
|
|
51
|
+
type: TableColumnType.Text,
|
|
52
|
+
});
|
|
53
|
+
const bucketTimeColumn = new AnalyticsTableColumn({
|
|
54
|
+
key: "bucketTime",
|
|
55
|
+
title: "Bucket Time",
|
|
56
|
+
description: "Start of the 1-minute bucket this row aggregates. Computed by the MV as toStartOfMinute(time).",
|
|
57
|
+
required: true,
|
|
58
|
+
type: TableColumnType.Date,
|
|
59
|
+
});
|
|
60
|
+
const valueSumStateColumn = new AnalyticsTableColumn({
|
|
61
|
+
key: "valueSumState",
|
|
62
|
+
title: "Sum (state)",
|
|
63
|
+
description: "AggregateFunction(sum, Float64) state for valueSum. Read via sumMerge(valueSumState).",
|
|
64
|
+
required: true,
|
|
65
|
+
type: TableColumnType.AggregateFunction,
|
|
66
|
+
aggregateFunctionDefinition: "sum, Float64",
|
|
67
|
+
});
|
|
68
|
+
const valueCountStateColumn = new AnalyticsTableColumn({
|
|
69
|
+
key: "valueCountState",
|
|
70
|
+
title: "Count (state)",
|
|
71
|
+
description: "AggregateFunction(count, Float64) state for valueCount. Read via countMerge(valueCountState).",
|
|
72
|
+
required: true,
|
|
73
|
+
type: TableColumnType.AggregateFunction,
|
|
74
|
+
aggregateFunctionDefinition: "count, Float64",
|
|
75
|
+
});
|
|
76
|
+
const valueMinStateColumn = new AnalyticsTableColumn({
|
|
77
|
+
key: "valueMinState",
|
|
78
|
+
title: "Min (state)",
|
|
79
|
+
description: "AggregateFunction(min, Float64) state. Read via minMerge(valueMinState).",
|
|
80
|
+
required: true,
|
|
81
|
+
type: TableColumnType.AggregateFunction,
|
|
82
|
+
aggregateFunctionDefinition: "min, Float64",
|
|
83
|
+
});
|
|
84
|
+
const valueMaxStateColumn = new AnalyticsTableColumn({
|
|
85
|
+
key: "valueMaxState",
|
|
86
|
+
title: "Max (state)",
|
|
87
|
+
description: "AggregateFunction(max, Float64) state. Read via maxMerge(valueMaxState).",
|
|
88
|
+
required: true,
|
|
89
|
+
type: TableColumnType.AggregateFunction,
|
|
90
|
+
aggregateFunctionDefinition: "max, Float64",
|
|
91
|
+
});
|
|
92
|
+
const retentionDateColumn = new AnalyticsTableColumn({
|
|
93
|
+
key: "retentionDate",
|
|
94
|
+
title: "Retention Date",
|
|
95
|
+
description: "Date after which this row is eligible for TTL deletion. Computed by the MV as max(retentionDate) per bucket — inherits from the source MetricItemV3 rows.",
|
|
96
|
+
required: true,
|
|
97
|
+
type: TableColumnType.Date,
|
|
98
|
+
});
|
|
99
|
+
super({
|
|
100
|
+
tableName: AnalyticsTableName.MetricItemAggMV1mByK8sCluster,
|
|
101
|
+
tableEngine: AnalyticsTableEngine.AggregatingMergeTree,
|
|
102
|
+
singularName: "Metric 1-Minute Aggregate (By Kubernetes Cluster Entity Key)",
|
|
103
|
+
pluralName: "Metric 1-Minute Aggregates (By Kubernetes Cluster Entity Key)",
|
|
104
|
+
tableColumns: [
|
|
105
|
+
projectIdColumn,
|
|
106
|
+
nameColumn,
|
|
107
|
+
k8sClusterEntityKeyColumn,
|
|
108
|
+
bucketTimeColumn,
|
|
109
|
+
valueSumStateColumn,
|
|
110
|
+
valueCountStateColumn,
|
|
111
|
+
valueMinStateColumn,
|
|
112
|
+
valueMaxStateColumn,
|
|
113
|
+
retentionDateColumn,
|
|
114
|
+
],
|
|
115
|
+
projections: [],
|
|
116
|
+
/*
|
|
117
|
+
* Per-cluster materialized view, reading the ingest-stamped
|
|
118
|
+
* `k8sClusterEntityKey` scalar column (contract C3) rather than the
|
|
119
|
+
* raw attributes map. Canonical definition; created idempotently by
|
|
120
|
+
* the analytics schema-sync on boot
|
|
121
|
+
* (MetricItemAggMV1mByK8sClusterService is registered in
|
|
122
|
+
* AnalyticsServices, so a wiped ClickHouse volume self-heals) and
|
|
123
|
+
* backfilled by the AddMetricEntityMinuteAggregateMaterializedViews
|
|
124
|
+
* migration. Rows without a cluster entity are filtered out so the
|
|
125
|
+
* per-cluster MV stays small.
|
|
126
|
+
*/
|
|
127
|
+
materializedViews: [
|
|
128
|
+
{
|
|
129
|
+
name: "MetricItemAggMV1mByK8sCluster_mv",
|
|
130
|
+
query: `CREATE MATERIALIZED VIEW IF NOT EXISTS MetricItemAggMV1mByK8sCluster_mv
|
|
131
|
+
TO MetricItemAggMV1mByK8sCluster
|
|
132
|
+
AS
|
|
133
|
+
SELECT
|
|
134
|
+
projectId,
|
|
135
|
+
name,
|
|
136
|
+
k8sClusterEntityKey,
|
|
137
|
+
toStartOfMinute(time) AS bucketTime,
|
|
138
|
+
sumState(toFloat64(coalesce(value, sum, 0))) AS valueSumState,
|
|
139
|
+
countState(toFloat64(coalesce(value, sum, 0))) AS valueCountState,
|
|
140
|
+
minState(toFloat64(coalesce(value, sum, 0))) AS valueMinState,
|
|
141
|
+
maxState(toFloat64(coalesce(value, sum, 0))) AS valueMaxState,
|
|
142
|
+
max(retentionDate) AS retentionDate
|
|
143
|
+
FROM MetricItemV3
|
|
144
|
+
WHERE k8sClusterEntityKey != ''
|
|
145
|
+
GROUP BY projectId, name, k8sClusterEntityKey, bucketTime`,
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
sortKeys: ["projectId", "name", "k8sClusterEntityKey", "bucketTime"],
|
|
149
|
+
primaryKeys: ["projectId", "name", "k8sClusterEntityKey", "bucketTime"],
|
|
150
|
+
partitionKey: "toYYYYMM(bucketTime)",
|
|
151
|
+
// Align with this MV's GROUP BY (projectId, name, k8sClusterEntityKey).
|
|
152
|
+
shardingKey: "cityHash64(projectId, name, k8sClusterEntityKey)",
|
|
153
|
+
tableSettings: "ttl_only_drop_parts = 1, non_replicated_deduplication_window = 10000",
|
|
154
|
+
ttlExpression: "retentionDate DELETE",
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=MetricItemAggMV1mByK8sCluster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricItemAggMV1mByK8sCluster.js","sourceRoot":"","sources":["../../../../Models/AnalyticsModels/MetricItemAggMV1mByK8sCluster.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
|
|
2
|
+
import AnalyticsTableEngine from "../../Types/AnalyticsDatabase/AnalyticsTableEngine";
|
|
3
|
+
import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
|
|
4
|
+
import AnalyticsTableColumn from "../../Types/AnalyticsDatabase/TableColumn";
|
|
5
|
+
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
|
|
6
|
+
/**
|
|
7
|
+
* Per-(service, minute) pre-aggregated rollup of `MetricItemV3` value
|
|
8
|
+
* samples — sibling of `MetricItemAggMV1mByHostV2`, keyed by the stable
|
|
9
|
+
* 16-hex `serviceEntityKey` the ingest pipeline stamps on every row whose
|
|
10
|
+
* resource carries a service identity (service.name, plus
|
|
11
|
+
* service.namespace when present — see the service resolver in
|
|
12
|
+
* Common/Server/Utils/Telemetry/TelemetryEntity).
|
|
13
|
+
*
|
|
14
|
+
* Because the namespace is folded into the key at ingest, ONE
|
|
15
|
+
* `service.name` can map to SEVERAL serviceEntityKeys (one per
|
|
16
|
+
* namespace variant). The read side therefore never derives a single
|
|
17
|
+
* key from the name: `MetricService.tryBuildEntityAggregateMVStatement`
|
|
18
|
+
* resolves the full key set from the Postgres TelemetryEntity registry
|
|
19
|
+
* and compiles `serviceEntityKey IN (<keys>)`, falling back to the raw
|
|
20
|
+
* table when the registry has no rows for the name.
|
|
21
|
+
*
|
|
22
|
+
* Populated by `MetricItemAggMV1mByService_mv` (declared below; created
|
|
23
|
+
* idempotently by boot schema-sync — the service is registered in
|
|
24
|
+
* AnalyticsServices — and backfilled from `MetricItemV3` by the
|
|
25
|
+
* AddMetricEntityMinuteAggregateMaterializedViews migration). Rows whose
|
|
26
|
+
* resource carries no service entity (`serviceEntityKey = ''`) are
|
|
27
|
+
* filtered out.
|
|
28
|
+
*
|
|
29
|
+
* No CRUD API; read-only infrastructure populated entirely by the MV.
|
|
30
|
+
*/
|
|
31
|
+
export default class MetricItemAggMV1mByService extends AnalyticsBaseModel {
|
|
32
|
+
constructor() {
|
|
33
|
+
const projectIdColumn = new AnalyticsTableColumn({
|
|
34
|
+
key: "projectId",
|
|
35
|
+
title: "Project ID",
|
|
36
|
+
description: "ID of project (tenant key, replicated from MetricItemV3)",
|
|
37
|
+
required: true,
|
|
38
|
+
type: TableColumnType.Text,
|
|
39
|
+
isTenantId: true,
|
|
40
|
+
});
|
|
41
|
+
const nameColumn = new AnalyticsTableColumn({
|
|
42
|
+
key: "name",
|
|
43
|
+
title: "Metric Name",
|
|
44
|
+
description: "Metric name (replicated from MetricItemV3)",
|
|
45
|
+
required: true,
|
|
46
|
+
type: TableColumnType.Text,
|
|
47
|
+
});
|
|
48
|
+
const serviceEntityKeyColumn = new AnalyticsTableColumn({
|
|
49
|
+
key: "serviceEntityKey",
|
|
50
|
+
title: "Service Entity Key",
|
|
51
|
+
description: "Stable 16-hex service entity key (EntityKey.keyForService — service.name + optional service.namespace) replicated from MetricItemV3.serviceEntityKey at insert time. Rows without one are filtered out by the MV's WHERE clause so this column is always populated for rows that exist.",
|
|
52
|
+
required: true,
|
|
53
|
+
type: TableColumnType.Text,
|
|
54
|
+
});
|
|
55
|
+
const bucketTimeColumn = new AnalyticsTableColumn({
|
|
56
|
+
key: "bucketTime",
|
|
57
|
+
title: "Bucket Time",
|
|
58
|
+
description: "Start of the 1-minute bucket this row aggregates. Computed by the MV as toStartOfMinute(time).",
|
|
59
|
+
required: true,
|
|
60
|
+
type: TableColumnType.Date,
|
|
61
|
+
});
|
|
62
|
+
const valueSumStateColumn = new AnalyticsTableColumn({
|
|
63
|
+
key: "valueSumState",
|
|
64
|
+
title: "Sum (state)",
|
|
65
|
+
description: "AggregateFunction(sum, Float64) state for valueSum. Read via sumMerge(valueSumState).",
|
|
66
|
+
required: true,
|
|
67
|
+
type: TableColumnType.AggregateFunction,
|
|
68
|
+
aggregateFunctionDefinition: "sum, Float64",
|
|
69
|
+
});
|
|
70
|
+
const valueCountStateColumn = new AnalyticsTableColumn({
|
|
71
|
+
key: "valueCountState",
|
|
72
|
+
title: "Count (state)",
|
|
73
|
+
description: "AggregateFunction(count, Float64) state for valueCount. Read via countMerge(valueCountState).",
|
|
74
|
+
required: true,
|
|
75
|
+
type: TableColumnType.AggregateFunction,
|
|
76
|
+
aggregateFunctionDefinition: "count, Float64",
|
|
77
|
+
});
|
|
78
|
+
const valueMinStateColumn = new AnalyticsTableColumn({
|
|
79
|
+
key: "valueMinState",
|
|
80
|
+
title: "Min (state)",
|
|
81
|
+
description: "AggregateFunction(min, Float64) state. Read via minMerge(valueMinState).",
|
|
82
|
+
required: true,
|
|
83
|
+
type: TableColumnType.AggregateFunction,
|
|
84
|
+
aggregateFunctionDefinition: "min, Float64",
|
|
85
|
+
});
|
|
86
|
+
const valueMaxStateColumn = new AnalyticsTableColumn({
|
|
87
|
+
key: "valueMaxState",
|
|
88
|
+
title: "Max (state)",
|
|
89
|
+
description: "AggregateFunction(max, Float64) state. Read via maxMerge(valueMaxState).",
|
|
90
|
+
required: true,
|
|
91
|
+
type: TableColumnType.AggregateFunction,
|
|
92
|
+
aggregateFunctionDefinition: "max, Float64",
|
|
93
|
+
});
|
|
94
|
+
const retentionDateColumn = new AnalyticsTableColumn({
|
|
95
|
+
key: "retentionDate",
|
|
96
|
+
title: "Retention Date",
|
|
97
|
+
description: "Date after which this row is eligible for TTL deletion. Computed by the MV as max(retentionDate) per bucket — inherits from the source MetricItemV3 rows.",
|
|
98
|
+
required: true,
|
|
99
|
+
type: TableColumnType.Date,
|
|
100
|
+
});
|
|
101
|
+
super({
|
|
102
|
+
tableName: AnalyticsTableName.MetricItemAggMV1mByService,
|
|
103
|
+
tableEngine: AnalyticsTableEngine.AggregatingMergeTree,
|
|
104
|
+
singularName: "Metric 1-Minute Aggregate (By Service Entity Key)",
|
|
105
|
+
pluralName: "Metric 1-Minute Aggregates (By Service Entity Key)",
|
|
106
|
+
tableColumns: [
|
|
107
|
+
projectIdColumn,
|
|
108
|
+
nameColumn,
|
|
109
|
+
serviceEntityKeyColumn,
|
|
110
|
+
bucketTimeColumn,
|
|
111
|
+
valueSumStateColumn,
|
|
112
|
+
valueCountStateColumn,
|
|
113
|
+
valueMinStateColumn,
|
|
114
|
+
valueMaxStateColumn,
|
|
115
|
+
retentionDateColumn,
|
|
116
|
+
],
|
|
117
|
+
projections: [],
|
|
118
|
+
/*
|
|
119
|
+
* Per-service materialized view, reading the ingest-stamped
|
|
120
|
+
* `serviceEntityKey` scalar column (contract C3) rather than the
|
|
121
|
+
* raw attributes map. Canonical definition; created idempotently by
|
|
122
|
+
* the analytics schema-sync on boot (MetricItemAggMV1mByServiceService
|
|
123
|
+
* is registered in AnalyticsServices, so a wiped ClickHouse volume
|
|
124
|
+
* self-heals) and backfilled by the
|
|
125
|
+
* AddMetricEntityMinuteAggregateMaterializedViews migration. Rows
|
|
126
|
+
* without a service entity are filtered out so the per-service MV
|
|
127
|
+
* stays smaller than the raw table.
|
|
128
|
+
*/
|
|
129
|
+
materializedViews: [
|
|
130
|
+
{
|
|
131
|
+
name: "MetricItemAggMV1mByService_mv",
|
|
132
|
+
query: `CREATE MATERIALIZED VIEW IF NOT EXISTS MetricItemAggMV1mByService_mv
|
|
133
|
+
TO MetricItemAggMV1mByService
|
|
134
|
+
AS
|
|
135
|
+
SELECT
|
|
136
|
+
projectId,
|
|
137
|
+
name,
|
|
138
|
+
serviceEntityKey,
|
|
139
|
+
toStartOfMinute(time) AS bucketTime,
|
|
140
|
+
sumState(toFloat64(coalesce(value, sum, 0))) AS valueSumState,
|
|
141
|
+
countState(toFloat64(coalesce(value, sum, 0))) AS valueCountState,
|
|
142
|
+
minState(toFloat64(coalesce(value, sum, 0))) AS valueMinState,
|
|
143
|
+
maxState(toFloat64(coalesce(value, sum, 0))) AS valueMaxState,
|
|
144
|
+
max(retentionDate) AS retentionDate
|
|
145
|
+
FROM MetricItemV3
|
|
146
|
+
WHERE serviceEntityKey != ''
|
|
147
|
+
GROUP BY projectId, name, serviceEntityKey, bucketTime`,
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
sortKeys: ["projectId", "name", "serviceEntityKey", "bucketTime"],
|
|
151
|
+
primaryKeys: ["projectId", "name", "serviceEntityKey", "bucketTime"],
|
|
152
|
+
partitionKey: "toYYYYMM(bucketTime)",
|
|
153
|
+
// Align with this MV's GROUP BY (projectId, name, serviceEntityKey).
|
|
154
|
+
shardingKey: "cityHash64(projectId, name, serviceEntityKey)",
|
|
155
|
+
tableSettings: "ttl_only_drop_parts = 1, non_replicated_deduplication_window = 10000",
|
|
156
|
+
ttlExpression: "retentionDate DELETE",
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=MetricItemAggMV1mByService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MetricItemAggMV1mByService.js","sourceRoot":"","sources":["../../../../Models/AnalyticsModels/MetricItemAggMV1mByService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import AnalyticsBaseModel from "./AnalyticsBaseModel/AnalyticsBaseModel";
|
|
2
|
+
import Route from "../../Types/API/Route";
|
|
3
|
+
import AnalyticsTableEngine from "../../Types/AnalyticsDatabase/AnalyticsTableEngine";
|
|
4
|
+
import AnalyticsTableName from "../../Types/AnalyticsDatabase/AnalyticsTableName";
|
|
5
|
+
import AnalyticsTableColumn from "../../Types/AnalyticsDatabase/TableColumn";
|
|
6
|
+
import TableColumnType from "../../Types/AnalyticsDatabase/TableColumnType";
|
|
7
|
+
import Permission from "../../Types/Permission";
|
|
8
|
+
/*
|
|
9
|
+
* One NetFlow v5 flow record exported by a network device, received by a
|
|
10
|
+
* probe's NetFlow receiver and correlated to a NetworkDevice on ingest.
|
|
11
|
+
* Powers top-talker / bandwidth-attribution queries: who talked to whom,
|
|
12
|
+
* over which protocol/port, and how many bytes/packets, per device.
|
|
13
|
+
*
|
|
14
|
+
* Access control mirrors the NetworkDevice database model — flows are an
|
|
15
|
+
* attribute of the device that exported them.
|
|
16
|
+
*/
|
|
17
|
+
const readPermissions = [
|
|
18
|
+
Permission.ProjectOwner,
|
|
19
|
+
Permission.ProjectAdmin,
|
|
20
|
+
Permission.ProjectMember,
|
|
21
|
+
Permission.Viewer,
|
|
22
|
+
Permission.SettingsAdmin,
|
|
23
|
+
Permission.SettingsMember,
|
|
24
|
+
Permission.SettingsViewer,
|
|
25
|
+
Permission.ReadNetworkDevice,
|
|
26
|
+
];
|
|
27
|
+
const createPermissions = [
|
|
28
|
+
Permission.ProjectOwner,
|
|
29
|
+
Permission.ProjectAdmin,
|
|
30
|
+
Permission.ProjectMember,
|
|
31
|
+
Permission.SettingsAdmin,
|
|
32
|
+
Permission.SettingsMember,
|
|
33
|
+
Permission.CreateNetworkDevice,
|
|
34
|
+
];
|
|
35
|
+
export default class NetworkFlow extends AnalyticsBaseModel {
|
|
36
|
+
constructor() {
|
|
37
|
+
const projectIdColumn = new AnalyticsTableColumn({
|
|
38
|
+
key: "projectId",
|
|
39
|
+
title: "Project ID",
|
|
40
|
+
description: "ID of project",
|
|
41
|
+
required: true,
|
|
42
|
+
type: TableColumnType.ObjectID,
|
|
43
|
+
isTenantId: true,
|
|
44
|
+
accessControl: {
|
|
45
|
+
read: readPermissions,
|
|
46
|
+
create: createPermissions,
|
|
47
|
+
update: [],
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
/*
|
|
51
|
+
* Required (not Nullable) even though a flow could in principle lack a
|
|
52
|
+
* device: the ingest path DROPS flows whose exporter matches no
|
|
53
|
+
* NetworkDevice (there is no project to attribute them to), so every
|
|
54
|
+
* stored row has one — and the column sits in the sort key, where
|
|
55
|
+
* ClickHouse rejects Nullable columns.
|
|
56
|
+
*/
|
|
57
|
+
const networkDeviceIdColumn = new AnalyticsTableColumn({
|
|
58
|
+
key: "networkDeviceId",
|
|
59
|
+
title: "Network Device ID",
|
|
60
|
+
description: "ID of the NetworkDevice that exported this flow (correlated from the exporter IP on ingest)",
|
|
61
|
+
required: true,
|
|
62
|
+
type: TableColumnType.ObjectID,
|
|
63
|
+
accessControl: {
|
|
64
|
+
read: readPermissions,
|
|
65
|
+
create: createPermissions,
|
|
66
|
+
update: [],
|
|
67
|
+
},
|
|
68
|
+
});
|
|
69
|
+
const exporterIpColumn = new AnalyticsTableColumn({
|
|
70
|
+
key: "exporterIp",
|
|
71
|
+
isLowCardinality: true,
|
|
72
|
+
title: "Exporter IP",
|
|
73
|
+
description: "Source IP of the NetFlow export datagram — the router/switch that observed the flow",
|
|
74
|
+
required: true,
|
|
75
|
+
type: TableColumnType.Text,
|
|
76
|
+
accessControl: {
|
|
77
|
+
read: readPermissions,
|
|
78
|
+
create: createPermissions,
|
|
79
|
+
update: [],
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
const srcIpColumn = new AnalyticsTableColumn({
|
|
83
|
+
key: "srcIp",
|
|
84
|
+
codec: { codec: "ZSTD", level: 1 },
|
|
85
|
+
title: "Source IP",
|
|
86
|
+
description: "Source IP address of the flow's traffic",
|
|
87
|
+
required: true,
|
|
88
|
+
type: TableColumnType.Text,
|
|
89
|
+
accessControl: {
|
|
90
|
+
read: readPermissions,
|
|
91
|
+
create: createPermissions,
|
|
92
|
+
update: [],
|
|
93
|
+
},
|
|
94
|
+
});
|
|
95
|
+
const dstIpColumn = new AnalyticsTableColumn({
|
|
96
|
+
key: "dstIp",
|
|
97
|
+
codec: { codec: "ZSTD", level: 1 },
|
|
98
|
+
title: "Destination IP",
|
|
99
|
+
description: "Destination IP address of the flow's traffic",
|
|
100
|
+
required: true,
|
|
101
|
+
type: TableColumnType.Text,
|
|
102
|
+
accessControl: {
|
|
103
|
+
read: readPermissions,
|
|
104
|
+
create: createPermissions,
|
|
105
|
+
update: [],
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
const srcPortColumn = new AnalyticsTableColumn({
|
|
109
|
+
key: "srcPort",
|
|
110
|
+
title: "Source Port",
|
|
111
|
+
description: "TCP/UDP source port (0 when not applicable)",
|
|
112
|
+
required: true,
|
|
113
|
+
type: TableColumnType.Number,
|
|
114
|
+
accessControl: {
|
|
115
|
+
read: readPermissions,
|
|
116
|
+
create: createPermissions,
|
|
117
|
+
update: [],
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
const dstPortColumn = new AnalyticsTableColumn({
|
|
121
|
+
key: "dstPort",
|
|
122
|
+
title: "Destination Port",
|
|
123
|
+
description: "TCP/UDP destination port (0 when not applicable)",
|
|
124
|
+
required: true,
|
|
125
|
+
type: TableColumnType.Number,
|
|
126
|
+
accessControl: {
|
|
127
|
+
read: readPermissions,
|
|
128
|
+
create: createPermissions,
|
|
129
|
+
update: [],
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
const protocolColumn = new AnalyticsTableColumn({
|
|
133
|
+
key: "protocol",
|
|
134
|
+
title: "Protocol",
|
|
135
|
+
description: "IP protocol number (6 = TCP, 17 = UDP, 1 = ICMP, ...)",
|
|
136
|
+
required: true,
|
|
137
|
+
type: TableColumnType.Number,
|
|
138
|
+
accessControl: {
|
|
139
|
+
read: readPermissions,
|
|
140
|
+
create: createPermissions,
|
|
141
|
+
update: [],
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
const octetsColumn = new AnalyticsTableColumn({
|
|
145
|
+
key: "octets",
|
|
146
|
+
title: "Octets",
|
|
147
|
+
description: "Total bytes in the flow",
|
|
148
|
+
required: true,
|
|
149
|
+
type: TableColumnType.UInt64,
|
|
150
|
+
accessControl: {
|
|
151
|
+
read: readPermissions,
|
|
152
|
+
create: createPermissions,
|
|
153
|
+
update: [],
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
const packetsColumn = new AnalyticsTableColumn({
|
|
157
|
+
key: "packets",
|
|
158
|
+
title: "Packets",
|
|
159
|
+
description: "Total packets in the flow",
|
|
160
|
+
required: true,
|
|
161
|
+
type: TableColumnType.UInt64,
|
|
162
|
+
accessControl: {
|
|
163
|
+
read: readPermissions,
|
|
164
|
+
create: createPermissions,
|
|
165
|
+
update: [],
|
|
166
|
+
},
|
|
167
|
+
});
|
|
168
|
+
const flowStartAtColumn = new AnalyticsTableColumn({
|
|
169
|
+
key: "flowStartAt",
|
|
170
|
+
codec: [{ codec: "DoubleDelta" }, { codec: "ZSTD", level: 1 }],
|
|
171
|
+
title: "Flow Start",
|
|
172
|
+
description: "Wall-clock time the flow started",
|
|
173
|
+
required: true,
|
|
174
|
+
type: TableColumnType.DateTime64,
|
|
175
|
+
accessControl: {
|
|
176
|
+
read: readPermissions,
|
|
177
|
+
create: createPermissions,
|
|
178
|
+
update: [],
|
|
179
|
+
},
|
|
180
|
+
});
|
|
181
|
+
const flowEndAtColumn = new AnalyticsTableColumn({
|
|
182
|
+
key: "flowEndAt",
|
|
183
|
+
codec: [{ codec: "DoubleDelta" }, { codec: "ZSTD", level: 1 }],
|
|
184
|
+
title: "Flow End",
|
|
185
|
+
description: "Wall-clock time the flow ended",
|
|
186
|
+
required: true,
|
|
187
|
+
type: TableColumnType.DateTime64,
|
|
188
|
+
accessControl: {
|
|
189
|
+
read: readPermissions,
|
|
190
|
+
create: createPermissions,
|
|
191
|
+
update: [],
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
const ingestedAtColumn = new AnalyticsTableColumn({
|
|
195
|
+
key: "ingestedAt",
|
|
196
|
+
codec: [{ codec: "DoubleDelta" }, { codec: "ZSTD", level: 1 }],
|
|
197
|
+
title: "Ingested At",
|
|
198
|
+
description: "When the server ingested this flow record",
|
|
199
|
+
required: true,
|
|
200
|
+
type: TableColumnType.DateTime64,
|
|
201
|
+
accessControl: {
|
|
202
|
+
read: readPermissions,
|
|
203
|
+
create: createPermissions,
|
|
204
|
+
update: [],
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
super({
|
|
208
|
+
tableName: AnalyticsTableName.NetworkFlow,
|
|
209
|
+
tableEngine: AnalyticsTableEngine.MergeTree,
|
|
210
|
+
singularName: "Network Flow",
|
|
211
|
+
accessControl: {
|
|
212
|
+
read: readPermissions,
|
|
213
|
+
create: createPermissions,
|
|
214
|
+
update: [
|
|
215
|
+
Permission.ProjectOwner,
|
|
216
|
+
Permission.ProjectAdmin,
|
|
217
|
+
Permission.ProjectMember,
|
|
218
|
+
Permission.SettingsAdmin,
|
|
219
|
+
Permission.SettingsMember,
|
|
220
|
+
Permission.EditNetworkDevice,
|
|
221
|
+
],
|
|
222
|
+
delete: [
|
|
223
|
+
Permission.ProjectOwner,
|
|
224
|
+
Permission.ProjectAdmin,
|
|
225
|
+
Permission.ProjectMember,
|
|
226
|
+
Permission.SettingsAdmin,
|
|
227
|
+
Permission.SettingsMember,
|
|
228
|
+
Permission.DeleteNetworkDevice,
|
|
229
|
+
],
|
|
230
|
+
},
|
|
231
|
+
pluralName: "Network Flows",
|
|
232
|
+
crudApiPath: new Route("/network-flow"),
|
|
233
|
+
tableColumns: [
|
|
234
|
+
projectIdColumn,
|
|
235
|
+
networkDeviceIdColumn,
|
|
236
|
+
exporterIpColumn,
|
|
237
|
+
srcIpColumn,
|
|
238
|
+
dstIpColumn,
|
|
239
|
+
srcPortColumn,
|
|
240
|
+
dstPortColumn,
|
|
241
|
+
protocolColumn,
|
|
242
|
+
octetsColumn,
|
|
243
|
+
packetsColumn,
|
|
244
|
+
flowStartAtColumn,
|
|
245
|
+
flowEndAtColumn,
|
|
246
|
+
ingestedAtColumn,
|
|
247
|
+
],
|
|
248
|
+
projections: [],
|
|
249
|
+
sortKeys: ["projectId", "networkDeviceId", "flowStartAt"],
|
|
250
|
+
primaryKeys: ["projectId", "networkDeviceId", "flowStartAt"],
|
|
251
|
+
partitionKey: "toYYYYMMDD(flowStartAt)",
|
|
252
|
+
/*
|
|
253
|
+
* Shard by (projectId, networkDeviceId, flowStartAt) — mirrors how
|
|
254
|
+
* Log shards on its always-present sort-key columns: the
|
|
255
|
+
* high-entropy time component spreads even a single very busy
|
|
256
|
+
* exporter across all shards.
|
|
257
|
+
*/
|
|
258
|
+
shardingKey: "cityHash64(projectId, networkDeviceId, flowStartAt)",
|
|
259
|
+
tableSettings: "non_replicated_deduplication_window = 10000",
|
|
260
|
+
/*
|
|
261
|
+
* Flows are the highest-volume rows in the product (a single busy
|
|
262
|
+
* router can export thousands per second), so the table must never
|
|
263
|
+
* grow unboundedly. Fixed-window TTL for now; per-project retention
|
|
264
|
+
* (a retentionDate column computed at ingest, like Log/Metric) is
|
|
265
|
+
* the phase-2 follow-up. Keyed on server-assigned ingestedAt so a
|
|
266
|
+
* device with a wrong clock cannot make rows expire early.
|
|
267
|
+
*/
|
|
268
|
+
ttlExpression: "ingestedAt + INTERVAL 30 DAY DELETE",
|
|
269
|
+
defaultSortColumn: "flowStartAt",
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
get projectId() {
|
|
273
|
+
return this.getColumnValue("projectId");
|
|
274
|
+
}
|
|
275
|
+
set projectId(v) {
|
|
276
|
+
this.setColumnValue("projectId", v);
|
|
277
|
+
}
|
|
278
|
+
get networkDeviceId() {
|
|
279
|
+
return this.getColumnValue("networkDeviceId");
|
|
280
|
+
}
|
|
281
|
+
set networkDeviceId(v) {
|
|
282
|
+
this.setColumnValue("networkDeviceId", v);
|
|
283
|
+
}
|
|
284
|
+
get exporterIp() {
|
|
285
|
+
return this.getColumnValue("exporterIp");
|
|
286
|
+
}
|
|
287
|
+
set exporterIp(v) {
|
|
288
|
+
this.setColumnValue("exporterIp", v);
|
|
289
|
+
}
|
|
290
|
+
get srcIp() {
|
|
291
|
+
return this.getColumnValue("srcIp");
|
|
292
|
+
}
|
|
293
|
+
set srcIp(v) {
|
|
294
|
+
this.setColumnValue("srcIp", v);
|
|
295
|
+
}
|
|
296
|
+
get dstIp() {
|
|
297
|
+
return this.getColumnValue("dstIp");
|
|
298
|
+
}
|
|
299
|
+
set dstIp(v) {
|
|
300
|
+
this.setColumnValue("dstIp", v);
|
|
301
|
+
}
|
|
302
|
+
get srcPort() {
|
|
303
|
+
return this.getColumnValue("srcPort");
|
|
304
|
+
}
|
|
305
|
+
set srcPort(v) {
|
|
306
|
+
this.setColumnValue("srcPort", v);
|
|
307
|
+
}
|
|
308
|
+
get dstPort() {
|
|
309
|
+
return this.getColumnValue("dstPort");
|
|
310
|
+
}
|
|
311
|
+
set dstPort(v) {
|
|
312
|
+
this.setColumnValue("dstPort", v);
|
|
313
|
+
}
|
|
314
|
+
get protocol() {
|
|
315
|
+
return this.getColumnValue("protocol");
|
|
316
|
+
}
|
|
317
|
+
set protocol(v) {
|
|
318
|
+
this.setColumnValue("protocol", v);
|
|
319
|
+
}
|
|
320
|
+
get octets() {
|
|
321
|
+
return this.getColumnValue("octets");
|
|
322
|
+
}
|
|
323
|
+
set octets(v) {
|
|
324
|
+
this.setColumnValue("octets", v);
|
|
325
|
+
}
|
|
326
|
+
get packets() {
|
|
327
|
+
return this.getColumnValue("packets");
|
|
328
|
+
}
|
|
329
|
+
set packets(v) {
|
|
330
|
+
this.setColumnValue("packets", v);
|
|
331
|
+
}
|
|
332
|
+
get flowStartAt() {
|
|
333
|
+
return this.getColumnValue("flowStartAt");
|
|
334
|
+
}
|
|
335
|
+
set flowStartAt(v) {
|
|
336
|
+
this.setColumnValue("flowStartAt", v);
|
|
337
|
+
}
|
|
338
|
+
get flowEndAt() {
|
|
339
|
+
return this.getColumnValue("flowEndAt");
|
|
340
|
+
}
|
|
341
|
+
set flowEndAt(v) {
|
|
342
|
+
this.setColumnValue("flowEndAt", v);
|
|
343
|
+
}
|
|
344
|
+
get ingestedAt() {
|
|
345
|
+
return this.getColumnValue("ingestedAt");
|
|
346
|
+
}
|
|
347
|
+
set ingestedAt(v) {
|
|
348
|
+
this.setColumnValue("ingestedAt", v);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
//# sourceMappingURL=NetworkFlow.js.map
|