From bd071e3e6036d66ff9c430e9fd7a779e5e962eec Mon Sep 17 00:00:00 2001 From: sawhil Date: Tue, 22 Apr 2025 01:56:05 +0530 Subject: [PATCH] feat: added new queries to handle error rates of endpoints --- .../components/EndPointMetrics.tsx | 6 +- .../src/container/ApiMonitoring/utils.tsx | 191 +++++++++++++++--- 2 files changed, 162 insertions(+), 35 deletions(-) diff --git a/frontend/src/container/ApiMonitoring/Explorer/Domains/DomainDetails/components/EndPointMetrics.tsx b/frontend/src/container/ApiMonitoring/Explorer/Domains/DomainDetails/components/EndPointMetrics.tsx index 7999e7e06c..e6c8b577ac 100644 --- a/frontend/src/container/ApiMonitoring/Explorer/Domains/DomainDetails/components/EndPointMetrics.tsx +++ b/frontend/src/container/ApiMonitoring/Explorer/Domains/DomainDetails/components/EndPointMetrics.tsx @@ -89,12 +89,14 @@ function EndPointMetrics({ ) : ( { const errorRatePercent = Number( - (metricsData?.errorRate ?? 0 * 100).toFixed(1), + (Number(metricsData?.errorRate ?? 0) * 100).toFixed(1), ); if (errorRatePercent >= 90) return Color.BG_SAKURA_500; if (errorRatePercent >= 60) return Color.BG_AMBER_500; diff --git a/frontend/src/container/ApiMonitoring/utils.tsx b/frontend/src/container/ApiMonitoring/utils.tsx index 3284304731..80a6549f50 100644 --- a/frontend/src/container/ApiMonitoring/utils.tsx +++ b/frontend/src/container/ApiMonitoring/utils.tsx @@ -357,14 +357,14 @@ export const getEndPointsQueryPayload = ( key: 'span_id', type: '', }, - aggregateOperator: 'count', + aggregateOperator: 'count_distinct', dataSource: DataSource.TRACES, disabled: false, expression: 'A', filters: { items: [ { - id: '82bdab49', + id: 'ec316e57', key: { dataType: DataTypes.String, id: 'net.peer.name--string--tag--false', @@ -389,7 +389,7 @@ export const getEndPointsQueryPayload = ( reduceTo: 'avg', spaceAggregation: 'sum', stepInterval: 60, - timeAggregation: 'rate', + timeAggregation: 'count_distinct', }, { aggregateAttribute: { @@ -407,7 +407,7 @@ export const getEndPointsQueryPayload = ( filters: { items: [ { - id: '3f46231e', + id: '46d57857', key: { dataType: DataTypes.String, id: 'net.peer.name--string--tag--false', @@ -449,7 +449,7 @@ export const getEndPointsQueryPayload = ( filters: { items: [ { - id: '55ad75cd', + id: '4a237616', key: { dataType: DataTypes.String, id: 'net.peer.name--string--tag--false', @@ -476,8 +476,71 @@ export const getEndPointsQueryPayload = ( stepInterval: 60, timeAggregation: 'max', }, + { + aggregateAttribute: { + dataType: DataTypes.String, + id: 'span_id--string----true', + isColumn: true, + isJSON: false, + key: 'span_id', + type: '', + }, + aggregateOperator: 'count_distinct', + dataSource: DataSource.TRACES, + disabled: true, + expression: 'D', + filters: { + items: [ + { + id: 'f162de1e', + key: { + dataType: DataTypes.String, + id: 'net.peer.name--string--tag--false', + isColumn: false, + isJSON: false, + key: 'net.peer.name', + type: 'tag', + }, + op: '=', + value: domainName, + }, + { + id: '3df0ac1d', + key: { + dataType: DataTypes.bool, + id: 'has_error--bool----true', + isColumn: true, + isJSON: false, + key: 'has_error', + type: '', + }, + op: '=', + value: 'true', + }, + ], + op: 'AND', + }, + functions: [], + groupBy: isGroupedByAttribute ? groupBy : defaultGroupBy, + having: [], + legend: '', + limit: null, + orderBy: [], + queryName: 'D', + reduceTo: 'avg', + spaceAggregation: 'sum', + stepInterval: 60, + timeAggregation: 'count_distinct', + }, + ], + queryFormulas: [ + { + queryName: 'F1', + expression: '(D/A)*100', + disabled: false, + legend: 'error percentage', + }, ], - queryFormulas: [], }, clickhouse_sql: [ { @@ -738,7 +801,7 @@ export const formatEndPointsDataForTable = ( endpoint.data.C === 'n/a' ? '-' : getLastUsedRelativeTime(Math.floor(Number(endpoint.data.C) / 1000000)), // Convert from nanoseconds to milliseconds - errorRate: endpoint.data.D || '-', + errorRate: endpoint.data.F1 === undefined ? '-' : Number(endpoint.data.F1), }; }); } @@ -834,7 +897,7 @@ export const getEndPointDetailsQueryPayload = ( filters: { items: [ { - id: '3db61dd6', + id: '92b8a1c1', key: { dataType: DataTypes.String, id: 'http.url--string--tag--false', @@ -847,7 +910,7 @@ export const getEndPointDetailsQueryPayload = ( value: endPointName, }, { - id: '2d0f6061', + id: '874562e1', key: { dataType: DataTypes.String, id: 'net.peer.name--string--tag--false', @@ -859,7 +922,6 @@ export const getEndPointDetailsQueryPayload = ( op: '=', value: domainName, }, - ...filters.items, ], op: 'AND', }, @@ -891,7 +953,7 @@ export const getEndPointDetailsQueryPayload = ( filters: { items: [ { - id: 'bd65eb28', + id: 'c0c0f76b', key: { dataType: DataTypes.String, id: 'http.url--string--tag--false', @@ -904,7 +966,7 @@ export const getEndPointDetailsQueryPayload = ( value: endPointName, }, { - id: '14b30e30', + id: '0c5564e0', key: { dataType: DataTypes.String, id: 'net.peer.name--string--tag--false', @@ -916,7 +978,6 @@ export const getEndPointDetailsQueryPayload = ( op: '=', value: domainName, }, - ...filters.items, ], op: 'AND', }, @@ -935,19 +996,20 @@ export const getEndPointDetailsQueryPayload = ( { aggregateAttribute: { dataType: DataTypes.String, - id: '------false', - isColumn: false, - key: '', + id: 'span_id--string----true', + isColumn: true, + isJSON: false, + key: 'span_id', type: '', }, - aggregateOperator: 'rate', + aggregateOperator: 'count_distinct', dataSource: DataSource.TRACES, - disabled: false, + disabled: true, expression: 'C', filters: { items: [ { - id: 'd9d55d83', + id: '7a3eebed', key: { dataType: DataTypes.String, id: 'http.url--string--tag--false', @@ -960,7 +1022,7 @@ export const getEndPointDetailsQueryPayload = ( value: endPointName, }, { - id: '6087aebe', + id: '0d656701', key: { dataType: DataTypes.String, id: 'net.peer.name--string--tag--false', @@ -973,7 +1035,7 @@ export const getEndPointDetailsQueryPayload = ( value: domainName, }, { - id: 'c575cf6e', + id: '83ef9a1b', key: { dataType: DataTypes.bool, id: 'has_error--bool----true', @@ -985,21 +1047,20 @@ export const getEndPointDetailsQueryPayload = ( op: '=', value: 'true', }, - ...filters.items, ], op: 'AND', }, functions: [], groupBy: [], having: [], - legend: 'Error', + legend: '', limit: null, orderBy: [], queryName: 'C', reduceTo: 'avg', spaceAggregation: 'sum', stepInterval: 60, - timeAggregation: 'rate', + timeAggregation: 'count_distinct', }, { aggregateAttribute: { @@ -1016,7 +1077,7 @@ export const getEndPointDetailsQueryPayload = ( filters: { items: [ { - id: '8899ca87', + id: 'e7f12d52', key: { dataType: DataTypes.String, id: 'http.url--string--tag--false', @@ -1029,7 +1090,7 @@ export const getEndPointDetailsQueryPayload = ( value: endPointName, }, { - id: '5c4646fd', + id: '918f5b99', key: { dataType: DataTypes.String, id: 'net.peer.name--string--tag--false', @@ -1041,7 +1102,6 @@ export const getEndPointDetailsQueryPayload = ( op: '=', value: domainName, }, - ...filters.items, ], op: 'AND', }, @@ -1057,8 +1117,71 @@ export const getEndPointDetailsQueryPayload = ( stepInterval: 60, timeAggregation: 'max', }, + { + aggregateAttribute: { + dataType: DataTypes.String, + id: 'span_id--string----true', + isColumn: true, + isJSON: false, + key: 'span_id', + type: '', + }, + aggregateOperator: 'count_distinct', + dataSource: DataSource.TRACES, + disabled: true, + expression: 'E', + filters: { + items: [ + { + id: '5281578a', + key: { + dataType: DataTypes.String, + id: 'http.url--string--tag--false', + isColumn: false, + isJSON: false, + key: 'http.url', + type: 'tag', + }, + op: '=', + value: endPointName, + }, + { + id: 'b355d1aa', + key: { + dataType: DataTypes.String, + id: 'net.peer.name--string--tag--false', + isColumn: false, + isJSON: false, + key: 'net.peer.name', + type: 'tag', + }, + op: '=', + value: domainName, + }, + ], + op: 'AND', + }, + functions: [], + groupBy: [], + having: [], + legend: 'total', + limit: null, + orderBy: [], + queryName: 'E', + reduceTo: 'avg', + spaceAggregation: 'sum', + stepInterval: 60, + timeAggregation: 'count_distinct', + }, + ], + queryFormulas: [ + { + queryName: 'F1', + expression: '(C/E)*100', + disabled: false, + legend: 'error percentage', + }, ], - queryFormulas: [], }, clickhouse_sql: [ { @@ -1726,10 +1849,11 @@ export const getEndPointZeroStateQueryPayload = ( interface EndPointMetricsResponseRow { data: { - A: number; + A: number | string; B: number | string; - C: number; + C: number | string; D: number | string; + F1: number | string; }; } @@ -1745,7 +1869,7 @@ interface EndPointMetricsData { key: string; rate: number | string; latency: number | string; - errorRate: number; + errorRate: number | string; lastUsed: string; } @@ -1760,10 +1884,11 @@ export const getFormattedEndPointMetricsData = ( data: EndPointMetricsResponseRow[], ): EndPointMetricsData => ({ key: v4(), - rate: data[0].data.D === 'n/a' || !data[0].data.D ? '-' : data[0].data.A, + rate: data[0].data.A === 'n/a' || !data[0].data.A ? '-' : data[0].data.A, latency: data[0].data.B === 'n/a' ? '-' : Math.round(Number(data[0].data.B) / 1000000), - errorRate: data[0].data.C, + errorRate: + data[0].data.F1 === 'n/a' || !data[0].data.F1 ? '-' : Number(data[0].data.F1), lastUsed: data[0].data.D === 'n/a' || !data[0].data.D ? '-'