D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
proc
/
self
/
root
/
usr
/
share
/
grafana
/
public
/
app
/
plugins
/
datasource
/
elasticsearch
/
Filename :
utils.ts
back
Copy
import { gte, SemVer } from 'semver'; import { isMetricAggregationWithField } from './components/QueryEditor/MetricAggregationsEditor/aggregations'; import { metricAggregationConfig } from './components/QueryEditor/MetricAggregationsEditor/utils'; import { ElasticsearchQuery, MetricAggregation, MetricAggregationWithInlineScript } from './types'; export const describeMetric = (metric: MetricAggregation) => { if (!isMetricAggregationWithField(metric)) { return metricAggregationConfig[metric.type].label; } // TODO: field might be undefined return `${metricAggregationConfig[metric.type].label} ${metric.field}`; }; /** * Utility function to clean up aggregations settings objects. * It removes nullish values and empty strings, array and objects * recursing over nested objects (not arrays). * @param obj */ export const removeEmpty = <T extends {}>(obj: T): Partial<T> => Object.entries(obj).reduce((acc, [key, value]) => { // Removing nullish values (null & undefined) if (value == null) { return { ...acc }; } // Removing empty arrays (This won't recurse the array) if (Array.isArray(value) && value.length === 0) { return { ...acc }; } // Removing empty strings if (typeof value === 'string' && value.length === 0) { return { ...acc }; } // Recursing over nested objects if (!Array.isArray(value) && typeof value === 'object') { const cleanObj = removeEmpty(value); if (Object.keys(cleanObj).length === 0) { return { ...acc }; } return { ...acc, [key]: cleanObj }; } return { ...acc, [key]: value, }; }, {}); /** * This function converts an order by string to the correct metric id For example, * if the user uses the standard deviation extended stat for the order by, * the value would be "1[std_deviation]" and this would return "1" */ export const convertOrderByToMetricId = (orderBy: string): string | undefined => { const metricIdMatches = orderBy.match(/^(\d+)/); return metricIdMatches ? metricIdMatches[1] : void 0; }; /** Gets the actual script value for metrics that support inline scripts. * * This is needed because the `script` is a bit polymorphic. * when creating a query with Grafana < 7.4 it was stored as: * ```json * { * "settings": { * "script": { * "inline": "value" * } * } * } * ``` * * while from 7.4 it's stored as * ```json * { * "settings": { * "script": "value" * } * } * ``` * * This allows us to access both formats and support both queries created before 7.4 and after. */ export const getScriptValue = (metric: MetricAggregationWithInlineScript) => (typeof metric.settings?.script === 'object' ? metric.settings?.script?.inline : metric.settings?.script) || ''; export const isSupportedVersion = (version: SemVer): boolean => { if (gte(version, '7.16.0')) { return true; } return false; }; export const unsupportedVersionMessage = 'Support for Elasticsearch versions after their end-of-life (currently versions < 7.16) was removed. Using unsupported version of Elasticsearch may lead to unexpected and incorrect results.'; // To be considered a time series query, the last bucked aggregation must be a Date Histogram export const isTimeSeriesQuery = (query: ElasticsearchQuery): boolean => { return query?.bucketAggs?.slice(-1)[0]?.type === 'date_histogram'; };