@@ -44,15 +44,23 @@ export type SortOrder = 'asc' | 'desc' | null;
44
44
45
45
export enum AggFn {
46
46
Avg = 'avg' ,
47
+ AvgRate = 'avg_rate' ,
47
48
Count = 'count' ,
48
49
CountDistinct = 'count_distinct' ,
49
50
Max = 'max' ,
51
+ MaxRate = 'max_rate' ,
50
52
Min = 'min' ,
53
+ MinRate = 'min_rate' ,
51
54
P50 = 'p50' ,
55
+ P50Rate = 'p50_rate' ,
52
56
P90 = 'p90' ,
57
+ P90Rate = 'p90_rate' ,
53
58
P95 = 'p95' ,
59
+ P95Rate = 'p95_rate' ,
54
60
P99 = 'p99' ,
61
+ P99Rate = 'p99_rate' ,
55
62
Sum = 'sum' ,
63
+ SumRate = 'sum_rate' ,
56
64
}
57
65
58
66
export enum Granularity {
@@ -621,6 +629,19 @@ export const getMetricsTags = async (teamId: string) => {
621
629
return result ;
622
630
} ;
623
631
632
+ const isRateAggFn = ( aggFn : AggFn ) => {
633
+ return (
634
+ aggFn === AggFn . SumRate ||
635
+ aggFn === AggFn . AvgRate ||
636
+ aggFn === AggFn . MaxRate ||
637
+ aggFn === AggFn . MinRate ||
638
+ aggFn === AggFn . P50Rate ||
639
+ aggFn === AggFn . P90Rate ||
640
+ aggFn === AggFn . P95Rate ||
641
+ aggFn === AggFn . P99Rate
642
+ ) ;
643
+ } ;
644
+
624
645
export const getMetricsChart = async ( {
625
646
aggFn,
626
647
dataType,
@@ -663,78 +684,100 @@ export const getMetricsChart = async ({
663
684
: 'name AS group' ,
664
685
] ;
665
686
666
- switch ( dataType ) {
667
- case 'Gauge' :
668
- selectClause . push (
669
- aggFn === AggFn . Count
670
- ? 'COUNT(value) as data'
671
- : aggFn === AggFn . Sum
672
- ? `SUM(value) as data`
673
- : aggFn === AggFn . Avg
674
- ? `AVG(value) as data`
675
- : aggFn === AggFn . Max
676
- ? `MAX(value) as data`
677
- : aggFn === AggFn . Min
678
- ? `MIN(value) as data`
679
- : `quantile(${
680
- aggFn === AggFn . P50
681
- ? '0.5'
682
- : aggFn === AggFn . P90
683
- ? '0.90'
684
- : aggFn === AggFn . P95
685
- ? '0.95'
686
- : '0.99'
687
- } )(value) as data`,
688
- ) ;
689
- break ;
690
- case 'Sum' :
691
- selectClause . push (
692
- aggFn === AggFn . Count
693
- ? 'COUNT(delta) as data'
694
- : aggFn === AggFn . Sum
695
- ? `SUM(delta) as data`
696
- : aggFn === AggFn . Avg
697
- ? `AVG(delta) as data`
698
- : aggFn === AggFn . Max
699
- ? `MAX(delta) as data`
700
- : aggFn === AggFn . Min
701
- ? `MIN(delta) as data`
702
- : `quantile(${
703
- aggFn === AggFn . P50
704
- ? '0.5'
705
- : aggFn === AggFn . P90
706
- ? '0.90'
707
- : aggFn === AggFn . P95
708
- ? '0.95'
709
- : '0.99'
710
- } )(delta) as data`,
711
- ) ;
712
- break ;
713
- default :
714
- logger . error ( `Unsupported data type: ${ dataType } ` ) ;
715
- break ;
687
+ const isRate = isRateAggFn ( aggFn ) ;
688
+
689
+ if ( dataType === 'Gauge' || dataType === 'Sum' ) {
690
+ selectClause . push (
691
+ aggFn === AggFn . Count
692
+ ? 'COUNT(value) as data'
693
+ : aggFn === AggFn . Sum
694
+ ? `SUM(value) as data`
695
+ : aggFn === AggFn . Avg
696
+ ? `AVG(value) as data`
697
+ : aggFn === AggFn . Max
698
+ ? `MAX(value) as data`
699
+ : aggFn === AggFn . Min
700
+ ? `MIN(value) as data`
701
+ : aggFn === AggFn . SumRate
702
+ ? `SUM(rate) as data`
703
+ : aggFn === AggFn . AvgRate
704
+ ? `AVG(rate) as data`
705
+ : aggFn === AggFn . MaxRate
706
+ ? `MAX(rate) as data`
707
+ : aggFn === AggFn . MinRate
708
+ ? `MIN(rate) as data`
709
+ : `quantile(${
710
+ aggFn === AggFn . P50 || aggFn === AggFn . P50Rate
711
+ ? '0.5'
712
+ : aggFn === AggFn . P90 || aggFn === AggFn . P90Rate
713
+ ? '0.90'
714
+ : aggFn === AggFn . P95 || aggFn === AggFn . P95Rate
715
+ ? '0.95'
716
+ : '0.99'
717
+ } )(${ isRate ? 'rate' : 'value' } ) as data`,
718
+ ) ;
719
+ } else {
720
+ logger . error ( `Unsupported data type: ${ dataType } ` ) ;
716
721
}
717
722
723
+ const rateMetricSource = SqlString . format (
724
+ `
725
+ SELECT
726
+ if(
727
+ runningDifference(value) < 0
728
+ OR neighbor(_string_attributes, -1, _string_attributes) != _string_attributes,
729
+ nan,
730
+ runningDifference(value)
731
+ ) AS rate,
732
+ ts_bucket as timestamp,
733
+ _string_attributes,
734
+ min_name as name
735
+ FROM
736
+ (
737
+ SELECT
738
+ toStartOfInterval(timestamp, INTERVAL ?) as ts_bucket,
739
+ min(value) as value,
740
+ _string_attributes,
741
+ min(name) as min_name
742
+ FROM
743
+ ??
744
+ WHERE
745
+ name = ?
746
+ AND data_type = ?
747
+ AND (?)
748
+ GROUP BY
749
+ _string_attributes,
750
+ ts_bucket
751
+ ORDER BY
752
+ _string_attributes,
753
+ ts_bucket ASC
754
+ )
755
+ ` . trim ( ) ,
756
+ [ granularity , tableName , name , dataType , SqlString . raw ( whereClause ) ] ,
757
+ ) ;
758
+
759
+ const gaugeMetricSource = SqlString . format (
760
+ `
761
+ SELECT
762
+ timestamp,
763
+ name,
764
+ value,
765
+ _string_attributes
766
+ FROM ??
767
+ WHERE name = ?
768
+ AND data_type = ?
769
+ AND (?)
770
+ ORDER BY _timestamp_sort_key ASC
771
+ ` . trim ( ) ,
772
+ [ tableName , name , dataType , SqlString . raw ( whereClause ) ] ,
773
+ ) ;
774
+
718
775
// TODO: support other data types like Sum, Histogram, etc.
719
776
const query = SqlString . format (
720
777
`
721
- WITH metrcis AS (
722
- SELECT *, runningDifference(value) AS delta
723
- FROM (
724
- SELECT
725
- timestamp,
726
- name,
727
- value,
728
- _string_attributes
729
- FROM ??
730
- WHERE name = ?
731
- AND data_type = ?
732
- AND (?)
733
- ORDER BY _timestamp_sort_key ASC
734
- )
735
- )
778
+ WITH metrics AS (?)
736
779
SELECT ?
737
- FROM metrcis
780
+ FROM metrics
738
781
GROUP BY group, ts_bucket
739
782
ORDER BY ts_bucket ASC
740
783
WITH FILL
@@ -743,10 +786,7 @@ export const getMetricsChart = async ({
743
786
STEP ?
744
787
` ,
745
788
[
746
- tableName ,
747
- name ,
748
- dataType ,
749
- SqlString . raw ( whereClause ) ,
789
+ SqlString . raw ( isRate ? rateMetricSource : gaugeMetricSource ) ,
750
790
SqlString . raw ( selectClause . join ( ',' ) ) ,
751
791
startTime / 1000 ,
752
792
granularity ,
@@ -798,6 +838,10 @@ export const getLogsChart = async ({
798
838
tableVersion : number | undefined ;
799
839
teamId : string ;
800
840
} ) => {
841
+ if ( isRateAggFn ( aggFn ) ) {
842
+ throw new Error ( 'Rate is not supported in logs chart' ) ;
843
+ }
844
+
801
845
const tableName = getLogStreamTableName ( tableVersion , teamId ) ;
802
846
const whereClause = await buildSearchQueryWhereCondition ( {
803
847
endTime,
0 commit comments