mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Explore: Prevent hidden queries from being run as supplementary query (#99356)
fix(loki/elasticsearch): prevent hidden queries from being run as supplementary query
This commit is contained in:
parent
149bc74191
commit
5b8e6f8fa8
@ -353,6 +353,20 @@ describe('ElasticDatasource', () => {
|
|||||||
).toEqual(undefined);
|
).toEqual(undefined);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('does not return logs volume query for hidden query', () => {
|
||||||
|
expect(
|
||||||
|
ds.getSupplementaryQuery(
|
||||||
|
{ type: SupplementaryQueryType.LogsVolume },
|
||||||
|
{
|
||||||
|
refId: 'A',
|
||||||
|
metrics: [{ type: 'logs', id: '1' }],
|
||||||
|
query: 'foo="bar"',
|
||||||
|
hide: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns logs volume query for log query', () => {
|
it('returns logs volume query for log query', () => {
|
||||||
expect(
|
expect(
|
||||||
ds.getSupplementaryQuery(
|
ds.getSupplementaryQuery(
|
||||||
@ -417,6 +431,20 @@ describe('ElasticDatasource', () => {
|
|||||||
metrics: [{ type: 'logs', id: '1', settings: { limit: '100' } }],
|
metrics: [{ type: 'logs', id: '1', settings: { limit: '100' } }],
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('does not return logs samples for hidden time series queries', () => {
|
||||||
|
expect(
|
||||||
|
ds.getSupplementaryQuery(
|
||||||
|
{ type: SupplementaryQueryType.LogsSample, limit: 100 },
|
||||||
|
{
|
||||||
|
refId: 'A',
|
||||||
|
query: '',
|
||||||
|
bucketAggs: [{ type: 'date_histogram', id: '1' }],
|
||||||
|
hide: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).toEqual(undefined);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('getDataProvider', () => {
|
describe('getDataProvider', () => {
|
||||||
@ -434,6 +462,21 @@ describe('ElasticDatasource', () => {
|
|||||||
expect(ds.getSupplementaryRequest(SupplementaryQueryType.LogsSample, options)).not.toBeDefined();
|
expect(ds.getSupplementaryRequest(SupplementaryQueryType.LogsSample, options)).not.toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('does not create a logs volume provider for hidden queries', () => {
|
||||||
|
const options: DataQueryRequest<ElasticsearchQuery> = {
|
||||||
|
...dataQueryDefaults,
|
||||||
|
targets: [
|
||||||
|
{
|
||||||
|
refId: 'A',
|
||||||
|
metrics: [{ type: 'logs', id: '1', settings: { limit: '100' } }],
|
||||||
|
hide: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(ds.getSupplementaryRequest(SupplementaryQueryType.LogsVolume, options)).not.toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
it('does create a logs sample provider for time series query', () => {
|
it('does create a logs sample provider for time series query', () => {
|
||||||
const options: DataQueryRequest<ElasticsearchQuery> = {
|
const options: DataQueryRequest<ElasticsearchQuery> = {
|
||||||
...dataQueryDefaults,
|
...dataQueryDefaults,
|
||||||
|
@ -595,6 +595,10 @@ export class ElasticDatasource
|
|||||||
getSupplementaryQuery(options: SupplementaryQueryOptions, query: ElasticsearchQuery): ElasticsearchQuery | undefined {
|
getSupplementaryQuery(options: SupplementaryQueryOptions, query: ElasticsearchQuery): ElasticsearchQuery | undefined {
|
||||||
let isQuerySuitable = false;
|
let isQuerySuitable = false;
|
||||||
|
|
||||||
|
if (query.hide) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
switch (options.type) {
|
switch (options.type) {
|
||||||
case SupplementaryQueryType.LogsVolume:
|
case SupplementaryQueryType.LogsVolume:
|
||||||
// it has to be a logs-producing range-query
|
// it has to be a logs-producing range-query
|
||||||
|
@ -1414,6 +1414,15 @@ describe('LokiDatasource', () => {
|
|||||||
expect(ds.getSupplementaryRequest(SupplementaryQueryType.LogsVolume, options)).toBeDefined();
|
expect(ds.getSupplementaryRequest(SupplementaryQueryType.LogsVolume, options)).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('does not create provider for hidden logs query', () => {
|
||||||
|
const options: DataQueryRequest<LokiQuery> = {
|
||||||
|
...baseRequestOptions,
|
||||||
|
targets: [{ expr: '{label="value"}', refId: 'A', queryType: LokiQueryType.Range, hide: true }],
|
||||||
|
};
|
||||||
|
|
||||||
|
expect(ds.getSupplementaryRequest(SupplementaryQueryType.LogsVolume, options)).not.toBeDefined();
|
||||||
|
});
|
||||||
|
|
||||||
it('does not create provider for metrics query', () => {
|
it('does not create provider for metrics query', () => {
|
||||||
const options: DataQueryRequest<LokiQuery> = {
|
const options: DataQueryRequest<LokiQuery> = {
|
||||||
...baseRequestOptions,
|
...baseRequestOptions,
|
||||||
@ -1526,7 +1535,21 @@ describe('LokiDatasource', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('does return logs volume query for instant log query', () => {
|
it('does not return logs volume query for hidden log query', () => {
|
||||||
|
expect(
|
||||||
|
ds.getSupplementaryQuery(
|
||||||
|
{ type: SupplementaryQueryType.LogsVolume },
|
||||||
|
{
|
||||||
|
expr: '{label="value"}',
|
||||||
|
queryType: LokiQueryType.Range,
|
||||||
|
refId: 'A',
|
||||||
|
hide: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns logs volume query for instant log query', () => {
|
||||||
// we changed logic to automatically run logs queries as range queries, thus there's a volume query now
|
// we changed logic to automatically run logs queries as range queries, thus there's a volume query now
|
||||||
expect(
|
expect(
|
||||||
ds.getSupplementaryQuery(
|
ds.getSupplementaryQuery(
|
||||||
@ -1605,6 +1628,20 @@ describe('LokiDatasource', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('does not return logs sample query for hidden query', () => {
|
||||||
|
expect(
|
||||||
|
ds.getSupplementaryQuery(
|
||||||
|
{ type: SupplementaryQueryType.LogsSample },
|
||||||
|
{
|
||||||
|
expr: 'rate({label="value"}[5m]',
|
||||||
|
queryType: LokiQueryType.Range,
|
||||||
|
refId: 'A',
|
||||||
|
hide: true,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
).toEqual(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
it('returns logs sample query for instant metric query', () => {
|
it('returns logs sample query for instant metric query', () => {
|
||||||
expect(
|
expect(
|
||||||
ds.getSupplementaryQuery(
|
ds.getSupplementaryQuery(
|
||||||
|
@ -206,6 +206,10 @@ export class LokiDatasource
|
|||||||
* @returns A supplemented Loki query or undefined if unsupported.
|
* @returns A supplemented Loki query or undefined if unsupported.
|
||||||
*/
|
*/
|
||||||
getSupplementaryQuery(options: SupplementaryQueryOptions, query: LokiQuery): LokiQuery | undefined {
|
getSupplementaryQuery(options: SupplementaryQueryOptions, query: LokiQuery): LokiQuery | undefined {
|
||||||
|
if (query.hide) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
const normalizedQuery = getNormalizedLokiQuery(query);
|
const normalizedQuery = getNormalizedLokiQuery(query);
|
||||||
let expr = removeCommentsFromQuery(normalizedQuery.expr);
|
let expr = removeCommentsFromQuery(normalizedQuery.expr);
|
||||||
let isQuerySuitable = false;
|
let isQuerySuitable = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user