The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/plugins/datasource/elasticsearch/query_def.ts

267 lines
6.9 KiB

import _ from 'lodash';
export const metricAggTypes = [
{ text: 'Count', value: 'count', requiresField: false },
{
text: 'Average',
value: 'avg',
requiresField: true,
supportsInlineScript: true,
supportsMissing: true,
},
{
text: 'Sum',
value: 'sum',
requiresField: true,
supportsInlineScript: true,
supportsMissing: true,
},
{
text: 'Max',
value: 'max',
requiresField: true,
supportsInlineScript: true,
supportsMissing: true,
},
{
text: 'Min',
value: 'min',
requiresField: true,
supportsInlineScript: true,
supportsMissing: true,
},
{
text: 'Extended Stats',
value: 'extended_stats',
requiresField: true,
supportsMissing: true,
supportsInlineScript: true,
},
{
text: 'Percentiles',
value: 'percentiles',
requiresField: true,
supportsMissing: true,
supportsInlineScript: true,
},
{
text: 'Unique Count',
value: 'cardinality',
requiresField: true,
supportsMissing: true,
},
{
text: 'Moving Average',
value: 'moving_avg',
requiresField: false,
isPipelineAgg: true,
minVersion: 2,
},
{
text: 'Derivative',
value: 'derivative',
requiresField: false,
isPipelineAgg: true,
minVersion: 2,
},
{
text: 'Bucket Script',
value: 'bucket_script',
requiresField: false,
isPipelineAgg: true,
supportsMultipleBucketPaths: true,
minVersion: 2,
},
{ text: 'Raw Document', value: 'raw_document', requiresField: false },
{ text: 'Logs', value: 'logs', requiresField: false },
];
export const bucketAggTypes = [
{ text: 'Terms', value: 'terms', requiresField: true },
{ text: 'Filters', value: 'filters' },
{ text: 'Geo Hash Grid', value: 'geohash_grid', requiresField: true },
{ text: 'Date Histogram', value: 'date_histogram', requiresField: true },
{ text: 'Histogram', value: 'histogram', requiresField: true },
];
export const orderByOptions = [{ text: 'Doc Count', value: '_count' }, { text: 'Term value', value: '_term' }];
export const orderOptions = [{ text: 'Top', value: 'desc' }, { text: 'Bottom', value: 'asc' }];
export const sizeOptions = [
{ text: 'No limit', value: '0' },
{ text: '1', value: '1' },
{ text: '2', value: '2' },
{ text: '3', value: '3' },
{ text: '5', value: '5' },
{ text: '10', value: '10' },
{ text: '15', value: '15' },
{ text: '20', value: '20' },
];
export const extendedStats = [
{ text: 'Avg', value: 'avg' },
{ text: 'Min', value: 'min' },
{ text: 'Max', value: 'max' },
{ text: 'Sum', value: 'sum' },
{ text: 'Count', value: 'count' },
{ text: 'Std Dev', value: 'std_deviation' },
{ text: 'Std Dev Upper', value: 'std_deviation_bounds_upper' },
{ text: 'Std Dev Lower', value: 'std_deviation_bounds_lower' },
];
export const intervalOptions = [
{ text: 'auto', value: 'auto' },
{ text: '10s', value: '10s' },
{ text: '1m', value: '1m' },
{ text: '5m', value: '5m' },
{ text: '10m', value: '10m' },
{ text: '20m', value: '20m' },
{ text: '1h', value: '1h' },
{ text: '1d', value: '1d' },
];
export const movingAvgModelOptions = [
{ text: 'Simple', value: 'simple' },
{ text: 'Linear', value: 'linear' },
{ text: 'Exponentially Weighted', value: 'ewma' },
{ text: 'Holt Linear', value: 'holt' },
{ text: 'Holt Winters', value: 'holt_winters' },
];
export const pipelineOptions: any = {
moving_avg: [
{ text: 'window', default: 5 },
{ text: 'model', default: 'simple' },
{ text: 'predict', default: undefined },
{ text: 'minimize', default: false },
],
derivative: [{ text: 'unit', default: undefined }],
bucket_script: [],
};
export const movingAvgModelSettings: any = {
simple: [],
linear: [],
ewma: [{ text: 'Alpha', value: 'alpha', default: undefined }],
holt: [{ text: 'Alpha', value: 'alpha', default: undefined }, { text: 'Beta', value: 'beta', default: undefined }],
holt_winters: [
{ text: 'Alpha', value: 'alpha', default: undefined },
{ text: 'Beta', value: 'beta', default: undefined },
{ text: 'Gamma', value: 'gamma', default: undefined },
{ text: 'Period', value: 'period', default: undefined },
{ text: 'Pad', value: 'pad', default: undefined, isCheckbox: true },
],
};
export function getMetricAggTypes(esVersion: any) {
return _.filter(metricAggTypes, f => {
if (f.minVersion) {
return f.minVersion <= esVersion;
} else {
return true;
}
});
}
export function getPipelineOptions(metric: any) {
if (!isPipelineAgg(metric.type)) {
return [];
}
return pipelineOptions[metric.type];
}
export function isPipelineAgg(metricType: any) {
if (metricType) {
const po = pipelineOptions[metricType];
return po !== null && po !== undefined;
}
return false;
}
export function isPipelineAggWithMultipleBucketPaths(metricType: any) {
if (metricType) {
return metricAggTypes.find(t => t.value === metricType && t.supportsMultipleBucketPaths) !== undefined;
}
return false;
}
export function getPipelineAggOptions(targets: any) {
const result: any[] = [];
_.each(targets.metrics, metric => {
if (!isPipelineAgg(metric.type)) {
result.push({ text: describeMetric(metric), value: metric.id });
}
});
return result;
}
export function getMovingAvgSettings(model: any, filtered: boolean) {
const filteredResult: any[] = [];
if (filtered) {
_.each(movingAvgModelSettings[model], setting => {
if (!setting.isCheckbox) {
filteredResult.push(setting);
}
});
return filteredResult;
}
return movingAvgModelSettings[model];
}
export function getOrderByOptions(target: any) {
const metricRefs: any[] = [];
_.each(target.metrics, metric => {
if (metric.type !== 'count') {
metricRefs.push({ text: describeMetric(metric), value: metric.id });
}
});
return orderByOptions.concat(metricRefs);
}
export function describeOrder(order: string) {
const def: any = _.find(orderOptions, { value: order });
return def.text;
}
export function describeMetric(metric: { type: string; field: string }) {
const def: any = _.find(metricAggTypes, { value: metric.type });
if (!def.requiresField && !isPipelineAgg(metric.type)) {
return def.text;
}
return def.text + ' ' + metric.field;
}
export function describeOrderBy(orderBy: any, target: any) {
const def: any = _.find(orderByOptions, { value: orderBy });
if (def) {
return def.text;
}
const metric: any = _.find(target.metrics, { id: orderBy });
if (metric) {
return describeMetric(metric);
} else {
return 'metric not found';
}
}
export function defaultMetricAgg() {
return { type: 'count', id: '1' };
}
export function defaultBucketAgg() {
return { type: 'date_histogram', id: '2', settings: { interval: 'auto' } };
}
export const findMetricById = (metrics: any[], id: any) => {
return _.find(metrics, { id: id });
};
export function hasMetricOfType(target: any, type: string): boolean {
return target && target.metrics && target.metrics.some((m: any) => m.type === type);
}