2023-03-16 22:56:26 +08:00
import React , { useMemo } from 'react' ;
2022-04-22 21:33:13 +08:00
2021-05-19 14:16:05 +08:00
import { SelectableValue } from '@grafana/data' ;
2022-10-24 23:12:36 +08:00
import { EditorField } from '@grafana/experimental' ;
import { RadioButtonGroup } from '@grafana/ui' ;
2022-04-22 21:33:13 +08:00
2021-05-19 14:16:05 +08:00
import { getAlignmentPickerData } from '../functions' ;
2023-05-23 00:19:54 +08:00
import { PreprocessorType , TimeSeriesList , MetricKind , ValueTypes } from '../types/query' ;
import { MetricDescriptor } from '../types/types' ;
2022-04-22 21:33:13 +08:00
2021-05-19 14:16:05 +08:00
const NONE_OPTION = { label : 'None' , value : PreprocessorType.None } ;
export interface Props {
metricDescriptor? : MetricDescriptor ;
2022-12-20 19:47:49 +08:00
onChange : ( query : TimeSeriesList ) = > void ;
query : TimeSeriesList ;
2021-05-19 14:16:05 +08:00
}
2023-03-16 22:56:26 +08:00
export const Preprocessor = ( { query , metricDescriptor , onChange } : Props ) = > {
2021-05-19 14:16:05 +08:00
const options = useOptions ( metricDescriptor ) ;
2022-12-20 19:47:49 +08:00
2021-05-19 14:16:05 +08:00
return (
2022-09-15 22:12:26 +08:00
< EditorField
2021-05-19 14:16:05 +08:00
label = "Pre-processing"
2022-10-17 15:45:35 +08:00
tooltip = "Preprocessing options are displayed when the selected metric has a metric kind of delta or cumulative. The specific options available are determined by the metric's value type. If you select 'Rate', data points are aligned and converted to a rate per time series. If you select 'Delta', data points are aligned by their delta (difference) per time series"
2021-05-19 14:16:05 +08:00
>
< RadioButtonGroup
onChange = { ( value : PreprocessorType ) = > {
2022-12-20 19:47:49 +08:00
const { perSeriesAligner : psa } = query ;
const { valueType , metricKind } = metricDescriptor ? ? { } ;
2021-05-19 14:16:05 +08:00
const { perSeriesAligner } = getAlignmentPickerData ( valueType , metricKind , psa , value ) ;
onChange ( { . . . query , preprocessor : value , perSeriesAligner } ) ;
} }
value = { query . preprocessor ? ? PreprocessorType . None }
options = { options }
2022-09-15 22:12:26 +08:00
/ >
< / EditorField >
2021-05-19 14:16:05 +08:00
) ;
} ;
2021-07-23 22:33:53 +08:00
const useOptions = ( metricDescriptor? : MetricDescriptor ) : Array < SelectableValue < PreprocessorType > > = > {
2021-05-19 14:16:05 +08:00
const metricKind = metricDescriptor ? . metricKind ;
const valueType = metricDescriptor ? . valueType ;
return useMemo ( ( ) = > {
if ( ! metricKind || metricKind === MetricKind . GAUGE || valueType === ValueTypes . DISTRIBUTION ) {
return [ NONE_OPTION ] ;
}
const options = [
NONE_OPTION ,
{
label : 'Rate' ,
value : PreprocessorType.Rate ,
description : 'Data points are aligned and converted to a rate per time series' ,
} ,
] ;
return metricKind === MetricKind . CUMULATIVE
? [
. . . options ,
{
label : 'Delta' ,
value : PreprocessorType.Delta ,
description : 'Data points are aligned by their delta (difference) per time series' ,
} ,
]
: options ;
} , [ metricKind , valueType ] ) ;
} ;