mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Loki: use queryType rather than range|instant flags (#43727)
This commit is contained in:
parent
0dd88d9480
commit
546818819b
@ -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"`
|
||||
|
@ -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}
|
||||
|
@ -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}
|
||||
|
@ -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>
|
||||
|
@ -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}
|
||||
|
@ -14,7 +14,6 @@ exports[`LokiExploreQueryEditor should render component 1`] = `
|
||||
"refId": "A",
|
||||
}
|
||||
}
|
||||
queryType="range"
|
||||
resolution={1}
|
||||
/>
|
||||
}
|
||||
|
@ -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}
|
||||
/>
|
||||
|
@ -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))
|
||||
|
@ -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', () => {
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
@ -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,
|
||||
};
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user