@oneuptime/common 10.8.1 → 11.0.0
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 +16 -18
- package/Models/AnalyticsModels/AuditLog.ts +3 -1
- package/Models/AnalyticsModels/ExceptionInstance.ts +200 -82
- package/Models/AnalyticsModels/Index.ts +7 -2
- package/Models/AnalyticsModels/Log.ts +197 -81
- package/Models/AnalyticsModels/Metric.ts +199 -86
- package/Models/AnalyticsModels/MetricBaselineHourly.ts +44 -25
- package/Models/AnalyticsModels/MetricItemAggMV1m.ts +23 -20
- package/Models/AnalyticsModels/{MetricItemAggMV1mByHost.ts → MetricItemAggMV1mByHostV2.ts} +58 -47
- package/Models/AnalyticsModels/MonitorLog.ts +5 -1
- package/Models/AnalyticsModels/Profile.ts +206 -85
- package/Models/AnalyticsModels/ProfileSample.ts +196 -83
- package/Models/AnalyticsModels/Span.ts +218 -85
- package/Models/DatabaseModels/CloudResourceInstance.ts +1 -2
- package/Models/DatabaseModels/CloudResourceOwnerTeam.ts +1 -2
- package/Models/DatabaseModels/CloudResourceOwnerUser.ts +1 -2
- package/Models/DatabaseModels/Index.ts +4 -0
- package/Models/DatabaseModels/Service.ts +29 -0
- package/Models/DatabaseModels/TelemetryEntity.ts +393 -0
- package/Models/DatabaseModels/TelemetryEntityRelationship.ts +294 -0
- package/Models/DatabaseModels/TelemetryException.ts +13 -12
- package/Models/DatabaseModels/TelemetryUsageBilling.ts +5 -5
- package/Server/API/AIAgentDataAPI.ts +13 -12
- package/Server/API/DashboardAPI.ts +2 -2
- package/Server/API/TelemetryAPI.ts +656 -141
- package/Server/API/TelemetryExceptionAPI.ts +2 -2
- package/Server/Infrastructure/ClickhouseConfig.ts +12 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.ts +1 -3
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.ts +6 -2
- package/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.ts +18 -6
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781011482945-MigrationName.ts +2317 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.ts +48 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.ts +70 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.ts +57 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.ts +207 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.ts +24 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Infrastructure/Queue.ts +36 -3
- package/Server/Middleware/TelemetryIngest.ts +27 -22
- package/Server/Services/AlertService.ts +9 -9
- package/Server/Services/AnalyticsDatabaseService.ts +204 -35
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +4 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +4 -1
- package/Server/Services/ExceptionAggregationService.ts +41 -18
- package/Server/Services/HostService.ts +2 -1
- package/Server/Services/IncidentService.ts +19 -19
- package/Server/Services/Index.ts +6 -2
- package/Server/Services/LogAggregationService.ts +116 -43
- package/Server/Services/MetricAggregationService.ts +29 -14
- package/Server/Services/MetricBaselineService.ts +34 -34
- package/Server/Services/MetricItemAggMV1mByHostV2Service.ts +30 -0
- package/Server/Services/MetricService.ts +119 -31
- package/Server/Services/OpenTelemetryIngestService.ts +189 -51
- package/Server/Services/ProfileAggregationService.ts +904 -126
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +4 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +4 -1
- package/Server/Services/ServerlessFunctionInstanceService.ts +4 -2
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +7 -2
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +7 -2
- package/Server/Services/ServiceService.ts +6 -0
- package/Server/Services/SpanService.ts +274 -14
- package/Server/Services/TelemetryEntityRelationshipService.ts +71 -0
- package/Server/Services/TelemetryEntityService.ts +246 -0
- package/Server/Services/TelemetryExceptionService.ts +27 -23
- package/Server/Services/TelemetryUsageBillingService.ts +38 -31
- package/Server/Services/TraceAggregationService.ts +875 -43
- package/Server/Types/AnalyticsDatabase/ModelPermission.ts +43 -2
- package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -2
- package/Server/Types/Database/Permissions/BasePermission.ts +37 -1
- package/Server/Types/Database/Permissions/OwnedScopePermission.ts +21 -3
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +1 -0
- package/Server/Types/Database/QueryHelper.ts +41 -0
- package/Server/Utils/Alert/AlertPrivacyFilter.ts +9 -2
- package/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.ts +9 -2
- package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +95 -0
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +133 -0
- package/Server/Utils/Incident/IncidentPrivacyFilter.ts +9 -2
- package/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.ts +9 -2
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +1 -1
- package/Server/Utils/Monitor/MonitorLogUtil.ts +1 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +3 -4
- package/Server/Utils/PrivacyFilterUtil.ts +72 -0
- package/Server/Utils/Profile/PprofEncoder.ts +135 -11
- package/Server/Utils/Telemetry/EntityRegistry.ts +316 -0
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +9 -3
- package/Server/Utils/Telemetry/TelemetryEntity.ts +783 -0
- package/Tests/Server/Services/AnalyticsDatabaseService.test.ts +79 -4
- package/Tests/Server/Services/LogAggregationService.test.ts +7 -2
- package/Tests/Server/Services/ProfileAggregationService.test.ts +280 -0
- package/Tests/Server/Services/ProfileBreakdown.test.ts +161 -0
- package/Tests/Server/Services/ProfileFunctionFocus.test.ts +349 -0
- package/Tests/Server/Services/TelemetryAttributeService.test.ts +1 -1
- package/Tests/Server/Services/TraceAggregationService.test.ts +403 -0
- package/Tests/Server/Types/AnalyticsDatabase/ModelPermissionOwnedScope.test.ts +114 -0
- package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +189 -0
- package/Tests/Server/Types/Database/Permissions/BasePermission.test.ts +118 -0
- package/Tests/Server/Types/Database/Permissions/OwnedScopePermission.test.ts +159 -0
- package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +275 -8
- package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +177 -0
- package/Tests/Server/Utils/Profile/PprofEncoder.test.ts +276 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +761 -0
- package/Tests/Types/Monitor/MonitorStepEntityScope.test.ts +275 -0
- package/Tests/Types/Text.test.ts +52 -0
- package/Tests/Utils/Telemetry/EntityKey.test.ts +150 -0
- package/Tests/Utils/Telemetry/EntityKeySqlParity.test.ts +40 -0
- package/Tests/Utils/Telemetry/EntityRelationship.test.ts +150 -0
- package/Tests/Utils/UUID.test.ts +47 -0
- package/Types/AnalyticsDatabase/AnalyticsTableName.ts +14 -9
- package/Types/AnalyticsDatabase/TableColumnType.ts +1 -0
- package/Types/Dashboard/DashboardComponentType.ts +1 -0
- package/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.ts +37 -0
- package/Types/Dashboard/DashboardTemplates.ts +4 -5
- package/Types/Log/LogQueryParser.ts +2 -2
- package/Types/Log/LogQueryToFilter.ts +2 -2
- package/Types/Monitor/MonitorStepExceptionMonitor.ts +19 -1
- package/Types/Monitor/MonitorStepLogMonitor.ts +20 -1
- package/Types/Monitor/MonitorStepMetricMonitor.ts +27 -0
- package/Types/Monitor/MonitorStepProfileMonitor.ts +19 -1
- package/Types/Monitor/MonitorStepTraceMonitor.ts +18 -1
- package/Types/Monitor/MonitorType.ts +8 -1
- package/Types/ObjectID.ts +10 -0
- package/Types/Permission.ts +4 -2
- package/Types/Telemetry/EntityRelationshipType.ts +31 -0
- package/Types/Telemetry/EntityType.ts +33 -0
- package/Types/Telemetry/TelemetrySavedViewState.ts +2 -0
- package/Types/Text.ts +34 -0
- package/Types/Trace/TraceAggregationType.ts +1 -0
- package/Types/Trace/TraceRecordingRuleDefinition.ts +74 -0
- package/UI/Components/BulkUpdate/BulkLabelActions.tsx +14 -14
- package/UI/Components/Forms/Fields/FormField.tsx +18 -12
- package/UI/Components/Input/Input.tsx +3 -1
- package/UI/Components/LogsViewer/LogsViewer.tsx +12 -9
- package/UI/Components/LogsViewer/components/LogDetailsPanel.tsx +10 -9
- package/UI/Components/LogsViewer/components/LogSearchBar.tsx +1 -1
- package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +2 -2
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +4 -4
- package/UI/Components/LogsViewer/components/LogsTable.tsx +5 -3
- package/UI/Components/Navbar/NavBarMenuModal.tsx +81 -44
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +33 -10
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +18 -3
- package/UI/Components/TelemetryViewer/components/TelemetryHistogram.tsx +91 -68
- package/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.tsx +9 -2
- package/UI/Components/TextArea/TextArea.tsx +3 -1
- package/UI/Components/Toast/Toast.tsx +4 -2
- package/UI/Utils/LogExport.ts +2 -2
- package/UI/Utils/TelemetryService.ts +20 -20
- package/Utils/Dashboard/Components/DashboardTraceChartComponent.ts +134 -0
- package/Utils/Dashboard/Components/Index.ts +7 -0
- package/Utils/Telemetry/EntityKey.ts +151 -0
- package/Utils/Telemetry/EntityRelationship.ts +113 -0
- package/Utils/Traces/CriticalPath.ts +7 -7
- package/Utils/UUID.ts +57 -0
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js +14 -13
- package/build/dist/Models/AnalyticsModels/AnalyticsBaseModel/AnalyticsBaseModel.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js +2 -1
- package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js +125 -22
- package/build/dist/Models/AnalyticsModels/ExceptionInstance.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Index.js +7 -2
- package/build/dist/Models/AnalyticsModels/Index.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Log.js +123 -22
- package/build/dist/Models/AnalyticsModels/Log.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Metric.js +125 -27
- package/build/dist/Models/AnalyticsModels/Metric.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js +38 -21
- package/build/dist/Models/AnalyticsModels/MetricBaselineHourly.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js +17 -16
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1m.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/{MetricItemAggMV1mByHost.js → MetricItemAggMV1mByHostV2.js} +54 -42
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHostV2.js.map +1 -0
- package/build/dist/Models/AnalyticsModels/MonitorLog.js +4 -1
- package/build/dist/Models/AnalyticsModels/MonitorLog.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Profile.js +132 -26
- package/build/dist/Models/AnalyticsModels/Profile.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ProfileSample.js +121 -23
- package/build/dist/Models/AnalyticsModels/ProfileSample.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/Span.js +144 -26
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceInstance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerTeam.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResourceOwnerUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +30 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js +419 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntity.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js +317 -0
- package/build/dist/Models/DatabaseModels/TelemetryEntityRelationship.js.map +1 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js +12 -12
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js +7 -7
- package/build/dist/Models/DatabaseModels/TelemetryUsageBilling.js.map +1 -1
- package/build/dist/Server/API/AIAgentDataAPI.js +14 -13
- package/build/dist/Server/API/AIAgentDataAPI.js.map +1 -1
- package/build/dist/Server/API/DashboardAPI.js +2 -2
- package/build/dist/Server/API/DashboardAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +425 -129
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryExceptionAPI.js +2 -2
- package/build/dist/Server/API/TelemetryExceptionAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js +12 -0
- package/build/dist/Server/Infrastructure/ClickhouseConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780931863719-AddTelemetryResourceMetadataColumns.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780933132562-AddServerlessFunctionTables.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1780935387827-AddCloudResourceTables.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781011482945-MigrationName.js +798 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781011482945-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781100000001-RenameTelemetryServiceIdToPrimaryEntityId.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.js +38 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000000-AddTelemetryEntityTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.js +33 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781200000001-AddTelemetryEntityRelationshipTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.js +78 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781250074195-MigrationName.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.js +19 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781300000000-AddTelemetryEntityLabels.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.js +18 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1781400000000-AddServiceTelemetrySdkLanguage.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +14 -3
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +16 -18
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertService.js +9 -9
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/AnalyticsDatabaseService.js +115 -40
- package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ExceptionAggregationService.js +38 -18
- package/build/dist/Server/Services/ExceptionAggregationService.js.map +1 -1
- package/build/dist/Server/Services/HostService.js +2 -1
- package/build/dist/Server/Services/HostService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +19 -19
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -2
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LogAggregationService.js +100 -42
- package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricAggregationService.js +27 -14
- package/build/dist/Server/Services/MetricAggregationService.js.map +1 -1
- package/build/dist/Server/Services/MetricBaselineService.js +28 -28
- package/build/dist/Server/Services/MetricBaselineService.js.map +1 -1
- package/build/dist/Server/Services/MetricItemAggMV1mByHostV2Service.js +28 -0
- package/build/dist/Server/Services/MetricItemAggMV1mByHostV2Service.js.map +1 -0
- package/build/dist/Server/Services/MetricService.js +116 -31
- package/build/dist/Server/Services/MetricService.js.map +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +103 -36
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ProfileAggregationService.js +613 -105
- package/build/dist/Server/Services/ProfileAggregationService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js +4 -2
- package/build/dist/Server/Services/ServerlessFunctionInstanceService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +2 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +2 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +9 -5
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/SpanService.js +217 -15
- package/build/dist/Server/Services/SpanService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js +72 -0
- package/build/dist/Server/Services/TelemetryEntityRelationshipService.js.map +1 -0
- package/build/dist/Server/Services/TelemetryEntityService.js +201 -0
- package/build/dist/Server/Services/TelemetryEntityService.js.map +1 -0
- package/build/dist/Server/Services/TelemetryExceptionService.js +18 -18
- package/build/dist/Server/Services/TelemetryExceptionService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +27 -21
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/TraceAggregationService.js +568 -43
- package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +38 -2
- package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +36 -2
- package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js +25 -1
- package/build/dist/Server/Types/Database/Permissions/BasePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js +17 -3
- package/build/dist/Server/Types/Database/Permissions/OwnedScopePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +1 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +31 -0
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/Alert/AlertPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/AlertEpisode/AlertEpisodePrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -0
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +97 -3
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
- package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/Incident/IncidentPrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.js +3 -2
- package/build/dist/Server/Utils/IncidentEpisode/IncidentEpisodePrivacyFilter.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +1 -2
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +3 -4
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/PrivacyFilterUtil.js +47 -0
- package/build/dist/Server/Utils/PrivacyFilterUtil.js.map +1 -0
- package/build/dist/Server/Utils/Profile/PprofEncoder.js +132 -4
- package/build/dist/Server/Utils/Profile/PprofEncoder.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +228 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +5 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +569 -0
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -0
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js +14 -9
- package/build/dist/Types/AnalyticsDatabase/AnalyticsTableName.js.map +1 -1
- package/build/dist/Types/AnalyticsDatabase/TableColumnType.js +1 -0
- package/build/dist/Types/AnalyticsDatabase/TableColumnType.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/DashboardTraceChartComponent.js +2 -0
- package/build/dist/Types/Dashboard/DashboardComponents/DashboardTraceChartComponent.js.map +1 -0
- package/build/dist/Types/Dashboard/DashboardTemplates.js +4 -5
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/Log/LogQueryParser.js +2 -2
- package/build/dist/Types/Log/LogQueryParser.js.map +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js +1 -1
- package/build/dist/Types/Log/LogQueryToFilter.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepExceptionMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepLogMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepLogMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js +13 -0
- package/build/dist/Types/Monitor/MonitorStepMetricMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepProfileMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepProfileMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepTraceMonitor.js +9 -1
- package/build/dist/Types/Monitor/MonitorStepTraceMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +8 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/ObjectID.js +9 -0
- package/build/dist/Types/ObjectID.js.map +1 -1
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityRelationshipType.js +32 -0
- package/build/dist/Types/Telemetry/EntityRelationshipType.js.map +1 -0
- package/build/dist/Types/Telemetry/EntityType.js +34 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -0
- package/build/dist/Types/Text.js +32 -1
- package/build/dist/Types/Text.js.map +1 -1
- package/build/dist/Types/Trace/TraceAggregationType.js +1 -0
- package/build/dist/Types/Trace/TraceAggregationType.js.map +1 -1
- package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js +50 -1
- package/build/dist/Types/Trace/TraceRecordingRuleDefinition.js.map +1 -1
- package/build/dist/UI/Components/BulkUpdate/BulkLabelActions.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +15 -12
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +3 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +10 -9
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js +8 -8
- package/build/dist/UI/Components/LogsViewer/components/LogDetailsPanel.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogSearchBar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +2 -2
- package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +4 -4
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js +3 -3
- package/build/dist/UI/Components/LogsViewer/components/LogsTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +43 -30
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +6 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -3
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js +18 -10
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogram.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js +4 -2
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryHistogramTooltip.js.map +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js +3 -1
- package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
- package/build/dist/UI/Components/Toast/Toast.js +4 -2
- package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
- package/build/dist/UI/Utils/LogExport.js +2 -2
- package/build/dist/UI/Utils/LogExport.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +16 -16
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/Dashboard/Components/DashboardTraceChartComponent.js +110 -0
- package/build/dist/Utils/Dashboard/Components/DashboardTraceChartComponent.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/Telemetry/EntityKey.js +115 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js +71 -0
- package/build/dist/Utils/Telemetry/EntityRelationship.js.map +1 -0
- package/build/dist/Utils/Traces/CriticalPath.js +5 -5
- package/build/dist/Utils/Traces/CriticalPath.js.map +1 -1
- package/build/dist/Utils/UUID.js +50 -0
- package/build/dist/Utils/UUID.js.map +1 -1
- package/package.json +2 -1
- package/tsconfig.json +10 -1
- package/Server/Services/MetricItemAggMV1mByHostService.ts +0 -30
- package/Types/Profile/ProfileMetricType.ts +0 -16
- package/build/dist/Models/AnalyticsModels/MetricItemAggMV1mByHost.js.map +0 -1
- package/build/dist/Server/Services/MetricItemAggMV1mByHostService.js +0 -28
- package/build/dist/Server/Services/MetricItemAggMV1mByHostService.js.map +0 -1
- package/build/dist/Tests/MockType.js +0 -5
- package/build/dist/Tests/MockType.js.map +0 -1
- package/build/dist/Tests/Models/AnalyticsModels/Log.test.js +0 -12
- package/build/dist/Tests/Models/AnalyticsModels/Log.test.js.map +0 -1
- package/build/dist/Tests/Models/File.test.js +0 -10
- package/build/dist/Tests/Models/File.test.js.map +0 -1
- package/build/dist/Tests/Server/API/BaseAPI.test.js +0 -590
- package/build/dist/Tests/Server/API/BaseAPI.test.js.map +0 -1
- package/build/dist/Tests/Server/API/Helpers.js +0 -27
- package/build/dist/Tests/Server/API/Helpers.js.map +0 -1
- package/build/dist/Tests/Server/API/ProbeAPI.test.js +0 -84
- package/build/dist/Tests/Server/API/ProbeAPI.test.js.map +0 -1
- package/build/dist/Tests/Server/API/ProjectAPI.test.js +0 -170
- package/build/dist/Tests/Server/API/ProjectAPI.test.js.map +0 -1
- package/build/dist/Tests/Server/API/UserSmsApi.test.js +0 -177
- package/build/dist/Tests/Server/API/UserSmsApi.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/BearerTokenAuthorization.test.js +0 -63
- package/build/dist/Tests/Server/Middleware/BearerTokenAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/ClusterKeyAuthorization.test.js +0 -58
- package/build/dist/Tests/Server/Middleware/ClusterKeyAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/NotificationMiddleware.test.js +0 -101
- package/build/dist/Tests/Server/Middleware/NotificationMiddleware.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js +0 -160
- package/build/dist/Tests/Server/Middleware/ProjectAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js +0 -410
- package/build/dist/Tests/Server/Middleware/UserAuthorization.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js +0 -165
- package/build/dist/Tests/Server/Services/AlertEpisodeMemberService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js +0 -193
- package/build/dist/Tests/Server/Services/AlertEpisodeService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js +0 -435
- package/build/dist/Tests/Server/Services/AlertGroupingEngineService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js +0 -320
- package/build/dist/Tests/Server/Services/AlertGroupingRuleService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js +0 -266
- package/build/dist/Tests/Server/Services/AnalyticsDatabaseService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/BillingService.test.js +0 -910
- package/build/dist/Tests/Server/Services/BillingService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/LogAggregationService.test.js +0 -75
- package/build/dist/Tests/Server/Services/LogAggregationService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/ProbeService.test.js +0 -127
- package/build/dist/Tests/Server/Services/ProbeService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js +0 -114
- package/build/dist/Tests/Server/Services/ScheduledMaintenanceService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/TeamMemberService.test.js +0 -106
- package/build/dist/Tests/Server/Services/TeamMemberService.test.js.map +0 -1
- package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js +0 -50
- package/build/dist/Tests/Server/Services/TelemetryAttributeService.test.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Init.js +0 -4
- package/build/dist/Tests/Server/TestingUtils/Init.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Postgres/TestDataSourceOptions.js +0 -9
- package/build/dist/Tests/Server/TestingUtils/Postgres/TestDataSourceOptions.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Redis/TestRedisOptions.js +0 -16
- package/build/dist/Tests/Server/TestingUtils/Redis/TestRedisOptions.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/BillingServiceHelper.js +0 -125
- package/build/dist/Tests/Server/TestingUtils/Services/BillingServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/ProjectServiceHelper.js +0 -39
- package/build/dist/Tests/Server/TestingUtils/Services/ProjectServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceServiceHelper.js +0 -20
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceStateServiceHelper.js +0 -31
- package/build/dist/Tests/Server/TestingUtils/Services/ScheduledMaintenanceStateServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/TeamMemberServiceHelper.js +0 -14
- package/build/dist/Tests/Server/TestingUtils/Services/TeamMemberServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/TeamServiceHelper.js +0 -21
- package/build/dist/Tests/Server/TestingUtils/Services/TeamServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/Types.js +0 -2
- package/build/dist/Tests/Server/TestingUtils/Services/Types.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/Services/UserServiceHelper.js +0 -37
- package/build/dist/Tests/Server/TestingUtils/Services/UserServiceHelper.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/__mocks__/Stripe.mock.js +0 -13
- package/build/dist/Tests/Server/TestingUtils/__mocks__/Stripe.mock.js.map +0 -1
- package/build/dist/Tests/Server/TestingUtils/__mocks__/TestDatabase.mock.js +0 -22
- package/build/dist/Tests/Server/TestingUtils/__mocks__/TestDatabase.mock.js.map +0 -1
- package/build/dist/Tests/Server/Types/Domain.test.js +0 -78
- package/build/dist/Tests/Server/Types/Domain.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/Statement.test.js +0 -94
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/Statement.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js +0 -459
- package/build/dist/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Cookie.test.js +0 -83
- package/build/dist/Tests/Server/Utils/Cookie.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/CronTab.test.js +0 -29
- package/build/dist/Tests/Server/Utils/CronTab.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/JsonToCsv.test.js +0 -114
- package/build/dist/Tests/Server/Utils/JsonToCsv.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js +0 -606
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.js +0 -255
- package/build/dist/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.js +0 -142
- package/build/dist/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/StatusPageResource.test.js +0 -122
- package/build/dist/Tests/Server/Utils/StatusPageResource.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js +0 -0
- package/build/dist/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.js.map +0 -1
- package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js +0 -205
- package/build/dist/Tests/Server/Utils/VM/VMAPI.test.js.map +0 -1
- package/build/dist/Tests/Spy.js +0 -4
- package/build/dist/Tests/Spy.js.map +0 -1
- package/build/dist/Tests/Types/API/ErrorResponse.test.js +0 -13
- package/build/dist/Tests/Types/API/ErrorResponse.test.js.map +0 -1
- package/build/dist/Tests/Types/API/HTTPErrorResponse.test.js +0 -33
- package/build/dist/Tests/Types/API/HTTPErrorResponse.test.js.map +0 -1
- package/build/dist/Tests/Types/API/HTTPMethod.test.js +0 -16
- package/build/dist/Tests/Types/API/HTTPMethod.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Headers.test.js +0 -14
- package/build/dist/Tests/Types/API/Headers.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Hostname.test.js +0 -22
- package/build/dist/Tests/Types/API/Hostname.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Protocal.test.js +0 -19
- package/build/dist/Tests/Types/API/Protocal.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Response.test.js +0 -14
- package/build/dist/Tests/Types/API/Response.test.js.map +0 -1
- package/build/dist/Tests/Types/API/ResponseType.test.js +0 -13
- package/build/dist/Tests/Types/API/ResponseType.test.js.map +0 -1
- package/build/dist/Tests/Types/API/Route.test.js +0 -30
- package/build/dist/Tests/Types/API/Route.test.js.map +0 -1
- package/build/dist/Tests/Types/API/StatusCode.test.js +0 -26
- package/build/dist/Tests/Types/API/StatusCode.test.js.map +0 -1
- package/build/dist/Tests/Types/API/URL.test.js +0 -33
- package/build/dist/Tests/Types/API/URL.test.js.map +0 -1
- package/build/dist/Tests/Types/Alerts/AlertEventType.test.js +0 -34
- package/build/dist/Tests/Types/Alerts/AlertEventType.test.js.map +0 -1
- package/build/dist/Tests/Types/Alerts/AlertType.test.js +0 -19
- package/build/dist/Tests/Types/Alerts/AlertType.test.js.map +0 -1
- package/build/dist/Tests/Types/AppEnvironment.test.js +0 -13
- package/build/dist/Tests/Types/AppEnvironment.test.js.map +0 -1
- package/build/dist/Tests/Types/ApplicationLog/ApplicationLogType.test.js +0 -13
- package/build/dist/Tests/Types/ApplicationLog/ApplicationLogType.test.js.map +0 -1
- package/build/dist/Tests/Types/ArrayUtil.test.js +0 -71
- package/build/dist/Tests/Types/ArrayUtil.test.js.map +0 -1
- package/build/dist/Tests/Types/Billing/SubscriptionPlan.test.js +0 -181
- package/build/dist/Tests/Types/Billing/SubscriptionPlan.test.js.map +0 -1
- package/build/dist/Tests/Types/BrandColors.test.js +0 -124
- package/build/dist/Tests/Types/BrandColors.test.js.map +0 -1
- package/build/dist/Tests/Types/Char.test.js +0 -82
- package/build/dist/Tests/Types/Char.test.js.map +0 -1
- package/build/dist/Tests/Types/Code/CodeType.test.js +0 -13
- package/build/dist/Tests/Types/Code/CodeType.test.js.map +0 -1
- package/build/dist/Tests/Types/Color.test.js +0 -44
- package/build/dist/Tests/Types/Color.test.js.map +0 -1
- package/build/dist/Tests/Types/Company/CompanySize.test.js +0 -20
- package/build/dist/Tests/Types/Company/CompanySize.test.js.map +0 -1
- package/build/dist/Tests/Types/Company/JobRole.test.js +0 -22
- package/build/dist/Tests/Types/Company/JobRole.test.js.map +0 -1
- package/build/dist/Tests/Types/Countries.test.js +0 -249
- package/build/dist/Tests/Types/Countries.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/ColumnLength.test.js +0 -43
- package/build/dist/Tests/Types/Database/ColumnLength.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/ColumnType.test.js +0 -79
- package/build/dist/Tests/Types/Database/ColumnType.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/Columns.test.js +0 -20
- package/build/dist/Tests/Types/Database/Columns.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/CompareBase.test.js +0 -37
- package/build/dist/Tests/Types/Database/CompareBase.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/Date.test.js +0 -62
- package/build/dist/Tests/Types/Database/Date.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/EqualTo.test.js +0 -65
- package/build/dist/Tests/Types/Database/EqualTo.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/EqualToOrNull.test.js +0 -62
- package/build/dist/Tests/Types/Database/EqualToOrNull.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/InBetween.test.js +0 -72
- package/build/dist/Tests/Types/Database/InBetween.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/LimitMax.test.js +0 -18
- package/build/dist/Tests/Types/Database/LimitMax.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/NotEqual.test.js +0 -19
- package/build/dist/Tests/Types/Database/NotEqual.test.js.map +0 -1
- package/build/dist/Tests/Types/Database/Search.test.js +0 -10
- package/build/dist/Tests/Types/Database/Search.test.js.map +0 -1
- package/build/dist/Tests/Types/DatabaseType.test.js +0 -7
- package/build/dist/Tests/Types/DatabaseType.test.js.map +0 -1
- package/build/dist/Tests/Types/Date.test.js +0 -194
- package/build/dist/Tests/Types/Date.test.js.map +0 -1
- package/build/dist/Tests/Types/Dictionary.test.js +0 -25
- package/build/dist/Tests/Types/Dictionary.test.js.map +0 -1
- package/build/dist/Tests/Types/Domain.test.js +0 -54
- package/build/dist/Tests/Types/Domain.test.js.map +0 -1
- package/build/dist/Tests/Types/Email/Email.test.js +0 -51
- package/build/dist/Tests/Types/Email/Email.test.js.map +0 -1
- package/build/dist/Tests/Types/EmailWithName.test.js +0 -36
- package/build/dist/Tests/Types/EmailWithName.test.js.map +0 -1
- package/build/dist/Tests/Types/EncryptionAlgorithm.test.js +0 -7
- package/build/dist/Tests/Types/EncryptionAlgorithm.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/ApiException.test.js +0 -10
- package/build/dist/Tests/Types/Exception/ApiException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/BadDataException.test.js +0 -12
- package/build/dist/Tests/Types/Exception/BadDataException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/BadOperationException.test.js +0 -10
- package/build/dist/Tests/Types/Exception/BadOperationException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/BadRequestException.test.js +0 -12
- package/build/dist/Tests/Types/Exception/BadRequestException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/DatabaseNotConnectedException.test.js +0 -10
- package/build/dist/Tests/Types/Exception/DatabaseNotConnectedException.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/Exception.test.js +0 -15
- package/build/dist/Tests/Types/Exception/Exception.test.js.map +0 -1
- package/build/dist/Tests/Types/Exception/NotImplementedException.test.js +0 -12
- package/build/dist/Tests/Types/Exception/NotImplementedException.test.js.map +0 -1
- package/build/dist/Tests/Types/File.test.js +0 -22
- package/build/dist/Tests/Types/File.test.js.map +0 -1
- package/build/dist/Tests/Types/HashedString.test.js +0 -51
- package/build/dist/Tests/Types/HashedString.test.js.map +0 -1
- package/build/dist/Tests/Types/Html.test.js +0 -8
- package/build/dist/Tests/Types/Html.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IP.test.js +0 -65
- package/build/dist/Tests/Types/IP/IP.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IPType.test.js +0 -10
- package/build/dist/Tests/Types/IP/IPType.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IPv4.test.js +0 -17
- package/build/dist/Tests/Types/IP/IPv4.test.js.map +0 -1
- package/build/dist/Tests/Types/IP/IPv6.test.js +0 -17
- package/build/dist/Tests/Types/IP/IPv6.test.js.map +0 -1
- package/build/dist/Tests/Types/JSON.test.js +0 -37
- package/build/dist/Tests/Types/JSON.test.js.map +0 -1
- package/build/dist/Tests/Types/JSONFunctions.test.js +0 -38
- package/build/dist/Tests/Types/JSONFunctions.test.js.map +0 -1
- package/build/dist/Tests/Types/ListData.test.js +0 -34
- package/build/dist/Tests/Types/ListData.test.js.map +0 -1
- package/build/dist/Tests/Types/Monitor/KubernetesAlertTemplates.test.js +0 -121
- package/build/dist/Tests/Types/Monitor/KubernetesAlertTemplates.test.js.map +0 -1
- package/build/dist/Tests/Types/Name.test.js +0 -26
- package/build/dist/Tests/Types/Name.test.js.map +0 -1
- package/build/dist/Tests/Types/ObjectID.test.js +0 -12
- package/build/dist/Tests/Types/ObjectID.test.js.map +0 -1
- package/build/dist/Tests/Types/OnCallDutyPolicy/LayerUtil.test.js +0 -530
- package/build/dist/Tests/Types/OnCallDutyPolicy/LayerUtil.test.js.map +0 -1
- package/build/dist/Tests/Types/Permission.test.js +0 -99
- package/build/dist/Tests/Types/Permission.test.js.map +0 -1
- package/build/dist/Tests/Types/Phone.test.js +0 -37
- package/build/dist/Tests/Types/Phone.test.js.map +0 -1
- package/build/dist/Tests/Types/Port.test.js +0 -35
- package/build/dist/Tests/Types/Port.test.js.map +0 -1
- package/build/dist/Tests/Types/PositiveNumber.test.js +0 -101
- package/build/dist/Tests/Types/PositiveNumber.test.js.map +0 -1
- package/build/dist/Tests/Types/SecuritySeverity.test.js +0 -16
- package/build/dist/Tests/Types/SecuritySeverity.test.js.map +0 -1
- package/build/dist/Tests/Types/SerializableObject.test.js +0 -37
- package/build/dist/Tests/Types/SerializableObject.test.js.map +0 -1
- package/build/dist/Tests/Types/Sleep.test.js +0 -14
- package/build/dist/Tests/Types/Sleep.test.js.map +0 -1
- package/build/dist/Tests/Types/Text.test.js +0 -8
- package/build/dist/Tests/Types/Text.test.js.map +0 -1
- package/build/dist/Tests/Types/Timezone.test.js +0 -596
- package/build/dist/Tests/Types/Timezone.test.js.map +0 -1
- package/build/dist/Tests/Types/Typeof.test.js +0 -16
- package/build/dist/Tests/Types/Typeof.test.js.map +0 -1
- package/build/dist/Tests/Types/UserType.test.js +0 -16
- package/build/dist/Tests/Types/UserType.test.js.map +0 -1
- package/build/dist/Tests/Types/Version.test.js +0 -35
- package/build/dist/Tests/Types/Version.test.js.map +0 -1
- package/build/dist/Tests/Types/XML.test.js +0 -35
- package/build/dist/Tests/Types/XML.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/404.test.js +0 -59
- package/build/dist/Tests/UI/Components/404.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Alert.test.js +0 -83
- package/build/dist/Tests/UI/Components/Alert.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Badge.test.js +0 -59
- package/build/dist/Tests/UI/Components/Badge.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/BasicForm.test.js +0 -92
- package/build/dist/Tests/UI/Components/BasicForm.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Breadcrumbs.test.js +0 -69
- package/build/dist/Tests/UI/Components/Breadcrumbs.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Button.test.js +0 -104
- package/build/dist/Tests/UI/Components/Button.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Card.test.js +0 -81
- package/build/dist/Tests/UI/Components/Card.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ColorViewer.test.js +0 -42
- package/build/dist/Tests/UI/Components/ColorViewer.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ComponentsModal.test.js +0 -233
- package/build/dist/Tests/UI/Components/ComponentsModal.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ConfirmModal.test.js +0 -57
- package/build/dist/Tests/UI/Components/ConfirmModal.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/DictionaryOfStrings.test.js +0 -84
- package/build/dist/Tests/UI/Components/DictionaryOfStrings.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Dropdown.test.js +0 -146
- package/build/dist/Tests/UI/Components/Dropdown.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/DuplicateModel.test.js +0 -229
- package/build/dist/Tests/UI/Components/DuplicateModel.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/EmptyState/EmptyState.test.js +0 -26
- package/build/dist/Tests/UI/Components/EmptyState/EmptyState.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ErrorBoundary.test.js +0 -32
- package/build/dist/Tests/UI/Components/ErrorBoundary.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/FilePicker.test.js +0 -342
- package/build/dist/Tests/UI/Components/FilePicker.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/HiddenText.test.js +0 -50
- package/build/dist/Tests/UI/Components/HiddenText.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Input.test.js +0 -223
- package/build/dist/Tests/UI/Components/Input.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Item.test.js +0 -58
- package/build/dist/Tests/UI/Components/Item.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/List.test.js +0 -83
- package/build/dist/Tests/UI/Components/List.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Loader.test.js +0 -19
- package/build/dist/Tests/UI/Components/Loader.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js +0 -85
- package/build/dist/Tests/UI/Components/MarkdownEditor.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/MasterPage.test.js +0 -46
- package/build/dist/Tests/UI/Components/MasterPage.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Modal.test.js +0 -127
- package/build/dist/Tests/UI/Components/Modal.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/NavBar.test.js +0 -52
- package/build/dist/Tests/UI/Components/NavBar.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/OrderedStatesList.test.js +0 -86
- package/build/dist/Tests/UI/Components/OrderedStatesList.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Pagination.test.js +0 -137
- package/build/dist/Tests/UI/Components/Pagination.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Pill.test.js +0 -55
- package/build/dist/Tests/UI/Components/Pill.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Probe.test.js +0 -52
- package/build/dist/Tests/UI/Components/Probe.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/ProgressBar.test.js +0 -41
- package/build/dist/Tests/UI/Components/ProgressBar.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/RadioButtons.test.js +0 -66
- package/build/dist/Tests/UI/Components/RadioButtons.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/SideMenuItem.test.js +0 -99
- package/build/dist/Tests/UI/Components/SideMenuItem.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/SideOver.test.js +0 -77
- package/build/dist/Tests/UI/Components/SideOver.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Tabs.test.js +0 -56
- package/build/dist/Tests/UI/Components/Tabs.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Template/Template.test.js +0 -15
- package/build/dist/Tests/UI/Components/Template/Template.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/TextArea.test.js +0 -112
- package/build/dist/Tests/UI/Components/TextArea.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/TimePicker/TimePicker.test.js +0 -352
- package/build/dist/Tests/UI/Components/TimePicker/TimePicker.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Toast.test.js +0 -48
- package/build/dist/Tests/UI/Components/Toast.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/Toggle.test.js +0 -95
- package/build/dist/Tests/UI/Components/Toggle.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/TopSection.test.js +0 -33
- package/build/dist/Tests/UI/Components/TopSection.test.js.map +0 -1
- package/build/dist/Tests/UI/Components/XAxis.test.js +0 -21
- package/build/dist/Tests/UI/Components/XAxis.test.js.map +0 -1
- package/build/dist/Tests/UI/Index.js +0 -2
- package/build/dist/Tests/UI/Index.js.map +0 -1
- package/build/dist/Tests/UI/Mocks/FileMock.js +0 -3
- package/build/dist/Tests/UI/Mocks/FileMock.js.map +0 -1
- package/build/dist/Tests/Utils/API.test.js +0 -399
- package/build/dist/Tests/Utils/API.test.js.map +0 -1
- package/build/dist/Tests/Utils/Analytics.test.js +0 -67
- package/build/dist/Tests/Utils/Analytics.test.js.map +0 -1
- package/build/dist/Tests/Utils/CronTime.test.js +0 -22
- package/build/dist/Tests/Utils/CronTime.test.js.map +0 -1
- package/build/dist/Tests/Utils/Faker.test.js +0 -27
- package/build/dist/Tests/Utils/Faker.test.js.map +0 -1
- package/build/dist/Tests/Utils/MetricUnitUtil.test.js +0 -187
- package/build/dist/Tests/Utils/MetricUnitUtil.test.js.map +0 -1
- package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js +0 -224
- package/build/dist/Tests/Utils/Metrics/MetricFormulaEvaluator.test.js.map +0 -1
- package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js +0 -180
- package/build/dist/Tests/Utils/Metrics/MetricResultUnitConverter.test.js.map +0 -1
- package/build/dist/Tests/Utils/RecordingRuleExpression.test.js +0 -142
- package/build/dist/Tests/Utils/RecordingRuleExpression.test.js.map +0 -1
- package/build/dist/Tests/Utils/Slug.test.js +0 -20
- package/build/dist/Tests/Utils/Slug.test.js.map +0 -1
- package/build/dist/Tests/Utils/UUID.test.js +0 -48
- package/build/dist/Tests/Utils/UUID.test.js.map +0 -1
- package/build/dist/Tests/jest.setup.js +0 -30
- package/build/dist/Tests/jest.setup.js.map +0 -1
- package/build/dist/Types/Profile/ProfileMetricType.js +0 -17
- package/build/dist/Types/Profile/ProfileMetricType.js.map +0 -1
|
@@ -4,6 +4,7 @@ import Express, {
|
|
|
4
4
|
ExpressResponse,
|
|
5
5
|
ExpressRouter,
|
|
6
6
|
NextFunction,
|
|
7
|
+
RequestHandler,
|
|
7
8
|
} from "../Utils/Express";
|
|
8
9
|
import Response from "../Utils/Response";
|
|
9
10
|
import BadDataException from "../../Types/Exception/BadDataException";
|
|
@@ -28,6 +29,12 @@ import TraceAggregationService, {
|
|
|
28
29
|
HistogramRequest as TraceHistogramRequest,
|
|
29
30
|
FacetValue as TraceFacetValue,
|
|
30
31
|
MultiFacetRequest as TraceMultiFacetRequest,
|
|
32
|
+
TraceFilters,
|
|
33
|
+
TraceAnalyticsChartType,
|
|
34
|
+
TraceAnalyticsRequest,
|
|
35
|
+
TraceAnalyticsTimeseriesRow,
|
|
36
|
+
TraceAnalyticsTopItem,
|
|
37
|
+
TraceAnalyticsTableRow,
|
|
31
38
|
} from "../Services/TraceAggregationService";
|
|
32
39
|
import ExceptionAggregationService, {
|
|
33
40
|
HistogramBucket as ExceptionHistogramBucket,
|
|
@@ -41,9 +48,13 @@ import MetricAggregationService, {
|
|
|
41
48
|
} from "../Services/MetricAggregationService";
|
|
42
49
|
import ProfileAggregationService, {
|
|
43
50
|
FlamegraphRequest,
|
|
51
|
+
FlamegraphResult,
|
|
44
52
|
FunctionListRequest,
|
|
45
|
-
|
|
46
|
-
|
|
53
|
+
FunctionListResult,
|
|
54
|
+
FunctionFocusRequest,
|
|
55
|
+
FunctionFocusResult,
|
|
56
|
+
BreakdownRequest,
|
|
57
|
+
BreakdownResult,
|
|
47
58
|
DiffFlamegraphRequest,
|
|
48
59
|
DiffFlamegraphNode,
|
|
49
60
|
ServiceActivityRequest,
|
|
@@ -58,6 +69,7 @@ import ProfileSample from "../../Models/AnalyticsModels/ProfileSample";
|
|
|
58
69
|
import ProfileService from "../Services/ProfileService";
|
|
59
70
|
import ProfileSampleService from "../Services/ProfileSampleService";
|
|
60
71
|
import SortOrder from "../../Types/BaseDatabase/SortOrder";
|
|
72
|
+
import Permission from "../../Types/Permission";
|
|
61
73
|
import ObjectID from "../../Types/ObjectID";
|
|
62
74
|
import OneUptimeDate from "../../Types/Date";
|
|
63
75
|
import { JSONObject } from "../../Types/JSON";
|
|
@@ -68,9 +80,81 @@ import ResourceFacetResolver, {
|
|
|
68
80
|
|
|
69
81
|
const router: ExpressRouter = Express.getRouter();
|
|
70
82
|
|
|
83
|
+
/*
|
|
84
|
+
* Shared guards for every bespoke telemetry route in this file. These routes
|
|
85
|
+
* don't go through BaseAnalyticsAPI, so nothing downstream re-checks
|
|
86
|
+
* authorization: the tenantId comes straight from a caller-controlled header
|
|
87
|
+
* and UserMiddleware lets tokenless requests through as Public. Every route
|
|
88
|
+
* must therefore demand an authenticated principal that holds a
|
|
89
|
+
* telemetry-read permission on that tenant before any data is queried.
|
|
90
|
+
* Each guard's permission list mirrors the table-level read access control
|
|
91
|
+
* declared on the corresponding analytics model, keeping these routes
|
|
92
|
+
* exactly as permissive as the model-backed CRUD APIs for the same signal.
|
|
93
|
+
*
|
|
94
|
+
* Guards are declared before any route registration: route registration
|
|
95
|
+
* executes at module load, and spreading a const declared further down the
|
|
96
|
+
* file would throw at startup (temporal dead zone).
|
|
97
|
+
*/
|
|
98
|
+
type TelemetryReadAccessGuardFactory = (
|
|
99
|
+
signalReadPermission: Permission,
|
|
100
|
+
) => Array<RequestHandler>;
|
|
101
|
+
|
|
102
|
+
const createTelemetryReadAccessGuard: TelemetryReadAccessGuardFactory = (
|
|
103
|
+
signalReadPermission: Permission,
|
|
104
|
+
): Array<RequestHandler> => {
|
|
105
|
+
return [
|
|
106
|
+
UserMiddleware.getUserMiddleware,
|
|
107
|
+
UserMiddleware.requireUserAuthentication,
|
|
108
|
+
UserMiddleware.requirePermission({
|
|
109
|
+
permissions: [
|
|
110
|
+
Permission.ProjectOwner,
|
|
111
|
+
Permission.ProjectAdmin,
|
|
112
|
+
Permission.ProjectMember,
|
|
113
|
+
Permission.Viewer,
|
|
114
|
+
Permission.TelemetryAdmin,
|
|
115
|
+
Permission.TelemetryMember,
|
|
116
|
+
Permission.TelemetryViewer,
|
|
117
|
+
signalReadPermission,
|
|
118
|
+
],
|
|
119
|
+
}),
|
|
120
|
+
];
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
// Mirrors the read access control declared on the Log analytics model.
|
|
124
|
+
const requireLogReadAccess: Array<RequestHandler> =
|
|
125
|
+
createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceLog);
|
|
126
|
+
|
|
127
|
+
// Mirrors the read access control declared on the Span analytics model.
|
|
128
|
+
const requireTraceReadAccess: Array<RequestHandler> =
|
|
129
|
+
createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceTraces);
|
|
130
|
+
|
|
131
|
+
/*
|
|
132
|
+
* Mirrors the read access control declared on the Metric analytics model,
|
|
133
|
+
* whose table-level read list grants ReadTelemetryServiceTraces rather than
|
|
134
|
+
* ReadTelemetryServiceMetrics. The guard follows the model declaration so
|
|
135
|
+
* these routes stay in lockstep with the model-backed CRUD API; if the model
|
|
136
|
+
* ever switches to ReadTelemetryServiceMetrics this must change with it.
|
|
137
|
+
*/
|
|
138
|
+
const requireMetricReadAccess: Array<RequestHandler> =
|
|
139
|
+
createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceTraces);
|
|
140
|
+
|
|
141
|
+
/*
|
|
142
|
+
* Mirrors the read access control declared on the ExceptionInstance
|
|
143
|
+
* analytics model.
|
|
144
|
+
*/
|
|
145
|
+
const requireExceptionReadAccess: Array<RequestHandler> =
|
|
146
|
+
createTelemetryReadAccessGuard(Permission.ReadTelemetryException);
|
|
147
|
+
|
|
148
|
+
/*
|
|
149
|
+
* Mirrors the read access control declared on the Profile / ProfileSample
|
|
150
|
+
* analytics models.
|
|
151
|
+
*/
|
|
152
|
+
const requireProfileReadAccess: Array<RequestHandler> =
|
|
153
|
+
createTelemetryReadAccessGuard(Permission.ReadTelemetryServiceProfiles);
|
|
154
|
+
|
|
71
155
|
router.post(
|
|
72
156
|
"/telemetry/metrics/get-attributes",
|
|
73
|
-
|
|
157
|
+
...requireMetricReadAccess,
|
|
74
158
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
75
159
|
return getAttributes(req, res, next, TelemetryType.Metric);
|
|
76
160
|
},
|
|
@@ -78,7 +162,7 @@ router.post(
|
|
|
78
162
|
|
|
79
163
|
router.post(
|
|
80
164
|
"/telemetry/metrics/get-attribute-values",
|
|
81
|
-
|
|
165
|
+
...requireMetricReadAccess,
|
|
82
166
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
83
167
|
return getAttributeValues(req, res, next, TelemetryType.Metric);
|
|
84
168
|
},
|
|
@@ -86,7 +170,7 @@ router.post(
|
|
|
86
170
|
|
|
87
171
|
router.post(
|
|
88
172
|
"/telemetry/logs/get-attributes",
|
|
89
|
-
|
|
173
|
+
...requireLogReadAccess,
|
|
90
174
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
91
175
|
return getAttributes(req, res, next, TelemetryType.Log);
|
|
92
176
|
},
|
|
@@ -94,7 +178,7 @@ router.post(
|
|
|
94
178
|
|
|
95
179
|
router.post(
|
|
96
180
|
"/telemetry/logs/get-attribute-values",
|
|
97
|
-
|
|
181
|
+
...requireLogReadAccess,
|
|
98
182
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
99
183
|
return getAttributeValues(req, res, next, TelemetryType.Log);
|
|
100
184
|
},
|
|
@@ -102,7 +186,7 @@ router.post(
|
|
|
102
186
|
|
|
103
187
|
router.post(
|
|
104
188
|
"/telemetry/traces/get-attributes",
|
|
105
|
-
|
|
189
|
+
...requireTraceReadAccess,
|
|
106
190
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
107
191
|
return getAttributes(req, res, next, TelemetryType.Trace);
|
|
108
192
|
},
|
|
@@ -110,7 +194,7 @@ router.post(
|
|
|
110
194
|
|
|
111
195
|
router.post(
|
|
112
196
|
"/telemetry/traces/get-attribute-values",
|
|
113
|
-
|
|
197
|
+
...requireTraceReadAccess,
|
|
114
198
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
115
199
|
return getAttributeValues(req, res, next, TelemetryType.Trace);
|
|
116
200
|
},
|
|
@@ -118,7 +202,7 @@ router.post(
|
|
|
118
202
|
|
|
119
203
|
router.post(
|
|
120
204
|
"/telemetry/exceptions/get-attributes",
|
|
121
|
-
|
|
205
|
+
...requireExceptionReadAccess,
|
|
122
206
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
123
207
|
return getAttributes(req, res, next, TelemetryType.Exception);
|
|
124
208
|
},
|
|
@@ -126,7 +210,7 @@ router.post(
|
|
|
126
210
|
|
|
127
211
|
router.post(
|
|
128
212
|
"/telemetry/exceptions/get-attribute-values",
|
|
129
|
-
|
|
213
|
+
...requireExceptionReadAccess,
|
|
130
214
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
131
215
|
return getAttributeValues(req, res, next, TelemetryType.Exception);
|
|
132
216
|
},
|
|
@@ -262,7 +346,7 @@ const getAttributeValues: GetAttributeValuesFunction = async (
|
|
|
262
346
|
|
|
263
347
|
router.post(
|
|
264
348
|
"/telemetry/logs/histogram",
|
|
265
|
-
|
|
349
|
+
...requireLogReadAccess,
|
|
266
350
|
async (
|
|
267
351
|
req: ExpressRequest,
|
|
268
352
|
res: ExpressResponse,
|
|
@@ -300,6 +384,10 @@ router.post(
|
|
|
300
384
|
})
|
|
301
385
|
: undefined;
|
|
302
386
|
|
|
387
|
+
const entityKeys: Array<string> | undefined = body["entityKeys"]
|
|
388
|
+
? (body["entityKeys"] as Array<string>)
|
|
389
|
+
: undefined;
|
|
390
|
+
|
|
303
391
|
const severityTexts: Array<string> | undefined = body["severityTexts"]
|
|
304
392
|
? (body["severityTexts"] as Array<string>)
|
|
305
393
|
: undefined;
|
|
@@ -326,6 +414,7 @@ router.post(
|
|
|
326
414
|
endTime,
|
|
327
415
|
bucketSizeInMinutes,
|
|
328
416
|
serviceIds,
|
|
417
|
+
entityKeys,
|
|
329
418
|
severityTexts,
|
|
330
419
|
bodySearchText,
|
|
331
420
|
traceIds,
|
|
@@ -349,7 +438,7 @@ router.post(
|
|
|
349
438
|
|
|
350
439
|
router.post(
|
|
351
440
|
"/telemetry/logs/facets",
|
|
352
|
-
|
|
441
|
+
...requireLogReadAccess,
|
|
353
442
|
async (
|
|
354
443
|
req: ExpressRequest,
|
|
355
444
|
res: ExpressResponse,
|
|
@@ -371,7 +460,7 @@ router.post(
|
|
|
371
460
|
|
|
372
461
|
const facetKeys: Array<string> = body["facetKeys"]
|
|
373
462
|
? (body["facetKeys"] as Array<string>)
|
|
374
|
-
: ["severityText", "
|
|
463
|
+
: ["severityText", "primaryEntityId"];
|
|
375
464
|
|
|
376
465
|
const startTime: Date = body["startTime"]
|
|
377
466
|
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
@@ -389,6 +478,10 @@ router.post(
|
|
|
389
478
|
})
|
|
390
479
|
: undefined;
|
|
391
480
|
|
|
481
|
+
const entityKeys: Array<string> | undefined = body["entityKeys"]
|
|
482
|
+
? (body["entityKeys"] as Array<string>)
|
|
483
|
+
: undefined;
|
|
484
|
+
|
|
392
485
|
const severityTexts: Array<string> | undefined = body["severityTexts"]
|
|
393
486
|
? (body["severityTexts"] as Array<string>)
|
|
394
487
|
: undefined;
|
|
@@ -411,9 +504,9 @@ router.post(
|
|
|
411
504
|
|
|
412
505
|
/*
|
|
413
506
|
* Per-facet partial-match filter applied at the Postgres source-of-truth
|
|
414
|
-
* lookup stage. Only consulted for resource facets (
|
|
415
|
-
* dockerHostId / kubernetesClusterId) — other facets continue
|
|
416
|
-
* client-side over the loaded value list.
|
|
507
|
+
* lookup stage. Only consulted for resource facets (primaryEntityId /
|
|
508
|
+
* hostId / dockerHostId / kubernetesClusterId) — other facets continue
|
|
509
|
+
* to filter client-side over the loaded value list.
|
|
417
510
|
*/
|
|
418
511
|
const facetSearchText: Record<string, string> | undefined = body[
|
|
419
512
|
"facetSearchText"
|
|
@@ -445,6 +538,7 @@ router.post(
|
|
|
445
538
|
facetKey,
|
|
446
539
|
limit,
|
|
447
540
|
serviceIds,
|
|
541
|
+
entityKeys,
|
|
448
542
|
severityTexts,
|
|
449
543
|
bodySearchText,
|
|
450
544
|
traceIds,
|
|
@@ -508,11 +602,127 @@ router.post(
|
|
|
508
602
|
},
|
|
509
603
|
);
|
|
510
604
|
|
|
605
|
+
/*
|
|
606
|
+
* Shared body parsing for every trace aggregation endpoint (histogram,
|
|
607
|
+
* facets, analytics). Defensive about shapes: arrays are validated and
|
|
608
|
+
* filtered to strings, booleans/numbers use strict typeof checks (JSON null
|
|
609
|
+
* or a stringly-typed value must mean "no filter", never an active
|
|
610
|
+
* predicate).
|
|
611
|
+
*/
|
|
612
|
+
function parseTraceFilterBody(body: JSONObject): TraceFilters {
|
|
613
|
+
const serviceIds: Array<ObjectID> | undefined = Array.isArray(
|
|
614
|
+
body["serviceIds"],
|
|
615
|
+
)
|
|
616
|
+
? (body["serviceIds"] as Array<unknown>)
|
|
617
|
+
.filter((v: unknown): v is string => {
|
|
618
|
+
return typeof v === "string";
|
|
619
|
+
})
|
|
620
|
+
.map((id: string) => {
|
|
621
|
+
return new ObjectID(id);
|
|
622
|
+
})
|
|
623
|
+
: undefined;
|
|
624
|
+
|
|
625
|
+
const stringArray: (key: string) => Array<string> | undefined = (
|
|
626
|
+
key: string,
|
|
627
|
+
): Array<string> | undefined => {
|
|
628
|
+
return Array.isArray(body[key])
|
|
629
|
+
? (body[key] as Array<unknown>).filter((v: unknown): v is string => {
|
|
630
|
+
return typeof v === "string";
|
|
631
|
+
})
|
|
632
|
+
: undefined;
|
|
633
|
+
};
|
|
634
|
+
|
|
635
|
+
/*
|
|
636
|
+
* Numeric strings are coerced (stringly-typed clients worked before the
|
|
637
|
+
* parsing was centralized) — dropping them would silently widen the
|
|
638
|
+
* filter to all statuses.
|
|
639
|
+
*/
|
|
640
|
+
const statusCodes: Array<number> | undefined = Array.isArray(
|
|
641
|
+
body["statusCodes"],
|
|
642
|
+
)
|
|
643
|
+
? (body["statusCodes"] as Array<unknown>)
|
|
644
|
+
.map((v: unknown): number => {
|
|
645
|
+
return typeof v === "number" ? v : Number(v);
|
|
646
|
+
})
|
|
647
|
+
.filter((v: number): boolean => {
|
|
648
|
+
return Number.isFinite(v);
|
|
649
|
+
})
|
|
650
|
+
: undefined;
|
|
651
|
+
|
|
652
|
+
const stringRecord: (key: string) => Record<string, string> | undefined = (
|
|
653
|
+
key: string,
|
|
654
|
+
): Record<string, string> | undefined => {
|
|
655
|
+
const raw: unknown = body[key];
|
|
656
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
|
|
657
|
+
return undefined;
|
|
658
|
+
}
|
|
659
|
+
const entries: Array<[string, string]> = Object.entries(
|
|
660
|
+
raw as Record<string, unknown>,
|
|
661
|
+
).filter((entry: [string, unknown]): entry is [string, string] => {
|
|
662
|
+
return typeof entry[1] === "string";
|
|
663
|
+
});
|
|
664
|
+
if (entries.length === 0) {
|
|
665
|
+
return undefined;
|
|
666
|
+
}
|
|
667
|
+
return Object.fromEntries(entries);
|
|
668
|
+
};
|
|
669
|
+
|
|
670
|
+
return {
|
|
671
|
+
serviceIds,
|
|
672
|
+
entityKeys: stringArray("entityKeys"),
|
|
673
|
+
statusCodes,
|
|
674
|
+
spanKinds: stringArray("spanKinds"),
|
|
675
|
+
spanNames: stringArray("spanNames"),
|
|
676
|
+
/*
|
|
677
|
+
* spanNameSearches is the only multiplicative filter (one ILIKE
|
|
678
|
+
* predicate per entry) — cap it. The dashboard sends at most one.
|
|
679
|
+
*/
|
|
680
|
+
spanNameSearches: stringArray("spanNameSearches")?.slice(0, 10),
|
|
681
|
+
spanIds: stringArray("spanIds"),
|
|
682
|
+
traceIds: stringArray("traceIds"),
|
|
683
|
+
nameSearchText:
|
|
684
|
+
typeof body["nameSearchText"] === "string" && body["nameSearchText"]
|
|
685
|
+
? (body["nameSearchText"] as string)
|
|
686
|
+
: undefined,
|
|
687
|
+
statusMessageSearchText:
|
|
688
|
+
typeof body["statusMessageSearchText"] === "string" &&
|
|
689
|
+
body["statusMessageSearchText"]
|
|
690
|
+
? (body["statusMessageSearchText"] as string)
|
|
691
|
+
: undefined,
|
|
692
|
+
statusMessages: stringArray("statusMessages"),
|
|
693
|
+
/*
|
|
694
|
+
* Strict boolean check — unlike rootOnly, a coerced `false` is a
|
|
695
|
+
* meaningful predicate here (JSON null must mean "no filter", not
|
|
696
|
+
* "exclude exception spans").
|
|
697
|
+
*/
|
|
698
|
+
hasException:
|
|
699
|
+
typeof body["hasException"] === "boolean"
|
|
700
|
+
? (body["hasException"] as boolean)
|
|
701
|
+
: undefined,
|
|
702
|
+
minDurationNano:
|
|
703
|
+
typeof body["minDurationNano"] === "number"
|
|
704
|
+
? (body["minDurationNano"] as number)
|
|
705
|
+
: undefined,
|
|
706
|
+
maxDurationNano:
|
|
707
|
+
typeof body["maxDurationNano"] === "number"
|
|
708
|
+
? (body["maxDurationNano"] as number)
|
|
709
|
+
: undefined,
|
|
710
|
+
exactDurationNano:
|
|
711
|
+
typeof body["exactDurationNano"] === "number"
|
|
712
|
+
? (body["exactDurationNano"] as number)
|
|
713
|
+
: undefined,
|
|
714
|
+
rootOnly:
|
|
715
|
+
body["rootOnly"] === undefined ? undefined : Boolean(body["rootOnly"]),
|
|
716
|
+
attributes: stringRecord("attributes"),
|
|
717
|
+
attributeSearches: stringRecord("attributeSearches"),
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
|
|
511
721
|
// --- Trace Histogram Endpoint ---
|
|
512
722
|
|
|
513
723
|
router.post(
|
|
514
724
|
"/telemetry/traces/histogram",
|
|
515
|
-
|
|
725
|
+
...requireTraceReadAccess,
|
|
516
726
|
async (
|
|
517
727
|
req: ExpressRequest,
|
|
518
728
|
res: ExpressResponse,
|
|
@@ -544,52 +754,14 @@ router.post(
|
|
|
544
754
|
(body["bucketSizeInMinutes"] as number) ||
|
|
545
755
|
computeDefaultBucketSize(startTime, endTime);
|
|
546
756
|
|
|
547
|
-
const
|
|
548
|
-
? (body["serviceIds"] as Array<string>).map((id: string) => {
|
|
549
|
-
return new ObjectID(id);
|
|
550
|
-
})
|
|
551
|
-
: undefined;
|
|
552
|
-
|
|
553
|
-
const statusCodes: Array<number> | undefined = body["statusCodes"]
|
|
554
|
-
? (body["statusCodes"] as Array<number>)
|
|
555
|
-
: undefined;
|
|
556
|
-
|
|
557
|
-
const spanKinds: Array<string> | undefined = body["spanKinds"]
|
|
558
|
-
? (body["spanKinds"] as Array<string>)
|
|
559
|
-
: undefined;
|
|
560
|
-
|
|
561
|
-
const spanNames: Array<string> | undefined = body["spanNames"]
|
|
562
|
-
? (body["spanNames"] as Array<string>)
|
|
563
|
-
: undefined;
|
|
564
|
-
|
|
565
|
-
const traceIds: Array<string> | undefined = body["traceIds"]
|
|
566
|
-
? (body["traceIds"] as Array<string>)
|
|
567
|
-
: undefined;
|
|
568
|
-
|
|
569
|
-
const nameSearchText: string | undefined = body["nameSearchText"]
|
|
570
|
-
? (body["nameSearchText"] as string)
|
|
571
|
-
: undefined;
|
|
572
|
-
|
|
573
|
-
const rootOnly: boolean | undefined =
|
|
574
|
-
body["rootOnly"] === undefined ? undefined : Boolean(body["rootOnly"]);
|
|
575
|
-
|
|
576
|
-
const attributes: Record<string, string> | undefined = body["attributes"]
|
|
577
|
-
? (body["attributes"] as Record<string, string>)
|
|
578
|
-
: undefined;
|
|
757
|
+
const traceFilters: TraceFilters = parseTraceFilterBody(body);
|
|
579
758
|
|
|
580
759
|
const request: TraceHistogramRequest = {
|
|
581
760
|
projectId: databaseProps.tenantId,
|
|
582
761
|
startTime,
|
|
583
762
|
endTime,
|
|
584
763
|
bucketSizeInMinutes,
|
|
585
|
-
|
|
586
|
-
statusCodes,
|
|
587
|
-
spanKinds,
|
|
588
|
-
spanNames,
|
|
589
|
-
traceIds,
|
|
590
|
-
nameSearchText,
|
|
591
|
-
rootOnly,
|
|
592
|
-
attributes,
|
|
764
|
+
...traceFilters,
|
|
593
765
|
};
|
|
594
766
|
|
|
595
767
|
const buckets: Array<TraceHistogramBucket> =
|
|
@@ -608,7 +780,7 @@ router.post(
|
|
|
608
780
|
|
|
609
781
|
router.post(
|
|
610
782
|
"/telemetry/traces/facets",
|
|
611
|
-
|
|
783
|
+
...requireTraceReadAccess,
|
|
612
784
|
async (
|
|
613
785
|
req: ExpressRequest,
|
|
614
786
|
res: ExpressResponse,
|
|
@@ -630,7 +802,7 @@ router.post(
|
|
|
630
802
|
|
|
631
803
|
const facetKeys: Array<string> = body["facetKeys"]
|
|
632
804
|
? (body["facetKeys"] as Array<string>)
|
|
633
|
-
: ["
|
|
805
|
+
: ["primaryEntityId", "statusCode", "kind", "name"];
|
|
634
806
|
|
|
635
807
|
const startTime: Date = body["startTime"]
|
|
636
808
|
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
@@ -642,44 +814,13 @@ router.post(
|
|
|
642
814
|
|
|
643
815
|
const limit: number = (body["limit"] as number) || 500;
|
|
644
816
|
|
|
645
|
-
const
|
|
646
|
-
? (body["serviceIds"] as Array<string>).map((id: string) => {
|
|
647
|
-
return new ObjectID(id);
|
|
648
|
-
})
|
|
649
|
-
: undefined;
|
|
650
|
-
|
|
651
|
-
const statusCodes: Array<number> | undefined = body["statusCodes"]
|
|
652
|
-
? (body["statusCodes"] as Array<number>)
|
|
653
|
-
: undefined;
|
|
654
|
-
|
|
655
|
-
const spanKinds: Array<string> | undefined = body["spanKinds"]
|
|
656
|
-
? (body["spanKinds"] as Array<string>)
|
|
657
|
-
: undefined;
|
|
658
|
-
|
|
659
|
-
const spanNames: Array<string> | undefined = body["spanNames"]
|
|
660
|
-
? (body["spanNames"] as Array<string>)
|
|
661
|
-
: undefined;
|
|
662
|
-
|
|
663
|
-
const traceIds: Array<string> | undefined = body["traceIds"]
|
|
664
|
-
? (body["traceIds"] as Array<string>)
|
|
665
|
-
: undefined;
|
|
666
|
-
|
|
667
|
-
const nameSearchText: string | undefined = body["nameSearchText"]
|
|
668
|
-
? (body["nameSearchText"] as string)
|
|
669
|
-
: undefined;
|
|
670
|
-
|
|
671
|
-
const rootOnly: boolean | undefined =
|
|
672
|
-
body["rootOnly"] === undefined ? undefined : Boolean(body["rootOnly"]);
|
|
673
|
-
|
|
674
|
-
const attributes: Record<string, string> | undefined = body["attributes"]
|
|
675
|
-
? (body["attributes"] as Record<string, string>)
|
|
676
|
-
: undefined;
|
|
817
|
+
const traceFilters: TraceFilters = parseTraceFilterBody(body);
|
|
677
818
|
|
|
678
819
|
/*
|
|
679
820
|
* Per-facet partial-match filter applied at the Postgres source-of-truth
|
|
680
|
-
* lookup stage. Only consulted for resource facets (
|
|
681
|
-
* dockerHostId / kubernetesClusterId) — other facets continue
|
|
682
|
-
* client-side over the loaded value list.
|
|
821
|
+
* lookup stage. Only consulted for resource facets (primaryEntityId /
|
|
822
|
+
* hostId / dockerHostId / kubernetesClusterId) — other facets continue
|
|
823
|
+
* to filter client-side over the loaded value list.
|
|
683
824
|
*/
|
|
684
825
|
const facetSearchText: Record<string, string> | undefined = body[
|
|
685
826
|
"facetSearchText"
|
|
@@ -699,19 +840,13 @@ router.post(
|
|
|
699
840
|
endTime,
|
|
700
841
|
facetKeys,
|
|
701
842
|
limit,
|
|
702
|
-
|
|
703
|
-
statusCodes,
|
|
704
|
-
spanKinds,
|
|
705
|
-
spanNames,
|
|
706
|
-
traceIds,
|
|
707
|
-
nameSearchText,
|
|
708
|
-
rootOnly,
|
|
709
|
-
attributes,
|
|
843
|
+
...traceFilters,
|
|
710
844
|
};
|
|
711
845
|
|
|
712
846
|
/*
|
|
713
|
-
* Resource facets (
|
|
714
|
-
* and statusCode are counted with an exact,
|
|
847
|
+
* Resource facets (primaryEntityId / hostId / dockerHostId / k8s
|
|
848
|
+
* cluster ...) and statusCode are counted with an exact,
|
|
849
|
+
* projection-backed GROUP BY
|
|
715
850
|
* in getResourceFacetCounts(). The recent-N sample below saturates with
|
|
716
851
|
* whichever service is chattiest right now and reports 0 for every other
|
|
717
852
|
* service regardless of its true volume over the window — the "top 1000"
|
|
@@ -781,8 +916,8 @@ router.post(
|
|
|
781
916
|
/*
|
|
782
917
|
* Replace resource-facet results with the Postgres source-of-truth list
|
|
783
918
|
* (filtered by facetSearchText and enriched with displayName). Every
|
|
784
|
-
* resource facet shares the same exact
|
|
785
|
-
* ids are globally unique, so each facet only ever resolves its own
|
|
919
|
+
* resource facet shares the same exact primaryEntityId -> count map;
|
|
920
|
+
* resource ids are globally unique, so each facet only ever resolves its own
|
|
786
921
|
* entities. Entities with no telemetry in the window surface with count
|
|
787
922
|
* 0 instead of being hidden, and the search box can find resources
|
|
788
923
|
* beyond the loaded subset.
|
|
@@ -822,11 +957,134 @@ router.post(
|
|
|
822
957
|
},
|
|
823
958
|
);
|
|
824
959
|
|
|
960
|
+
// --- Trace Analytics Endpoint ---
|
|
961
|
+
|
|
962
|
+
router.post(
|
|
963
|
+
"/telemetry/traces/analytics",
|
|
964
|
+
...requireTraceReadAccess,
|
|
965
|
+
async (
|
|
966
|
+
req: ExpressRequest,
|
|
967
|
+
res: ExpressResponse,
|
|
968
|
+
next: NextFunction,
|
|
969
|
+
): Promise<void> => {
|
|
970
|
+
try {
|
|
971
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
972
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
973
|
+
|
|
974
|
+
if (!databaseProps?.tenantId) {
|
|
975
|
+
return Response.sendErrorResponse(
|
|
976
|
+
req,
|
|
977
|
+
res,
|
|
978
|
+
new BadDataException("Invalid Project ID"),
|
|
979
|
+
);
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
const body: JSONObject = req.body as JSONObject;
|
|
983
|
+
|
|
984
|
+
const chartType: TraceAnalyticsChartType =
|
|
985
|
+
(body["chartType"] as TraceAnalyticsChartType) || "timeseries";
|
|
986
|
+
|
|
987
|
+
if (!["timeseries", "toplist", "table"].includes(chartType)) {
|
|
988
|
+
return Response.sendErrorResponse(
|
|
989
|
+
req,
|
|
990
|
+
res,
|
|
991
|
+
new BadDataException("Invalid chartType"),
|
|
992
|
+
);
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
const metric: string = (body["metric"] as string) || "count";
|
|
996
|
+
|
|
997
|
+
if (!TraceAggregationService.isValidAnalyticsMetric(metric)) {
|
|
998
|
+
return Response.sendErrorResponse(
|
|
999
|
+
req,
|
|
1000
|
+
res,
|
|
1001
|
+
new BadDataException("Invalid metric"),
|
|
1002
|
+
);
|
|
1003
|
+
}
|
|
1004
|
+
|
|
1005
|
+
const startTime: Date = body["startTime"]
|
|
1006
|
+
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
1007
|
+
: OneUptimeDate.addRemoveHours(OneUptimeDate.getCurrentDate(), -1);
|
|
1008
|
+
|
|
1009
|
+
const endTime: Date = body["endTime"]
|
|
1010
|
+
? OneUptimeDate.fromString(body["endTime"] as string)
|
|
1011
|
+
: OneUptimeDate.getCurrentDate();
|
|
1012
|
+
|
|
1013
|
+
const rawBucketSize: number = Number(body["bucketSizeInMinutes"]);
|
|
1014
|
+
const bucketSizeInMinutes: number =
|
|
1015
|
+
Number.isFinite(rawBucketSize) && rawBucketSize >= 1
|
|
1016
|
+
? Math.trunc(rawBucketSize)
|
|
1017
|
+
: computeDefaultBucketSize(startTime, endTime);
|
|
1018
|
+
|
|
1019
|
+
const groupBy: Array<string> | undefined = Array.isArray(body["groupBy"])
|
|
1020
|
+
? (body["groupBy"] as Array<unknown>).filter(
|
|
1021
|
+
(v: unknown): v is string => {
|
|
1022
|
+
return typeof v === "string" && v.length > 0;
|
|
1023
|
+
},
|
|
1024
|
+
)
|
|
1025
|
+
: undefined;
|
|
1026
|
+
|
|
1027
|
+
/*
|
|
1028
|
+
* Clamp to a sane integer range — `limit` flows into LIMIT and the
|
|
1029
|
+
* timeseries series cap, so negative/fractional values would 500 in
|
|
1030
|
+
* ClickHouse and huge values would explode the result set. Numeric
|
|
1031
|
+
* strings are accepted (dashboard widget arguments are stored as
|
|
1032
|
+
* strings).
|
|
1033
|
+
*/
|
|
1034
|
+
const rawLimit: number = Number(body["limit"]);
|
|
1035
|
+
const limit: number | undefined = Number.isFinite(rawLimit)
|
|
1036
|
+
? Math.min(Math.max(Math.trunc(rawLimit), 1), 1000)
|
|
1037
|
+
: undefined;
|
|
1038
|
+
|
|
1039
|
+
const traceFilters: TraceFilters = parseTraceFilterBody(body);
|
|
1040
|
+
|
|
1041
|
+
const request: TraceAnalyticsRequest = {
|
|
1042
|
+
projectId: databaseProps.tenantId,
|
|
1043
|
+
startTime,
|
|
1044
|
+
endTime,
|
|
1045
|
+
bucketSizeInMinutes,
|
|
1046
|
+
chartType,
|
|
1047
|
+
metric,
|
|
1048
|
+
groupBy,
|
|
1049
|
+
limit,
|
|
1050
|
+
...traceFilters,
|
|
1051
|
+
};
|
|
1052
|
+
|
|
1053
|
+
if (chartType === "timeseries") {
|
|
1054
|
+
const data: Array<TraceAnalyticsTimeseriesRow> =
|
|
1055
|
+
await TraceAggregationService.getAnalyticsTimeseries(request);
|
|
1056
|
+
|
|
1057
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
1058
|
+
data: data as unknown as JSONObject,
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
if (chartType === "toplist") {
|
|
1063
|
+
const data: Array<TraceAnalyticsTopItem> =
|
|
1064
|
+
await TraceAggregationService.getAnalyticsTopList(request);
|
|
1065
|
+
|
|
1066
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
1067
|
+
data: data as unknown as JSONObject,
|
|
1068
|
+
});
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
const data: Array<TraceAnalyticsTableRow> =
|
|
1072
|
+
await TraceAggregationService.getAnalyticsTable(request);
|
|
1073
|
+
|
|
1074
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
1075
|
+
data: data as unknown as JSONObject,
|
|
1076
|
+
});
|
|
1077
|
+
} catch (err: unknown) {
|
|
1078
|
+
next(err);
|
|
1079
|
+
}
|
|
1080
|
+
},
|
|
1081
|
+
);
|
|
1082
|
+
|
|
825
1083
|
// --- Exception Histogram Endpoint ---
|
|
826
1084
|
|
|
827
1085
|
router.post(
|
|
828
1086
|
"/telemetry/exceptions/histogram",
|
|
829
|
-
|
|
1087
|
+
...requireExceptionReadAccess,
|
|
830
1088
|
async (
|
|
831
1089
|
req: ExpressRequest,
|
|
832
1090
|
res: ExpressResponse,
|
|
@@ -917,7 +1175,7 @@ router.post(
|
|
|
917
1175
|
|
|
918
1176
|
router.post(
|
|
919
1177
|
"/telemetry/exceptions/facets",
|
|
920
|
-
|
|
1178
|
+
...requireExceptionReadAccess,
|
|
921
1179
|
async (
|
|
922
1180
|
req: ExpressRequest,
|
|
923
1181
|
res: ExpressResponse,
|
|
@@ -940,7 +1198,7 @@ router.post(
|
|
|
940
1198
|
const facetKeys: Array<string> = body["facetKeys"]
|
|
941
1199
|
? (body["facetKeys"] as Array<string>)
|
|
942
1200
|
: [
|
|
943
|
-
"
|
|
1201
|
+
"primaryEntityId",
|
|
944
1202
|
"hostId",
|
|
945
1203
|
"dockerHostId",
|
|
946
1204
|
"kubernetesClusterId",
|
|
@@ -1085,7 +1343,7 @@ router.post(
|
|
|
1085
1343
|
|
|
1086
1344
|
router.post(
|
|
1087
1345
|
"/telemetry/metrics/facets",
|
|
1088
|
-
|
|
1346
|
+
...requireMetricReadAccess,
|
|
1089
1347
|
async (
|
|
1090
1348
|
req: ExpressRequest,
|
|
1091
1349
|
res: ExpressResponse,
|
|
@@ -1107,7 +1365,7 @@ router.post(
|
|
|
1107
1365
|
|
|
1108
1366
|
const facetKeys: Array<string> = body["facetKeys"]
|
|
1109
1367
|
? (body["facetKeys"] as Array<string>)
|
|
1110
|
-
: ["
|
|
1368
|
+
: ["primaryEntityId", "hostId", "dockerHostId", "kubernetesClusterId"];
|
|
1111
1369
|
|
|
1112
1370
|
const startTime: Date = body["startTime"]
|
|
1113
1371
|
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
@@ -1217,7 +1475,7 @@ router.post(
|
|
|
1217
1475
|
|
|
1218
1476
|
router.post(
|
|
1219
1477
|
"/telemetry/logs/analytics",
|
|
1220
|
-
|
|
1478
|
+
...requireLogReadAccess,
|
|
1221
1479
|
async (
|
|
1222
1480
|
req: ExpressRequest,
|
|
1223
1481
|
res: ExpressResponse,
|
|
@@ -1357,7 +1615,7 @@ router.post(
|
|
|
1357
1615
|
|
|
1358
1616
|
router.post(
|
|
1359
1617
|
"/telemetry/logs/export",
|
|
1360
|
-
|
|
1618
|
+
...requireLogReadAccess,
|
|
1361
1619
|
async (
|
|
1362
1620
|
req: ExpressRequest,
|
|
1363
1621
|
res: ExpressResponse,
|
|
@@ -1427,7 +1685,7 @@ router.post(
|
|
|
1427
1685
|
|
|
1428
1686
|
if (format === "csv") {
|
|
1429
1687
|
const header: string =
|
|
1430
|
-
"time,
|
|
1688
|
+
"time,primaryEntityId,severityText,severityNumber,body,traceId,spanId,attributes";
|
|
1431
1689
|
const csvRows: Array<string> = rows.map((row: JSONObject) => {
|
|
1432
1690
|
const escapeCsv: (val: unknown) => string = (
|
|
1433
1691
|
val: unknown,
|
|
@@ -1442,7 +1700,7 @@ router.post(
|
|
|
1442
1700
|
|
|
1443
1701
|
return [
|
|
1444
1702
|
escapeCsv(row["time"]),
|
|
1445
|
-
escapeCsv(row["
|
|
1703
|
+
escapeCsv(row["primaryEntityId"]),
|
|
1446
1704
|
escapeCsv(row["severityText"]),
|
|
1447
1705
|
escapeCsv(row["severityNumber"]),
|
|
1448
1706
|
escapeCsv(row["body"]),
|
|
@@ -1479,7 +1737,7 @@ router.post(
|
|
|
1479
1737
|
|
|
1480
1738
|
router.post(
|
|
1481
1739
|
"/telemetry/logs/context",
|
|
1482
|
-
|
|
1740
|
+
...requireLogReadAccess,
|
|
1483
1741
|
async (
|
|
1484
1742
|
req: ExpressRequest,
|
|
1485
1743
|
res: ExpressResponse,
|
|
@@ -1500,16 +1758,16 @@ router.post(
|
|
|
1500
1758
|
const body: JSONObject = req.body as JSONObject;
|
|
1501
1759
|
|
|
1502
1760
|
const logId: string | undefined = body["logId"] as string | undefined;
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
| undefined;
|
|
1761
|
+
// `serviceId` is the pre-rename alias kept for stale clients.
|
|
1762
|
+
const primaryEntityId: string | undefined = (body["primaryEntityId"] ||
|
|
1763
|
+
body["serviceId"]) as string | undefined;
|
|
1506
1764
|
const time: string | undefined = body["time"] as string | undefined;
|
|
1507
1765
|
|
|
1508
|
-
if (!logId || !
|
|
1766
|
+
if (!logId || !primaryEntityId || !time) {
|
|
1509
1767
|
return Response.sendErrorResponse(
|
|
1510
1768
|
req,
|
|
1511
1769
|
res,
|
|
1512
|
-
new BadDataException("logId,
|
|
1770
|
+
new BadDataException("logId, primaryEntityId, and time are required"),
|
|
1513
1771
|
);
|
|
1514
1772
|
}
|
|
1515
1773
|
|
|
@@ -1520,7 +1778,7 @@ router.post(
|
|
|
1520
1778
|
after: Array<JSONObject>;
|
|
1521
1779
|
} = await LogAggregationService.getLogContext({
|
|
1522
1780
|
projectId: databaseProps.tenantId,
|
|
1523
|
-
|
|
1781
|
+
primaryEntityId: new ObjectID(primaryEntityId),
|
|
1524
1782
|
time: OneUptimeDate.fromString(time),
|
|
1525
1783
|
logId,
|
|
1526
1784
|
count,
|
|
@@ -1540,7 +1798,7 @@ router.post(
|
|
|
1540
1798
|
|
|
1541
1799
|
router.post(
|
|
1542
1800
|
"/telemetry/logs/drop-filter-estimate",
|
|
1543
|
-
|
|
1801
|
+
...requireLogReadAccess,
|
|
1544
1802
|
async (
|
|
1545
1803
|
req: ExpressRequest,
|
|
1546
1804
|
res: ExpressResponse,
|
|
@@ -1647,7 +1905,7 @@ function computeDefaultBucketSize(startTime: Date, endTime: Date): number {
|
|
|
1647
1905
|
|
|
1648
1906
|
router.post(
|
|
1649
1907
|
"/telemetry/profiles/get-attributes",
|
|
1650
|
-
|
|
1908
|
+
...requireProfileReadAccess,
|
|
1651
1909
|
async (req: ExpressRequest, res: ExpressResponse, next: NextFunction) => {
|
|
1652
1910
|
return getAttributes(req, res, next, TelemetryType.Profile);
|
|
1653
1911
|
},
|
|
@@ -1657,7 +1915,7 @@ router.post(
|
|
|
1657
1915
|
|
|
1658
1916
|
router.post(
|
|
1659
1917
|
"/telemetry/profiles/flamegraph",
|
|
1660
|
-
|
|
1918
|
+
...requireProfileReadAccess,
|
|
1661
1919
|
async (
|
|
1662
1920
|
req: ExpressRequest,
|
|
1663
1921
|
res: ExpressResponse,
|
|
@@ -1730,11 +1988,12 @@ router.post(
|
|
|
1730
1988
|
profileTypes.length > 0 && { profileTypes }),
|
|
1731
1989
|
};
|
|
1732
1990
|
|
|
1733
|
-
const
|
|
1991
|
+
const result: FlamegraphResult =
|
|
1734
1992
|
await ProfileAggregationService.getFlamegraph(request);
|
|
1735
1993
|
|
|
1736
1994
|
return Response.sendJsonObjectResponse(req, res, {
|
|
1737
|
-
flamegraph: flamegraph as unknown as JSONObject,
|
|
1995
|
+
flamegraph: result.flamegraph as unknown as JSONObject,
|
|
1996
|
+
truncated: result.truncated,
|
|
1738
1997
|
});
|
|
1739
1998
|
} catch (err: unknown) {
|
|
1740
1999
|
next(err);
|
|
@@ -1746,7 +2005,7 @@ router.post(
|
|
|
1746
2005
|
|
|
1747
2006
|
router.post(
|
|
1748
2007
|
"/telemetry/profiles/function-list",
|
|
1749
|
-
|
|
2008
|
+
...requireProfileReadAccess,
|
|
1750
2009
|
async (
|
|
1751
2010
|
req: ExpressRequest,
|
|
1752
2011
|
res: ExpressResponse,
|
|
@@ -1766,13 +2025,37 @@ router.post(
|
|
|
1766
2025
|
|
|
1767
2026
|
const body: JSONObject = req.body as JSONObject;
|
|
1768
2027
|
|
|
1769
|
-
const
|
|
2028
|
+
const profileId: string | undefined = body["profileId"]
|
|
2029
|
+
? (body["profileId"] as string)
|
|
2030
|
+
: undefined;
|
|
2031
|
+
|
|
2032
|
+
/*
|
|
2033
|
+
* Only default the window when no profileId is given: a profile's
|
|
2034
|
+
* samples are bounded by the profile itself, and a defaulted
|
|
2035
|
+
* last-hour window would silently exclude any profile captured
|
|
2036
|
+
* before the window started.
|
|
2037
|
+
*/
|
|
2038
|
+
const startTime: Date | undefined = body["startTime"]
|
|
1770
2039
|
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
1771
|
-
:
|
|
2040
|
+
: profileId
|
|
2041
|
+
? undefined
|
|
2042
|
+
: OneUptimeDate.addRemoveHours(OneUptimeDate.getCurrentDate(), -1);
|
|
1772
2043
|
|
|
1773
|
-
const endTime: Date = body["endTime"]
|
|
2044
|
+
const endTime: Date | undefined = body["endTime"]
|
|
1774
2045
|
? OneUptimeDate.fromString(body["endTime"] as string)
|
|
1775
|
-
:
|
|
2046
|
+
: profileId
|
|
2047
|
+
? undefined
|
|
2048
|
+
: OneUptimeDate.getCurrentDate();
|
|
2049
|
+
|
|
2050
|
+
if (!profileId && !startTime) {
|
|
2051
|
+
return Response.sendErrorResponse(
|
|
2052
|
+
req,
|
|
2053
|
+
res,
|
|
2054
|
+
new BadDataException(
|
|
2055
|
+
"Either profileId or startTime must be provided",
|
|
2056
|
+
),
|
|
2057
|
+
);
|
|
2058
|
+
}
|
|
1776
2059
|
|
|
1777
2060
|
const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
|
|
1778
2061
|
? (body["serviceIds"] as Array<string>).map((id: string) => {
|
|
@@ -1805,8 +2088,9 @@ router.post(
|
|
|
1805
2088
|
|
|
1806
2089
|
const request: FunctionListRequest = {
|
|
1807
2090
|
projectId: databaseProps.tenantId,
|
|
1808
|
-
startTime,
|
|
1809
|
-
endTime,
|
|
2091
|
+
...(startTime !== undefined && { startTime }),
|
|
2092
|
+
...(endTime !== undefined && { endTime }),
|
|
2093
|
+
...(profileId !== undefined && { profileId }),
|
|
1810
2094
|
...(serviceIds !== undefined && { serviceIds }),
|
|
1811
2095
|
...(profileType !== undefined && { profileType }),
|
|
1812
2096
|
...(profileTypes !== undefined &&
|
|
@@ -1815,11 +2099,13 @@ router.post(
|
|
|
1815
2099
|
...(sortBy !== undefined && { sortBy }),
|
|
1816
2100
|
};
|
|
1817
2101
|
|
|
1818
|
-
const
|
|
2102
|
+
const result: FunctionListResult =
|
|
1819
2103
|
await ProfileAggregationService.getFunctionList(request);
|
|
1820
2104
|
|
|
1821
2105
|
return Response.sendJsonObjectResponse(req, res, {
|
|
1822
|
-
functions: functions as unknown as JSONObject,
|
|
2106
|
+
functions: result.functions as unknown as JSONObject,
|
|
2107
|
+
windowTotal: result.windowTotal,
|
|
2108
|
+
truncated: result.truncated,
|
|
1823
2109
|
});
|
|
1824
2110
|
} catch (err: unknown) {
|
|
1825
2111
|
next(err);
|
|
@@ -1831,7 +2117,7 @@ router.post(
|
|
|
1831
2117
|
|
|
1832
2118
|
router.post(
|
|
1833
2119
|
"/telemetry/profiles/service-activity",
|
|
1834
|
-
|
|
2120
|
+
...requireProfileReadAccess,
|
|
1835
2121
|
async (
|
|
1836
2122
|
req: ExpressRequest,
|
|
1837
2123
|
res: ExpressResponse,
|
|
@@ -1898,7 +2184,7 @@ router.post(
|
|
|
1898
2184
|
|
|
1899
2185
|
router.get(
|
|
1900
2186
|
"/telemetry/profiles/:profileId/pprof",
|
|
1901
|
-
|
|
2187
|
+
...requireProfileReadAccess,
|
|
1902
2188
|
async (
|
|
1903
2189
|
req: ExpressRequest,
|
|
1904
2190
|
res: ExpressResponse,
|
|
@@ -2027,7 +2313,7 @@ router.get(
|
|
|
2027
2313
|
|
|
2028
2314
|
router.post(
|
|
2029
2315
|
"/telemetry/profiles/diff-flamegraph",
|
|
2030
|
-
|
|
2316
|
+
...requireProfileReadAccess,
|
|
2031
2317
|
async (
|
|
2032
2318
|
req: ExpressRequest,
|
|
2033
2319
|
res: ExpressResponse,
|
|
@@ -2110,11 +2396,240 @@ router.post(
|
|
|
2110
2396
|
profileTypes.length > 0 && { profileTypes }),
|
|
2111
2397
|
};
|
|
2112
2398
|
|
|
2113
|
-
const diffFlamegraph: DiffFlamegraphNode =
|
|
2399
|
+
const result: { diffFlamegraph: DiffFlamegraphNode; truncated: boolean } =
|
|
2114
2400
|
await ProfileAggregationService.getDiffFlamegraph(request);
|
|
2115
2401
|
|
|
2402
|
+
/*
|
|
2403
|
+
* `truncated` is surfaced so the UI can warn that the diff was built
|
|
2404
|
+
* from a capped sample set rather than the full window.
|
|
2405
|
+
*/
|
|
2406
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2407
|
+
diffFlamegraph: result.diffFlamegraph as unknown as JSONObject,
|
|
2408
|
+
truncated: result.truncated,
|
|
2409
|
+
});
|
|
2410
|
+
} catch (err: unknown) {
|
|
2411
|
+
next(err);
|
|
2412
|
+
}
|
|
2413
|
+
},
|
|
2414
|
+
);
|
|
2415
|
+
|
|
2416
|
+
// --- Profile Function Focus Endpoint ---
|
|
2417
|
+
|
|
2418
|
+
router.post(
|
|
2419
|
+
"/telemetry/profiles/function-focus",
|
|
2420
|
+
...requireProfileReadAccess,
|
|
2421
|
+
async (
|
|
2422
|
+
req: ExpressRequest,
|
|
2423
|
+
res: ExpressResponse,
|
|
2424
|
+
next: NextFunction,
|
|
2425
|
+
): Promise<void> => {
|
|
2426
|
+
try {
|
|
2427
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
2428
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2429
|
+
|
|
2430
|
+
if (!databaseProps?.tenantId) {
|
|
2431
|
+
return Response.sendErrorResponse(
|
|
2432
|
+
req,
|
|
2433
|
+
res,
|
|
2434
|
+
new BadDataException("Invalid Project ID"),
|
|
2435
|
+
);
|
|
2436
|
+
}
|
|
2437
|
+
|
|
2438
|
+
const body: JSONObject = req.body as JSONObject;
|
|
2439
|
+
|
|
2440
|
+
const functionName: string | undefined =
|
|
2441
|
+
body["functionName"] && typeof body["functionName"] === "string"
|
|
2442
|
+
? (body["functionName"] as string)
|
|
2443
|
+
: undefined;
|
|
2444
|
+
|
|
2445
|
+
if (!functionName) {
|
|
2446
|
+
return Response.sendErrorResponse(
|
|
2447
|
+
req,
|
|
2448
|
+
res,
|
|
2449
|
+
new BadDataException("functionName is required"),
|
|
2450
|
+
);
|
|
2451
|
+
}
|
|
2452
|
+
|
|
2453
|
+
/*
|
|
2454
|
+
* fileName participates in frame identity (frames match on
|
|
2455
|
+
* functionName + fileName; line numbers are ignored so identity
|
|
2456
|
+
* survives deploys) but may legitimately be empty: folded uploads
|
|
2457
|
+
* produce bare frames with no file information.
|
|
2458
|
+
*/
|
|
2459
|
+
const fileName: string =
|
|
2460
|
+
typeof body["fileName"] === "string"
|
|
2461
|
+
? (body["fileName"] as string)
|
|
2462
|
+
: "";
|
|
2463
|
+
|
|
2464
|
+
const profileId: string | undefined = body["profileId"]
|
|
2465
|
+
? (body["profileId"] as string)
|
|
2466
|
+
: undefined;
|
|
2467
|
+
|
|
2468
|
+
const startTime: Date | undefined = body["startTime"]
|
|
2469
|
+
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
2470
|
+
: undefined;
|
|
2471
|
+
|
|
2472
|
+
const endTime: Date | undefined = body["endTime"]
|
|
2473
|
+
? OneUptimeDate.fromString(body["endTime"] as string)
|
|
2474
|
+
: undefined;
|
|
2475
|
+
|
|
2476
|
+
const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
|
|
2477
|
+
? (body["serviceIds"] as Array<string>).map((id: string) => {
|
|
2478
|
+
return new ObjectID(id);
|
|
2479
|
+
})
|
|
2480
|
+
: undefined;
|
|
2481
|
+
|
|
2482
|
+
const profileType: string | undefined = body["profileType"]
|
|
2483
|
+
? (body["profileType"] as string)
|
|
2484
|
+
: undefined;
|
|
2485
|
+
|
|
2486
|
+
const profileTypes: Array<string> | undefined = Array.isArray(
|
|
2487
|
+
body["profileTypes"],
|
|
2488
|
+
)
|
|
2489
|
+
? (body["profileTypes"] as Array<string>).filter(
|
|
2490
|
+
(t: unknown): t is string => {
|
|
2491
|
+
return typeof t === "string" && t.length > 0;
|
|
2492
|
+
},
|
|
2493
|
+
)
|
|
2494
|
+
: undefined;
|
|
2495
|
+
|
|
2496
|
+
if (!profileId && !startTime) {
|
|
2497
|
+
return Response.sendErrorResponse(
|
|
2498
|
+
req,
|
|
2499
|
+
res,
|
|
2500
|
+
new BadDataException(
|
|
2501
|
+
"Either profileId or startTime must be provided",
|
|
2502
|
+
),
|
|
2503
|
+
);
|
|
2504
|
+
}
|
|
2505
|
+
|
|
2506
|
+
const request: FunctionFocusRequest = {
|
|
2507
|
+
projectId: databaseProps.tenantId,
|
|
2508
|
+
functionName,
|
|
2509
|
+
fileName,
|
|
2510
|
+
...(profileId !== undefined && { profileId }),
|
|
2511
|
+
...(startTime !== undefined && { startTime }),
|
|
2512
|
+
...(endTime !== undefined && { endTime }),
|
|
2513
|
+
...(serviceIds !== undefined && { serviceIds }),
|
|
2514
|
+
...(profileType !== undefined && { profileType }),
|
|
2515
|
+
...(profileTypes !== undefined &&
|
|
2516
|
+
profileTypes.length > 0 && { profileTypes }),
|
|
2517
|
+
};
|
|
2518
|
+
|
|
2519
|
+
const result: FunctionFocusResult =
|
|
2520
|
+
await ProfileAggregationService.getFunctionFocus(request);
|
|
2521
|
+
|
|
2522
|
+
return Response.sendJsonObjectResponse(req, res, {
|
|
2523
|
+
functionName: result.functionName,
|
|
2524
|
+
fileName: result.fileName,
|
|
2525
|
+
totalValue: result.totalValue,
|
|
2526
|
+
selfValue: result.selfValue,
|
|
2527
|
+
sampleCount: result.sampleCount,
|
|
2528
|
+
windowTotal: result.windowTotal,
|
|
2529
|
+
callers: result.callers as unknown as JSONObject,
|
|
2530
|
+
callees: result.callees as unknown as JSONObject,
|
|
2531
|
+
truncated: result.truncated,
|
|
2532
|
+
});
|
|
2533
|
+
} catch (err: unknown) {
|
|
2534
|
+
next(err);
|
|
2535
|
+
}
|
|
2536
|
+
},
|
|
2537
|
+
);
|
|
2538
|
+
|
|
2539
|
+
// --- Profile Breakdown Endpoint ---
|
|
2540
|
+
|
|
2541
|
+
router.post(
|
|
2542
|
+
"/telemetry/profiles/breakdown",
|
|
2543
|
+
...requireProfileReadAccess,
|
|
2544
|
+
async (
|
|
2545
|
+
req: ExpressRequest,
|
|
2546
|
+
res: ExpressResponse,
|
|
2547
|
+
next: NextFunction,
|
|
2548
|
+
): Promise<void> => {
|
|
2549
|
+
try {
|
|
2550
|
+
const databaseProps: DatabaseCommonInteractionProps =
|
|
2551
|
+
await CommonAPI.getDatabaseCommonInteractionProps(req);
|
|
2552
|
+
|
|
2553
|
+
if (!databaseProps?.tenantId) {
|
|
2554
|
+
return Response.sendErrorResponse(
|
|
2555
|
+
req,
|
|
2556
|
+
res,
|
|
2557
|
+
new BadDataException("Invalid Project ID"),
|
|
2558
|
+
);
|
|
2559
|
+
}
|
|
2560
|
+
|
|
2561
|
+
const body: JSONObject = req.body as JSONObject;
|
|
2562
|
+
|
|
2563
|
+
const startTime: Date | undefined = body["startTime"]
|
|
2564
|
+
? OneUptimeDate.fromString(body["startTime"] as string)
|
|
2565
|
+
: undefined;
|
|
2566
|
+
|
|
2567
|
+
const endTime: Date | undefined = body["endTime"]
|
|
2568
|
+
? OneUptimeDate.fromString(body["endTime"] as string)
|
|
2569
|
+
: undefined;
|
|
2570
|
+
|
|
2571
|
+
/*
|
|
2572
|
+
* breakdownBy is either the reserved key 'service' (grouping by
|
|
2573
|
+
* primaryEntityId, resolved to display names by the UI) or a Profile
|
|
2574
|
+
* attribute key.
|
|
2575
|
+
*/
|
|
2576
|
+
const breakdownBy: string | undefined =
|
|
2577
|
+
body["breakdownBy"] && typeof body["breakdownBy"] === "string"
|
|
2578
|
+
? (body["breakdownBy"] as string)
|
|
2579
|
+
: undefined;
|
|
2580
|
+
|
|
2581
|
+
if (!startTime || !endTime || !breakdownBy) {
|
|
2582
|
+
return Response.sendErrorResponse(
|
|
2583
|
+
req,
|
|
2584
|
+
res,
|
|
2585
|
+
new BadDataException(
|
|
2586
|
+
"startTime, endTime, and breakdownBy are all required",
|
|
2587
|
+
),
|
|
2588
|
+
);
|
|
2589
|
+
}
|
|
2590
|
+
|
|
2591
|
+
const serviceIds: Array<ObjectID> | undefined = body["serviceIds"]
|
|
2592
|
+
? (body["serviceIds"] as Array<string>).map((id: string) => {
|
|
2593
|
+
return new ObjectID(id);
|
|
2594
|
+
})
|
|
2595
|
+
: undefined;
|
|
2596
|
+
|
|
2597
|
+
const profileType: string | undefined = body["profileType"]
|
|
2598
|
+
? (body["profileType"] as string)
|
|
2599
|
+
: undefined;
|
|
2600
|
+
|
|
2601
|
+
const profileTypes: Array<string> | undefined = Array.isArray(
|
|
2602
|
+
body["profileTypes"],
|
|
2603
|
+
)
|
|
2604
|
+
? (body["profileTypes"] as Array<string>).filter(
|
|
2605
|
+
(t: unknown): t is string => {
|
|
2606
|
+
return typeof t === "string" && t.length > 0;
|
|
2607
|
+
},
|
|
2608
|
+
)
|
|
2609
|
+
: undefined;
|
|
2610
|
+
|
|
2611
|
+
const limit: number | undefined = body["limit"]
|
|
2612
|
+
? (body["limit"] as number)
|
|
2613
|
+
: undefined;
|
|
2614
|
+
|
|
2615
|
+
const request: BreakdownRequest = {
|
|
2616
|
+
projectId: databaseProps.tenantId,
|
|
2617
|
+
startTime,
|
|
2618
|
+
endTime,
|
|
2619
|
+
breakdownBy,
|
|
2620
|
+
...(serviceIds !== undefined && { serviceIds }),
|
|
2621
|
+
...(profileType !== undefined && { profileType }),
|
|
2622
|
+
...(profileTypes !== undefined &&
|
|
2623
|
+
profileTypes.length > 0 && { profileTypes }),
|
|
2624
|
+
...(limit !== undefined && { limit }),
|
|
2625
|
+
};
|
|
2626
|
+
|
|
2627
|
+
const result: BreakdownResult =
|
|
2628
|
+
await ProfileAggregationService.getBreakdown(request);
|
|
2629
|
+
|
|
2116
2630
|
return Response.sendJsonObjectResponse(req, res, {
|
|
2117
|
-
|
|
2631
|
+
items: result.items as unknown as JSONObject,
|
|
2632
|
+
totalSampleCount: result.totalSampleCount,
|
|
2118
2633
|
});
|
|
2119
2634
|
} catch (err: unknown) {
|
|
2120
2635
|
next(err);
|