@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,178 @@
|
|
|
1
|
+
import CriticalPathUtil, {
|
|
2
|
+
CriticalPathResult,
|
|
3
|
+
ServiceBreakdown,
|
|
4
|
+
SpanData,
|
|
5
|
+
SpanSelfTime,
|
|
6
|
+
} from "../../../Utils/Traces/CriticalPath";
|
|
7
|
+
import { describe, expect, test } from "@jest/globals";
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
* CriticalPathUtil is a zero-dependency interval/graph engine over trace spans.
|
|
11
|
+
* The math is subtle (overlapping-child interval merge, longest-weighted path
|
|
12
|
+
* with self-time), and its output drives the "where did the latency go" views,
|
|
13
|
+
* so these tests pin the numeric behavior with hand-computed fixtures.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
function span(
|
|
17
|
+
spanId: string,
|
|
18
|
+
parentSpanId: string | undefined,
|
|
19
|
+
start: number,
|
|
20
|
+
end: number,
|
|
21
|
+
primaryEntityId?: string,
|
|
22
|
+
): SpanData {
|
|
23
|
+
return {
|
|
24
|
+
spanId,
|
|
25
|
+
parentSpanId,
|
|
26
|
+
startTimeUnixNano: start,
|
|
27
|
+
endTimeUnixNano: end,
|
|
28
|
+
durationUnixNano: end - start,
|
|
29
|
+
primaryEntityId,
|
|
30
|
+
name: spanId,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe("CriticalPathUtil.computeSelfTimes", () => {
|
|
35
|
+
test("a leaf span's self-time equals its whole duration", () => {
|
|
36
|
+
const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
|
|
37
|
+
span("a", undefined, 0, 100),
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
const a: SpanSelfTime = times.get("a")!;
|
|
41
|
+
expect(a.selfTimeUnixNano).toBe(100);
|
|
42
|
+
expect(a.childTimeUnixNano).toBe(0);
|
|
43
|
+
expect(a.selfTimePercent).toBe(100);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
test("subtracts a single child's covered time", () => {
|
|
47
|
+
const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
|
|
48
|
+
span("root", undefined, 0, 100),
|
|
49
|
+
span("child", "root", 10, 40),
|
|
50
|
+
]);
|
|
51
|
+
|
|
52
|
+
expect(times.get("root")!.selfTimeUnixNano).toBe(70);
|
|
53
|
+
expect(times.get("root")!.childTimeUnixNano).toBe(30);
|
|
54
|
+
expect(times.get("root")!.selfTimePercent).toBe(70);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("sums two non-overlapping children", () => {
|
|
58
|
+
const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
|
|
59
|
+
span("root", undefined, 0, 100),
|
|
60
|
+
span("c1", "root", 10, 30),
|
|
61
|
+
span("c2", "root", 50, 80),
|
|
62
|
+
]);
|
|
63
|
+
// covered = 20 + 30 = 50 -> self = 50
|
|
64
|
+
expect(times.get("root")!.childTimeUnixNano).toBe(50);
|
|
65
|
+
expect(times.get("root")!.selfTimeUnixNano).toBe(50);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("merges overlapping children into one interval", () => {
|
|
69
|
+
const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
|
|
70
|
+
span("root", undefined, 0, 100),
|
|
71
|
+
span("c1", "root", 10, 50),
|
|
72
|
+
span("c2", "root", 30, 70),
|
|
73
|
+
]);
|
|
74
|
+
// merged interval [10,70] = 60 -> self = 40
|
|
75
|
+
expect(times.get("root")!.childTimeUnixNano).toBe(60);
|
|
76
|
+
expect(times.get("root")!.selfTimeUnixNano).toBe(40);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("clamps children that spill past the parent window", () => {
|
|
80
|
+
const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
|
|
81
|
+
span("root", undefined, 0, 100),
|
|
82
|
+
span("c1", "root", -50, 150),
|
|
83
|
+
]);
|
|
84
|
+
// clamped to [0,100] = 100 -> self = 0
|
|
85
|
+
expect(times.get("root")!.childTimeUnixNano).toBe(100);
|
|
86
|
+
expect(times.get("root")!.selfTimeUnixNano).toBe(0);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
test("self-time is floored at zero and percent is zero for a zero-duration span", () => {
|
|
90
|
+
const zero: SpanData = span("z", undefined, 5, 5);
|
|
91
|
+
const times: Map<string, SpanSelfTime> = CriticalPathUtil.computeSelfTimes([
|
|
92
|
+
zero,
|
|
93
|
+
]);
|
|
94
|
+
expect(times.get("z")!.selfTimeUnixNano).toBe(0);
|
|
95
|
+
expect(times.get("z")!.selfTimePercent).toBe(0);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
describe("CriticalPathUtil.computeCriticalPath", () => {
|
|
100
|
+
test("returns all-zero result for an empty trace", () => {
|
|
101
|
+
const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([]);
|
|
102
|
+
expect(result).toEqual({
|
|
103
|
+
criticalPathSpanIds: [],
|
|
104
|
+
totalTraceDurationUnixNano: 0,
|
|
105
|
+
criticalPathDurationUnixNano: 0,
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test("a single span is its own critical path", () => {
|
|
110
|
+
const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([
|
|
111
|
+
span("only", undefined, 0, 100),
|
|
112
|
+
]);
|
|
113
|
+
expect(result.criticalPathSpanIds).toEqual(["only"]);
|
|
114
|
+
expect(result.totalTraceDurationUnixNano).toBe(100);
|
|
115
|
+
expect(result.criticalPathDurationUnixNano).toBe(100);
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("follows the heavier of two parallel children", () => {
|
|
119
|
+
const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([
|
|
120
|
+
span("root", undefined, 0, 100),
|
|
121
|
+
span("fast", "root", 10, 40), // duration 30
|
|
122
|
+
span("slow", "root", 10, 90), // duration 80
|
|
123
|
+
]);
|
|
124
|
+
|
|
125
|
+
expect(result.criticalPathSpanIds).toEqual(["root", "slow"]);
|
|
126
|
+
expect(result.totalTraceDurationUnixNano).toBe(100);
|
|
127
|
+
// root self-time (100 - merged[10,90]=80 => 20) + slow weight 80 = 100
|
|
128
|
+
expect(result.criticalPathDurationUnixNano).toBe(100);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
test("treats a span whose parent is absent from the set as a root", () => {
|
|
132
|
+
const result: CriticalPathResult = CriticalPathUtil.computeCriticalPath([
|
|
133
|
+
span("orphan", "missing-parent", 0, 50),
|
|
134
|
+
]);
|
|
135
|
+
expect(result.criticalPathSpanIds).toEqual(["orphan"]);
|
|
136
|
+
expect(result.criticalPathDurationUnixNano).toBe(50);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
describe("CriticalPathUtil.computeServiceBreakdown", () => {
|
|
141
|
+
test("aggregates self-time per service and sorts descending", () => {
|
|
142
|
+
const breakdown: Array<ServiceBreakdown> =
|
|
143
|
+
CriticalPathUtil.computeServiceBreakdown([
|
|
144
|
+
span("root", undefined, 0, 100, "A"),
|
|
145
|
+
span("child", "root", 20, 60, "B"),
|
|
146
|
+
]);
|
|
147
|
+
|
|
148
|
+
// root self = 100 - 40 = 60 (service A); child self = 40 (service B)
|
|
149
|
+
expect(breakdown).toHaveLength(2);
|
|
150
|
+
expect(breakdown[0]!.primaryEntityId).toBe("A");
|
|
151
|
+
expect(breakdown[0]!.selfTimeUnixNano).toBe(60);
|
|
152
|
+
expect(breakdown[0]!.percentOfTrace).toBe(60);
|
|
153
|
+
expect(breakdown[1]!.primaryEntityId).toBe("B");
|
|
154
|
+
expect(breakdown[1]!.selfTimeUnixNano).toBe(40);
|
|
155
|
+
expect(breakdown[1]!.percentOfTrace).toBe(40);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
test("groups spans without a service id under 'unknown'", () => {
|
|
159
|
+
const breakdown: Array<ServiceBreakdown> =
|
|
160
|
+
CriticalPathUtil.computeServiceBreakdown([span("a", undefined, 0, 10)]);
|
|
161
|
+
|
|
162
|
+
expect(breakdown).toHaveLength(1);
|
|
163
|
+
expect(breakdown[0]!.primaryEntityId).toBe("unknown");
|
|
164
|
+
expect(breakdown[0]!.spanCount).toBe(1);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test("accumulates span counts and durations per service", () => {
|
|
168
|
+
const breakdown: Array<ServiceBreakdown> =
|
|
169
|
+
CriticalPathUtil.computeServiceBreakdown([
|
|
170
|
+
span("s1", undefined, 0, 100, "A"),
|
|
171
|
+
span("s2", undefined, 100, 150, "A"),
|
|
172
|
+
]);
|
|
173
|
+
|
|
174
|
+
expect(breakdown).toHaveLength(1);
|
|
175
|
+
expect(breakdown[0]!.spanCount).toBe(2);
|
|
176
|
+
expect(breakdown[0]!.totalDurationUnixNano).toBe(150);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import ValueFormatter from "../../Utils/ValueFormatter";
|
|
2
|
+
|
|
3
|
+
describe("ValueFormatter", () => {
|
|
4
|
+
describe("formatValue - bytes", () => {
|
|
5
|
+
test("scales bytes up to the right unit", () => {
|
|
6
|
+
expect(ValueFormatter.formatValue(1048576, "bytes")).toBe("1.05 MB");
|
|
7
|
+
expect(ValueFormatter.formatValue(1e6, "bytes")).toBe("1 MB");
|
|
8
|
+
expect(ValueFormatter.formatValue(1e9, "bytes")).toBe("1 GB");
|
|
9
|
+
expect(ValueFormatter.formatValue(1e12, "bytes")).toBe("1 TB");
|
|
10
|
+
expect(ValueFormatter.formatValue(1e15, "bytes")).toBe("1 PB");
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
test("keeps small byte values in B", () => {
|
|
14
|
+
expect(ValueFormatter.formatValue(512, "bytes")).toBe("512 B");
|
|
15
|
+
expect(ValueFormatter.formatValue(1, "bytes")).toBe("1 B");
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
test("recognizes UCUM byte aliases", () => {
|
|
19
|
+
expect(ValueFormatter.formatValue(2000, "By")).toBe("2 KB");
|
|
20
|
+
expect(ValueFormatter.formatValue(2000, "b")).toBe("2 KB");
|
|
21
|
+
expect(ValueFormatter.formatValue(2000, "byte")).toBe("2 KB");
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
test("renders 0 bytes with the natural byte unit", () => {
|
|
25
|
+
expect(ValueFormatter.formatValue(0, "bytes")).toBe("0 B");
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("handles negative byte values", () => {
|
|
29
|
+
expect(ValueFormatter.formatValue(-2000, "bytes")).toBe("-2 KB");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("formatValue - seconds", () => {
|
|
34
|
+
test("scales seconds into larger units", () => {
|
|
35
|
+
expect(ValueFormatter.formatValue(60, "seconds")).toBe("1 min");
|
|
36
|
+
expect(ValueFormatter.formatValue(3600, "seconds")).toBe("1 hours");
|
|
37
|
+
expect(ValueFormatter.formatValue(86400, "seconds")).toBe("1 days");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("scales sub-second values down", () => {
|
|
41
|
+
expect(ValueFormatter.formatValue(0.5, "seconds")).toBe("500 ms");
|
|
42
|
+
expect(ValueFormatter.formatValue(0.0005, "seconds")).toBe("500 µs");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("renders 0 seconds with the natural second unit, not ns", () => {
|
|
46
|
+
expect(ValueFormatter.formatValue(0, "seconds")).toBe("0 sec");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("recognizes second aliases", () => {
|
|
50
|
+
expect(ValueFormatter.formatValue(120, "s")).toBe("2 min");
|
|
51
|
+
expect(ValueFormatter.formatValue(120, "sec")).toBe("2 min");
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
describe("formatValue - milliseconds", () => {
|
|
56
|
+
test("scales milliseconds into seconds and beyond", () => {
|
|
57
|
+
expect(ValueFormatter.formatValue(1000, "ms")).toBe("1 sec");
|
|
58
|
+
expect(ValueFormatter.formatValue(60000, "ms")).toBe("1 min");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
test("keeps small ms values", () => {
|
|
62
|
+
expect(ValueFormatter.formatValue(5, "ms")).toBe("5 ms");
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("renders 0 ms with the natural ms unit", () => {
|
|
66
|
+
expect(ValueFormatter.formatValue(0, "ms")).toBe("0 ms");
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
describe("formatValue - percent", () => {
|
|
71
|
+
test("renders percent inline with two decimals", () => {
|
|
72
|
+
expect(ValueFormatter.formatValue(42, "%")).toBe("42.00%");
|
|
73
|
+
expect(ValueFormatter.formatValue(100, "%")).toBe("100.00%");
|
|
74
|
+
expect(ValueFormatter.formatValue(2.04, "%")).toBe("2.04%");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("treats spelled-out percent variants the same", () => {
|
|
78
|
+
expect(ValueFormatter.formatValue(50, "percent")).toBe("50.00%");
|
|
79
|
+
expect(ValueFormatter.formatValue(50, "percentage")).toBe("50.00%");
|
|
80
|
+
expect(ValueFormatter.formatValue(50, "pct")).toBe("50.00%");
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
test("non-finite percent falls back to 0.00", () => {
|
|
84
|
+
expect(ValueFormatter.formatValue(Infinity, "%")).toBe("0.00%");
|
|
85
|
+
expect(ValueFormatter.formatValue(NaN, "%")).toBe("0.00%");
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe("formatValue - dimensionless and fraction metrics", () => {
|
|
90
|
+
test("dimensionless unit '1' renders a bare number", () => {
|
|
91
|
+
expect(ValueFormatter.formatValue(1234, "1")).toBe("1.23K");
|
|
92
|
+
expect(ValueFormatter.formatValue(5, "1")).toBe("5");
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("empty unit renders a bare number", () => {
|
|
96
|
+
expect(ValueFormatter.formatValue(5, "")).toBe("5");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test("fraction metric with unit '1' renders as a percentage", () => {
|
|
100
|
+
expect(
|
|
101
|
+
ValueFormatter.formatValue(0.25, "1", {
|
|
102
|
+
metricName: "system.cpu.utilization",
|
|
103
|
+
}),
|
|
104
|
+
).toBe("25.00%");
|
|
105
|
+
expect(
|
|
106
|
+
ValueFormatter.formatValue(0.5, "1", {
|
|
107
|
+
metricName: "db.client.connection.usage_ratio",
|
|
108
|
+
}),
|
|
109
|
+
).toBe("50.00%");
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("non-fraction metric with unit '1' stays a bare number", () => {
|
|
113
|
+
expect(
|
|
114
|
+
ValueFormatter.formatValue(0.25, "1", {
|
|
115
|
+
metricName: "http.server.request.count",
|
|
116
|
+
}),
|
|
117
|
+
).toBe("0.25");
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
describe("formatValue - annotation-only units", () => {
|
|
122
|
+
test("renders bare number for UCUM annotation units", () => {
|
|
123
|
+
expect(ValueFormatter.formatValue(42, "{thread}")).toBe("42");
|
|
124
|
+
expect(ValueFormatter.formatValue(1500, "{packets}")).toBe("1.5K");
|
|
125
|
+
});
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
describe("formatValue - compound rate units", () => {
|
|
129
|
+
test("scales the numerator and keeps a compact denominator", () => {
|
|
130
|
+
expect(ValueFormatter.formatValue(1500000, "By/s")).toBe("1.5 MB/s");
|
|
131
|
+
expect(ValueFormatter.formatValue(2000, "bytes/s")).toBe("2 KB/s");
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("falls back to readable form for unknown numerator", () => {
|
|
135
|
+
expect(ValueFormatter.formatValue(5, "requests/s")).toBe(
|
|
136
|
+
"5 requests per Second",
|
|
137
|
+
);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
describe("formatValue - unknown units", () => {
|
|
142
|
+
test("formats number and appends a readable unit name", () => {
|
|
143
|
+
expect(ValueFormatter.formatValue(10, "hz")).toBe("10 Hertz");
|
|
144
|
+
expect(ValueFormatter.formatValue(5, "v")).toBe("5 Volts");
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("keeps the original unit when unrecognized", () => {
|
|
148
|
+
expect(ValueFormatter.formatValue(5, "widgets")).toBe("5 widgets");
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
describe("formatValue - large number abbreviation", () => {
|
|
153
|
+
test("abbreviates thousands, millions, billions", () => {
|
|
154
|
+
expect(ValueFormatter.formatValue(5000, "widgets")).toBe("5K widgets");
|
|
155
|
+
expect(ValueFormatter.formatValue(1500000, "widgets")).toBe(
|
|
156
|
+
"1.5M widgets",
|
|
157
|
+
);
|
|
158
|
+
expect(ValueFormatter.formatValue(2000000000, "widgets")).toBe(
|
|
159
|
+
"2B widgets",
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
test("trims trailing zeros but keeps distinguishing decimals", () => {
|
|
164
|
+
expect(ValueFormatter.formatValue(119250000000, "widgets")).toBe(
|
|
165
|
+
"119.25B widgets",
|
|
166
|
+
);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
describe("formatValue - small number precision", () => {
|
|
171
|
+
test("keeps two significant digits below 1", () => {
|
|
172
|
+
expect(ValueFormatter.formatValue(0.004, "widgets")).toBe(
|
|
173
|
+
"0.004 widgets",
|
|
174
|
+
);
|
|
175
|
+
expect(ValueFormatter.formatValue(0.006, "widgets")).toBe(
|
|
176
|
+
"0.006 widgets",
|
|
177
|
+
);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test("expands very small numbers out of exponential notation", () => {
|
|
181
|
+
const result: string = ValueFormatter.formatValue(0.00000012, "widgets");
|
|
182
|
+
// Should not fall back to exponential notation like "1.2e-7".
|
|
183
|
+
expect(result).not.toMatch(/e[+-]/i);
|
|
184
|
+
expect(result).toContain("0.00000012");
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
describe("isPercentUnit", () => {
|
|
189
|
+
test("returns true for percent variants", () => {
|
|
190
|
+
expect(ValueFormatter.isPercentUnit("%")).toBe(true);
|
|
191
|
+
expect(ValueFormatter.isPercentUnit("percent")).toBe(true);
|
|
192
|
+
expect(ValueFormatter.isPercentUnit("PERCENTAGE")).toBe(true);
|
|
193
|
+
expect(ValueFormatter.isPercentUnit(" pct ")).toBe(true);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
test("returns false otherwise", () => {
|
|
197
|
+
expect(ValueFormatter.isPercentUnit("bytes")).toBe(false);
|
|
198
|
+
expect(ValueFormatter.isPercentUnit(undefined)).toBe(false);
|
|
199
|
+
expect(ValueFormatter.isPercentUnit("")).toBe(false);
|
|
200
|
+
});
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
describe("isFractionMetric", () => {
|
|
204
|
+
test("matches utilization/ratio/fraction/percent suffixes", () => {
|
|
205
|
+
expect(ValueFormatter.isFractionMetric("system.cpu.utilization")).toBe(
|
|
206
|
+
true,
|
|
207
|
+
);
|
|
208
|
+
expect(ValueFormatter.isFractionMetric("some_ratio")).toBe(true);
|
|
209
|
+
expect(ValueFormatter.isFractionMetric("mem.fraction")).toBe(true);
|
|
210
|
+
expect(ValueFormatter.isFractionMetric("disk_percentage")).toBe(true);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
test("does not match unrelated names", () => {
|
|
214
|
+
expect(ValueFormatter.isFractionMetric("request.count")).toBe(false);
|
|
215
|
+
expect(ValueFormatter.isFractionMetric(undefined)).toBe(false);
|
|
216
|
+
expect(ValueFormatter.isFractionMetric("")).toBe(false);
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
describe("isHigherWorseMetric", () => {
|
|
221
|
+
test("returns false for higher-is-better metrics", () => {
|
|
222
|
+
expect(
|
|
223
|
+
ValueFormatter.isHigherWorseMetric("oneuptime.monitor.online"),
|
|
224
|
+
).toBe(false);
|
|
225
|
+
expect(ValueFormatter.isHigherWorseMetric("service.uptime")).toBe(false);
|
|
226
|
+
expect(ValueFormatter.isHigherWorseMetric("availability_percent")).toBe(
|
|
227
|
+
false,
|
|
228
|
+
);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test("returns true for higher-is-worse metrics", () => {
|
|
232
|
+
expect(ValueFormatter.isHigherWorseMetric("http.error.count")).toBe(true);
|
|
233
|
+
expect(ValueFormatter.isHigherWorseMetric("incident.count")).toBe(true);
|
|
234
|
+
expect(ValueFormatter.isHigherWorseMetric("request.latency")).toBe(true);
|
|
235
|
+
expect(ValueFormatter.isHigherWorseMetric("cpu.utilization")).toBe(true);
|
|
236
|
+
expect(ValueFormatter.isHigherWorseMetric("pod.restart")).toBe(true);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test("returns false for neutral counters and undefined", () => {
|
|
240
|
+
expect(ValueFormatter.isHigherWorseMetric("network.bytes")).toBe(false);
|
|
241
|
+
expect(ValueFormatter.isHigherWorseMetric(undefined)).toBe(false);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
test("higher-is-better token wins over higher-is-worse token", () => {
|
|
245
|
+
// Contains both "uptime" (better) and would otherwise be neutral.
|
|
246
|
+
expect(ValueFormatter.isHigherWorseMetric("system.uptime.seconds")).toBe(
|
|
247
|
+
false,
|
|
248
|
+
);
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
describe("isScalableUnit", () => {
|
|
253
|
+
test("true for known scalable units", () => {
|
|
254
|
+
expect(ValueFormatter.isScalableUnit("bytes")).toBe(true);
|
|
255
|
+
expect(ValueFormatter.isScalableUnit("ms")).toBe(true);
|
|
256
|
+
expect(ValueFormatter.isScalableUnit("By")).toBe(true);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test("false for empty or unknown units", () => {
|
|
260
|
+
expect(ValueFormatter.isScalableUnit("")).toBe(false);
|
|
261
|
+
expect(ValueFormatter.isScalableUnit(" ")).toBe(false);
|
|
262
|
+
expect(ValueFormatter.isScalableUnit("%")).toBe(false);
|
|
263
|
+
expect(ValueFormatter.isScalableUnit("widgets")).toBe(false);
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
describe("getReadableUnit", () => {
|
|
268
|
+
test("maps UCUM codes to readable names", () => {
|
|
269
|
+
expect(ValueFormatter.getReadableUnit("By")).toBe("Bytes");
|
|
270
|
+
expect(ValueFormatter.getReadableUnit("s")).toBe("Seconds");
|
|
271
|
+
expect(ValueFormatter.getReadableUnit("ms")).toBe("Milliseconds");
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
test("dimensionless returns empty string", () => {
|
|
275
|
+
expect(ValueFormatter.getReadableUnit("1")).toBe("");
|
|
276
|
+
expect(ValueFormatter.getReadableUnit("")).toBe("");
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
test("fraction metric with '1' returns Percent", () => {
|
|
280
|
+
expect(
|
|
281
|
+
ValueFormatter.getReadableUnit("1", {
|
|
282
|
+
metricName: "cpu.utilization",
|
|
283
|
+
}),
|
|
284
|
+
).toBe("Percent");
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
test("percent variants return Percent", () => {
|
|
288
|
+
expect(ValueFormatter.getReadableUnit("%")).toBe("Percent");
|
|
289
|
+
expect(ValueFormatter.getReadableUnit("pct")).toBe("Percent");
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
test("annotation-only unit is capitalized", () => {
|
|
293
|
+
expect(ValueFormatter.getReadableUnit("{thread}")).toBe("Thread");
|
|
294
|
+
expect(ValueFormatter.getReadableUnit("{packets}")).toBe("Packets");
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
test("compound rate unit reads as 'X per Y' with singular denominator", () => {
|
|
298
|
+
expect(ValueFormatter.getReadableUnit("By/s")).toBe("Bytes per Second");
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
test("unknown unit is returned unchanged", () => {
|
|
302
|
+
expect(ValueFormatter.getReadableUnit("widgets")).toBe("widgets");
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
});
|
|
@@ -8,6 +8,7 @@ enum AnalyticsTableName {
|
|
|
8
8
|
Profile = "ProfileItemV3",
|
|
9
9
|
ProfileSample = "ProfileSampleItemV3",
|
|
10
10
|
AuditLog = "AuditLogV2",
|
|
11
|
+
KubernetesCostAllocation = "KubernetesCostAllocationV1",
|
|
11
12
|
/*
|
|
12
13
|
* Materialized-view target tables. These hold AggregateFunction
|
|
13
14
|
* states populated by attached MVs on the source `Metric` table.
|
|
@@ -33,6 +34,15 @@ enum AnalyticsTableName {
|
|
|
33
34
|
MetricItemAggMV1mByContainer = "MetricItemAggMV1mByContainer",
|
|
34
35
|
MetricBaselineHourly = "MetricBaselineHourly",
|
|
35
36
|
MutableMetric = "MutableMetricItem",
|
|
37
|
+
/*
|
|
38
|
+
* SLO / Error Budget history rollup. ReplacingMergeTree keyed by
|
|
39
|
+
* (projectId, sloId, metricName, bucketStart) with a `version` column
|
|
40
|
+
* so at-least-once evaluator writes and trailing re-writes dedupe to
|
|
41
|
+
* the latest value. Deliberately NOT MetricItemV3: its own monthly
|
|
42
|
+
* partitions + 400-day TTL keep long-lived SLO rows from pinning the
|
|
43
|
+
* daily raw-telemetry partitions (ttl_only_drop_parts hazard).
|
|
44
|
+
*/
|
|
45
|
+
SloHistory = "SloHistory",
|
|
36
46
|
}
|
|
37
47
|
|
|
38
48
|
export default AnalyticsTableName;
|
|
@@ -213,6 +213,27 @@ export default class AnalyticsTableColumn {
|
|
|
213
213
|
this._aggregateFunctionDefinition = v;
|
|
214
214
|
}
|
|
215
215
|
|
|
216
|
+
/*
|
|
217
|
+
* Optional ClickHouse SimpleAggregateFunction wrapper for scalar columns.
|
|
218
|
+
*
|
|
219
|
+
* Unlike AggregateFunction, a SimpleAggregateFunction keeps the scalar's
|
|
220
|
+
* ordinary wire/query type (for example DateTime) while teaching
|
|
221
|
+
* AggregatingMergeTree how to combine values during background merges.
|
|
222
|
+
* `max` on a DateTime retention column is the canonical use: reads and TTLs
|
|
223
|
+
* still see a DateTime, but rows sharing the sort key retain the latest
|
|
224
|
+
* expiry instead of an arbitrary one.
|
|
225
|
+
*
|
|
226
|
+
* The underlying type comes from `type`; this field contains only the
|
|
227
|
+
* function name, e.g. "max".
|
|
228
|
+
*/
|
|
229
|
+
private _simpleAggregateFunction: string | undefined;
|
|
230
|
+
public get simpleAggregateFunction(): string | undefined {
|
|
231
|
+
return this._simpleAggregateFunction;
|
|
232
|
+
}
|
|
233
|
+
public set simpleAggregateFunction(v: string | undefined) {
|
|
234
|
+
this._simpleAggregateFunction = v;
|
|
235
|
+
}
|
|
236
|
+
|
|
216
237
|
public constructor(data: {
|
|
217
238
|
key: string;
|
|
218
239
|
title: string;
|
|
@@ -232,6 +253,7 @@ export default class AnalyticsTableColumn {
|
|
|
232
253
|
isLowCardinality?: boolean | undefined;
|
|
233
254
|
mapKeysColumn?: string | undefined;
|
|
234
255
|
aggregateFunctionDefinition?: string | undefined;
|
|
256
|
+
simpleAggregateFunction?: string | undefined;
|
|
235
257
|
}) {
|
|
236
258
|
this.accessControl = data.accessControl;
|
|
237
259
|
this.key = data.key;
|
|
@@ -250,5 +272,6 @@ export default class AnalyticsTableColumn {
|
|
|
250
272
|
this.isLowCardinality = data.isLowCardinality || false;
|
|
251
273
|
this.mapKeysColumn = data.mapKeysColumn;
|
|
252
274
|
this.aggregateFunctionDefinition = data.aggregateFunctionDefinition;
|
|
275
|
+
this.simpleAggregateFunction = data.simpleAggregateFunction;
|
|
253
276
|
}
|
|
254
277
|
}
|
|
@@ -15,7 +15,15 @@ export default class EqualTo<T extends CompareType> extends CompareBase<T> {
|
|
|
15
15
|
public override toJSON(): JSONObject {
|
|
16
16
|
return {
|
|
17
17
|
_type: ObjectType.EqualTo,
|
|
18
|
-
|
|
18
|
+
/*
|
|
19
|
+
* The RAW value is serialized (like GreaterThan / InBetween), not
|
|
20
|
+
* toString(): toString() stringifies a Date into a locale- and
|
|
21
|
+
* timezone-dependent form that loses milliseconds, and coerces a number
|
|
22
|
+
* into a string. JSON.stringify emits a raw Date as its full ISO
|
|
23
|
+
* timestamp, which the server binds at full precision — and which is
|
|
24
|
+
* what lets an equality filter survive a round trip through the URL.
|
|
25
|
+
*/
|
|
26
|
+
value: (this as EqualTo<T>).value,
|
|
19
27
|
};
|
|
20
28
|
}
|
|
21
29
|
|
|
@@ -17,7 +17,15 @@ export default class EqualToOrNull<
|
|
|
17
17
|
public override toJSON(): JSONObject {
|
|
18
18
|
return {
|
|
19
19
|
_type: ObjectType.EqualToOrNull,
|
|
20
|
-
|
|
20
|
+
/*
|
|
21
|
+
* The RAW value is serialized (like GreaterThan / InBetween), not
|
|
22
|
+
* toString(): toString() stringifies a Date into a locale- and
|
|
23
|
+
* timezone-dependent form that loses milliseconds, and coerces a number
|
|
24
|
+
* into a string. JSON.stringify emits a raw Date as its full ISO
|
|
25
|
+
* timestamp, which the server binds at full precision — and which is
|
|
26
|
+
* what lets an equality filter survive a round trip through the URL.
|
|
27
|
+
*/
|
|
28
|
+
value: (this as EqualToOrNull<T>).value,
|
|
21
29
|
};
|
|
22
30
|
}
|
|
23
31
|
|
|
@@ -14,7 +14,15 @@ export default class NotEqual<T extends CompareType> extends CompareBase<T> {
|
|
|
14
14
|
public override toJSON(): JSONObject {
|
|
15
15
|
return {
|
|
16
16
|
_type: ObjectType.NotEqual,
|
|
17
|
-
|
|
17
|
+
/*
|
|
18
|
+
* The RAW value is serialized (like GreaterThan / InBetween), not
|
|
19
|
+
* toString(): toString() stringifies a Date into a locale- and
|
|
20
|
+
* timezone-dependent form that loses milliseconds, and coerces a number
|
|
21
|
+
* into a string. JSON.stringify emits a raw Date as its full ISO
|
|
22
|
+
* timestamp, which the server binds at full precision — and which is
|
|
23
|
+
* what lets an equality filter survive a round trip through the URL.
|
|
24
|
+
*/
|
|
25
|
+
value: (this as NotEqual<T>).value,
|
|
18
26
|
};
|
|
19
27
|
}
|
|
20
28
|
|
|
@@ -12,6 +12,7 @@ enum DashboardComponentType {
|
|
|
12
12
|
IncidentList = `IncidentList`,
|
|
13
13
|
AlertList = `AlertList`,
|
|
14
14
|
MonitorList = `MonitorList`,
|
|
15
|
+
Slo = `Slo`,
|
|
15
16
|
KubernetesPodList = `KubernetesPodList`,
|
|
16
17
|
KubernetesNodeList = `KubernetesNodeList`,
|
|
17
18
|
KubernetesNamespaceList = `KubernetesNamespaceList`,
|
|
@@ -27,6 +27,7 @@ export enum EntityFilterModelType {
|
|
|
27
27
|
AlertState = "AlertState",
|
|
28
28
|
MonitorStatus = "MonitorStatus",
|
|
29
29
|
Monitor = "Monitor",
|
|
30
|
+
ServiceLevelObjective = "ServiceLevelObjective",
|
|
30
31
|
Label = "Label",
|
|
31
32
|
KubernetesCluster = "KubernetesCluster",
|
|
32
33
|
DockerHost = "DockerHost",
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import ObjectID from "../../ObjectID";
|
|
2
|
+
import DashboardComponentType from "../DashboardComponentType";
|
|
3
|
+
import BaseComponent from "./DashboardBaseComponent";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Which of the SLO's three tracked numbers the widget renders.
|
|
7
|
+
*
|
|
8
|
+
* These values are persisted inside the dashboard's JSON config, so they
|
|
9
|
+
* must never be renamed — only added to.
|
|
10
|
+
*/
|
|
11
|
+
export enum SloWidgetMetric {
|
|
12
|
+
Sli = "Sli",
|
|
13
|
+
ErrorBudgetRemaining = "ErrorBudgetRemaining",
|
|
14
|
+
BurnRate = "BurnRate",
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Tile renders the single current number (read from the SLO row that the
|
|
19
|
+
* evaluation worker keeps up to date). Chart renders the SloHistory
|
|
20
|
+
* series for the same metric over the dashboard's selected time range.
|
|
21
|
+
*/
|
|
22
|
+
export enum SloWidgetDisplayType {
|
|
23
|
+
Tile = "Tile",
|
|
24
|
+
Chart = "Chart",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export default interface DashboardSloComponent extends BaseComponent {
|
|
28
|
+
componentType: DashboardComponentType.Slo;
|
|
29
|
+
componentId: ObjectID;
|
|
30
|
+
arguments: {
|
|
31
|
+
/*
|
|
32
|
+
* ObjectID of the ServiceLevelObjective, held as a string because the
|
|
33
|
+
* EntityDropdown argument editor writes the raw `_id` and the whole
|
|
34
|
+
* component tree round-trips through the dashboard's JSON config.
|
|
35
|
+
* The renderer wraps it in `new ObjectID(...)` before querying.
|
|
36
|
+
*/
|
|
37
|
+
serviceLevelObjectiveId?: string | undefined;
|
|
38
|
+
sloMetric?: SloWidgetMetric | undefined;
|
|
39
|
+
displayType?: SloWidgetDisplayType | undefined;
|
|
40
|
+
widgetTitle?: string | undefined;
|
|
41
|
+
};
|
|
42
|
+
}
|