Fix: Adds context to list of keys that are not part of query (#17423)

Fixes: #17408
This commit is contained in:
Hugo Häggmark 2019-06-04 14:07:25 +02:00 committed by GitHub
parent 8ef961bba5
commit 10a4a89902
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 16 deletions

View File

@ -181,11 +181,11 @@ describe('updateHistory()', () => {
describe('hasNonEmptyQuery', () => { describe('hasNonEmptyQuery', () => {
test('should return true if one query is non-empty', () => { test('should return true if one query is non-empty', () => {
expect(hasNonEmptyQuery([{ refId: '1', key: '2', expr: 'foo' }])).toBeTruthy(); expect(hasNonEmptyQuery([{ refId: '1', key: '2', context: 'explore', expr: 'foo' }])).toBeTruthy();
}); });
test('should return false if query is empty', () => { test('should return false if query is empty', () => {
expect(hasNonEmptyQuery([{ refId: '1', key: '2' }])).toBeFalsy(); expect(hasNonEmptyQuery([{ refId: '1', key: '2', context: 'panel' }])).toBeFalsy();
}); });
test('should return false if no queries exist', () => { test('should return false if no queries exist', () => {

View File

@ -303,17 +303,19 @@ export function ensureQueries(queries?: DataQuery[]): DataQuery[] {
} }
/** /**
* A target is non-empty when it has keys (with non-empty values) other than refId and key. * A target is non-empty when it has keys (with non-empty values) other than refId, key and context.
*/ */
const validKeys = ['refId', 'key', 'context'];
export function hasNonEmptyQuery<TQuery extends DataQuery = any>(queries: TQuery[]): boolean { export function hasNonEmptyQuery<TQuery extends DataQuery = any>(queries: TQuery[]): boolean {
return ( return (
queries && queries &&
queries.some( queries.some(query => {
query => const keys = Object.keys(query)
Object.keys(query) .filter(key => validKeys.indexOf(key) === -1)
.map(k => query[k]) .map(k => query[k])
.filter(v => v).length > 2 .filter(v => v);
) return keys.length > 0;
})
); );
} }

View File

@ -13,7 +13,7 @@ import { TypeaheadOutput, HistoryItem } from 'app/types/explore';
import { getNextCharacter, getPreviousCousin } from 'app/features/explore/utils/dom'; import { getNextCharacter, getPreviousCousin } from 'app/features/explore/utils/dom';
import BracesPlugin from 'app/features/explore/slate-plugins/braces'; import BracesPlugin from 'app/features/explore/slate-plugins/braces';
import QueryField, { TypeaheadInput, QueryFieldState } from 'app/features/explore/QueryField'; import QueryField, { TypeaheadInput, QueryFieldState } from 'app/features/explore/QueryField';
import { PromQuery } from '../types'; import { PromQuery, PromContext } from '../types';
import { CancelablePromise, makePromiseCancelable } from 'app/core/utils/CancelablePromise'; import { CancelablePromise, makePromiseCancelable } from 'app/core/utils/CancelablePromise';
import { DataSourceApi, ExploreQueryFieldProps, DataSourceStatus, QueryHint } from '@grafana/ui'; import { DataSourceApi, ExploreQueryFieldProps, DataSourceStatus, QueryHint } from '@grafana/ui';
@ -223,7 +223,7 @@ class PromQueryField extends React.PureComponent<PromQueryFieldProps, PromQueryF
// Send text change to parent // Send text change to parent
const { query, onChange, onRunQuery } = this.props; const { query, onChange, onRunQuery } = this.props;
if (onChange) { if (onChange) {
const nextQuery: PromQuery = { ...query, expr: value, context: 'explore' }; const nextQuery: PromQuery = { ...query, expr: value, context: PromContext.Explore };
onChange(nextQuery); onChange(nextQuery);
if (override && onRunQuery) { if (override && onRunQuery) {

View File

@ -2,6 +2,7 @@
import _ from 'lodash'; import _ from 'lodash';
import $ from 'jquery'; import $ from 'jquery';
import { from, Observable } from 'rxjs'; import { from, Observable } from 'rxjs';
import { single, map, filter } from 'rxjs/operators';
// Services & Utils // Services & Utils
import kbn from 'app/core/utils/kbn'; import kbn from 'app/core/utils/kbn';
@ -15,7 +16,7 @@ import { getQueryHints } from './query_hints';
import { expandRecordingRules } from './language_utils'; import { expandRecordingRules } from './language_utils';
// Types // Types
import { PromQuery, PromOptions, PromQueryRequest } from './types'; import { PromQuery, PromOptions, PromQueryRequest, PromContext } from './types';
import { import {
DataQueryRequest, DataQueryRequest,
DataSourceApi, DataSourceApi,
@ -29,7 +30,6 @@ import { ExploreUrlState } from 'app/types/explore';
import { safeStringifyValue } from 'app/core/utils/explore'; import { safeStringifyValue } from 'app/core/utils/explore';
import { TemplateSrv } from 'app/features/templating/template_srv'; import { TemplateSrv } from 'app/features/templating/template_srv';
import { TimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { TimeSrv } from 'app/features/dashboard/services/TimeSrv';
import { single, map, filter } from 'rxjs/operators';
export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions> { export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions> {
type: string; type: string;
@ -224,7 +224,7 @@ export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions>
continue; continue;
} }
if (target.context === 'explore') { if (target.context === PromContext.Explore) {
target.format = 'time_series'; target.format = 'time_series';
target.instant = false; target.instant = false;
const instantTarget: any = _.cloneDeep(target); const instantTarget: any = _.cloneDeep(target);
@ -260,7 +260,10 @@ export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions>
return this.$q.when({ data: [] }) as Promise<{ data: any }>; return this.$q.when({ data: [] }) as Promise<{ data: any }>;
} }
if (observer && options.targets.filter(target => target.context === 'explore').length === options.targets.length) { if (
observer &&
options.targets.filter(target => target.context === PromContext.Explore).length === options.targets.length
) {
// using observer to make the instant query return immediately // using observer to make the instant query return immediately
this.runObserverQueries(options, observer, queries, activeTargets, end); this.runObserverQueries(options, observer, queries, activeTargets, end);
return this.$q.when({ data: [] }) as Promise<{ data: any }>; return this.$q.when({ data: [] }) as Promise<{ data: any }>;

View File

@ -1,8 +1,13 @@
import { DataQuery, DataSourceJsonData } from '@grafana/ui/src/types'; import { DataQuery, DataSourceJsonData } from '@grafana/ui/src/types';
export enum PromContext {
Explore = 'explore',
Panel = 'panel',
}
export interface PromQuery extends DataQuery { export interface PromQuery extends DataQuery {
expr: string; expr: string;
context?: 'explore' | 'panel'; context?: PromContext;
format?: string; format?: string;
instant?: boolean; instant?: boolean;
hinting?: boolean; hinting?: boolean;