mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Elasticsearch: Add Support for Serial Differencing Pipeline Aggregation (#28618)
* Elasticsearch: Add support for serial diff pipeline aggregation * Removing settings transsforms * Removing unused deps * removing unused dep * Fixing type in test * Adding backend support for serial_diff
This commit is contained in:
parent
ccf2e255fe
commit
cf1c01dd8b
@ -48,6 +48,7 @@ var metricAggType = map[string]string{
|
||||
"moving_fn": "Moving Function",
|
||||
"cumulative_sum": "Cumulative Sum",
|
||||
"derivative": "Derivative",
|
||||
"serial_diff": "Serial Difference",
|
||||
"bucket_script": "Bucket Script",
|
||||
"raw_document": "Raw Document",
|
||||
}
|
||||
@ -68,6 +69,7 @@ var pipelineAggType = map[string]string{
|
||||
"moving_fn": "moving_fn",
|
||||
"cumulative_sum": "cumulative_sum",
|
||||
"derivative": "derivative",
|
||||
"serial_diff": "serial_diff",
|
||||
"bucket_script": "bucket_script",
|
||||
}
|
||||
|
||||
|
@ -650,6 +650,64 @@ func TestExecuteTimeSeriesQuery(t *testing.T) {
|
||||
So(plAgg.BucketPath, ShouldEqual, "_count")
|
||||
})
|
||||
|
||||
Convey("With serial_diff", func() {
|
||||
c := newFakeClient(5)
|
||||
_, err := executeTsdbQuery(c, `{
|
||||
"timeField": "@timestamp",
|
||||
"bucketAggs": [
|
||||
{ "type": "date_histogram", "field": "@timestamp", "id": "4" }
|
||||
],
|
||||
"metrics": [
|
||||
{ "id": "3", "type": "sum", "field": "@value" },
|
||||
{
|
||||
"id": "2",
|
||||
"type": "serial_diff",
|
||||
"pipelineAgg": "3"
|
||||
}
|
||||
]
|
||||
}`, from, to, 15*time.Second)
|
||||
So(err, ShouldBeNil)
|
||||
sr := c.multisearchRequests[0].Requests[0]
|
||||
|
||||
firstLevel := sr.Aggs[0]
|
||||
So(firstLevel.Key, ShouldEqual, "4")
|
||||
So(firstLevel.Aggregation.Type, ShouldEqual, "date_histogram")
|
||||
|
||||
serialDiffAgg := firstLevel.Aggregation.Aggs[1]
|
||||
So(serialDiffAgg.Key, ShouldEqual, "2")
|
||||
plAgg := serialDiffAgg.Aggregation.Aggregation.(*es.PipelineAggregation)
|
||||
So(plAgg.BucketPath, ShouldEqual, "3")
|
||||
})
|
||||
|
||||
Convey("With serial_diff doc count", func() {
|
||||
c := newFakeClient(5)
|
||||
_, err := executeTsdbQuery(c, `{
|
||||
"timeField": "@timestamp",
|
||||
"bucketAggs": [
|
||||
{ "type": "date_histogram", "field": "@timestamp", "id": "4" }
|
||||
],
|
||||
"metrics": [
|
||||
{ "id": "3", "type": "count", "field": "select field" },
|
||||
{
|
||||
"id": "2",
|
||||
"type": "serial_diff",
|
||||
"pipelineAgg": "3"
|
||||
}
|
||||
]
|
||||
}`, from, to, 15*time.Second)
|
||||
So(err, ShouldBeNil)
|
||||
sr := c.multisearchRequests[0].Requests[0]
|
||||
|
||||
firstLevel := sr.Aggs[0]
|
||||
So(firstLevel.Key, ShouldEqual, "4")
|
||||
So(firstLevel.Aggregation.Type, ShouldEqual, "date_histogram")
|
||||
|
||||
serialDiffAgg := firstLevel.Aggregation.Aggs[0]
|
||||
So(serialDiffAgg.Key, ShouldEqual, "2")
|
||||
plAgg := serialDiffAgg.Aggregation.Aggregation.(*es.PipelineAggregation)
|
||||
So(plAgg.BucketPath, ShouldEqual, "_count")
|
||||
})
|
||||
|
||||
Convey("With bucket_script", func() {
|
||||
c := newFakeClient(5)
|
||||
_, err := executeTsdbQuery(c, `{
|
||||
|
@ -35,6 +35,15 @@ export const SettingsEditor: FunctionComponent<Props> = ({ metric, previousMetri
|
||||
<SettingsEditorContainer label={description} hidden={metric.hide}>
|
||||
{metric.type === 'derivative' && <SettingField label="Unit" metric={metric} settingName="unit" />}
|
||||
|
||||
{metric.type === 'serial_diff' && (
|
||||
<InlineField label="Lag">
|
||||
<Input
|
||||
onBlur={e => dispatch(changeMetricSetting(metric, 'lag', parseInt(e.target.value, 10)))}
|
||||
defaultValue={metric.settings?.lag}
|
||||
/>
|
||||
</InlineField>
|
||||
)}
|
||||
|
||||
{metric.type === 'cumulative_sum' && <SettingField label="Format" metric={metric} settingName="format" />}
|
||||
|
||||
{metric.type === 'moving_avg' && <MovingAverageSettingsEditor metric={metric} />}
|
||||
|
@ -4,6 +4,7 @@ export type PipelineMetricAggregationType =
|
||||
| 'moving_avg'
|
||||
| 'moving_fn'
|
||||
| 'derivative'
|
||||
| 'serial_diff'
|
||||
| 'cumulative_sum'
|
||||
| 'bucket_script';
|
||||
|
||||
@ -247,6 +248,13 @@ export interface Derivative extends BasePipelineMetricAggregation {
|
||||
};
|
||||
}
|
||||
|
||||
export interface SerialDiff extends BasePipelineMetricAggregation {
|
||||
type: 'serial_diff';
|
||||
settings?: {
|
||||
lag?: number;
|
||||
};
|
||||
}
|
||||
|
||||
interface CumulativeSum extends BasePipelineMetricAggregation {
|
||||
type: 'cumulative_sum';
|
||||
settings?: {
|
||||
@ -267,6 +275,7 @@ export type MetricAggregationWithSettings =
|
||||
| BucketScript
|
||||
| CumulativeSum
|
||||
| Derivative
|
||||
| SerialDiff
|
||||
| RawData
|
||||
| RawDocument
|
||||
| UniqueCount
|
||||
@ -336,6 +345,7 @@ export const METRIC_AGGREGATION_TYPES = [
|
||||
'moving_avg',
|
||||
'moving_fn',
|
||||
'derivative',
|
||||
'serial_diff',
|
||||
'cumulative_sum',
|
||||
'bucket_script',
|
||||
];
|
||||
|
@ -147,6 +147,18 @@ export const metricAggregationConfig: MetricsConfiguration = {
|
||||
hasMeta: false,
|
||||
defaults: {},
|
||||
},
|
||||
serial_diff: {
|
||||
label: 'Serial Difference',
|
||||
requiresField: true,
|
||||
isPipelineAgg: true,
|
||||
minVersion: 2,
|
||||
supportsMissing: false,
|
||||
supportsMultipleBucketPaths: false,
|
||||
hasSettings: true,
|
||||
supportsInlineScript: false,
|
||||
hasMeta: false,
|
||||
defaults: {},
|
||||
},
|
||||
cumulative_sum: {
|
||||
label: 'Cumulative Sum',
|
||||
requiresField: true,
|
||||
@ -236,6 +248,7 @@ export const pipelineOptions: PipelineOptions = {
|
||||
],
|
||||
moving_fn: [{ label: 'window', default: 5 }, { label: 'script' }],
|
||||
derivative: [{ label: 'unit' }],
|
||||
serial_diff: [{ label: 'lag' }],
|
||||
cumulative_sum: [{ label: 'format' }],
|
||||
bucket_script: [],
|
||||
};
|
||||
|
@ -387,6 +387,35 @@ describe('ElasticQueryBuilder', () => {
|
||||
expect(firstLevel.aggs['2'].derivative.buckets_path).toBe('_count');
|
||||
});
|
||||
|
||||
it('with serial_diff', () => {
|
||||
const query = builder.build({
|
||||
refId: 'A',
|
||||
metrics: [
|
||||
{
|
||||
id: '3',
|
||||
type: 'max',
|
||||
field: '@value',
|
||||
},
|
||||
{
|
||||
id: '2',
|
||||
type: 'serial_diff',
|
||||
field: '3',
|
||||
settings: {
|
||||
lag: 5,
|
||||
},
|
||||
},
|
||||
],
|
||||
bucketAggs: [{ type: 'date_histogram', field: '@timestamp', id: '3' }],
|
||||
});
|
||||
|
||||
const firstLevel = query.aggs['3'];
|
||||
|
||||
expect(firstLevel.aggs['2']).not.toBe(undefined);
|
||||
expect(firstLevel.aggs['2'].serial_diff).not.toBe(undefined);
|
||||
expect(firstLevel.aggs['2'].serial_diff.buckets_path).toBe('3');
|
||||
expect(firstLevel.aggs['2'].serial_diff.lag).toBe(5);
|
||||
});
|
||||
|
||||
it('with bucket_script', () => {
|
||||
const query = builder.build({
|
||||
refId: 'A',
|
||||
|
Loading…
Reference in New Issue
Block a user