Loki: use queryType rather than range|instant flags (#43727)

This commit is contained in:
Ryan McKinley 2022-01-07 10:00:11 -08:00 committed by GitHub
parent 0dd88d9480
commit 546818819b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 46 additions and 29 deletions

View File

@ -69,6 +69,7 @@ type datasourceInfo struct {
}
type QueryModel struct {
QueryType string `json:"queryType"`
Expr string `json:"expr"`
LegendFormat string `json:"legendFormat"`
Interval string `json:"interval"`

View File

@ -34,7 +34,6 @@ export const LokiAnnotationsQueryEditor = memo(function LokiAnnotationQueryEdito
history={[]}
ExtraFieldElement={
<LokiOptionFields
queryType={queryWithRefId.instant ? 'instant' : 'range'}
lineLimitValue={queryWithRefId?.maxLines?.toString() || ''}
resolution={queryWithRefId.resolution || 1}
query={queryWithRefId}

View File

@ -25,7 +25,6 @@ export function LokiExploreQueryEditor(props: Props) {
range={range}
ExtraFieldElement={
<LokiOptionFields
queryType={query.instant ? 'instant' : 'range'}
lineLimitValue={query?.maxLines?.toString() || ''}
resolution={query.resolution || 1}
query={query}

View File

@ -6,27 +6,29 @@ import { map } from 'lodash';
// Types
import { InlineFormLabel, RadioButtonGroup, InlineField, Input, Select } from '@grafana/ui';
import { SelectableValue } from '@grafana/data';
import { LokiQuery } from '../types';
import { LokiQuery, LokiQueryType } from '../types';
export interface LokiOptionFieldsProps {
lineLimitValue: string;
resolution: number;
queryType: LokiQueryType;
query: LokiQuery;
onChange: (value: LokiQuery) => void;
onRunQuery: () => void;
runOnBlur?: boolean;
}
type LokiQueryType = 'instant' | 'range';
const queryTypeOptions: Array<SelectableValue<LokiQueryType>> = [
{ value: 'range', label: 'Range', description: 'Run query over a range of time.' },
{ value: LokiQueryType.Range, label: 'Range', description: 'Run query over a range of time.' },
{
value: 'instant',
value: LokiQueryType.Instant,
label: 'Instant',
description: 'Run query against a single point in time. For this query, the "To" time is used.',
},
// {
// value: LokiQueryType.Stream,
// label: 'Stream',
// description: 'Run a query and keep sending results on an interval',
// },
];
export const DEFAULT_RESOLUTION: SelectableValue<number> = {
@ -42,21 +44,18 @@ const RESOLUTION_OPTIONS: Array<SelectableValue<number>> = [DEFAULT_RESOLUTION].
);
export function LokiOptionFields(props: LokiOptionFieldsProps) {
const { lineLimitValue, resolution, queryType, query, onRunQuery, runOnBlur, onChange } = props;
const { lineLimitValue, resolution, onRunQuery, runOnBlur, onChange } = props;
const query = props.query ?? {};
let queryType = query.queryType ?? (query.instant ? LokiQueryType.Instant : LokiQueryType.Range);
function onChangeQueryLimit(value: string) {
const nextQuery = { ...query, maxLines: preprocessMaxLines(value) };
onChange(nextQuery);
}
function onQueryTypeChange(value: LokiQueryType) {
let nextQuery;
if (value === 'instant') {
nextQuery = { ...query, instant: true, range: false };
} else {
nextQuery = { ...query, instant: false, range: true };
}
onChange(nextQuery);
function onQueryTypeChange(queryType: LokiQueryType) {
const { instant, range, ...rest } = query;
onChange({ ...rest, queryType });
}
function preprocessMaxLines(value: string): number {
@ -155,6 +154,7 @@ export function LokiOptionFields(props: LokiOptionFieldsProps) {
options={RESOLUTION_OPTIONS}
value={resolution}
aria-label="Select resolution"
menuShouldPortal
/>
</InlineField>
</div>

View File

@ -51,7 +51,6 @@ export function LokiQueryEditor(props: LokiQueryEditorProps) {
ExtraFieldElement={
<>
<LokiOptionFields
queryType={query.instant ? 'instant' : 'range'}
lineLimitValue={query?.maxLines?.toString() || ''}
resolution={query?.resolution || 1}
query={query}

View File

@ -14,7 +14,6 @@ exports[`LokiExploreQueryEditor should render component 1`] = `
"refId": "A",
}
}
queryType="range"
resolution={1}
/>
}

View File

@ -15,7 +15,6 @@ exports[`Render LokiQueryEditor with legend should render 1`] = `
"refId": "A",
}
}
queryType="range"
resolution={1}
runOnBlur={true}
/>
@ -81,7 +80,6 @@ exports[`Render LokiQueryEditor with legend should update timerange 1`] = `
"refId": "A",
}
}
queryType="range"
resolution={1}
runOnBlur={true}
/>

View File

@ -49,6 +49,7 @@ import { addParsedLabelToQuery, queryHasPipeParser } from './query_utils';
import {
LokiOptions,
LokiQuery,
LokiQueryType,
LokiRangeQueryRequest,
LokiResultType,
LokiStreamResponse,
@ -172,7 +173,7 @@ export class LokiDatasource
});
for (const target of filteredTargets) {
if (target.instant) {
if (target.instant || target.queryType === LokiQueryType.Instant) {
subQueries.push(this.runInstantQuery(target, options, filteredTargets.length));
} else {
subQueries.push(this.runRangeQuery(target, options, filteredTargets.length));
@ -647,6 +648,7 @@ export class LokiDatasource
maxLines,
instant,
stepInterval,
queryType: instant ? LokiQueryType.Instant : LokiQueryType.Range,
};
const { data } = instant
? await lastValueFrom(this.runInstantQuery(query, options as any))

View File

@ -6,6 +6,7 @@ import { TypeaheadInput } from '@grafana/ui';
import { makeMockLokiDatasource } from './mocks';
import LokiDatasource from './datasource';
import { AbstractLabelOperator } from '@grafana/data';
import { LokiQueryType } from './types';
jest.mock('app/store/store', () => ({
store: {
@ -248,7 +249,7 @@ describe('Query imports', () => {
it('returns empty queries', async () => {
const instance = new LanguageProvider(datasource);
const result = await instance.importFromAbstractQuery({ refId: 'bar', labelMatchers: [] });
expect(result).toEqual({ refId: 'bar', expr: '', range: true });
expect(result).toEqual({ refId: 'bar', expr: '', queryType: LokiQueryType.Range });
});
describe('exporting to abstract query', () => {

View File

@ -7,12 +7,12 @@ import {
extractLabelMatchers,
parseSelector,
processLabels,
toPromLikeQuery,
toPromLikeExpr,
} from 'app/plugins/datasource/prometheus/language_utils';
import syntax, { FUNCTIONS, PIPE_PARSERS, PIPE_OPERATORS } from './syntax';
// Types
import { LokiQuery } from './types';
import { LokiQuery, LokiQueryType } from './types';
import { dateTime, AbsoluteTimeRange, LanguageProvider, HistoryItem, AbstractQuery } from '@grafana/data';
import LokiDatasource from './datasource';
@ -332,7 +332,11 @@ export default class LokiLanguageProvider extends LanguageProvider {
}
importFromAbstractQuery(labelBasedQuery: AbstractQuery): LokiQuery {
return toPromLikeQuery(labelBasedQuery);
return {
refId: labelBasedQuery.refId,
expr: toPromLikeExpr(labelBasedQuery),
queryType: LokiQueryType.Range,
};
}
exportToAbstractQuery(query: LokiQuery): AbstractQuery {

View File

@ -22,7 +22,14 @@ export enum LokiResultType {
Matrix = 'matrix',
}
export enum LokiQueryType {
Range = 'range',
Instant = 'instant',
// Stream = 'stream',
}
export interface LokiQuery extends DataQuery {
queryType?: LokiQueryType;
expr: string;
query?: string;
format?: string;
@ -31,9 +38,13 @@ export interface LokiQuery extends DataQuery {
valueWithRefId?: boolean;
maxLines?: number;
resolution?: number;
volumeQuery?: boolean; // Used in range queries
/* @deprecated now use queryType */
range?: boolean;
/* @deprecated now use queryType */
instant?: boolean;
volumeQuery?: boolean;
}
export interface LokiOptions extends DataSourceJsonData {

View File

@ -274,7 +274,7 @@ const ToPromLikeMap: Record<AbstractLabelOperator, string> = invert(FromPromLike
string
>;
export function toPromLikeQuery(labelBasedQuery: AbstractQuery): PromLikeQuery {
export function toPromLikeExpr(labelBasedQuery: AbstractQuery): string {
const expr = labelBasedQuery.labelMatchers
.map((selector: AbstractLabelMatcher) => {
const operator = ToPromLikeMap[selector.operator];
@ -287,9 +287,13 @@ export function toPromLikeQuery(labelBasedQuery: AbstractQuery): PromLikeQuery {
.filter((e: string) => e !== '')
.join(', ');
return expr ? `{${expr}}` : '';
}
export function toPromLikeQuery(labelBasedQuery: AbstractQuery): PromLikeQuery {
return {
refId: labelBasedQuery.refId,
expr: expr ? `{${expr}}` : '',
expr: toPromLikeExpr(labelBasedQuery),
range: true,
};
}