grafana/public/app/plugins/datasource/loki/queryHints.test.ts
Ivana Huckova 772b6396f5
Loki: Add hints for level-like labels (#52414)
* Loki: Add hint for level-like label

* Add test to addToQuery

* Add tests

* Update tests

* Update copy

* Get log position in metrics query and add test

* Update
2022-07-22 16:59:25 +02:00

115 lines
3.5 KiB
TypeScript

import { ArrayVector, DataFrame, FieldType } from '@grafana/data';
import { getQueryHints } from './queryHints';
describe('getQueryHints', () => {
describe('when series with json logs', () => {
const jsonSeries: DataFrame = {
name: 'logs',
length: 2,
fields: [
{
name: 'Line',
type: FieldType.string,
config: {},
values: new ArrayVector(['{"foo": "bar", "bar": "baz"}', '{"foo": "bar", "bar": "baz"}']),
},
],
};
it('suggest json parser when no parser in query', () => {
expect(getQueryHints('{job="grafana"', [jsonSeries])).toMatchObject([{ type: 'ADD_JSON_PARSER' }]);
});
it('does not suggest parser when parser in query', () => {
expect(getQueryHints('{job="grafana" | json', [jsonSeries])).toEqual([]);
});
});
describe('when series with logfmt logs', () => {
const logfmtSeries: DataFrame = {
name: 'logs',
length: 2,
fields: [
{
name: 'Line',
type: FieldType.string,
config: {},
values: new ArrayVector(['foo="bar" bar="baz"', 'foo="bar" bar="baz"']),
},
],
};
it('suggest logfmt parser when no parser in query', () => {
expect(getQueryHints('{job="grafana"', [logfmtSeries])).toMatchObject([{ type: 'ADD_LOGFMT_PARSER' }]);
});
it('does not suggest parser when parser in query', () => {
expect(getQueryHints('{job="grafana" | json', [logfmtSeries])).toEqual([]);
});
});
describe('when series with json and logfmt logs', () => {
const jsonAndLogfmtSeries: DataFrame = {
name: 'logs',
length: 2,
fields: [
{
name: 'Line',
type: FieldType.string,
config: {},
values: new ArrayVector(['{"foo": "bar", "bar": "baz"}', 'foo="bar" bar="baz"']),
},
],
};
it('suggest logfmt parser when no parser in query', () => {
expect(getQueryHints('{job="grafana"', [jsonAndLogfmtSeries])).toMatchObject([
{ type: 'ADD_JSON_PARSER' },
{ type: 'ADD_LOGFMT_PARSER' },
]);
});
it('does not suggest parser when parser in query', () => {
expect(getQueryHints('{job="grafana" | json', [jsonAndLogfmtSeries])).toEqual([]);
});
});
describe('when series with level-like label', () => {
const createSeriesWithLabel = (labelName?: string): DataFrame => {
const labelVariable: { [key: string]: string } = { job: 'a' };
if (labelName) {
labelVariable[labelName] = 'error';
}
return {
name: 'logs',
length: 2,
fields: [
{
name: 'Line',
type: FieldType.string,
config: {},
values: new ArrayVector(['{"foo": "bar", "bar": "baz"}', 'foo="bar" bar="baz"']),
},
{
name: 'labels',
type: FieldType.other,
config: {},
values: new ArrayVector([labelVariable, { job: 'baz', foo: 'bar' }]),
},
],
};
};
it('suggest level renaming when no level label', () => {
expect(getQueryHints('{job="grafana"', [createSeriesWithLabel('lvl')])).toMatchObject([
{ type: 'ADD_JSON_PARSER' },
{ type: 'ADD_LOGFMT_PARSER' },
{ type: 'ADD_LEVEL_LABEL_FORMAT' },
]);
});
it('does not suggest level renaming if level label', () => {
expect(getQueryHints('{job="grafana"', [createSeriesWithLabel('level')])).toMatchObject([
{ type: 'ADD_JSON_PARSER' },
{ type: 'ADD_LOGFMT_PARSER' },
]);
});
});
});