mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Prometheus: Add info that using Loki as Prometheus data source is no longer supported and might stop working (#34650) (#34911)
* Add information that Loki as Prometheus data source is not supported
* Fix ugly error when loki as prometheus used
* Refactor, add test
* Fix type error
* Fix test by passing missing method
* Update public/app/plugins/datasource/prometheus/query_hints.ts
* Remove optionality in prop
(cherry picked from commit add1b827ae
)
Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com>
This commit is contained in:
parent
4c967fe718
commit
aa48f0f6a0
@ -12,6 +12,7 @@ import { testIds as regularTestIds } from './PromQueryEditor';
|
|||||||
function setup(app: CoreApp): RenderResult {
|
function setup(app: CoreApp): RenderResult {
|
||||||
const dataSource = ({
|
const dataSource = ({
|
||||||
createQuery: jest.fn((q) => q),
|
createQuery: jest.fn((q) => q),
|
||||||
|
getInitHints: () => [],
|
||||||
getPrometheusTime: jest.fn((date, roundup) => 123),
|
getPrometheusTime: jest.fn((date, roundup) => 123),
|
||||||
languageProvider: {
|
languageProvider: {
|
||||||
start: () => Promise.resolve([]),
|
start: () => Promise.resolve([]),
|
||||||
|
@ -3,7 +3,7 @@ import RCCascader from 'rc-cascader';
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PromQlLanguageProvider from '../language_provider';
|
import PromQlLanguageProvider from '../language_provider';
|
||||||
import PromQueryField from './PromQueryField';
|
import PromQueryField from './PromQueryField';
|
||||||
import { DataSourceInstanceSettings } from '@grafana/data';
|
import { DataSourceInstanceSettings, PanelData, LoadingState, DataFrame } from '@grafana/data';
|
||||||
import { PromOptions } from '../types';
|
import { PromOptions } from '../types';
|
||||||
import { render, screen } from '@testing-library/react';
|
import { render, screen } from '@testing-library/react';
|
||||||
|
|
||||||
@ -21,6 +21,7 @@ describe('PromQueryField', () => {
|
|||||||
getLabelKeys: () => [],
|
getLabelKeys: () => [],
|
||||||
metrics: [],
|
metrics: [],
|
||||||
},
|
},
|
||||||
|
getInitHints: () => [],
|
||||||
} as unknown) as DataSourceInstanceSettings<PromOptions>;
|
} as unknown) as DataSourceInstanceSettings<PromOptions>;
|
||||||
|
|
||||||
const queryField = render(
|
const queryField = render(
|
||||||
@ -45,6 +46,7 @@ describe('PromQueryField', () => {
|
|||||||
getLabelKeys: () => [],
|
getLabelKeys: () => [],
|
||||||
metrics: [],
|
metrics: [],
|
||||||
},
|
},
|
||||||
|
getInitHints: () => [],
|
||||||
} as unknown) as DataSourceInstanceSettings<PromOptions>;
|
} as unknown) as DataSourceInstanceSettings<PromOptions>;
|
||||||
const queryField = render(
|
const queryField = render(
|
||||||
<PromQueryField
|
<PromQueryField
|
||||||
@ -61,6 +63,60 @@ describe('PromQueryField', () => {
|
|||||||
expect(bcButton).toBeDisabled();
|
expect(bcButton).toBeDisabled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('renders an initial hint if no data and initial hint provided', () => {
|
||||||
|
const datasource = ({
|
||||||
|
languageProvider: {
|
||||||
|
start: () => Promise.resolve([]),
|
||||||
|
syntax: () => {},
|
||||||
|
getLabelKeys: () => [],
|
||||||
|
metrics: [],
|
||||||
|
},
|
||||||
|
getInitHints: () => [{ label: 'Initial hint', type: 'INFO' }],
|
||||||
|
} as unknown) as DataSourceInstanceSettings<PromOptions>;
|
||||||
|
render(
|
||||||
|
<PromQueryField
|
||||||
|
// @ts-ignore
|
||||||
|
datasource={{ ...datasource, lookupsDisabled: true }}
|
||||||
|
query={{ expr: '', refId: '' }}
|
||||||
|
onRunQuery={() => {}}
|
||||||
|
onChange={() => {}}
|
||||||
|
history={[]}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
expect(screen.getByText('Initial hint')).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('renders query hint if data, query hint and initial hint provided', () => {
|
||||||
|
const datasource = ({
|
||||||
|
languageProvider: {
|
||||||
|
start: () => Promise.resolve([]),
|
||||||
|
syntax: () => {},
|
||||||
|
getLabelKeys: () => [],
|
||||||
|
metrics: [],
|
||||||
|
},
|
||||||
|
getInitHints: () => [{ label: 'Initial hint', type: 'INFO' }],
|
||||||
|
getQueryHints: () => [{ label: 'Query hint', type: 'INFO' }],
|
||||||
|
} as unknown) as DataSourceInstanceSettings<PromOptions>;
|
||||||
|
render(
|
||||||
|
<PromQueryField
|
||||||
|
// @ts-ignore
|
||||||
|
datasource={{ ...datasource }}
|
||||||
|
query={{ expr: '', refId: '' }}
|
||||||
|
onRunQuery={() => {}}
|
||||||
|
onChange={() => {}}
|
||||||
|
history={[]}
|
||||||
|
data={
|
||||||
|
{
|
||||||
|
series: [{ name: 'test name' }] as DataFrame[],
|
||||||
|
state: LoadingState.Done,
|
||||||
|
} as PanelData
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
expect(screen.getByText('Query hint')).toBeInTheDocument();
|
||||||
|
expect(screen.queryByText('Initial hint')).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
it('refreshes metrics when the data source changes', async () => {
|
it('refreshes metrics when the data source changes', async () => {
|
||||||
const defaultProps = {
|
const defaultProps = {
|
||||||
query: { expr: '', refId: '' },
|
query: { expr: '', refId: '' },
|
||||||
@ -74,6 +130,7 @@ describe('PromQueryField', () => {
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
datasource={{
|
datasource={{
|
||||||
languageProvider: makeLanguageProvider({ metrics: [metrics] }),
|
languageProvider: makeLanguageProvider({ metrics: [metrics] }),
|
||||||
|
getInitHints: () => [],
|
||||||
}}
|
}}
|
||||||
{...defaultProps}
|
{...defaultProps}
|
||||||
/>
|
/>
|
||||||
|
@ -153,24 +153,21 @@ class PromQueryField extends React.PureComponent<PromQueryFieldProps, PromQueryF
|
|||||||
|
|
||||||
refreshHint = () => {
|
refreshHint = () => {
|
||||||
const { datasource, query, data } = this.props;
|
const { datasource, query, data } = this.props;
|
||||||
|
const initHints = datasource.getInitHints();
|
||||||
|
const initHint = initHints.length > 0 ? initHints[0] : null;
|
||||||
|
|
||||||
if (!data || data.series.length === 0) {
|
if (!data || data.series.length === 0) {
|
||||||
this.setState({ hint: null });
|
this.setState({
|
||||||
|
hint: initHint,
|
||||||
|
});
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = isDataFrame(data.series[0]) ? data.series.map(toLegacyResponseData) : data.series;
|
const result = isDataFrame(data.series[0]) ? data.series.map(toLegacyResponseData) : data.series;
|
||||||
const hints = datasource.getQueryHints(query, result);
|
const queryHints = datasource.getQueryHints(query, result);
|
||||||
let hint = hints.length > 0 ? hints[0] : null;
|
let queryHint = queryHints.length > 0 ? queryHints[0] : null;
|
||||||
|
|
||||||
// Hint for big disabled lookups
|
this.setState({ hint: queryHint ?? initHint });
|
||||||
if (!hint && datasource.lookupsDisabled) {
|
|
||||||
hint = {
|
|
||||||
label: `Labels and metrics lookup was disabled in data source settings.`,
|
|
||||||
type: 'INFO',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
this.setState({ hint });
|
|
||||||
};
|
};
|
||||||
|
|
||||||
refreshMetrics = async () => {
|
refreshMetrics = async () => {
|
||||||
|
@ -24,7 +24,7 @@ import { catchError, filter, map, tap } from 'rxjs/operators';
|
|||||||
import addLabelToQuery from './add_label_to_query';
|
import addLabelToQuery from './add_label_to_query';
|
||||||
import PrometheusLanguageProvider from './language_provider';
|
import PrometheusLanguageProvider from './language_provider';
|
||||||
import { expandRecordingRules } from './language_utils';
|
import { expandRecordingRules } from './language_utils';
|
||||||
import { getQueryHints } from './query_hints';
|
import { getQueryHints, getInitHints } from './query_hints';
|
||||||
import { getOriginalMetricName, renderTemplate, transform } from './result_transformer';
|
import { getOriginalMetricName, renderTemplate, transform } from './result_transformer';
|
||||||
import {
|
import {
|
||||||
ExemplarTraceIdDestination,
|
ExemplarTraceIdDestination,
|
||||||
@ -746,6 +746,10 @@ export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions>
|
|||||||
return getQueryHints(query.expr ?? '', result, this);
|
return getQueryHints(query.expr ?? '', result, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getInitHints() {
|
||||||
|
return getInitHints(this);
|
||||||
|
}
|
||||||
|
|
||||||
async loadRules() {
|
async loadRules() {
|
||||||
try {
|
try {
|
||||||
const res = await this.metadataRequest('/api/v1/rules');
|
const res = await this.metadataRequest('/api/v1/rules');
|
||||||
|
@ -119,7 +119,7 @@ export default class PromQlLanguageProvider extends LanguageProvider {
|
|||||||
|
|
||||||
// TODO #33976: make those requests parallel
|
// TODO #33976: make those requests parallel
|
||||||
await this.fetchLabels();
|
await this.fetchLabels();
|
||||||
this.metrics = await this.fetchLabelValues('__name__');
|
this.metrics = (await this.fetchLabelValues('__name__')) || [];
|
||||||
this.metricsMetadata = fixSummariesMetadata(await this.request('/api/v1/metadata', {}));
|
this.metricsMetadata = fixSummariesMetadata(await this.request('/api/v1/metadata', {}));
|
||||||
this.processHistogramMetrics(this.metrics);
|
this.processHistogramMetrics(this.metrics);
|
||||||
|
|
||||||
|
@ -127,3 +127,24 @@ export function getQueryHints(query: string, series?: any[], datasource?: Promet
|
|||||||
|
|
||||||
return hints;
|
return hints;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getInitHints(datasource: PrometheusDatasource): QueryHint[] {
|
||||||
|
const hints = [];
|
||||||
|
// Hint if using Loki as Prometheus data source
|
||||||
|
if (datasource.directUrl.includes('/loki') && !datasource.languageProvider.metrics.length) {
|
||||||
|
hints.push({
|
||||||
|
label: `Using Loki as a Prometheus data source is no longer supported. You must use the Loki data source for your Loki instance.`,
|
||||||
|
type: 'INFO',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hint for big disabled lookups
|
||||||
|
if (datasource.lookupsDisabled) {
|
||||||
|
hints.push({
|
||||||
|
label: `Labels and metrics lookup was disabled in data source settings.`,
|
||||||
|
type: 'INFO',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return hints;
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user