(null);
- const { languageProvider, history, onBlur, onRunQuery, initialValue, placeholder, datasource, timeRange } = props;
-
- const lpRef = useLatest(languageProvider);
- const historyRef = useLatest(history);
- const onRunQueryRef = useLatest(onRunQuery);
- const onBlurRef = useLatest(onBlur);
-
- const autocompleteDisposeFun = useRef<(() => void) | null>(null);
-
- const theme = useTheme2();
- const styles = getStyles(theme, placeholder);
-
- useEffect(() => {
- // when we unmount, we unregister the autocomplete-function, if it was registered
- return () => {
- autocompleteDisposeFun.current?.();
- };
- }, []);
-
- return (
-
- {
- ensurePromQL(monaco);
- }}
- onMount={(editor, monaco) => {
- const isEditorFocused = editor.createContextKey('isEditorFocused' + id, false);
- // we setup on-blur
- editor.onDidBlurEditorWidget(() => {
- isEditorFocused.set(false);
- onBlurRef.current(editor.getValue());
- });
- editor.onDidFocusEditorText(() => {
- isEditorFocused.set(true);
- });
- const dataProvider = new DataProvider({
- historyProvider: historyRef.current,
- languageProvider: lpRef.current,
- });
-
- // Create completion provider with state for Ctrl+Space detection
- const { provider: completionProvider, state: completionState } = getCompletionProvider(
- monaco,
- dataProvider,
- timeRange
- );
-
- // completion-providers in monaco are not registered directly to editor-instances,
- // they are registered to languages. this makes it hard for us to have
- // separate completion-providers for every query-field-instance
- // (but we need that, because they might connect to different datasources).
- // the trick we do is, we wrap the callback in a "proxy",
- // and in the proxy, the first thing is, we check if we are called from
- // "our editor instance", and if not, we just return nothing. if yes,
- // we call the completion-provider.
- const filteringCompletionProvider: monacoTypes.languages.CompletionItemProvider = {
- ...completionProvider,
- provideCompletionItems: (model, position, context, token) => {
- // if the model-id does not match, then this call is from a different editor-instance,
- // not "our instance", so return nothing
- if (editor.getModel()?.id !== model.id) {
- return { suggestions: [] };
- }
- return completionProvider.provideCompletionItems(model, position, context, token);
- },
- };
-
- const { dispose } = monaco.languages.registerCompletionItemProvider(
- PROMQL_LANG_ID,
- filteringCompletionProvider
- );
-
- const handleKeyDown = (event: KeyboardEvent) => {
- if ((event.ctrlKey || event.metaKey) && event.code === 'Space') {
- // Only handle if this editor is focused
- if (editor.hasTextFocus()) {
- event.preventDefault();
- event.stopPropagation();
-
- completionState.isManualTriggerRequested = true;
- editor.trigger('keyboard', 'editor.action.triggerSuggest', {});
- setTimeout(() => {
- completionState.isManualTriggerRequested = false;
- }, 300);
- }
- }
- };
-
- // Add global listener
- document.addEventListener('keydown', handleKeyDown, true);
-
- // Combine cleanup functions
- autocompleteDisposeFun.current = () => {
- document.removeEventListener('keydown', handleKeyDown, true);
- dispose();
- };
-
- // this code makes the editor resize itself so that the content fits
- // (it will grow taller when necessary)
- // FIXME: maybe move this functionality into CodeEditor, like:
- //
- const updateElementHeight = () => {
- const containerDiv = containerRef.current;
- if (containerDiv !== null) {
- const pixelHeight = editor.getContentHeight();
- containerDiv.style.height = `${pixelHeight + EDITOR_HEIGHT_OFFSET}px`;
- containerDiv.style.width = '100%';
- const pixelWidth = containerDiv.clientWidth;
- editor.layout({ width: pixelWidth, height: pixelHeight });
- }
- };
-
- editor.onDidContentSizeChange(updateElementHeight);
- updateElementHeight();
-
- // handle: shift + enter
- // FIXME: maybe move this functionality into CodeEditor?
- editor.addCommand(
- monaco.KeyMod.Shift | monaco.KeyCode.Enter,
- () => {
- onRunQueryRef.current(editor.getValue());
- },
- 'isEditorFocused' + id
- );
-
- // Fixes Monaco capturing the search key binding and displaying a useless search box within the Editor.
- // See https://github.com/grafana/grafana/issues/85850
- monaco.editor.addKeybindingRule({
- keybinding: monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyF,
- command: null,
- });
-
- // Something in this configuration of monaco doesn't bubble up [mod]+K,
- // which the command palette uses. Pass the event out of monaco manually
- editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK, function () {
- global.dispatchEvent(new KeyboardEvent('keydown', { key: 'k', metaKey: true }));
- });
-
- if (placeholder) {
- const placeholderDecorators = [
- {
- range: new monaco.Range(1, 1, 1, 1),
- options: {
- className: styles.placeholder,
- isWholeLine: true,
- },
- },
- ];
-
- let decorators: string[] = [];
-
- const checkDecorators: () => void = () => {
- const model = editor.getModel();
-
- if (!model) {
- return;
- }
-
- const newDecorators = model.getValueLength() === 0 ? placeholderDecorators : [];
- decorators = model.deltaDecorations(decorators, newDecorators);
- };
-
- checkDecorators();
- editor.onDidChangeModelContent(checkDecorators);
-
- editor.onDidChangeModelContent((e) => {
- const model = editor.getModel();
- if (!model) {
- return;
- }
- const query = model.getValue();
- const { errors, warnings } = validateQuery(
- query,
- datasource.interpolateString(query, placeHolderScopedVars),
- model.getLinesContent(),
- parser
- );
-
- const errorMarkers = errors.map(({ issue, ...boundary }) => {
- return {
- message: `${issue ? `Error parsing "${issue}"` : 'Parse error'}. The query appears to be incorrect and could fail to be executed.`,
- severity: monaco.MarkerSeverity.Error,
- ...boundary,
- };
- });
-
- const warningMarkers = warnings.map(({ issue, ...boundary }) => {
- return {
- message: `Warning: ${issue}`,
- severity: monaco.MarkerSeverity.Warning,
- ...boundary,
- };
- });
-
- monaco.editor.setModelMarkers(model, 'owner', [...errorMarkers, ...warningMarkers]);
- });
- }
- }}
- />
-
- );
-};
-
-// we will lazy-load this module using React.lazy,
-// and that only supports default-exports,
-// so we have to default-export this, even if
-// it is against the style-guidelines.
-
-export default MonacoQueryField;
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldLazy.tsx b/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldLazy.tsx
deleted file mode 100644
index eef7078163a..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldLazy.tsx
+++ /dev/null
@@ -1,13 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryFieldLazy.tsx
-import { Suspense } from 'react';
-
-import MonacoQueryField from './MonacoQueryField';
-import { type Props } from './MonacoQueryFieldProps';
-
-export const MonacoQueryFieldLazy = (props: Props) => {
- return (
-
-
-
- );
-};
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldProps.ts b/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldProps.ts
deleted file mode 100644
index 1481fa1fb2d..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldProps.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryFieldProps.ts
-import { type HistoryItem, type TimeRange } from '@grafana/data';
-
-import { type PrometheusDatasource } from '../../datasource';
-import { type PrometheusLanguageProviderInterface } from '../../language_provider';
-import { type PromQuery } from '../../types';
-
-// we need to store this in a separate file,
-// because we have an async-wrapper around,
-// the react-component, and it needs the same
-// props as the sync-component.
-export type Props = {
- initialValue: string;
- languageProvider: PrometheusLanguageProviderInterface;
- history: Array>;
- placeholder: string;
- onRunQuery: (value: string) => void;
- onBlur: (value: string) => void;
- datasource: PrometheusDatasource;
- timeRange: TimeRange;
-};
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldWrapper.tsx b/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldWrapper.tsx
deleted file mode 100644
index 5002750b731..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/MonacoQueryFieldWrapper.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/MonacoQueryFieldWrapper.tsx
-import { useRef } from 'react';
-
-import { MonacoQueryFieldLazy } from './MonacoQueryFieldLazy';
-import { type Props as MonacoProps } from './MonacoQueryFieldProps';
-
-type Props = Omit & {
- onChange: (query: string) => void;
- onRunQuery: () => void;
-};
-
-export const MonacoQueryFieldWrapper = (props: Props) => {
- const lastRunValueRef = useRef(null);
- const { onRunQuery, onChange, ...rest } = props;
-
- const handleRunQuery = (value: string) => {
- lastRunValueRef.current = value;
- onChange(value);
- onRunQuery();
- };
-
- const handleBlur = (value: string) => {
- onChange(value);
- };
-
- return ;
-};
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/getOverrideServices.ts b/packages/grafana-prometheus/src/components/monaco-query-field/getOverrideServices.ts
deleted file mode 100644
index d3cc7d95ab8..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/getOverrideServices.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/getOverrideServices.ts
-import { type monacoTypes } from '@grafana/ui';
-
-// this thing here is a workaround in a way.
-// what we want to achieve, is that when the autocomplete-window
-// opens, the "second, extra popup" with the extra help,
-// also opens automatically.
-// but there is no API to achieve it.
-// the way to do it is to implement the `storageService`
-// interface, and provide our custom implementation,
-// which will default to `true` for the correct string-key.
-// unfortunately, while the typescript-interface exists,
-// it is not exported from monaco-editor,
-// so we cannot rely on typescript to make sure
-// we do it right. all we can do is to manually
-// lookup the interface, and make sure we code our code right.
-// our code is a "best effort" approach,
-// i am not 100% how the `scope` and `target` things work,
-// but so far it seems to work ok.
-// i would use an another approach, if there was one available.
-
-function makeStorageService() {
- // we need to return an object that fulfills this interface:
- // https://github.com/microsoft/vscode/blob/ff1e16eebb93af79fd6d7af1356c4003a120c563/src/vs/platform/storage/common/storage.ts#L37
- // unfortunately it is not export from monaco-editor
-
- const strings = new Map();
-
- // we want this to be true by default
- strings.set('expandSuggestionDocs', true.toString());
-
- return {
- // we do not implement the on* handlers
- onDidChangeValue: (data: unknown): void => undefined,
- onDidChangeTarget: (data: unknown): void => undefined,
- onWillSaveState: (data: unknown): void => undefined,
-
- get: (key: string, scope: unknown, fallbackValue?: string): string | undefined => {
- return strings.get(key) ?? fallbackValue;
- },
-
- getBoolean: (key: string, scope: unknown, fallbackValue?: boolean): boolean | undefined => {
- const val = strings.get(key);
- if (val !== undefined) {
- // the interface-docs say the value will be converted
- // to a boolean but do not specify how, so we improvise
- return val === 'true';
- } else {
- return fallbackValue;
- }
- },
-
- getNumber: (key: string, scope: unknown, fallbackValue?: number): number | undefined => {
- const val = strings.get(key);
- if (val !== undefined) {
- return parseInt(val, 10);
- } else {
- return fallbackValue;
- }
- },
-
- store: (
- key: string,
- value: string | boolean | number | undefined | null,
- scope: unknown,
- target: unknown
- ): void => {
- // the interface-docs say if the value is nullish, it should act as delete
- if (value === null || value === undefined) {
- strings.delete(key);
- } else {
- strings.set(key, value.toString());
- }
- },
-
- remove: (key: string, scope: unknown): void => {
- strings.delete(key);
- },
-
- keys: (scope: unknown, target: unknown): string[] => {
- return Array.from(strings.keys());
- },
-
- logStorage: (): void => {
- console.log('logStorage: not implemented');
- },
-
- migrate: (): Promise => {
- // we do not implement this
- return Promise.resolve(undefined);
- },
-
- isNew: (scope: unknown): boolean => {
- // we create a new storage for every session, we do not persist it,
- // so we return `true`.
- return true;
- },
-
- flush: (reason?: unknown): Promise => {
- // we do not implement this
- return Promise.resolve(undefined);
- },
- };
-}
-
-let overrideServices: monacoTypes.editor.IEditorOverrideServices | null = null;
-
-export function getOverrideServices(): monacoTypes.editor.IEditorOverrideServices {
- // only have one instance of this for every query editor
- if (overrideServices === null) {
- overrideServices = {
- storageService: makeStorageService(),
- };
- }
-
- return overrideServices;
-}
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.test.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.test.ts
deleted file mode 100644
index 3c374be6610..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.test.ts
+++ /dev/null
@@ -1,415 +0,0 @@
-import { config } from '@grafana/runtime';
-
-import { DEFAULT_COMPLETION_LIMIT } from '../../../constants';
-import { getFunctions } from '../../../promql';
-import { getMockTimeRange } from '../../../test/mocks/datasource';
-
-import { filterMetricNames, getCompletions } from './completions';
-import { DataProvider, type DataProviderParams } from './data_provider';
-import type { Situation } from './situation';
-
-const history: string[] = ['previous_metric_name_1', 'previous_metric_name_2', 'previous_metric_name_3'];
-const dataProviderSettings = {
- languageProvider: {
- queryLabelKeys: jest.fn(),
- queryLabelValues: jest.fn(),
- queryMetricsMetadata: jest.fn().mockResolvedValue({}),
- retrieveLabelKeys: jest.fn(),
- retrieveMetricsMetadata: jest.fn().mockReturnValue({}),
- },
- historyProvider: history.map((expr, idx) => ({ query: { expr, refId: 'some-ref' }, ts: idx })),
-} as unknown as DataProviderParams;
-let dataProvider = new DataProvider(dataProviderSettings);
-const metrics = {
- beyondLimit: Array.from(Array(DEFAULT_COMPLETION_LIMIT + 1), (_, i) => `metric_name_${i}`),
- get atLimit() {
- return this.beyondLimit.slice(0, DEFAULT_COMPLETION_LIMIT - 1);
- },
-};
-
-beforeEach(() => {
- dataProvider = new DataProvider(dataProviderSettings);
-});
-
-afterEach(() => {
- jest.restoreAllMocks();
-});
-
-describe('filterMetricNames', () => {
- const sampleMetrics = [
- 'http_requests_total',
- 'http_requests_failed',
- 'node_cpu_seconds_total',
- 'node_memory_usage_bytes',
- 'very_long_metric_name_with_many_underscores_and_detailed_description',
- 'metric_name_1_with_extra_terms_included',
- ];
-
- describe('empty input', () => {
- it('should return all metrics up to limit when input is empty', () => {
- const result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: '',
- limit: 3,
- });
- expect(result).toEqual(sampleMetrics.slice(0, 3));
- });
-
- it('should return all metrics when input is whitespace', () => {
- const result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: ' ',
- limit: 3,
- });
- expect(result).toEqual(sampleMetrics.slice(0, 3));
- });
- });
-
- describe('simple searches (≤ 4 terms)', () => {
- it('should match exact strings', () => {
- const result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'http_requests_total',
- limit: 10,
- });
- expect(result).toContainEqual('http_requests_total');
- });
-
- it('should match with single character errors', () => {
- // substitution
- let result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'http_requezts_total', // 's' replaced with 'z'
- limit: 10,
- });
- expect(result).toContainEqual('http_requests_total');
-
- // ransposition
- result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'http_reqeust_total', // 'ue' swapped
- limit: 10,
- });
- expect(result).toContainEqual('http_requests_total');
-
- // deletion
- result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'http_reqests_total', // missing 'u'
- limit: 10,
- });
- expect(result).toContainEqual('http_requests_total');
-
- // insertion
- result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'http_reqquests_total', // extra 'q'
- limit: 10,
- });
- expect(result).toContainEqual('http_requests_total');
- });
-
- it('should match partial strings', () => {
- const result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'requests', // partial match
- limit: 10,
- });
- expect(result).toContainEqual('http_requests_total');
- expect(result).toContainEqual('http_requests_failed');
- });
-
- it('should not match with multiple errors', () => {
- const result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'htp_reqests_total', // two errors: missing 't' and missing 'u'
- limit: 10,
- });
- expect(result).not.toContainEqual('http_requests_total');
- });
- });
-
- describe('complex searches (> 4 terms)', () => {
- it('should use substring matching for each term', () => {
- const result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'metric name 1 with extra terms',
- limit: 10,
- });
- expect(result).toContainEqual('metric_name_1_with_extra_terms_included');
- });
-
- it('should return empty array when no metrics match all terms', () => {
- const result = filterMetricNames({
- metricNames: sampleMetrics,
- inputText: 'metric name 1 with nonexistent terms',
- limit: 10,
- });
- expect(result).toHaveLength(0);
- });
-
- it('should stop searching after limit is reached', () => {
- const manyMetrics = Array.from({ length: 10 }, (_, i) => `metric_name_${i}_with_terms`);
-
- const result = filterMetricNames({
- metricNames: manyMetrics,
- inputText: 'metric name with terms other words', // > 4 terms
- limit: 3,
- });
-
- expect(result.length).toBeLessThanOrEqual(3);
- });
- });
-});
-
-type MetricNameSituation = Extract;
-const metricNameCompletionSituations = ['AT_ROOT', 'IN_FUNCTION', 'EMPTY'] as MetricNameSituation[];
-
-function getSuggestionCountForSituation(situationType: MetricNameSituation, metricsCount: number): number {
- const limitedMetricNamesCount = metricsCount < DEFAULT_COMPLETION_LIMIT ? metricsCount : DEFAULT_COMPLETION_LIMIT;
- let suggestionsCount = limitedMetricNamesCount + getFunctions().length;
-
- if (situationType === 'EMPTY') {
- suggestionsCount += history.length;
- }
-
- return suggestionsCount;
-}
-
-describe.each(metricNameCompletionSituations)('metric name completions in situation %s', (situationType) => {
- const timeRange = getMockTimeRange();
-
- it('should return completions for all metric names when the number of metric names is at or below the limit', async () => {
- jest.spyOn(dataProvider, 'queryMetricNames').mockResolvedValue(metrics.atLimit);
- const expectedCompletionsCount = getSuggestionCountForSituation(situationType, metrics.atLimit.length);
- const situation: Situation = {
- type: situationType,
- };
-
- // No text input
- dataProvider.monacoSettings.setInputInRange('');
- let completions = await getCompletions(situation, dataProvider, timeRange);
- expect(completions).toHaveLength(expectedCompletionsCount);
-
- // With text input (use fuzzy search)
- dataProvider.monacoSettings.setInputInRange('name_1');
- completions = await getCompletions(situation, dataProvider, timeRange);
- expect(completions?.length).toBeLessThanOrEqual(expectedCompletionsCount);
- });
-
- it('should limit completions for metric names when the number exceeds the limit', async () => {
- const situation: Situation = {
- type: situationType,
- };
- const expectedCompletionsCount = getSuggestionCountForSituation(situationType, metrics.beyondLimit.length);
- jest.spyOn(dataProvider, 'getAllMetricNames').mockReturnValue(metrics.beyondLimit);
-
- // Complex query
- dataProvider.monacoSettings.setInputInRange('metric name one two three four five');
- let completions = await getCompletions(situation, dataProvider, timeRange);
- expect(completions.length).toBeLessThanOrEqual(expectedCompletionsCount);
-
- // Simple query with fuzzy match
- dataProvider.monacoSettings.setInputInRange('metric_name_');
- completions = await getCompletions(situation, dataProvider, timeRange);
- expect(completions.length).toBeLessThanOrEqual(expectedCompletionsCount);
- });
-
- it('should handle complex queries efficiently', async () => {
- const situation: Situation = {
- type: situationType,
- };
-
- const testMetrics = ['metric_name_1', 'metric_name_2', 'metric_name_1_with_extra_terms', 'unrelated_metric'];
- jest.spyOn(dataProvider, 'queryMetricNames').mockResolvedValue(testMetrics);
-
- // Test with a complex query (> 4 terms)
- dataProvider.monacoSettings.setInputInRange('metric name 1 with extra terms more');
- const completions = await getCompletions(situation, dataProvider, timeRange);
-
- const metricCompletions = completions.filter((c) => c.type === 'METRIC_NAME');
- expect(metricCompletions.some((c) => c.label === 'metric_name_1_with_extra_terms')).toBe(true);
- });
-
- it('should handle multiple term queries efficiently', async () => {
- const situation: Situation = {
- type: situationType,
- };
-
- jest.spyOn(dataProvider, 'getAllMetricNames').mockReturnValue(metrics.beyondLimit);
-
- // Test with multiple terms
- dataProvider.monacoSettings.setInputInRange('metric name 1 2 3 4 5');
- const completions = await getCompletions(situation, dataProvider, timeRange);
-
- const expectedCompletionsCount = getSuggestionCountForSituation(situationType, metrics.beyondLimit.length);
- expect(completions.length).toBeLessThanOrEqual(expectedCompletionsCount);
- });
-});
-
-describe('Label value completions', () => {
- let dataProvider: DataProvider;
-
- beforeEach(() => {
- dataProvider = {
- getAllMetricNames: jest.fn(),
- metricNamesToMetrics: jest.fn(),
- getHistory: jest.fn(),
- queryLabelValues: jest.fn().mockResolvedValue(['value1', 'value"2', 'value\\3', "value'4"]),
- monacoSettings: {
- setInputInRange: jest.fn(),
- inputInRange: '',
- suggestionsIncomplete: false,
- enableAutocompleteSuggestionsUpdate: jest.fn(),
- },
- metricNamesSuggestionLimit: 100,
- } as unknown as DataProvider;
- });
-
- afterEach(() => {
- jest.restoreAllMocks();
- });
-
- describe('with prometheusSpecialCharsInLabelValues disabled', () => {
- beforeEach(() => {
- jest.replaceProperty(config, 'featureToggles', {
- prometheusSpecialCharsInLabelValues: false,
- });
- });
-
- const timeRange = getMockTimeRange();
-
- it('should not escape special characters when between quotes', async () => {
- const situation: Situation = {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'testLabel',
- betweenQuotes: true,
- otherLabels: [],
- };
-
- const completions = await getCompletions(situation, dataProvider, timeRange);
-
- expect(completions).toHaveLength(4);
- expect(completions[0].insertText).toBe('value1');
- expect(completions[1].insertText).toBe('value"2');
- expect(completions[2].insertText).toBe('value\\3');
- expect(completions[3].insertText).toBe("value'4");
- });
-
- it('should wrap in quotes but not escape special characters when not between quotes', async () => {
- const situation: Situation = {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'testLabel',
- betweenQuotes: false,
- otherLabels: [],
- };
-
- const completions = await getCompletions(situation, dataProvider, timeRange);
-
- expect(completions).toHaveLength(4);
- expect(completions[0].insertText).toBe('"value1"');
- expect(completions[1].insertText).toBe('"value"2"');
- expect(completions[2].insertText).toBe('"value\\3"');
- expect(completions[3].insertText).toBe('"value\'4"');
- });
- });
-
- describe('with prometheusSpecialCharsInLabelValues enabled', () => {
- beforeEach(() => {
- jest.replaceProperty(config, 'featureToggles', {
- prometheusSpecialCharsInLabelValues: true,
- });
- });
-
- const timeRange = getMockTimeRange();
-
- it('should escape special characters when between quotes', async () => {
- const situation: Situation = {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'testLabel',
- betweenQuotes: true,
- otherLabels: [],
- };
-
- const completions = await getCompletions(situation, dataProvider, timeRange);
-
- expect(completions).toHaveLength(4);
- expect(completions[0].insertText).toBe('value1');
- expect(completions[1].insertText).toBe('value\\"2');
- expect(completions[2].insertText).toBe('value\\\\3');
- expect(completions[3].insertText).toBe("value'4");
- });
-
- it('should wrap in quotes and escape special characters when not between quotes', async () => {
- const situation: Situation = {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'testLabel',
- betweenQuotes: false,
- otherLabels: [],
- };
-
- const completions = await getCompletions(situation, dataProvider, timeRange);
-
- expect(completions).toHaveLength(4);
- expect(completions[0].insertText).toBe('"value1"');
- expect(completions[1].insertText).toBe('"value\\"2"');
- expect(completions[2].insertText).toBe('"value\\\\3"');
- expect(completions[3].insertText).toBe('"value\'4"');
- });
- });
-
- describe('label value escaping edge cases', () => {
- beforeEach(() => {
- jest.replaceProperty(config, 'featureToggles', {
- prometheusSpecialCharsInLabelValues: true,
- });
- });
-
- const timeRange = getMockTimeRange();
-
- it('should handle empty values', async () => {
- jest.spyOn(dataProvider, 'queryLabelValues').mockResolvedValue(['']);
-
- const situation: Situation = {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'testLabel',
- betweenQuotes: false,
- otherLabels: [],
- };
-
- const completions = await getCompletions(situation, dataProvider, timeRange);
- expect(completions).toHaveLength(1);
- expect(completions[0].insertText).toBe('""');
- });
-
- it('should handle values with multiple special characters', async () => {
- jest.spyOn(dataProvider, 'queryLabelValues').mockResolvedValue(['test"\\value']);
-
- const situation: Situation = {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'testLabel',
- betweenQuotes: true,
- otherLabels: [],
- };
-
- const completions = await getCompletions(situation, dataProvider, timeRange);
- expect(completions).toHaveLength(1);
- expect(completions[0].insertText).toBe('test\\"\\\\value');
- });
-
- it('should handle non-string values', async () => {
- jest.spyOn(dataProvider, 'queryLabelValues').mockResolvedValue([123 as unknown as string]);
-
- const situation: Situation = {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'testLabel',
- betweenQuotes: false,
- otherLabels: [],
- };
-
- const completions = await getCompletions(situation, dataProvider, timeRange);
- expect(completions).toHaveLength(1);
- expect(completions[0].insertText).toBe('"123"');
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts
deleted file mode 100644
index 3d0bf489c10..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts
+++ /dev/null
@@ -1,296 +0,0 @@
-// Core grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/completions.ts
-import UFuzzy from '@leeoniya/ufuzzy';
-import { type languages } from 'monaco-editor';
-
-import { type TimeRange } from '@grafana/data';
-import { config } from '@grafana/runtime';
-
-import { DEFAULT_COMPLETION_LIMIT } from '../../../constants';
-import { escapeLabelValueInExactSelector, prometheusRegularEscape } from '../../../escaping';
-import { getFunctions } from '../../../promql';
-import { isValidLegacyName } from '../../../utf8_support';
-
-import { type DataProvider } from './data_provider';
-import { type TriggerType } from './monaco-completion-provider';
-import type { Label, Situation } from './situation';
-import { NeverCaseError } from './util';
-// FIXME: we should not load this from the "outside", but we cannot do that while we have the "old" query-field too
-
-export type CompletionType = 'HISTORY' | 'FUNCTION' | 'METRIC_NAME' | 'DURATION' | 'LABEL_NAME' | 'LABEL_VALUE';
-
-// We cannot use languages.CompletionItemInsertTextRule.InsertAsSnippet because grafana-prometheus package isn't compatible
-// It should first change the moduleResolution to bundler for TS to correctly resolve the types
-// https://github.com/grafana/grafana/pull/96450
-const InsertAsSnippet = 4;
-
-type Completion = {
- type: CompletionType;
- label: string;
- insertText: string;
- insertTextRules?: languages.CompletionItemInsertTextRule;
- detail?: string;
- documentation?: string;
- triggerOnInsert?: boolean;
-};
-
-const metricNamesSearch = {
- // see https://github.com/leeoniya/uFuzzy?tab=readme-ov-file#how-it-works for details
- multiInsert: new UFuzzy({ intraMode: 0 }),
- singleError: new UFuzzy({ intraMode: 1 }),
-};
-
-// Snippet Marker is telling monaco where to show the cursor and maybe a help text
-// With help text example: ${1:labelName}
-// labelName will be shown as selected. So user would know what to type next
-const snippetMarker = '${1:}';
-
-interface MetricFilterOptions {
- metricNames: string[];
- inputText: string;
- limit: number;
-}
-
-export function filterMetricNames({ metricNames, inputText, limit }: MetricFilterOptions): string[] {
- if (!inputText?.trim()) {
- return metricNames.slice(0, limit);
- }
-
- const terms = metricNamesSearch.multiInsert.split(inputText); // e.g. 'some_metric_name or-another' -> ['some', 'metric', 'name', 'or', 'another']
- const isComplexSearch = terms.length > 4;
- const fuzzyResults = isComplexSearch
- ? metricNamesSearch.multiInsert.filter(metricNames, inputText) // for complex searches, prioritize performance by using MultiInsert fuzzy search
- : metricNamesSearch.singleError.filter(metricNames, inputText); // for simple searches, prioritize flexibility by using SingleError fuzzy search
-
- return fuzzyResults ? fuzzyResults.slice(0, limit).map((idx) => metricNames[idx]) : [];
-}
-
-// we order items like: history, functions, metrics
-async function getAllMetricNamesCompletions(
- searchTerm: string | undefined,
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- let metricNames = await dataProvider.queryMetricNames(timeRange, searchTerm);
-
- return dataProvider.metricNamesToMetrics(metricNames).map((metric) => ({
- type: 'METRIC_NAME',
- label: metric.name,
- detail: `${metric.name} : ${metric.type}`,
- documentation: metric.help,
- ...(metric.isUtf8
- ? {
- insertText: `{"${metric.name}"${snippetMarker}}`,
- insertTextRules: InsertAsSnippet,
- }
- : {
- insertText: metric.name,
- }),
- }));
-}
-
-const getFunctionCompletions: () => Completion[] = () => {
- return getFunctions().map((f) => ({
- type: 'FUNCTION',
- label: f.label,
- insertText: f.insertText ?? '', // i don't know what to do when this is nullish. it should not be.
- detail: f.detail,
- documentation: f.documentation,
- }));
-};
-
-async function getFunctionsOnlyCompletions(): Promise {
- return Promise.resolve(getFunctionCompletions());
-}
-
-async function getAllFunctionsAndMetricNamesCompletions(
- searchTerm: string | undefined,
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- const metricNames = await getAllMetricNamesCompletions(searchTerm, dataProvider, timeRange);
- return [...getFunctionCompletions(), ...metricNames];
-}
-
-const DURATION_COMPLETIONS: Completion[] = [
- '$__interval',
- '$__range',
- '$__rate_interval',
- '1m',
- '5m',
- '10m',
- '30m',
- '1h',
- '1d',
-].map((text) => ({
- type: 'DURATION',
- label: text,
- insertText: text,
-}));
-
-function getAllHistoryCompletions(dataProvider: DataProvider): Completion[] {
- // function getAllHistoryCompletions(queryHistory: PromHistoryItem[]): Completion[] {
- // NOTE: the typescript types are wrong. historyItem.query.expr can be undefined
- const allHistory = dataProvider.getHistory();
- // FIXME: find a better history-limit
- return allHistory.slice(0, 10).map((expr) => ({
- type: 'HISTORY',
- label: expr,
- insertText: expr,
- }));
-}
-
-function makeSelector(metricName: string | undefined, labels: Label[]): string | undefined {
- if (metricName === undefined && labels.length === 0) {
- return undefined;
- }
-
- const allLabels = [...labels];
-
- // we transform the metricName to a label, if it exists
- if (metricName !== undefined) {
- allLabels.push({ name: '__name__', value: metricName, op: '=' });
- }
-
- const allLabelTexts = allLabels.map(
- (label) => `${label.name}${label.op}"${escapeLabelValueInExactSelector(label.value)}"`
- );
-
- return `{${allLabelTexts.join(',')}}`;
-}
-
-async function getLabelNames(
- metric: string | undefined,
- otherLabels: Label[],
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- const selector = makeSelector(metric, otherLabels);
- const labelNames = await dataProvider.queryLabelKeys(timeRange, selector, DEFAULT_COMPLETION_LIMIT);
- // Exclude __name__ from output
- otherLabels.push({ name: '__name__', value: '', op: '!=' });
- const usedLabelNames = new Set(otherLabels.map((l) => l.name));
- // names used in the query
- return labelNames.filter((l) => !usedLabelNames.has(l));
-}
-
-async function getLabelNamesForCompletions(
- metric: string | undefined,
- suffix: string,
- triggerOnInsert: boolean,
- otherLabels: Label[],
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- const labelNames = await getLabelNames(metric, otherLabels, dataProvider, timeRange);
- return labelNames.map((text) => {
- const isUtf8 = !isValidLegacyName(text);
- return {
- type: 'LABEL_NAME',
- label: text,
- ...(isUtf8
- ? {
- insertText: `"${text}"${suffix}`,
- insertTextRules: InsertAsSnippet,
- }
- : {
- insertText: `${text}${suffix}`,
- }),
- triggerOnInsert,
- };
- });
-}
-
-async function getLabelNamesForSelectorCompletions(
- metric: string | undefined,
- otherLabels: Label[],
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- return getLabelNamesForCompletions(metric, '=', true, otherLabels, dataProvider, timeRange);
-}
-
-async function getLabelNamesForByCompletions(
- metric: string | undefined,
- otherLabels: Label[],
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- return getLabelNamesForCompletions(metric, '', false, otherLabels, dataProvider, timeRange);
-}
-
-async function getLabelValues(
- metric: string | undefined,
- labelName: string,
- otherLabels: Label[],
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- const selector = makeSelector(metric, otherLabels);
- return await dataProvider.queryLabelValues(timeRange, labelName, selector);
-}
-
-async function getLabelValuesForMetricCompletions(
- metric: string | undefined,
- labelName: string,
- betweenQuotes: boolean,
- otherLabels: Label[],
- dataProvider: DataProvider,
- timeRange: TimeRange
-): Promise {
- const values = await getLabelValues(metric, labelName, otherLabels, dataProvider, timeRange);
- return values.map((text) => ({
- type: 'LABEL_VALUE',
- label: text,
- insertText: formatLabelValueForCompletion(text, betweenQuotes),
- }));
-}
-
-function formatLabelValueForCompletion(value: string, betweenQuotes: boolean): string {
- const text = config.featureToggles.prometheusSpecialCharsInLabelValues ? prometheusRegularEscape(value) : value;
- return betweenQuotes ? text : `"${text}"`;
-}
-
-export async function getCompletions(
- situation: Situation,
- dataProvider: DataProvider,
- timeRange: TimeRange,
- searchTerm?: string,
- triggerType: TriggerType = 'full'
-): Promise {
- switch (situation.type) {
- case 'IN_DURATION':
- return Promise.resolve(DURATION_COMPLETIONS);
- case 'IN_FUNCTION':
- return triggerType === 'full'
- ? getAllFunctionsAndMetricNamesCompletions(searchTerm, dataProvider, timeRange)
- : getFunctionsOnlyCompletions();
- case 'AT_ROOT': {
- return triggerType === 'full'
- ? getAllFunctionsAndMetricNamesCompletions(searchTerm, dataProvider, timeRange)
- : getFunctionsOnlyCompletions();
- }
- case 'EMPTY': {
- if (triggerType === 'partial') {
- return Promise.resolve(getFunctionCompletions());
- }
- const metricNames = await getAllMetricNamesCompletions(searchTerm, dataProvider, timeRange);
- const historyCompletions = getAllHistoryCompletions(dataProvider);
- return Promise.resolve([...historyCompletions, ...getFunctionCompletions(), ...metricNames]);
- }
- case 'IN_LABEL_SELECTOR_NO_LABEL_NAME':
- return getLabelNamesForSelectorCompletions(situation.metricName, situation.otherLabels, dataProvider, timeRange);
- case 'IN_GROUPING':
- return getLabelNamesForByCompletions(situation.metricName, situation.otherLabels, dataProvider, timeRange);
- case 'IN_LABEL_SELECTOR_WITH_LABEL_NAME':
- return getLabelValuesForMetricCompletions(
- situation.metricName,
- situation.labelName,
- situation.betweenQuotes,
- situation.otherLabels,
- dataProvider,
- timeRange
- );
- default:
- throw new NeverCaseError(situation);
- }
-}
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.test.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.test.ts
deleted file mode 100644
index 2895b53b4c8..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.test.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import type { PrometheusLanguageProvider } from '../../../language_provider';
-
-import { DataProvider, type DataProviderParams } from './data_provider';
-
-const createLanguageProviderMock = (existingMetadata: Record = {}) => ({
- queryLabelKeys: jest.fn(),
- queryLabelValues: jest.fn(),
- queryMetricsMetadata: jest.fn().mockResolvedValue({}),
- retrieveMetrics: jest.fn().mockReturnValue([]),
- retrieveMetricsMetadata: jest.fn().mockReturnValue(existingMetadata),
-});
-
-const createDataProvider = (languageProvider: Partial) => {
- return new DataProvider({ languageProvider } as DataProviderParams);
-};
-
-describe('DataProvider', () => {
- describe('metadata fetching', () => {
- it('calls queryMetricsMetadata when no metadata is cached', () => {
- const languageProvider = createLanguageProviderMock({});
- createDataProvider(languageProvider);
- expect(languageProvider.queryMetricsMetadata).toHaveBeenCalledTimes(1);
- });
-
- it('does not call queryMetricsMetadata when metadata is already cached', () => {
- const languageProvider = createLanguageProviderMock({
- http_requests_total: { type: 'counter', help: 'Total HTTP requests' },
- });
- createDataProvider(languageProvider);
- expect(languageProvider.queryMetricsMetadata).not.toHaveBeenCalled();
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts
deleted file mode 100644
index a4bcc1aa895..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/data_provider.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-import { type HistoryItem, type TimeRange } from '@grafana/data';
-
-import { DEFAULT_COMPLETION_LIMIT, METRIC_LABEL } from '../../../constants';
-import { type PrometheusLanguageProviderInterface } from '../../../language_provider';
-import { removeQuotesIfExist } from '../../../language_utils';
-import { type PromQuery } from '../../../types';
-import { escapeForUtf8Support, isValidLegacyName } from '../../../utf8_support';
-
-export const CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT = 'codeModeSuggestionsIncomplete';
-
-type SuggestionsIncompleteEvent = CustomEvent<{
- limit: number;
- datasourceUid: string;
-}>;
-
-export function isSuggestionsIncompleteEvent(e: Event): e is SuggestionsIncompleteEvent {
- return (
- e.type === CODE_MODE_SUGGESTIONS_INCOMPLETE_EVENT &&
- 'detail' in e &&
- typeof e.detail === 'object' &&
- e.detail !== null &&
- 'limit' in e.detail &&
- 'datasourceUid' in e.detail
- );
-}
-
-interface Metric {
- name: string;
- help: string;
- type: string;
- isUtf8?: boolean;
-}
-
-export interface DataProviderParams {
- languageProvider: PrometheusLanguageProviderInterface;
- historyProvider: Array>;
-}
-
-export class DataProvider {
- readonly languageProvider: PrometheusLanguageProviderInterface;
- readonly historyProvider: Array>;
-
- readonly queryLabelKeys: typeof this.languageProvider.queryLabelKeys;
- readonly queryLabelValues: typeof this.languageProvider.queryLabelValues;
- /**
- * The text that's been typed so far within the current {@link Monaco.Range | Range}.
- *
- * @remarks
- * This is useful with fuzzy searching items to provide as Monaco autocomplete suggestions.
- */
- private inputInRange: string;
-
- constructor(params: DataProviderParams) {
- this.languageProvider = params.languageProvider;
- this.historyProvider = params.historyProvider;
- this.inputInRange = '';
-
- this.queryLabelKeys = this.languageProvider.queryLabelKeys.bind(this.languageProvider);
- this.queryLabelValues = this.languageProvider.queryLabelValues.bind(this.languageProvider);
-
- // Ensure metadata is loaded for completions. The builder mode triggers this via its own
- // components, but the code editor does not, so we need to fetch it here if not already cached.
- const existingMetadata = this.languageProvider.retrieveMetricsMetadata();
- if (Object.keys(existingMetadata).length === 0) {
- this.languageProvider.queryMetricsMetadata();
- }
- }
-
- /**
- * Queries metric names with optional filtering.
- * Safely constructs regex patterns and handles errors.
- */
- queryMetricNames = async (timeRange: TimeRange, searchTerm: string | undefined): Promise => {
- try {
- let match: string | undefined;
- if (searchTerm) {
- const escapedWord = escapeForUtf8Support(removeQuotesIfExist(searchTerm));
- match = `{__name__=~".*${escapedWord}.*"}`;
- }
-
- const result = await this.languageProvider.queryLabelValues(
- timeRange,
- METRIC_LABEL,
- match,
- DEFAULT_COMPLETION_LIMIT
- );
-
- return Array.isArray(result) ? result : [];
- } catch (error) {
- console.warn('Failed to query metric names:', error);
- return [];
- }
- };
-
- getHistory(): string[] {
- return this.historyProvider.map((h) => h.query.expr).filter(Boolean);
- }
-
- getAllMetricNames(): string[] {
- return this.languageProvider.retrieveMetrics();
- }
-
- metricNamesToMetrics(metricNames: string[]): Metric[] {
- const metricsMetadata = this.languageProvider.retrieveMetricsMetadata();
- const result: Metric[] = metricNames.map((m) => {
- const metaItem = metricsMetadata?.[m];
- return {
- name: m,
- help: metaItem?.help ?? '',
- type: metaItem?.type ?? '',
- isUtf8: !isValidLegacyName(m),
- };
- });
-
- return result;
- }
-
- private setInputInRange(textInput: string): void {
- this.inputInRange = textInput;
- }
-
- get monacoSettings() {
- return {
- inputInRange: this.inputInRange,
- setInputInRange: this.setInputInRange.bind(this),
- };
- }
-}
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/monaco-completion-provider.test.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/monaco-completion-provider.test.ts
deleted file mode 100644
index 21a27038f8c..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/monaco-completion-provider.test.ts
+++ /dev/null
@@ -1,353 +0,0 @@
-import { dateTime, type TimeRange } from '@grafana/data';
-import type { Monaco, monacoTypes } from '@grafana/ui';
-
-import { type DataProvider } from './data_provider';
-import { getCompletionProvider, getSuggestOptions } from './monaco-completion-provider';
-
-// Mock the dependencies
-jest.mock('./completions');
-jest.mock('./situation');
-
-const mockGetCompletions = jest.fn();
-const mockGetSituation = jest.fn();
-
-jest.mock('./completions', () => ({
- getCompletions: (...args: Parameters) => mockGetCompletions(...args),
-}));
-
-jest.mock('./situation', () => ({
- getSituation: (...args: Parameters) => mockGetSituation(...args),
-}));
-
-// Create proper Monaco mocks without 'any'
-const createMockMonaco = (): Monaco => {
- const mockRange = {
- lift: jest.fn((range: monacoTypes.IRange) => range),
- fromPositions: jest.fn((position: monacoTypes.Position) => ({
- startLineNumber: position.lineNumber,
- endLineNumber: position.lineNumber,
- startColumn: position.column,
- endColumn: position.column,
- })),
- };
-
- return {
- languages: {
- CompletionItemKind: {
- Unit: 0,
- Variable: 1,
- Snippet: 2,
- Enum: 3,
- EnumMember: 4,
- Constructor: 5,
- } as const,
- },
- Range: mockRange,
- } as unknown as Monaco;
-};
-
-const createMockModel = (
- value: string,
- mockWord: monacoTypes.editor.IWordAtPosition | null = null
-): monacoTypes.editor.ITextModel => {
- return {
- getValue: () => value,
- getValueInRange: jest.fn((range: monacoTypes.IRange) => {
- // Convert to 0-based indexing
- const startIndex = Math.max(0, range.startColumn - 1);
- const endIndex = Math.min(value.length, range.endColumn - 1);
- return value.substring(startIndex, endIndex);
- }),
- getWordAtPosition: jest.fn(() => mockWord),
- getOffsetAt: jest.fn((position: monacoTypes.Position) => position.column - 1),
- id: 'test-model',
- } as unknown as monacoTypes.editor.ITextModel;
-};
-
-const createMockPosition = (column: number, lineNumber = 1): monacoTypes.Position =>
- ({
- column,
- lineNumber,
- }) as monacoTypes.Position;
-
-const createMockDataProvider = (): DataProvider => {
- return {
- monacoSettings: {
- setInputInRange: jest.fn(),
- suggestionsIncomplete: false,
- },
- } as unknown as DataProvider;
-};
-
-const createMockTimeRange = (): TimeRange => ({
- from: dateTime(Date.now() - 3600000), // 1 hour ago
- to: dateTime(Date.now()),
- raw: { from: 'now-1h', to: 'now' },
-});
-
-describe('monaco-completion-provider', () => {
- let monaco: Monaco;
- let dataProvider: DataProvider;
- let timeRange: TimeRange;
-
- beforeEach(() => {
- monaco = createMockMonaco();
- dataProvider = createMockDataProvider();
- timeRange = createMockTimeRange();
-
- // Reset mocks
- jest.clearAllMocks();
- mockGetCompletions.mockResolvedValue([]);
- mockGetSituation.mockReturnValue({ type: 'METRIC_NAME' });
-
- // Mock window.getSelection
- Object.defineProperty(window, 'getSelection', {
- writable: true,
- value: jest.fn(() => ({
- toString: () => '',
- })),
- });
- });
-
- afterEach(() => {
- jest.restoreAllMocks();
- });
-
- describe('getSuggestOptions', () => {
- it('should return options with showWords set to false', () => {
- const options = getSuggestOptions();
- expect(options).toEqual({
- showWords: false,
- });
- });
- });
-
- describe('getCompletionProvider', () => {
- it('should return provider and state objects', () => {
- const result = getCompletionProvider(monaco, dataProvider, timeRange);
-
- expect(result).toHaveProperty('provider');
- expect(result).toHaveProperty('state');
- expect(result.state).toHaveProperty('isManualTriggerRequested', false);
- expect(result.provider).toHaveProperty('triggerCharacters');
- expect(result.provider).toHaveProperty('provideCompletionItems');
- });
-
- it('should have correct trigger characters', () => {
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- expect(provider.triggerCharacters).toEqual(['{', ',', '[', '(', '=', '~', ' ', '"']);
- });
- });
-
- describe('provideCompletionItems', () => {
- it('should return empty suggestions when no situation is detected', async () => {
- mockGetSituation.mockReturnValue(null);
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
- const model = createMockModel('test');
- const position = createMockPosition(4);
-
- const result = await (provider.provideCompletionItems as Function)(model, position);
-
- expect(result).toEqual({
- suggestions: [],
- incomplete: false,
- });
- });
-
- it('should call getCompletions with correct parameters for normal word', async () => {
- const mockWord = { word: 'grafana', startColumn: 1, endColumn: 7 };
- const model = createMockModel('grafana', mockWord);
- const position = createMockPosition(7);
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- await (provider.provideCompletionItems as Function)(model, position);
-
- expect(mockGetCompletions).toHaveBeenCalledWith(
- { type: 'METRIC_NAME' },
- dataProvider,
- timeRange,
- 'grafana',
- 'full' // Should be 'full' because word length >= 3
- );
- });
-
- it('should use partial trigger type for short words', async () => {
- const mockWord = { word: 'go', startColumn: 1, endColumn: 3 };
- const model = createMockModel('go', mockWord);
- const position = createMockPosition(3);
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- await (provider.provideCompletionItems as Function)(model, position);
-
- expect(mockGetCompletions).toHaveBeenCalledWith(
- { type: 'METRIC_NAME' },
- dataProvider,
- timeRange,
- 'go',
- 'partial' // Should be 'partial' because word length < 3
- );
- });
-
- it('should format completion items correctly', async () => {
- const mockCompletions = [
- {
- label: 'test_metric',
- detail: 'A test metric',
- insertText: 'test_metric',
- documentation: 'Test documentation',
- insertTextRules: undefined,
- type: 'METRIC_NAME' as const,
- triggerOnInsert: false,
- },
- ];
-
- mockGetCompletions.mockResolvedValue(mockCompletions);
-
- const mockWord = { word: 'test', startColumn: 1, endColumn: 5 };
- const model = createMockModel('test', mockWord);
- const position = createMockPosition(5);
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- const result = await (provider.provideCompletionItems as Function)(model, position);
-
- expect(result?.suggestions).toHaveLength(1);
- expect(result?.suggestions?.[0]).toMatchObject({
- label: 'test_metric',
- detail: 'A test metric',
- insertText: 'test_metric',
- documentation: 'Test documentation',
- kind: 5, // Constructor kind for METRIC_NAME
- sortText: '0',
- command: undefined,
- });
- });
-
- it('should add trigger command for items with triggerOnInsert', async () => {
- const mockCompletions = [
- {
- label: 'func(',
- insertText: 'func(',
- type: 'FUNCTION' as const,
- triggerOnInsert: true,
- },
- ];
-
- mockGetCompletions.mockResolvedValue(mockCompletions);
-
- const model = createMockModel('func');
- const position = createMockPosition(4);
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- const result = await (provider.provideCompletionItems as Function)(model, position);
-
- expect(result?.suggestions?.[0]?.command).toEqual({
- id: 'editor.action.triggerSuggest',
- title: '',
- });
- });
- });
-
- describe('manual trigger handling', () => {
- it('should use full trigger type for manual trigger', async () => {
- const mockWord = { word: 'te', startColumn: 1, endColumn: 3 };
- const model = createMockModel('te', mockWord);
- const position = createMockPosition(3);
-
- const { provider, state } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- // Set manual trigger flag
- state.isManualTriggerRequested = true;
-
- await (provider.provideCompletionItems as Function)(model, position);
-
- expect(mockGetCompletions).toHaveBeenCalledWith(
- { type: 'METRIC_NAME' },
- dataProvider,
- timeRange,
- 'te',
- 'full' // Should be 'full' despite short word length
- );
- });
- });
-
- describe('trigger character handling', () => {
- const triggerCharacters = ['{', ',', '[', '(', '=', '~', ' ', '"'];
-
- triggerCharacters.forEach((triggerChar) => {
- it(`should use full trigger type for trigger character "${triggerChar}"`, async () => {
- const testString = `grafana${triggerChar}`;
- const model = createMockModel(testString, null);
- const position = createMockPosition(testString.length + 1); // After trigger character (1-indexed)
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- await (provider.provideCompletionItems as Function)(model, position);
-
- expect(mockGetCompletions).toHaveBeenCalledWith(
- { type: 'METRIC_NAME' },
- dataProvider,
- timeRange,
- undefined, // No word at position after trigger char
- 'full'
- );
- });
- });
-
- it('should handle trigger character at beginning of line', async () => {
- const model = createMockModel('{', null);
- const position = createMockPosition(2); // After the { character
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- await (provider.provideCompletionItems as Function)(model, position);
-
- // Should not fail and should still call getCompletions
- expect(mockGetCompletions).toHaveBeenCalled();
- });
- });
-
- describe('selection handling', () => {
- it('should adjust cursor position when text is selected', async () => {
- // Mock selected text
- Object.defineProperty(window, 'getSelection', {
- writable: true,
- value: jest.fn(() => ({
- toString: () => 'selected',
- })),
- });
-
- const model = createMockModel('grafana selected');
- const position = createMockPosition(16); // End of string
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- await (provider.provideCompletionItems as Function)(model, position);
-
- // Should call getOffsetAt with adjusted position
- expect(model.getOffsetAt).toHaveBeenCalledWith({
- column: 8, // 16 - 8 (length of 'selected')
- lineNumber: 1,
- });
- });
- });
-
- describe('data provider integration', () => {
- it('should set input range on data provider', async () => {
- const mockWord = { word: 'test', startColumn: 1, endColumn: 5 };
- const model = createMockModel('test', mockWord);
- const position = createMockPosition(5);
-
- const { provider } = getCompletionProvider(monaco, dataProvider, timeRange);
-
- await (provider.provideCompletionItems as Function)(model, position);
-
- expect(dataProvider.monacoSettings.setInputInRange).toHaveBeenCalled();
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/monaco-completion-provider.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/monaco-completion-provider.ts
deleted file mode 100644
index 164de2e419b..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/monaco-completion-provider.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/index.ts
-import { type TimeRange } from '@grafana/data';
-import type { Monaco, monacoTypes } from '@grafana/ui';
-
-import { type CompletionType, getCompletions } from './completions';
-import { type DataProvider } from './data_provider';
-import { getSituation } from './situation';
-import { NeverCaseError } from './util';
-
-export type TriggerType = 'partial' | 'full';
-
-export type MonacoQueryFieldLocalState = {
- isManualTriggerRequested: boolean;
-};
-
-const TRIGGER_CHARACTERS = ['{', ',', '[', '(', '=', '~', ' ', '"'];
-const MIN_WORD_LENGTH_FOR_FULL_COMPLETIONS = 3;
-
-export function getSuggestOptions(): monacoTypes.editor.ISuggestOptions {
- return {
- // monaco-editor sometimes provides suggestions automatically, i am not
- // sure based on what, seems to be by analyzing the words already
- // written.
- // to try it out:
- // - enter `go_goroutines{job~`
- // - have the cursor at the end of the string
- // - press ctrl-enter
- // - you will get two suggestions
- // those were not provided by grafana, they are offered automatically.
- // i want to remove those. the only way i found is:
- // - every suggestion-item has a `kind` attribute,
- // that controls the icon to the left of the suggestion.
- // - items auto-generated by monaco have `kind` set to `text`.
- // - we make sure grafana-provided suggestions do not have `kind` set to `text`.
- // - and then we tell monaco not to show suggestions of kind `text`
- showWords: false,
- };
-}
-
-function getMonacoCompletionItemKind(type: CompletionType, monaco: Monaco): monacoTypes.languages.CompletionItemKind {
- switch (type) {
- case 'DURATION':
- return monaco.languages.CompletionItemKind.Unit;
- case 'FUNCTION':
- return monaco.languages.CompletionItemKind.Variable;
- case 'HISTORY':
- return monaco.languages.CompletionItemKind.Snippet;
- case 'LABEL_NAME':
- return monaco.languages.CompletionItemKind.Enum;
- case 'LABEL_VALUE':
- return monaco.languages.CompletionItemKind.EnumMember;
- case 'METRIC_NAME':
- return monaco.languages.CompletionItemKind.Constructor;
- default:
- throw new NeverCaseError(type);
- }
-}
-
-function getTriggerType(
- word: monacoTypes.editor.IWordAtPosition | null,
- model: monacoTypes.editor.ITextModel,
- position: monacoTypes.Position,
- state: MonacoQueryFieldLocalState
-): TriggerType {
- // Manual trigger (Ctrl+Space) - always full completions
- if (state.isManualTriggerRequested) {
- return 'full';
- }
-
- const charBeforeCursor = model.getValueInRange({
- startLineNumber: position.lineNumber,
- endLineNumber: position.lineNumber,
- startColumn: Math.max(1, position.column - 1),
- endColumn: position.column,
- });
-
- if (TRIGGER_CHARACTERS.includes(charBeforeCursor)) {
- return 'full';
- }
-
- // For typed words of sufficient length, use full completions
- if (word && word.word.length >= MIN_WORD_LENGTH_FOR_FULL_COMPLETIONS) {
- return 'full';
- }
-
- return 'partial';
-}
-
-export function getCompletionProvider(
- monaco: Monaco,
- dataProvider: DataProvider,
- timeRange: TimeRange
-): { provider: monacoTypes.languages.CompletionItemProvider; state: MonacoQueryFieldLocalState } {
- const state: MonacoQueryFieldLocalState = {
- isManualTriggerRequested: false,
- };
-
- const provideCompletionItems = (
- model: monacoTypes.editor.ITextModel,
- position: monacoTypes.Position
- ): monacoTypes.languages.ProviderResult => {
- const word = model.getWordAtPosition(position);
- const range =
- word != null
- ? monaco.Range.lift({
- startLineNumber: position.lineNumber,
- endLineNumber: position.lineNumber,
- startColumn: word.startColumn,
- endColumn: word.endColumn,
- })
- : monaco.Range.fromPositions(position);
-
- // Set input range for data provider
- dataProvider.monacoSettings.setInputInRange(model.getValueInRange(range));
-
- // Get adjusted position for cursor/selection handling
- const adjustedPosition = getAdjustedPosition(position);
- const offset = model.getOffsetAt(adjustedPosition);
- const situation = getSituation(model.getValue(), offset);
-
- // Early exit if no situation detected
- if (situation === null) {
- return Promise.resolve({ suggestions: [], incomplete: false });
- }
-
- const triggerType: TriggerType = getTriggerType(word, model, position, state);
-
- return getCompletions(situation, dataProvider, timeRange, word?.word, triggerType).then((items) => {
- // Monaco by-default alphabetically orders the items.
- // We use a number-as-string sortkey to maintain our custom order
- const maxIndexDigits = items.length > 0 ? items.length.toString().length : 1;
- const suggestions: monacoTypes.languages.CompletionItem[] = items.map((item, index) => ({
- kind: getMonacoCompletionItemKind(item.type, monaco),
- label: item.label,
- insertText: item.insertText,
- insertTextRules: item.insertTextRules,
- detail: item.detail,
- documentation: item.documentation,
- sortText: index.toString().padStart(maxIndexDigits, '0'), // to force the order we have
- range,
- command: item.triggerOnInsert
- ? {
- id: 'editor.action.triggerSuggest',
- title: '',
- }
- : undefined,
- }));
-
- return { suggestions };
- });
- };
-
- // Helper function to handle position adjustment for selection
- function getAdjustedPosition(position: monacoTypes.Position): { column: number; lineNumber: number } {
- let adjustedColumn = position.column;
-
- // Check to see if the browser supports window.getSelection()
- if (window.getSelection) {
- const selectedText = window.getSelection()?.toString();
- // If the user has selected text, adjust the cursor position to be at the start of the selection
- if (selectedText && selectedText.length > 0) {
- adjustedColumn = Math.max(1, adjustedColumn - selectedText.length);
- }
- }
-
- return {
- column: adjustedColumn,
- lineNumber: position.lineNumber,
- };
- }
-
- return {
- provider: {
- triggerCharacters: TRIGGER_CHARACTERS,
- provideCompletionItems,
- },
- state,
- };
-}
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/situation.test.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/situation.test.ts
deleted file mode 100644
index b2739598561..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/situation.test.ts
+++ /dev/null
@@ -1,324 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.test.ts
-import { getSituation, type Situation } from './situation';
-
-// we use the `^` character as the cursor-marker in the string.
-function assertSituation(situation: string, expectedSituation: Situation | null) {
- // first we find the cursor-position
- const pos = situation.indexOf('^');
- if (pos === -1) {
- throw new Error('cursor missing');
- }
-
- // we remove the cursor-marker from the string
- const text = situation.replace('^', '');
-
- // sanity check, make sure no more cursor-markers remain
- if (text.indexOf('^') !== -1) {
- throw new Error('multiple cursors');
- }
-
- const result = getSituation(text, pos);
-
- if (expectedSituation === null) {
- expect(result).toStrictEqual(null);
- } else {
- expect(result).toMatchObject(expectedSituation);
- }
-}
-
-describe('situation', () => {
- it('handles things', () => {
- assertSituation('^', {
- type: 'EMPTY',
- });
-
- assertSituation('sum(one) / ^', {
- type: 'AT_ROOT',
- });
-
- assertSituation('sum(^)', {
- type: 'IN_FUNCTION',
- });
-
- assertSituation('sum(one) / sum(^)', {
- type: 'IN_FUNCTION',
- });
-
- assertSituation('something{}[^]', {
- type: 'IN_DURATION',
- });
-
- assertSituation('something{label~^}', null);
- });
-
- it('handles label names', () => {
- assertSituation('something{^}', {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- metricName: 'something',
- otherLabels: [],
- betweenQuotes: false,
- });
-
- assertSituation('sum(something) by (^)', {
- type: 'IN_GROUPING',
- metricName: 'something',
- otherLabels: [],
- });
-
- assertSituation('sum by (^) (something)', {
- type: 'IN_GROUPING',
- metricName: 'something',
- otherLabels: [],
- });
-
- assertSituation('something{one="val1",two!="val2",three=~"val3",four!~"val4",^}', {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- metricName: 'something',
- otherLabels: [
- { name: 'one', value: 'val1', op: '=' },
- { name: 'two', value: 'val2', op: '!=' },
- { name: 'three', value: 'val3', op: '=~' },
- { name: 'four', value: 'val4', op: '!~' },
- ],
- betweenQuotes: false,
- });
-
- assertSituation('{^}', {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels: [],
- betweenQuotes: false,
- });
-
- assertSituation('{one="val1",^}', {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels: [{ name: 'one', value: 'val1', op: '=' }],
- betweenQuotes: false,
- });
-
- // single-quoted label-values with escape
- assertSituation("{one='val\\'1',^}", {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels: [{ name: 'one', value: "val'1", op: '=' }],
- betweenQuotes: false,
- });
-
- // double-quoted label-values with escape
- assertSituation('{one="val\\"1",^}', {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels: [{ name: 'one', value: 'val"1', op: '=' }],
- betweenQuotes: false,
- });
-
- // backticked label-values with escape (the escape should not be interpreted)
- assertSituation('{one=`val\\"1`,^}', {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels: [{ name: 'one', value: 'val\\"1', op: '=' }],
- betweenQuotes: false,
- });
- });
-
- describe('utf-8 metric name support', () => {
- it('with utf8 metric name no label and no comma', () => {
- assertSituation(`{"metric.name"^}`, null);
- });
-
- it('with utf8 metric name no label', () => {
- assertSituation(`{"metric.name", ^}`, {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- metricName: 'metric.name',
- otherLabels: [],
- betweenQuotes: false,
- });
- });
-
- it('with utf8 metric name requesting utf8 labels in quotes', () => {
- assertSituation(`{"metric.name", "^"}`, {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- metricName: 'metric.name',
- otherLabels: [],
- betweenQuotes: true,
- });
- });
-
- it('with utf8 metric name with a legacy label', () => {
- assertSituation(`{"metric.name", label1="val", ^}`, {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- metricName: 'metric.name',
- otherLabels: [{ name: 'label1', value: 'val', op: '=' }],
- betweenQuotes: false,
- });
- });
-
- it('with utf8 metric name with a legacy label and no value', () => {
- assertSituation(`{"metric.name", label1="^"}`, {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'metric.name',
- labelName: 'label1',
- betweenQuotes: true,
- otherLabels: [],
- });
- });
-
- it('with utf8 metric name with a utf8 label and no value', () => {
- assertSituation(`{"metric.name", "utf8.label"="^"}`, {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'metric.name',
- labelName: '"utf8.label"',
- betweenQuotes: true,
- otherLabels: [],
- });
- });
-
- it('with utf8 metric name with a legacy label and utf8 label', () => {
- assertSituation(`{"metric.name", label1="val", "utf8.label"="^"}`, {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'metric.name',
- labelName: `"utf8.label"`,
- betweenQuotes: true,
- otherLabels: [{ name: 'label1', value: 'val', op: '=' }],
- });
- });
-
- it('with utf8 metric name with a utf8 label and legacy label', () => {
- assertSituation(`{"metric.name", "utf8.label"="val", label1="^"}`, {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'metric.name',
- labelName: `label1`,
- betweenQuotes: true,
- otherLabels: [{ name: '"utf8.label"', value: 'val', op: '=' }],
- });
- });
-
- it('with utf8 metric name with grouping', () => {
- assertSituation(`sum by (^)(rate({"metric.name", label1="val"}[1m]))`, {
- type: 'IN_GROUPING',
- metricName: 'metric.name',
- otherLabels: [],
- });
- });
- });
-
- it('utf-8 label support', () => {
- assertSituation(`metric{"label": "^"}`, null);
-
- assertSituation(`metric{"label with space": "^"}`, null);
-
- assertSituation(`metric{"label_🤖": "^"}`, null);
-
- assertSituation(`metric{"Spaß": "^"}`, null);
-
- assertSituation(`{"metric", "Spaß": "^"}`, null);
-
- assertSituation('something{"job"=^}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: '"job"',
- betweenQuotes: false,
- otherLabels: [],
- });
-
- assertSituation('something{"job📈"=^}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: '"job📈"',
- betweenQuotes: false,
- otherLabels: [],
- });
-
- assertSituation('something{"job with space"=^,host="h1"}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: '"job with space"',
- betweenQuotes: false,
- otherLabels: [{ name: 'host', value: 'h1', op: '=' }],
- });
- });
-
- it('handles label values', () => {
- assertSituation('something{job=^}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: 'job',
- betweenQuotes: false,
- otherLabels: [],
- });
-
- assertSituation('something{job!=^}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: 'job',
- betweenQuotes: false,
- otherLabels: [],
- });
-
- assertSituation('something{job=~^}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: 'job',
- betweenQuotes: false,
- otherLabels: [],
- });
-
- assertSituation('something{job!~^}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: 'job',
- betweenQuotes: false,
- otherLabels: [],
- });
-
- assertSituation('something{job=^,host="h1"}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: 'job',
- betweenQuotes: false,
- otherLabels: [{ name: 'host', value: 'h1', op: '=' }],
- });
-
- assertSituation('something{job="j1",host="^"}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: 'host',
- betweenQuotes: true,
- otherLabels: [{ name: 'job', value: 'j1', op: '=' }],
- });
-
- assertSituation('something{job="j1"^}', null);
- assertSituation('something{job="j1" ^ }', null);
- assertSituation('something{job="j1" ^ , }', null);
-
- assertSituation('{job=^,host="h1"}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName: 'job',
- betweenQuotes: false,
- otherLabels: [{ name: 'host', value: 'h1', op: '=' }],
- });
-
- assertSituation('something{one="val1",two!="val2",three=^,four=~"val4",five!~"val5"}', {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- metricName: 'something',
- labelName: 'three',
- betweenQuotes: false,
- otherLabels: [
- { name: 'one', value: 'val1', op: '=' },
- { name: 'two', value: 'val2', op: '!=' },
- { name: 'four', value: 'val4', op: '=~' },
- { name: 'five', value: 'val5', op: '!~' },
- ],
- });
- });
-
- it('identifies all labels from queries when cursor is in middle', () => {
- // Note the extra whitespace, if the cursor is after whitespace, the situation will fail to resolve
- assertSituation('{one="val1", ^,two!="val2",three=~"val3",four!~"val4"}', {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels: [
- { name: 'one', value: 'val1', op: '=' },
- { name: 'two', value: 'val2', op: '!=' },
- { name: 'three', value: 'val3', op: '=~' },
- { name: 'four', value: 'val4', op: '!~' },
- ],
- betweenQuotes: false,
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/situation.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/situation.ts
deleted file mode 100644
index dfc0f40a556..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/situation.ts
+++ /dev/null
@@ -1,612 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/situation.ts
-import type { SyntaxNode, Tree } from '@lezer/common';
-import {
- AggregateExpr,
- AggregateModifier,
- BinaryExpr,
- EqlRegex,
- EqlSingle,
- FunctionCallBody,
- GroupingLabels,
- Identifier,
- LabelMatchers,
- LabelName,
- MatchOp,
- MatrixSelector,
- Neq,
- NeqRegex,
- NumberDurationLiteralInDurationContext,
- parser,
- PromQL,
- QuotedLabelMatcher,
- QuotedLabelName,
- StringLiteral,
- UnquotedLabelMatcher,
- VectorSelector,
-} from '@prometheus-io/lezer-promql';
-
-import { NeverCaseError } from './util';
-
-type Direction = 'parent' | 'firstChild' | 'lastChild' | 'nextSibling';
-
-type NodeTypeId =
- | 0 // this is used as error-id
- | typeof AggregateExpr
- | typeof AggregateModifier
- | typeof FunctionCallBody
- | typeof GroupingLabels
- | typeof Identifier
- | typeof UnquotedLabelMatcher
- | typeof QuotedLabelMatcher
- | typeof LabelMatchers
- | typeof LabelName
- | typeof QuotedLabelName
- | typeof PromQL
- | typeof StringLiteral
- | typeof VectorSelector
- | typeof MatrixSelector
- | typeof MatchOp
- | typeof EqlSingle
- | typeof Neq
- | typeof EqlRegex
- | typeof NeqRegex;
-
-type Path = Array<[Direction, NodeTypeId]>;
-
-function move(node: SyntaxNode, direction: Direction): SyntaxNode | null {
- switch (direction) {
- case 'parent':
- return node.parent;
- case 'firstChild':
- return node.firstChild;
- case 'lastChild':
- return node.lastChild;
- case 'nextSibling':
- return node.nextSibling;
- default:
- throw new NeverCaseError(direction);
- }
-}
-
-function walk(node: SyntaxNode, path: Path): SyntaxNode | null {
- let current: SyntaxNode | null = node;
- for (const [direction, expectedType] of path) {
- current = move(current, direction);
- if (current === null) {
- // we could not move in the direction, we stop
- return null;
- }
- if (current.type.id !== expectedType) {
- // the reached node has wrong type, we stop
- return null;
- }
- }
- return current;
-}
-
-function getNodeText(node: SyntaxNode, text: string, utf8?: boolean): string {
- const nodeFrom = utf8 ? node.from + 1 : node.from;
- const nodeTo = utf8 ? node.to - 1 : node.to;
- return text.slice(nodeFrom, nodeTo);
-}
-
-function parsePromQLStringLiteral(text: string): string {
- // if it is a string-literal, it is inside quotes of some kind
- const inside = text.slice(1, text.length - 1);
-
- // FIXME: support https://prometheus.io/docs/prometheus/latest/querying/basics/#string-literals
- // FIXME: maybe check other promql code, if all is supported or not
-
- // for now we do only some very simple un-escaping
-
- // we start with double-quotes
- if (text.startsWith('"') && text.endsWith('"')) {
- // NOTE: this is not 100% perfect, we only unescape the double-quote,
- // there might be other characters too
- return inside.replace(/\\"/, '"');
- }
-
- // then single-quote
- if (text.startsWith("'") && text.endsWith("'")) {
- // NOTE: this is not 100% perfect, we only unescape the single-quote,
- // there might be other characters too
- return inside.replace(/\\'/, "'");
- }
-
- // then backticks
- if (text.startsWith('`') && text.endsWith('`')) {
- return inside;
- }
-
- throw new Error('FIXME: invalid string literal');
-}
-
-type LabelOperator = '=' | '!=' | '=~' | '!~';
-
-export type Label = {
- name: string;
- value: string;
- op: LabelOperator;
-};
-
-export type Situation =
- | {
- type: 'IN_FUNCTION';
- }
- | {
- type: 'AT_ROOT';
- }
- | {
- type: 'EMPTY';
- }
- | {
- type: 'IN_DURATION';
- }
- | {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME';
- metricName?: string;
- otherLabels: Label[];
- // utf8 labels must be in quotes
- betweenQuotes: boolean;
- }
- | {
- type: 'IN_GROUPING';
- metricName: string;
- otherLabels: Label[];
- }
- | {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME';
- metricName?: string;
- labelName: string;
- betweenQuotes: boolean;
- otherLabels: Label[];
- };
-
-type Resolver = {
- path: NodeTypeId[];
- fun: (node: SyntaxNode, text: string, pos: number) => Situation | null;
-};
-
-function isPathMatch(resolverPath: NodeTypeId[], cursorPath: number[]): boolean {
- return resolverPath.every((item, index) => item === cursorPath[index]);
-}
-
-const ERROR_NODE_NAME: NodeTypeId = 0; // this is used as error-id
-
-const RESOLVERS: Resolver[] = [
- {
- path: [LabelMatchers, VectorSelector],
- fun: resolveLabelKeysWithEquals,
- },
- {
- path: [StringLiteral, QuotedLabelName, LabelMatchers, VectorSelector],
- fun: resolveUtf8LabelKeysWithEquals,
- },
- {
- path: [PromQL],
- fun: resolveTopLevel,
- },
- {
- // Partially written metric name
- path: [Identifier, VectorSelector, PromQL],
- fun: resolveTopLevel,
- },
- {
- path: [FunctionCallBody],
- fun: resolveInFunction,
- },
- {
- path: [StringLiteral, UnquotedLabelMatcher],
- fun: resolveLabelMatcher,
- },
- {
- path: [StringLiteral, QuotedLabelMatcher],
- fun: resolveQuotedLabelMatcher,
- },
- {
- path: [ERROR_NODE_NAME, BinaryExpr, PromQL],
- fun: resolveTopLevel,
- },
- {
- path: [ERROR_NODE_NAME, UnquotedLabelMatcher],
- fun: resolveLabelMatcher,
- },
- {
- path: [ERROR_NODE_NAME, QuotedLabelMatcher],
- fun: resolveQuotedLabelMatcher,
- },
- {
- path: [ERROR_NODE_NAME, NumberDurationLiteralInDurationContext, MatrixSelector],
- fun: resolveDurations,
- },
- {
- path: [GroupingLabels],
- fun: resolveLabelsForGrouping,
- },
-];
-
-const LABEL_OP_MAP = new Map([
- [EqlSingle, '='],
- [EqlRegex, '=~'],
- [Neq, '!='],
- [NeqRegex, '!~'],
-]);
-
-function getLabelOp(opNode: SyntaxNode): LabelOperator | null {
- const opChild = opNode.firstChild;
- if (opChild === null) {
- return null;
- }
-
- return LABEL_OP_MAP.get(opChild.type.id) ?? null;
-}
-
-function getLabel(labelMatcherNode: SyntaxNode, text: string): Label | null {
- const allowedMatchers = new Set([UnquotedLabelMatcher, QuotedLabelMatcher]);
- if (!allowedMatchers.has(labelMatcherNode.type.id)) {
- return null;
- }
-
- const nameNode =
- walk(labelMatcherNode, [['firstChild', LabelName]]) ?? walk(labelMatcherNode, [['firstChild', QuotedLabelName]]);
-
- if (nameNode === null) {
- return null;
- }
-
- const opNode = walk(nameNode, [['nextSibling', MatchOp]]);
- if (opNode === null) {
- return null;
- }
-
- const op = getLabelOp(opNode);
- if (op === null) {
- return null;
- }
-
- const valueNode = walk(labelMatcherNode, [['lastChild', StringLiteral]]);
-
- if (valueNode === null) {
- return null;
- }
-
- const name = getNodeText(nameNode, text);
- const value = parsePromQLStringLiteral(getNodeText(valueNode, text));
-
- return { name, value, op };
-}
-
-function getLabels(labelMatchersNode: SyntaxNode, text: string): Label[] {
- if (labelMatchersNode.type.id !== LabelMatchers) {
- return [];
- }
-
- const matchers = [UnquotedLabelMatcher, QuotedLabelMatcher];
-
- return matchers.reduce((acc, matcher) => {
- labelMatchersNode.getChildren(matcher).forEach((ln) => {
- const label = getLabel(ln, text);
- if (notEmpty(label)) {
- acc.push(label);
- }
- });
- return acc;
- }, []);
-}
-
-function getNodeChildren(node: SyntaxNode): SyntaxNode[] {
- let child: SyntaxNode | null = node.firstChild;
- const children: SyntaxNode[] = [];
- while (child !== null) {
- children.push(child);
- child = child.nextSibling;
- }
- return children;
-}
-
-function getNodeInSubtree(node: SyntaxNode, typeId: NodeTypeId): SyntaxNode | null {
- // first we try the current node
- if (node.type.id === typeId) {
- return node;
- }
-
- // then we try the children
- const children = getNodeChildren(node);
- for (const child of children) {
- const n = getNodeInSubtree(child, typeId);
- if (n !== null) {
- return n;
- }
- }
-
- return null;
-}
-
-function resolveLabelsForGrouping(node: SyntaxNode, text: string, pos: number): Situation | null {
- const aggrExpNode = walk(node, [
- ['parent', AggregateModifier],
- ['parent', AggregateExpr],
- ]);
- if (aggrExpNode === null) {
- return null;
- }
- const bodyNode = aggrExpNode.getChild(FunctionCallBody);
- if (bodyNode === null) {
- return null;
- }
-
- const metricIdNode = getNodeInSubtree(bodyNode, Identifier) ?? getNodeInSubtree(bodyNode, StringLiteral);
-
- if (!metricIdNode) {
- return null;
- }
-
- // Let's check whether it's a utf8 metric.
- // A utf8 metric must be a StringLiteral and its parent must be a QuotedLabelName
- if (metricIdNode.type.id === StringLiteral && metricIdNode.parent?.type.id !== QuotedLabelName) {
- return null;
- }
-
- const metricName = getNodeText(metricIdNode, text, metricIdNode.type.id === StringLiteral);
-
- return {
- type: 'IN_GROUPING',
- metricName,
- otherLabels: [],
- };
-}
-
-function resolveLabelMatcher(node: SyntaxNode, text: string, pos: number): Situation | null {
- // we can arrive here in two situation. `node` is either:
- // - a StringNode (like in `{job="^"}`)
- // - or an error node (like in `{job=^}`)
- const inStringNode = !node.type.isError;
-
- const parent = walk(node, [['parent', UnquotedLabelMatcher]]);
- if (parent === null) {
- return null;
- }
-
- const labelNameNode = walk(parent, [['firstChild', LabelName]]);
- if (labelNameNode === null) {
- return null;
- }
-
- const labelName = getNodeText(labelNameNode, text);
-
- const labelMatchersNode = walk(parent, [['parent', LabelMatchers]]);
- if (labelMatchersNode === null) {
- return null;
- }
-
- // now we need to find the other names
- const allLabels = getLabels(labelMatchersNode, text);
-
- // we need to remove "our" label from all-labels, if it is in there
- const otherLabels = allLabels.filter((label) => label.name !== labelName);
-
- const metricName = getMetricName(labelMatchersNode, text);
-
- // we are probably in a situation without a metric name
- return {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName,
- betweenQuotes: inStringNode,
- otherLabels,
- ...(metricName ? { metricName } : {}),
- };
-}
-
-function resolveQuotedLabelMatcher(node: SyntaxNode, text: string, pos: number): Situation | null {
- // we can arrive here in two situation. `node` is either:
- // - a StringNode (like in `{"job"="^"}`)
- // - or an error node (like in `{"job"=^}`)
- const inStringNode = !node.type.isError;
-
- const parent = walk(node, [['parent', QuotedLabelMatcher]]);
- if (parent === null) {
- return null;
- }
-
- const labelNameNode = walk(parent, [['firstChild', QuotedLabelName]]);
- if (labelNameNode === null) {
- return null;
- }
-
- const labelName = getNodeText(labelNameNode, text);
-
- const labelMatchersNode = walk(parent, [['parent', LabelMatchers]]);
- if (labelMatchersNode === null) {
- return null;
- }
-
- // now we need to find the other names
- const allLabels = getLabels(labelMatchersNode, text);
-
- // we need to remove "our" label from all-labels, if it is in there
- const otherLabels = allLabels.filter((label) => label.name !== labelName);
- const metricName = getMetricName(parent.parent!, text);
-
- return {
- type: 'IN_LABEL_SELECTOR_WITH_LABEL_NAME',
- labelName,
- betweenQuotes: inStringNode,
- otherLabels,
- ...(metricName ? { metricName } : {}),
- };
-}
-
-function resolveTopLevel(node: SyntaxNode, text: string, pos: number): Situation {
- return {
- type: 'AT_ROOT',
- };
-}
-
-function resolveInFunction(node: SyntaxNode, text: string, pos: number): Situation {
- return {
- type: 'IN_FUNCTION',
- };
-}
-
-function resolveDurations(node: SyntaxNode, text: string, pos: number): Situation {
- return {
- type: 'IN_DURATION',
- };
-}
-
-function resolveLabelKeysWithEquals(node: SyntaxNode, text: string, pos: number): Situation | null {
- // next false positive:
- // `something{a="1"^}`
- let child = walk(node, [['firstChild', UnquotedLabelMatcher]]);
- if (child !== null) {
- // means the label-matching part contains at least one label already.
- //
- // in this case, we will need to have a `,` character at the end,
- // to be able to suggest adding the next label.
- // the area between the end-of-the-child-node and the cursor-pos
- // must contain a `,` in this case.
- const textToCheck = text.slice(child.to, pos);
-
- if (!textToCheck.includes(',')) {
- return null;
- }
- }
-
- // next false positive:
- // `{"utf8.metric"^}`
- child = walk(node, [['firstChild', QuotedLabelName]]);
- if (child !== null) {
- // means the label-matching part contains a utf8 metric.
- //
- // in this case, we will need to have a `,` character at the end,
- // to be able to suggest adding the next label.
- // the area between the end-of-the-child-node and the cursor-pos
- // must contain a `,` in this case.
- const textToCheck = text.slice(child.to, pos);
-
- if (!textToCheck.includes(',')) {
- return null;
- }
- }
-
- const otherLabels = getLabels(node, text);
- const metricName = getMetricName(node, text);
-
- return {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels,
- betweenQuotes: false,
- ...(metricName ? { metricName } : {}),
- };
-}
-
-function resolveUtf8LabelKeysWithEquals(node: SyntaxNode, text: string, pos: number): Situation | null {
- const otherLabels = getLabels(node, text);
- const metricName = node.parent?.parent ? getMetricName(node.parent.parent, text) : null;
-
- return {
- type: 'IN_LABEL_SELECTOR_NO_LABEL_NAME',
- otherLabels,
- betweenQuotes: true,
- ...(metricName ? { metricName } : {}),
- };
-}
-
-function getMetricName(node: SyntaxNode, text: string): string | null {
- // Legacy Metric metric_name{label="value"}
- const legacyMetricNameNode = walk(node, [
- ['parent', VectorSelector],
- ['firstChild', Identifier],
- ]);
-
- if (legacyMetricNameNode) {
- return getNodeText(legacyMetricNameNode, text);
- }
-
- // check for a utf-8 metric
- // utf-8 metric {"metric.name", label="value"}
- const utf8MetricNameNode = walk(node, [
- ['parent', VectorSelector],
- ['firstChild', LabelMatchers],
- ['firstChild', QuotedLabelName],
- ['firstChild', StringLiteral],
- ]);
-
- if (utf8MetricNameNode) {
- return getNodeText(utf8MetricNameNode, text, true);
- }
-
- // no metric name
- return null;
-}
-
-// we find the first error-node in the tree that is at the cursor-position.
-// NOTE: this might be too slow, might need to optimize it
-// (ideas: we do not need to go into every subtree, based on from/to)
-// also, only go to places that are in the sub-tree of the node found
-// by default by lezer. problem is, `next()` will go upward too,
-// and we do not want to go higher than our node
-function getErrorNode(tree: Tree, pos: number): SyntaxNode | null {
- const cur = tree.cursorAt(pos);
- while (true) {
- if (cur.from === pos && cur.to === pos) {
- const { node } = cur;
- if (node.type.isError) {
- return node;
- }
- }
-
- if (!cur.next()) {
- break;
- }
- }
- return null;
-}
-
-export function getSituation(text: string, pos: number): Situation | null {
- // there is a special-case when we are at the start of writing text,
- // so we handle that case first
-
- if (text === '') {
- return {
- type: 'EMPTY',
- };
- }
-
- /**
- PromQL
- Expr
- VectorSelector
- LabelMatchers
- */
- const tree = parser.parse(text);
-
- // if the tree contains error, it is very probable that
- // our node is one of those error-nodes.
- // also, if there are errors, the node lezer finds us,
- // might not be the best node.
- // so first we check if there is an error-node at the cursor-position
- const maybeErrorNode = getErrorNode(tree, pos);
-
- const cur = maybeErrorNode != null ? maybeErrorNode.cursor() : tree.cursorAt(pos);
- const currentNode = cur.node;
-
- const ids = [cur.type.id];
- while (cur.parent()) {
- ids.push(cur.type.id);
- }
-
- for (let resolver of RESOLVERS) {
- // i do not use a foreach because i want to stop as soon
- // as i find something
- if (isPathMatch(resolver.path, ids)) {
- return resolver.fun(currentNode, text, pos);
- }
- }
-
- return null;
-}
-
-function notEmpty(value: TValue | null | undefined): value is TValue {
- return value !== null && value !== undefined;
-}
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/util.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/util.ts
deleted file mode 100644
index 84ee27c8e94..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/util.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/util.ts
-
-// this helper class is used to make typescript warn you when you forget
-// a case-block in a switch statement.
-// example code that triggers the typescript-error:
-//
-// const x:'A'|'B'|'C' = 'A';
-//
-// switch(x) {
-// case 'A':
-// // something
-// case 'B':
-// // something
-// default:
-// throw new NeverCaseError(x);
-// }
-//
-//
-// typescript will show an error in this case,
-// when you add the missing `case 'C'` code,
-// the problem will be fixed.
-
-export class NeverCaseError extends Error {
- constructor(value: never) {
- super('should never happen');
- }
-}
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/validation.test.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/validation.test.ts
deleted file mode 100644
index 14acf601422..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/validation.test.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/monaco-query-field/monaco-completion-provider/validation.test.ts
-import { parser } from '@prometheus-io/lezer-promql';
-
-import { validateQuery, warningTypes } from './validation';
-
-describe('Monaco Query Validation', () => {
- test('Identifies empty queries as valid', () => {
- expect(validateQuery('', '', [], parser)).toEqual({ errors: [], warnings: [] });
- });
-
- test.each([
- 'access_evaluation_duration_sum{job="grafana"}',
- 'http_requests_total{job="apiserver", handler="/api/comments"}[5m]',
- 'http_requests_total{job=~".*server"}',
- 'rate(http_requests_total[5m])[30m:1m]',
- 'max_over_time(deriv(rate(distance_covered_total[5s])[30s:5s])[10m:])',
- 'rate(http_requests_total[5m])',
- 'topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))',
- ])('Identifies valid queries', (query: string) => {
- expect(validateQuery(query, query, [], parser).errors).toEqual([]);
- });
-
- test('Identifies invalid queries', () => {
- // Missing } at the end
- let query = 'access_evaluation_duration_sum{job="grafana"';
- expect(validateQuery(query, query, [query], parser)).toEqual({
- errors: [{ endColumn: 45, endLineNumber: 1, issue: '{job="grafana"', startColumn: 31, startLineNumber: 1 }],
- warnings: [],
- });
-
- // Missing handler="value"
- query = 'http_requests_total{job="apiserver", handler}[5m]';
- expect(validateQuery(query, query, [query], parser)).toEqual({
- errors: [{ endColumn: 45, endLineNumber: 1, issue: 'handler', startColumn: 38, startLineNumber: 1 }],
- warnings: [],
- });
-
- // Missing : in [30s:5s]
- query = 'max_over_time(deriv(rate(distance_covered_total[5s])[30s5s])[10m:])';
- expect(validateQuery(query, query, [query], parser)).toEqual({
- errors: [{ endColumn: 59, endLineNumber: 1, issue: '5s', startColumn: 57, startLineNumber: 1 }],
- warnings: [],
- });
- });
-
- test('Identifies valid multi-line queries', () => {
- const query = `
-sum by (job) (
- rate(http_requests_total[5m])
-)`;
- const queryLines = query.split('\n');
- expect(validateQuery(query, query, queryLines, parser)).toEqual({ errors: [], warnings: [] });
- });
-
- test('Identifies invalid multi-line queries', () => {
- const query = `
-sum by (job) (
- rate(http_requests_total[])
-)`;
- const queryLines = query.split('\n');
- expect(validateQuery(query, query, queryLines, parser)).toEqual({
- errors: [{ endColumn: 30, endLineNumber: 3, issue: '', startColumn: 30, startLineNumber: 3 }],
- warnings: [],
- });
- });
-
- test('Warns agains subqueries with same duration and step', () => {
- const query = 'rate(http_requests_total[5m:5m])';
- const queryLines = query.split('\n');
- expect(validateQuery(query, query, queryLines, parser)).toEqual({
- errors: [],
- warnings: [
- { endColumn: 32, endLineNumber: 1, issue: warningTypes.SubqueryExpr, startColumn: 6, startLineNumber: 1 },
- ],
- });
- });
-
- test('Warns agains queries with multiple subqueries', () => {
- const query = 'quantile_over_time(0.5, rate(http_requests_total[1m:1m]) [1m:1m])';
- const queryLines = query.split('\n');
- expect(validateQuery(query, query, queryLines, parser)).toEqual({
- errors: [],
- warnings: [
- { issue: warningTypes.SubqueryExpr, startColumn: 25, endColumn: 65, startLineNumber: 1, endLineNumber: 1 },
- { issue: warningTypes.SubqueryExpr, startColumn: 30, endColumn: 56, startLineNumber: 1, endLineNumber: 1 },
- ],
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/validation.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/validation.ts
deleted file mode 100644
index d84302de851..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/validation.ts
+++ /dev/null
@@ -1,179 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/loki/components/monaco-query-field/monaco-completion-provider/validation.ts
-import { type SyntaxNode } from '@lezer/common';
-import { type LRParser } from '@lezer/lr';
-
-// Although 0 isn't explicitly provided in the @grafana/lezer-logql library as the error node ID, it does appear to be the ID of error nodes within lezer.
-const ErrorId = 0;
-
-export const warningTypes: Record = {
- SubqueryExpr:
- 'This subquery may return only one data point, preventing rate/increase/delta calculations. Use a range at least twice the step size (e.g., [2x:x]).',
-};
-
-enum NodeType {
- SubqueryExpr = 'SubqueryExpr',
- Duration = 'NumberDurationLiteralInDurationContext',
-}
-
-interface ParserIssueBoundary {
- startLineNumber: number;
- startColumn: number;
- endLineNumber: number;
- endColumn: number;
- issue: string;
-}
-
-interface ParseIssue {
- text: string;
- node: SyntaxNode;
-}
-
-/**
- * Conceived to work in combination with the MonacoQueryField component.
- * Given an original query, and it's interpolated version, it will return an array of ParserErrorBoundary
- * objects containing nodes which are actual errors. The interpolated version (even with placeholder variables)
- * is required because variables look like errors for Lezer.
- * @internal
- */
-export function validateQuery(
- query: string,
- interpolatedQuery: string,
- queryLines: string[],
- parser: LRParser
-): { errors: ParserIssueBoundary[]; warnings: ParserIssueBoundary[] } {
- if (!query) {
- return { errors: [], warnings: [] };
- }
-
- /**
- * To provide support to variable interpolation in query validation, we run the parser in the interpolated
- * query. If there are errors there, we trace them back to the original unparsed query, so we can more
- * accurately highlight the error in the query, since it's likely that the variable name and variable value
- * have different lengths. With this, we also exclude irrelevant parser errors that are produced by
- * lezer not understanding $variables and $__variables, which usually generate 2 or 3 error SyntaxNode.
- */
- const { errors: interpolatedErrors, warnings: interpolatedWarnings } = parseQuery(interpolatedQuery, parser);
- if (!interpolatedErrors.length && !interpolatedWarnings.length) {
- return { errors: [], warnings: [] };
- }
-
- let parseErrors: ParseIssue[] = interpolatedErrors;
- let parseWarnings: ParseIssue[] = interpolatedWarnings;
- if (query !== interpolatedQuery) {
- const { errors: queryErrors, warnings: queryWarnings } = parseQuery(query, parser);
- parseErrors = interpolatedErrors.flatMap(
- (interpolatedError) =>
- queryErrors.filter((queryError) => interpolatedError.text === queryError.text) || interpolatedError
- );
- parseWarnings = interpolatedWarnings.flatMap(
- (interpolatedWarning) =>
- queryWarnings.filter((queryWarning) => interpolatedWarning.node.from === queryWarning.node.from) ||
- interpolatedWarning
- );
- }
-
- const errorBoundaries = parseErrors
- .map((parseError) => findIssueBoundary(query, queryLines, parseError, 'error'))
- .filter(isValidIssueBoundary);
- const warningBoundaries = parseWarnings
- .map((parseWarning) => findIssueBoundary(query, queryLines, parseWarning, 'warning'))
- .filter(isValidIssueBoundary);
-
- return {
- errors: errorBoundaries,
- warnings: warningBoundaries,
- };
-}
-
-function parseQuery(query: string, parser: LRParser) {
- const parseErrors: ParseIssue[] = [];
- const parseWarnings: ParseIssue[] = [];
-
- const tree = parser.parse(query);
- tree.iterate({
- enter: (nodeRef): false | void => {
- if (nodeRef.type.id === ErrorId) {
- const node = nodeRef.node;
- parseErrors.push({ node: node, text: query.substring(node.from, node.to) });
- }
-
- if (nodeRef.type.name === NodeType.SubqueryExpr) {
- const node = nodeRef.node;
- const durations: string[] = [];
-
- const children = node.getChildren(NodeType.Duration);
- for (const child of children) {
- durations.push(query.substring(child.from, child.to));
- }
-
- if (durations.length === 2 && durations[0] === durations[1]) {
- parseWarnings.push({ node: node, text: query.substring(node.from, node.to) });
- }
- }
- },
- });
-
- return { errors: parseErrors, warnings: parseWarnings };
-}
-
-function findIssueBoundary(
- query: string,
- queryLines: string[],
- parseError: ParseIssue,
- issueType: 'error' | 'warning'
-): ParserIssueBoundary | null {
- if (queryLines.length === 1) {
- const isEmptyString = parseError.node.from === parseError.node.to;
- const errorNode = isEmptyString && parseError.node.parent ? parseError.node.parent : parseError.node;
- let issue: string;
-
- if (issueType === 'error') {
- issue = isEmptyString ? query.substring(errorNode.from, errorNode.to) : parseError.text;
- } else {
- issue = warningTypes[parseError.node.type.name];
- }
-
- return {
- startLineNumber: 1,
- startColumn: errorNode.from + 1,
- endLineNumber: 1,
- endColumn: errorNode.to + 1,
- issue,
- };
- }
-
- let startPos = 0,
- endPos = 0;
- for (let line = 0; line < queryLines.length; line++) {
- endPos = startPos + queryLines[line].length;
-
- if (parseError.node.from > endPos) {
- startPos += queryLines[line].length + 1;
- continue;
- }
-
- return {
- startLineNumber: line + 1,
- startColumn: parseError.node.from - startPos + 1,
- endLineNumber: line + 1,
- endColumn: parseError.node.to - startPos + 1,
- issue: issueType === 'error' ? parseError.text : warningTypes[parseError.node.type.name],
- };
- }
-
- return null;
-}
-
-function isValidIssueBoundary(boundary: ParserIssueBoundary | null): boundary is ParserIssueBoundary {
- return boundary !== null;
-}
-
-export const placeHolderScopedVars = {
- __interval: { text: '1s', value: '1s' },
- __rate_interval: { text: '1s', value: '1s' },
- __auto: { text: '1s', value: '1s' },
- __interval_ms: { text: '1000', value: 1000 },
- __range_ms: { text: '1000', value: 1000 },
- __range_s: { text: '1', value: 1 },
- __range: { text: '1s', value: '1s' },
-};
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/promql.ts b/packages/grafana-prometheus/src/components/monaco-query-field/promql.ts
deleted file mode 100644
index d144b130208..00000000000
--- a/packages/grafana-prometheus/src/components/monaco-query-field/promql.ts
+++ /dev/null
@@ -1,258 +0,0 @@
-// The MIT License (MIT)
-//
-// Copyright (c) Celian Garcia and Augustin Husson @ Amadeus IT Group
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-'use strict';
-// import { languages } from "monaco-editor";
-// noinspection JSUnusedGlobalSymbols
-export const languageConfiguration = {
- // the default separators except `@$`
- wordPattern: /(-?\d*\.\d\w*)|([^`~!#%^&*()\-=+\[{\]}\\|;:'",.<>\/?\s]+)/g,
- // Not possible to make comments in PromQL syntax
- comments: {
- lineComment: '#',
- },
- brackets: [
- ['{', '}'],
- ['[', ']'],
- ['(', ')'],
- ],
- autoClosingPairs: [
- { open: '{', close: '}' },
- { open: '[', close: ']' },
- { open: '(', close: ')' },
- { open: '"', close: '"' },
- { open: "'", close: "'" },
- ],
- surroundingPairs: [
- { open: '{', close: '}' },
- { open: '[', close: ']' },
- { open: '(', close: ')' },
- { open: '"', close: '"' },
- { open: "'", close: "'" },
- { open: '<', close: '>' },
- ],
- folding: {},
-};
-// PromQL Aggregation Operators
-// (https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators)
-const aggregations = [
- 'sum',
- 'min',
- 'max',
- 'avg',
- 'group',
- 'stddev',
- 'stdvar',
- 'count',
- 'count_values',
- 'bottomk',
- 'topk',
- 'quantile',
-];
-// PromQL functions
-// (https://prometheus.io/docs/prometheus/latest/querying/functions/)
-const functions = [
- 'abs',
- 'absent',
- 'ceil',
- 'changes',
- 'clamp',
- 'clamp_max',
- 'clamp_min',
- 'day_of_month',
- 'day_of_week',
- 'days_in_month',
- 'delta',
- 'deriv',
- 'double_exponential_smoothing',
- 'exp',
- 'floor',
- 'histogram_quantile',
- 'histogram_avg',
- 'histogram_count',
- 'histogram_sum',
- 'histogram_fraction',
- 'histogram_stddev',
- 'histogram_stdvar',
- // Renamed as DoubleExponentialSmoothing with Prometheus v3.x
- // https://github.com/prometheus/prometheus/pull/14930
- 'holt_winters',
- 'hour',
- 'idelta',
- 'increase',
- 'info',
- 'irate',
- 'label_join',
- 'label_replace',
- 'ln',
- 'log2',
- 'log10',
- 'minute',
- 'month',
- 'predict_linear',
- 'rate',
- 'resets',
- 'round',
- 'scalar',
- 'sort',
- 'sort_desc',
- 'sqrt',
- 'time',
- 'timestamp',
- 'vector',
- 'year',
-];
-// PromQL specific functions: Aggregations over time
-// (https://prometheus.io/docs/prometheus/latest/querying/functions/#aggregation_over_time)
-const aggregationsOverTime = [];
-for (let _i = 0, aggregations_1 = aggregations; _i < aggregations_1.length; _i++) {
- let agg = aggregations_1[_i];
- aggregationsOverTime.push(agg + '_over_time');
-}
-// PromQL vector matching + the by and without clauses
-// (https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching)
-const vectorMatching = ['on', 'ignoring', 'group_right', 'group_left', 'by', 'without'];
-// Produce a regex matching elements : (elt1|elt2|...)
-const vectorMatchingRegex =
- '(' +
- vectorMatching.reduce(function (prev, curr) {
- return prev + '|' + curr;
- }) +
- ')';
-// PromQL Operators
-// (https://prometheus.io/docs/prometheus/latest/querying/operators/)
-const operators = ['+', '-', '*', '/', '%', '^', '==', '!=', '>', '<', '>=', '<=', 'and', 'or', 'unless'];
-// PromQL offset modifier
-// (https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier)
-const offsetModifier = ['offset'];
-// Merging all the keywords in one list
-const keywords = aggregations
- .concat(functions)
- .concat(aggregationsOverTime)
- .concat(vectorMatching)
- .concat(offsetModifier);
-// noinspection JSUnusedGlobalSymbols
-export const language = {
- ignoreCase: false,
- defaultToken: '',
- tokenPostfix: '.promql',
- keywords: keywords,
- operators: operators,
- vectorMatching: vectorMatchingRegex,
- // we include these common regular expressions
- symbols: /[=>](?!@symbols)/, '@brackets'],
- [
- /@symbols/,
- {
- cases: {
- '@operators': 'delimiter',
- '@default': '',
- },
- },
- ],
- // numbers
- [/\d+[smhdwy]/, 'number'],
- [/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/, 'number.float'],
- [/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/, 'number.float'],
- [/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/, 'number.hex'],
- [/0[0-7']*[0-7](@integersuffix)/, 'number.octal'],
- [/0[bB][0-1']*[0-1](@integersuffix)/, 'number.binary'],
- [/\d[\d']*\d(@integersuffix)/, 'number'],
- [/\d(@integersuffix)/, 'number'],
- ],
- string_double: [
- [/[^\\"]+/, 'string'],
- [/@escapes/, 'string.escape'],
- [/\\./, 'string.escape.invalid'],
- [/"/, 'string', '@pop'],
- ],
- string_single: [
- [/[^\\']+/, 'string'],
- [/@escapes/, 'string.escape'],
- [/\\./, 'string.escape.invalid'],
- [/'/, 'string', '@pop'],
- ],
- string_backtick: [
- [/[^\\`$]+/, 'string'],
- [/@escapes/, 'string.escape'],
- [/\\./, 'string.escape.invalid'],
- [/`/, 'string', '@pop'],
- ],
- clauses: [
- [/[^(,)]/, 'tag'],
- [/\)/, 'identifier', '@pop'],
- ],
- whitespace: [[/[ \t\r\n]+/, 'white']],
- },
-};
-// noinspection JSUnusedGlobalSymbols
-// export const completionItemProvider = {
-// provideCompletionItems: function () {
-// // To simplify, we made the choice to never create automatically the parenthesis behind keywords
-// // It is because in PromQL, some keywords need parenthesis behind, some don't, some can have but it's optional.
-// const suggestions = keywords.map(function (value) {
-// return {
-// label: value,
-// kind: languages.CompletionItemKind.Keyword,
-// insertText: value,
-// insertTextRules: languages.CompletionItemInsertTextRule.InsertAsSnippet
-// };
-// });
-// return { suggestions: suggestions };
-// }
-// };
diff --git a/packages/grafana-prometheus/src/components/types.ts b/packages/grafana-prometheus/src/components/types.ts
deleted file mode 100644
index 8de022e9e8c..00000000000
--- a/packages/grafana-prometheus/src/components/types.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/components/types.ts
-import { type QueryEditorProps } from '@grafana/data';
-
-import { type PrometheusDatasource } from '../datasource';
-import { type PromOptions, type PromQuery } from '../types';
-
-export type PromQueryEditorProps = QueryEditorProps;
diff --git a/packages/grafana-prometheus/src/configuration/AlertingSettingsOverhaul.test.tsx b/packages/grafana-prometheus/src/configuration/AlertingSettingsOverhaul.test.tsx
deleted file mode 100644
index 6ff15e9f063..00000000000
--- a/packages/grafana-prometheus/src/configuration/AlertingSettingsOverhaul.test.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import { render } from '@testing-library/react';
-
-import { selectors } from '@grafana/e2e-selectors';
-import { config } from '@grafana/runtime';
-
-import { createDefaultConfigOptions } from '../test/mocks/datasource';
-
-import { AlertingSettingsOverhaul } from './AlertingSettingsOverhaul';
-
-describe(AlertingSettingsOverhaul.name, () => {
- describe('Manage Alerts toggle', () => {
- describe('when options.jsonData.manageAlerts is unset', () => {
- it('uses the config default `true`', () => {
- const options = createDefaultConfigOptions();
- options.jsonData.manageAlerts = undefined;
-
- config.defaultDatasourceManageAlertsUiToggle = true;
-
- const { container } = render( {}} options={options} />);
-
- const manageAlertsToggle = container.querySelector(
- `#${selectors.components.DataSource.Prometheus.configPage.manageAlerts}`
- );
- expect(manageAlertsToggle).toBeChecked();
- });
-
- it('uses the config default `false`', () => {
- const options = createDefaultConfigOptions();
- options.jsonData.manageAlerts = undefined;
-
- config.defaultDatasourceManageAlertsUiToggle = false;
-
- const { container } = render( {}} options={options} />);
-
- const manageAlertsToggle = container.querySelector(
- `#${selectors.components.DataSource.Prometheus.configPage.manageAlerts}`
- );
- expect(manageAlertsToggle).not.toBeChecked();
- });
- });
-
- describe('when options.jsonData.manageAlerts is set', () => {
- it.each([true, false])('uses the manageAlerts value even when the config default is %s', (configDefault) => {
- const options = createDefaultConfigOptions();
- options.jsonData.manageAlerts = true;
-
- config.defaultDatasourceManageAlertsUiToggle = configDefault;
-
- const { container } = render( {}} options={options} />);
-
- const manageAlertsToggle = container.querySelector(
- `#${selectors.components.DataSource.Prometheus.configPage.manageAlerts}`
- );
- expect(manageAlertsToggle).toBeChecked();
- });
- });
- });
-
- describe('Recording Rules Target toggle', () => {
- describe('when options.jsonData.allowAsRecordingRulesTarget is unset', () => {
- it('defaults to `true` (enabled)', () => {
- const options = createDefaultConfigOptions();
- options.jsonData.allowAsRecordingRulesTarget = undefined;
-
- const { container } = render( {}} options={options} />);
-
- const recordingRulesTargetToggle = container.querySelector(
- `#${selectors.components.DataSource.Prometheus.configPage.allowAsRecordingRulesTarget}`
- );
- expect(recordingRulesTargetToggle).toBeChecked();
- });
- });
-
- describe('when options.jsonData.allowAsRecordingRulesTarget is set', () => {
- it.each([true, false])('uses the allowAsRecordingRulesTarget value %s', (value) => {
- const options = createDefaultConfigOptions();
- options.jsonData.allowAsRecordingRulesTarget = value;
-
- const { container } = render( {}} options={options} />);
-
- const recordingRulesTargetToggle = container.querySelector(
- `#${selectors.components.DataSource.Prometheus.configPage.allowAsRecordingRulesTarget}`
- );
-
- if (value) {
- expect(recordingRulesTargetToggle).toBeChecked();
- } else {
- expect(recordingRulesTargetToggle).not.toBeChecked();
- }
- });
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/configuration/AlertingSettingsOverhaul.tsx b/packages/grafana-prometheus/src/configuration/AlertingSettingsOverhaul.tsx
deleted file mode 100644
index e7018a17cae..00000000000
--- a/packages/grafana-prometheus/src/configuration/AlertingSettingsOverhaul.tsx
+++ /dev/null
@@ -1,109 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/AlertingSettingsOverhaul.tsx
-import { cx } from '@emotion/css';
-import type { JSX } from 'react';
-
-import { type DataSourceJsonData, type DataSourcePluginOptionsEditorProps } from '@grafana/data';
-import { selectors } from '@grafana/e2e-selectors';
-import { Trans, t } from '@grafana/i18n';
-import { ConfigSubSection } from '@grafana/plugin-ui';
-import { config } from '@grafana/runtime';
-import { InlineField, Switch, useTheme2 } from '@grafana/ui';
-
-import { docsTip, overhaulStyles } from './shared/utils';
-
-interface Props
- extends Pick, 'options' | 'onOptionsChange'> {}
-
-interface AlertingConfig extends DataSourceJsonData {
- manageAlerts?: boolean;
- allowAsRecordingRulesTarget?: boolean;
-}
-
-export function AlertingSettingsOverhaul({
- options,
- onOptionsChange,
-}: Props): JSX.Element {
- const theme = useTheme2();
- // imported GrafanaTheme2 from @grafana/data does not match type of same from @grafana/ui
- // @ts-ignore
- const styles = overhaulStyles(theme);
-
- return (
-
-
-
-
-
-
- Manage alert rules for this data source. To manage other alerting resources, add an Alertmanager
- data source.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- className={styles.switchField}
- >
-
- onOptionsChange({
- ...options,
- jsonData: { ...options.jsonData, manageAlerts: event!.currentTarget.checked },
- })
- }
- id={selectors.components.DataSource.Prometheus.configPage.manageAlerts}
- />
-
-
-
-
-
-
-
- Allow this data source to be selected as a target for writing recording rules.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- className={styles.switchField}
- >
-
- onOptionsChange({
- ...options,
- jsonData: { ...options.jsonData, allowAsRecordingRulesTarget: event!.currentTarget.checked },
- })
- }
- id={selectors.components.DataSource.Prometheus.configPage.allowAsRecordingRulesTarget}
- />
-
-
-
-
-
- );
-}
diff --git a/packages/grafana-prometheus/src/configuration/ConfigEditor.test.tsx b/packages/grafana-prometheus/src/configuration/ConfigEditor.test.tsx
deleted file mode 100644
index be74f080b0b..00000000000
--- a/packages/grafana-prometheus/src/configuration/ConfigEditor.test.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/ConfigEditor.test.tsx
-import { FieldValidationMessage } from '@grafana/ui';
-
-import { DURATION_REGEX, MULTIPLE_DURATION_REGEX } from '../constants';
-
-import { validateInput } from './shared/utils';
-
-const VALID_URL_REGEX = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
-
-const error = Value is not valid ;
-// replaces promSettingsValidationEvents to display a onBlur for duration input errors
-describe('promSettings validateInput', () => {
- it.each`
- value | expected
- ${'1ms'} | ${true}
- ${'1M'} | ${true}
- ${'1w'} | ${true}
- ${'1d'} | ${true}
- ${'1h'} | ${true}
- ${'1m'} | ${true}
- ${'1s'} | ${true}
- ${'1y'} | ${true}
- `(
- "Single duration regex, when calling the rule with correct formatted value: '$value' then result should be '$expected'",
- ({ value, expected }) => {
- expect(validateInput(value, DURATION_REGEX)).toBe(expected);
- }
- );
-
- it.each`
- value | expected
- ${'1M 2s'} | ${true}
- ${'1w 2d'} | ${true}
- ${'1d 2m'} | ${true}
- ${'1h 2m'} | ${true}
- ${'1m 2s'} | ${true}
- `(
- "Multiple duration regex, when calling the rule with correct formatted value: '$value' then result should be '$expected'",
- ({ value, expected }) => {
- expect(validateInput(value, MULTIPLE_DURATION_REGEX)).toBe(expected);
- }
- );
-
- it.each`
- value | expected
- ${'1 ms'} | ${error}
- ${'1x'} | ${error}
- ${' '} | ${error}
- ${'w'} | ${error}
- ${'1.0s'} | ${error}
- `(
- "when calling the rule with incorrect formatted value: '$value' then result should be '$expected'",
- ({ value, expected }) => {
- expect(validateInput(value, DURATION_REGEX)).toStrictEqual(expected);
- }
- );
-
- it.each`
- value | expected
- ${'frp://'} | ${error}
- ${'htp://'} | ${error}
- ${'httpss:??'} | ${error}
- ${'http@//'} | ${error}
- ${'http:||'} | ${error}
- ${'http://'} | ${error}
- ${'https://'} | ${error}
- ${'ftp://'} | ${error}
- `(
- "Url incorrect formatting, when calling the rule with correct formatted value: '$value' then result should be '$expected'",
- ({ value, expected }) => {
- expect(validateInput(value, VALID_URL_REGEX)).toStrictEqual(expected);
- }
- );
-
- it.each`
- value | expected
- ${'ftp://example'} | ${true}
- ${'http://example'} | ${true}
- ${'https://example'} | ${true}
- `(
- "Url correct formatting, when calling the rule with correct formatted value: '$value' then result should be '$expected'",
- ({ value, expected }) => {
- expect(validateInput(value, VALID_URL_REGEX)).toBe(expected);
- }
- );
-
- it('should display a custom validation message', () => {
- const invalidDuration = 'invalid';
- const customMessage = 'This is invalid';
- const errorWithCustomMessage = {customMessage} ;
- expect(validateInput(invalidDuration, DURATION_REGEX, customMessage)).toStrictEqual(errorWithCustomMessage);
- });
-});
diff --git a/packages/grafana-prometheus/src/configuration/ConfigEditor.tsx b/packages/grafana-prometheus/src/configuration/ConfigEditor.tsx
deleted file mode 100644
index 6451c20f843..00000000000
--- a/packages/grafana-prometheus/src/configuration/ConfigEditor.tsx
+++ /dev/null
@@ -1,60 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/ConfigEditor.tsx
-
-import { type DataSourcePluginOptionsEditorProps } from '@grafana/data';
-import { t, Trans } from '@grafana/i18n';
-import { ConfigSection, DataSourceDescription, AdvancedHttpSettings } from '@grafana/plugin-ui';
-import { config } from '@grafana/runtime';
-import { Alert, useTheme2 } from '@grafana/ui';
-
-import { type PromOptions } from '../types';
-
-import { AlertingSettingsOverhaul } from './AlertingSettingsOverhaul';
-import { DataSourceHttpSettingsOverhaul } from './DataSourceHttpSettingsOverhaul';
-import { PromSettings } from './PromSettings';
-import { overhaulStyles } from './shared/utils';
-type PrometheusConfigProps = DataSourcePluginOptionsEditorProps;
-
-export const ConfigEditor = (props: PrometheusConfigProps) => {
- const { options, onOptionsChange } = props;
- const theme = useTheme2();
- const styles = overhaulStyles(theme);
-
- return (
- <>
- {options.access === 'direct' && (
-
-
- Browser access mode in the Prometheus data source is no longer available. Switch to server access mode.
-
-
- )}
-
-
-
-
-
-
- options={options} onOptionsChange={onOptionsChange} />
-
-
- >
- );
-};
diff --git a/packages/grafana-prometheus/src/configuration/DataSourceHttpSettingsOverhaul.tsx b/packages/grafana-prometheus/src/configuration/DataSourceHttpSettingsOverhaul.tsx
deleted file mode 100644
index 9b8a75a26d3..00000000000
--- a/packages/grafana-prometheus/src/configuration/DataSourceHttpSettingsOverhaul.tsx
+++ /dev/null
@@ -1,111 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/DataSourceHttpSettingsOverhaul.tsx
-import { type DataSourceSettings } from '@grafana/data';
-import { Trans } from '@grafana/i18n';
-import { Auth, AuthMethod, ConnectionSettings, convertLegacyAuthProps } from '@grafana/plugin-ui';
-import { SecureSocksProxySettings, useTheme2 } from '@grafana/ui';
-
-import { type PromOptions } from '../types';
-
-import { docsTip, overhaulStyles } from './shared/utils';
-
-type DataSourceHttpSettingsProps = {
- options: DataSourceSettings;
- onOptionsChange: (options: DataSourceSettings) => void;
- secureSocksDSProxyEnabled: boolean;
-};
-
-export const DataSourceHttpSettingsOverhaul = (props: DataSourceHttpSettingsProps) => {
- const { options, onOptionsChange, secureSocksDSProxyEnabled } = props;
-
- const newAuthProps = convertLegacyAuthProps({
- config: options,
- onChange: onOptionsChange,
- });
-
- const theme = useTheme2();
- const styles = overhaulStyles(theme);
-
- function returnSelectedMethod() {
- return newAuthProps.selectedMethod;
- }
-
- // Do we need this switch anymore? Update the language.
- let urlTooltip;
- switch (options.access) {
- case 'direct':
- urlTooltip = (
- <>
-
- Your access method is Browser , this means the URL needs to be accessible from the browser.
-
- {docsTip()}
- >
- );
- break;
- case 'proxy':
- urlTooltip = (
- <>
-
- Your access method is Server , this means the URL needs to be accessible from the grafana
- backend/server.
-
- {docsTip()}
- >
- );
- break;
- default:
- urlTooltip = (
- <>
-
- Specify a complete HTTP URL (for example {'{{exampleURL}}'})
-
- {docsTip()}
- >
- );
- }
-
- return (
- <>
-
-
- {
- onOptionsChange({
- ...options,
- basicAuth: method === AuthMethod.BasicAuth,
- withCredentials: method === AuthMethod.CrossSiteCredentials,
- jsonData: {
- ...options.jsonData,
- oauthPassThru: method === AuthMethod.OAuthForward,
- },
- });
- }}
- // If your method is selected pass its id to `selectedMethod`,
- // otherwise pass the id from converted legacy data
- selectedMethod={returnSelectedMethod()}
- />
-
- {secureSocksDSProxyEnabled && (
- <>
-
-
- >
- )}
- >
- );
-};
diff --git a/packages/grafana-prometheus/src/configuration/ExemplarSetting.tsx b/packages/grafana-prometheus/src/configuration/ExemplarSetting.tsx
deleted file mode 100644
index e5962de6daf..00000000000
--- a/packages/grafana-prometheus/src/configuration/ExemplarSetting.tsx
+++ /dev/null
@@ -1,205 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/ExemplarSetting.tsx
-import { useState } from 'react';
-
-import { type DataSourceInstanceSettings } from '@grafana/data';
-import { selectors } from '@grafana/e2e-selectors';
-import { Trans, t } from '@grafana/i18n';
-import { config, DataSourcePicker } from '@grafana/runtime';
-import { Button, InlineField, Input, Switch, useTheme2 } from '@grafana/ui';
-
-import { PROM_CONFIG_LABEL_WIDTH } from '../constants';
-import { type ExemplarTraceIdDestination } from '../types';
-
-import { docsTip, overhaulStyles } from './shared/utils';
-
-type Props = {
- value: ExemplarTraceIdDestination;
- onChange: (value: ExemplarTraceIdDestination) => void;
- onDelete: () => void;
- disabled?: boolean;
-};
-
-export function ExemplarSetting({ value, onChange, onDelete, disabled }: Props) {
- const [isInternalLink, setIsInternalLink] = useState(Boolean(value.datasourceUid));
-
- const theme = useTheme2();
- const styles = overhaulStyles(theme);
-
- return (
-
-
-
- Enable this option if you have an internal link. When enabled, this reveals the data source selector.
- Select the backend tracing data store for your exemplar data.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- className={styles.switchField}
- >
- <>
- setIsInternalLink(ev.currentTarget.checked)}
- />
- >
-
-
- {isInternalLink ? (
-
-
- The data source the exemplar is going to navigate to.
- {' '}
- {docsTip()}
- >
- }
- disabled={disabled}
- interactive={true}
- >
- ds.type !== 'grafana-azure-monitor-datasource'
- }
- tracing={true}
- current={value.datasourceUid}
- noDefault={true}
- width={40}
- onChange={(ds: DataSourceInstanceSettings) =>
- onChange({
- ...value,
- datasourceUid: ds.uid,
- url: undefined,
- })
- }
- />
-
- ) : (
-
-
- The URL of the trace backend the user would go to see its trace
- {' '}
- {docsTip()}
- >
- }
- disabled={disabled}
- interactive={true}
- >
-
- onChange({
- ...value,
- datasourceUid: undefined,
- url: event.currentTarget.value,
- })
- }
- />
-
- )}
-
-
-
- Use to override the button label on the exemplar traceID field.
- {' '}
- {docsTip()}
- >
- }
- disabled={disabled}
- interactive={true}
- >
-
- onChange({
- ...value,
- urlDisplayLabel: event.currentTarget.value,
- })
- }
- />
-
-
-
- The name of the field in the labels object that should be used to get the traceID.
- {' '}
- {docsTip()}
- >
- }
- disabled={disabled}
- interactive={true}
- >
-
- onChange({
- ...value,
- name: event.currentTarget.value,
- })
- }
- />
-
- {!disabled && (
-
- {
- event.preventDefault();
- onDelete();
- }}
- />
-
- )}
-
- );
-}
diff --git a/packages/grafana-prometheus/src/configuration/ExemplarsSettings.tsx b/packages/grafana-prometheus/src/configuration/ExemplarsSettings.tsx
deleted file mode 100644
index 7c20461d3c4..00000000000
--- a/packages/grafana-prometheus/src/configuration/ExemplarsSettings.tsx
+++ /dev/null
@@ -1,77 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/ExemplarsSettings.tsx
-import { css } from '@emotion/css';
-
-import { selectors } from '@grafana/e2e-selectors';
-import { t, Trans } from '@grafana/i18n';
-import { ConfigSubSection } from '@grafana/plugin-ui';
-import { Button, useTheme2 } from '@grafana/ui';
-
-import { type ExemplarTraceIdDestination } from '../types';
-
-import { ExemplarSetting } from './ExemplarSetting';
-import { overhaulStyles } from './shared/utils';
-
-type Props = {
- options?: ExemplarTraceIdDestination[];
- onChange: (value: ExemplarTraceIdDestination[]) => void;
- disabled?: boolean;
-};
-
-export function ExemplarsSettings({ options, onChange, disabled }: Props) {
- const theme = useTheme2();
- const styles = overhaulStyles(theme);
- return (
-
-
- {options &&
- options.map((option, index) => {
- return (
- {
- const newOptions = [...options];
- newOptions.splice(index, 1, newField);
- onChange(newOptions);
- }}
- onDelete={() => {
- const newOptions = [...options];
- newOptions.splice(index, 1);
- onChange(newOptions);
- }}
- disabled={disabled}
- />
- );
- })}
-
- {!disabled && (
- {
- event.preventDefault();
- const newOptions = [...(options || []), { name: 'traceID' }];
- onChange(newOptions);
- }}
- >
- Add
-
- )}
- {disabled && !options && (
-
-
- No exemplars configurations
-
-
- )}
-
-
- );
-}
diff --git a/packages/grafana-prometheus/src/configuration/PromFlavorVersions.ts b/packages/grafana-prometheus/src/configuration/PromFlavorVersions.ts
deleted file mode 100644
index 71381bd73c0..00000000000
--- a/packages/grafana-prometheus/src/configuration/PromFlavorVersions.ts
+++ /dev/null
@@ -1,100 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/PromFlavorVersions.ts
-export const PromFlavorVersions: { [index: string]: Array<{ value?: string; label: string }> } = {
- Prometheus: [
- { value: undefined, label: 'Please select' },
- { value: '2.0.0', label: '< 2.14.x' },
- { value: '2.14.0', label: '2.14.x' },
- { value: '2.15.0', label: '2.15.x' },
- { value: '2.16.0', label: '2.16.x' },
- { value: '2.17.0', label: '2.17.x' },
- { value: '2.18.0', label: '2.18.x' },
- { value: '2.19.0', label: '2.19.x' },
- { value: '2.20.0', label: '2.20.x' },
- { value: '2.21.0', label: '2.21.x' },
- { value: '2.22.0', label: '2.22.x' },
- { value: '2.23.0', label: '2.23.x' },
- { value: '2.24.0', label: '2.24.x' },
- { value: '2.25.0', label: '2.25.x' },
- { value: '2.26.0', label: '2.26.x' },
- { value: '2.27.0', label: '2.27.x' },
- { value: '2.28.0', label: '2.28.x' },
- { value: '2.29.0', label: '2.29.x' },
- { value: '2.30.0', label: '2.30.x' },
- { value: '2.31.0', label: '2.31.x' },
- { value: '2.32.0', label: '2.32.x' },
- { value: '2.33.0', label: '2.33.x' },
- { value: '2.34.0', label: '2.34.x' },
- { value: '2.35.0', label: '2.35.x' },
- { value: '2.36.0', label: '2.36.x' },
- { value: '2.37.0', label: '2.37.x' },
- { value: '2.38.0', label: '2.38.x' },
- { value: '2.39.0', label: '2.39.x' },
- { value: '2.40.0', label: '2.40.x' },
- { value: '2.41.0', label: '2.41.x' },
- { value: '2.42.0', label: '2.42.x' },
- { value: '2.43.0', label: '2.43.x' },
- { value: '2.44.0', label: '2.44.x' },
- { value: '2.45.0', label: '2.45.x' },
- { value: '2.46.0', label: '2.46.x' },
- { value: '2.47.0', label: '2.47.x' },
- { value: '2.48.0', label: '2.48.x' },
- { value: '2.49.0', label: '2.49.x' },
- { value: '2.50.0', label: '2.50.x' },
-
- // This value will be returned for future versions of prometheus until we add new entries to this object
- { value: '2.50.1', label: '> 2.50.x' },
- ],
- Mimir: [
- { value: undefined, label: 'Please select' },
- { value: '2.0.0', label: '2.0.x' },
- { value: '2.1.0', label: '2.1.x' },
- { value: '2.2.0', label: '2.2.x' },
- { value: '2.3.0', label: '2.3.x' },
- { value: '2.4.0', label: '2.4.x' },
- { value: '2.5.0', label: '2.5.x' },
- { value: '2.6.0', label: '2.6.x' },
- { value: '2.7.0', label: '2.7.x' },
- { value: '2.8.0', label: '2.8.x' },
- { value: '2.9.0', label: '2.9.x' },
- { value: '2.9.1', label: '> 2.9.x' },
- ],
- Thanos: [
- { value: undefined, label: 'Please select' },
- { value: '0.0.0', label: '< 0.16.x' },
- { value: '0.16.0', label: '0.16.x' },
- { value: '0.17.0', label: '0.17.x' },
- { value: '0.18.0', label: '0.18.x' },
- { value: '0.19.0', label: '0.19.x' },
- { value: '0.20.0', label: '0.20.x' },
- { value: '0.21.0', label: '0.21.x' },
- { value: '0.22.0', label: '0.22.x' },
- { value: '0.23.0', label: '0.23.x' },
- { value: '0.24.0', label: '0.24.x' },
- { value: '0.25.0', label: '0.25.x' },
- { value: '0.26.0', label: '0.26.x' },
- { value: '0.27.0', label: '0.27.x' },
- { value: '0.28.0', label: '0.28.x' },
- { value: '0.29.0', label: '0.29.x' },
- { value: '0.30.0', label: '0.30.x' },
- { value: '0.31.0', label: '0.31.x' },
- { value: '0.31.1', label: '> 0.31.x' },
- ],
- Cortex: [
- { value: undefined, label: 'Please select' },
- { value: '0.0.0', label: '< 1.0.0' },
- { value: '1.0.0', label: '1.0.0' },
- { value: '1.1.0', label: '1.1.x' },
- { value: '1.2.0', label: '1.2.x' },
- { value: '1.3.0', label: '1.3.x' },
- { value: '1.4.0', label: '1.4.x' },
- { value: '1.5.0', label: '1.5.x' },
- { value: '1.6.0', label: '1.6.x' },
- { value: '1.7.0', label: '1.7.x' },
- { value: '1.8.0', label: '1.8.x' },
- { value: '1.9.0', label: '1.9.x' },
- { value: '1.10.0', label: '1.10.x' },
- { value: '1.11.0', label: '1.11.x' },
- { value: '1.13.0', label: '1.13.x' },
- { value: '1.14.0', label: '> 1.13.x' },
- ],
-};
diff --git a/packages/grafana-prometheus/src/configuration/PromSettings.test.tsx b/packages/grafana-prometheus/src/configuration/PromSettings.test.tsx
deleted file mode 100644
index f9c41a9419e..00000000000
--- a/packages/grafana-prometheus/src/configuration/PromSettings.test.tsx
+++ /dev/null
@@ -1,74 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/PromSettings.test.tsx
-import { render, screen } from '@testing-library/react';
-import { type SyntheticEvent } from 'react';
-
-import { type SelectableValue } from '@grafana/data';
-
-import { createDefaultConfigOptions } from '../test/mocks/datasource';
-
-import { getValueFromEventItem, PromSettings } from './PromSettings';
-
-describe('PromSettings', () => {
- describe('getValueFromEventItem', () => {
- describe('when called with undefined', () => {
- it('then it should return empty string', () => {
- const result = getValueFromEventItem(
- undefined as unknown as SyntheticEvent | SelectableValue
- );
- expect(result).toEqual('');
- });
- });
-
- describe('when called with an input event', () => {
- it('then it should return value from currentTarget', () => {
- const value = 'An input value';
- const result = getValueFromEventItem({ currentTarget: { value } });
- expect(result).toEqual(value);
- });
- });
-
- describe('when called with a select event', () => {
- it('then it should return value', () => {
- const value = 'A select value';
- const result = getValueFromEventItem({ value });
- expect(result).toEqual(value);
- });
- });
- });
-
- describe('PromSettings component', () => {
- const defaultProps = createDefaultConfigOptions();
-
- it('should show POST httpMethod if no httpMethod', () => {
- const options = defaultProps;
- options.url = '';
- options.jsonData.httpMethod = '';
-
- render( {}} options={options} />);
- expect(screen.getByText('POST')).toBeInTheDocument();
- });
- it('should show POST httpMethod if POST httpMethod is configured', () => {
- const options = defaultProps;
- options.url = 'test_url';
- options.jsonData.httpMethod = 'POST';
-
- render( {}} options={options} />);
- expect(screen.getByText('POST')).toBeInTheDocument();
- });
- it('should show GET httpMethod if GET httpMethod is configured', () => {
- const options = defaultProps;
- options.url = 'test_url';
- options.jsonData.httpMethod = 'GET';
-
- render( {}} options={options} />);
- expect(screen.getByText('GET')).toBeInTheDocument();
- });
-
- it('should have a series endpoint configuration element', () => {
- const options = defaultProps;
-
- render( {}} options={options} />);
- expect(screen.getByText('Use series endpoint')).toBeInTheDocument();
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/configuration/PromSettings.tsx b/packages/grafana-prometheus/src/configuration/PromSettings.tsx
deleted file mode 100644
index 4822efbb567..00000000000
--- a/packages/grafana-prometheus/src/configuration/PromSettings.tsx
+++ /dev/null
@@ -1,670 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/PromSettings.tsx
-import { type SyntheticEvent, useState } from 'react';
-
-import {
- type DataSourcePluginOptionsEditorProps,
- type DataSourceSettings,
- onUpdateDatasourceJsonDataOptionChecked,
- type SelectableValue,
- updateDatasourcePluginJsonDataOption,
-} from '@grafana/data';
-import { selectors } from '@grafana/e2e-selectors';
-import { Trans, t } from '@grafana/i18n';
-import { ConfigSubSection } from '@grafana/plugin-ui';
-import { Box, InlineField, Input, Select, Stack, Switch, TextLink, useTheme2 } from '@grafana/ui';
-
-import {
- DEFAULT_SERIES_LIMIT,
- DURATION_REGEX,
- durationError,
- MULTIPLE_DURATION_REGEX,
- NON_NEGATIVE_INTEGER_REGEX,
- PROM_CONFIG_LABEL_WIDTH,
- seriesLimitError,
-} from '../constants';
-import { QueryEditorMode } from '../querybuilder/shared/types';
-import { defaultPrometheusQueryOverlapWindow } from '../querycache/QueryCache';
-import { PromApplication, PrometheusCacheLevel, type PromOptions } from '../types';
-
-import { ExemplarsSettings } from './ExemplarsSettings';
-import { PromFlavorVersions } from './PromFlavorVersions';
-import { docsTip, overhaulStyles, validateInput } from './shared/utils';
-
-type Props = Pick, 'options' | 'onOptionsChange'> & {
- /** Hide the Prometheus type and version dropdowns */
- hidePrometheusTypeVersion?: boolean;
- /** Hide the Exemplars settings section */
- hideExemplars?: boolean;
-};
-
-const httpOptions = [
- { value: 'POST', label: 'POST' },
- { value: 'GET', label: 'GET' },
-];
-
-const cacheValueOptions = [
- { value: PrometheusCacheLevel.Low, label: 'Low' },
- { value: PrometheusCacheLevel.Medium, label: 'Medium' },
- { value: PrometheusCacheLevel.High, label: 'High' },
- { value: PrometheusCacheLevel.None, label: 'None' },
-];
-
-type PrometheusSelectItemsType = Array<{ value: PromApplication; label: PromApplication }>;
-
-type ValidDuration = {
- timeInterval: string;
- queryTimeout: string;
- incrementalQueryOverlapWindow: string;
-};
-
-const prometheusFlavorSelectItems: PrometheusSelectItemsType = [
- { value: PromApplication.Prometheus, label: PromApplication.Prometheus },
- { value: PromApplication.Cortex, label: PromApplication.Cortex },
- { value: PromApplication.Mimir, label: PromApplication.Mimir },
- { value: PromApplication.Thanos, label: PromApplication.Thanos },
-];
-
-const getOptionsWithDefaults = (options: DataSourceSettings) => {
- if (options.jsonData.httpMethod) {
- return options;
- }
-
- // We are explicitly adding httpMethod so, it is correctly displayed in dropdown.
- // This way, it is more predictable for users.
- return { ...options, jsonData: { ...options.jsonData, httpMethod: 'POST' } };
-};
-
-export const PromSettings = (props: Props) => {
- const theme = useTheme2();
- const styles = overhaulStyles(theme);
- const { onOptionsChange, hidePrometheusTypeVersion, hideExemplars } = props;
-
- const editorOptions = [
- {
- value: QueryEditorMode.Builder,
- label: t('grafana-prometheus.configuration.prom-settings.editor-options.label-builder', 'Builder'),
- },
- {
- value: QueryEditorMode.Code,
- label: t('grafana-prometheus.configuration.prom-settings.editor-options.label-code', 'Code'),
- },
- ];
-
- const optionsWithDefaults = getOptionsWithDefaults(props.options);
- const [validDuration, updateValidDuration] = useState({
- timeInterval: '',
- queryTimeout: '',
- incrementalQueryOverlapWindow: '',
- });
-
- const [seriesLimit, setSeriesLimit] = useState(
- optionsWithDefaults.jsonData.seriesLimit?.toString() || `${DEFAULT_SERIES_LIMIT}`
- );
-
- return (
- <>
-
-
-
- {/* Scrape interval */}
-
-
- This interval is how frequently Prometheus scrapes targets. Set this to the typical scrape and
- evaluation interval configured in your Prometheus config file. If you set this to a greater value
- than your Prometheus config file interval, Grafana will evaluate the data according to this interval
- and you will see less data points. Defaults to {'{{default}}'}.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- <>
-
- updateValidDuration({
- ...validDuration,
- timeInterval: e.currentTarget.value,
- })
- }
- data-testid={selectors.components.DataSource.Prometheus.configPage.scrapeInterval}
- />
- {validateInput(validDuration.timeInterval, DURATION_REGEX, durationError)}
- >
-
- {/* Query Timeout */}
-
-
- Set the Prometheus query timeout.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- <>
-
- updateValidDuration({
- ...validDuration,
- queryTimeout: e.currentTarget.value,
- })
- }
- data-testid={selectors.components.DataSource.Prometheus.configPage.queryTimeout}
- />
- {validateInput(validDuration.queryTimeout, DURATION_REGEX, durationError)}
- >
-
-
-
-
-
-
-
-
-
-
- Set default editor option for all users of this data source.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- o.value === optionsWithDefaults.jsonData.defaultEditor) ??
- editorOptions.find((o) => o.value === QueryEditorMode.Builder)
- }
- onChange={onChangeHandler('defaultEditor', optionsWithDefaults, onOptionsChange)}
- width={40}
- data-testid={selectors.components.DataSource.Prometheus.configPage.defaultEditor}
- />
-
-
-
- Checking this option will disable the metrics chooser and metric/label support in the query
- field's autocomplete. This helps if you have performance issues with bigger Prometheus
- instances.{' '}
-
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- className={styles.switchField}
- >
-
-
-
-
-
-
-
- {!hidePrometheusTypeVersion &&
- !optionsWithDefaults.jsonData.prometheusType &&
- !optionsWithDefaults.jsonData.prometheusVersion &&
- optionsWithDefaults.readOnly && (
-
-
- For more information on configuring prometheus type and version in data sources, see the{' '}
-
- provisioning documentation
-
- .
-
-
- )}
-
-
- {!hidePrometheusTypeVersion && (
- <>
-
- {/* , and attempt to detect the version */}
-
- Set this to the type of your prometheus database, e.g. Prometheus, Cortex, Mimir or Thanos.
- Changing this field will save your current settings. Certain types of Prometheus supports or
- does not support various APIs. For example, some types support regex matching for label queries
- to improve performance. Some types have an API for metadata. If you set this incorrectly you may
- experience odd behavior when querying metrics and labels. Please check your Prometheus
- documentation to ensure you enter the correct type.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- o.value === optionsWithDefaults.jsonData.prometheusType
- )}
- onChange={onChangeHandler('prometheusType', optionsWithDefaults, onOptionsChange)}
- width={40}
- data-testid={selectors.components.DataSource.Prometheus.configPage.prometheusType}
- />
-
- {optionsWithDefaults.jsonData.prometheusType && (
-
-
- Use this to set the version of your {'{{promType}}'} instance if it is not automatically
- configured.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- o.value === optionsWithDefaults.jsonData.prometheusVersion
- )}
- onChange={onChangeHandler('prometheusVersion', optionsWithDefaults, onOptionsChange)}
- width={40}
- data-testid={selectors.components.DataSource.Prometheus.configPage.prometheusVersion}
- />
-
- )}
- >
- )}
-
-
- Sets the browser caching level for editor queries. Higher cache settings are recommended for high
- cardinality data sources.
-
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- o.value === optionsWithDefaults.jsonData.cacheLevel) ??
- PrometheusCacheLevel.Low
- }
- data-testid={selectors.components.DataSource.Prometheus.configPage.cacheLevel}
- />
-
-
-
-
- This feature will change the default behavior of relative queries to always request fresh data from
- the prometheus instance, instead query results will be cached, and only new records are requested.
- Turn this on to decrease database and network load.
-
- >
- }
- interactive={true}
- className={styles.switchField}
- disabled={optionsWithDefaults.readOnly}
- >
-
-
-
- {optionsWithDefaults.jsonData.incrementalQuerying && (
-
-
- Set a duration like {'{{example1}}'} or {'{{example2}}'} or {'{{example3}}'}. Default of{' '}
- {'{{default}}'}. This duration will be added to the duration of each incremental request.
-
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- <>
-
- updateValidDuration({
- ...validDuration,
- incrementalQueryOverlapWindow: e.currentTarget.value,
- })
- }
- className="width-20"
- value={
- optionsWithDefaults.jsonData.incrementalQueryOverlapWindow ?? defaultPrometheusQueryOverlapWindow
- }
- onChange={onChangeHandler('incrementalQueryOverlapWindow', optionsWithDefaults, onOptionsChange)}
- spellCheck={false}
- data-testid={selectors.components.DataSource.Prometheus.configPage.queryOverlapWindow}
- />
- {validateInput(validDuration.incrementalQueryOverlapWindow, MULTIPLE_DURATION_REGEX, durationError)}
- >
-
- )}
-
-
-
- This feature will disable recording rules. Turn this on to improve dashboard performance
-
- >
- }
- interactive={true}
- className={styles.switchField}
- disabled={optionsWithDefaults.readOnly}
- >
-
-
-
-
-
-
-
-
-
-
-
- Add custom parameters to the Prometheus query URL. For example {'{{example1}}'}, {'{{example2}}'},{' '}
- {'{{example3}}'}, or
- {'{{example4}}'}. Multiple parameters should be concatenated together with {'{{concatenationChar}}'}
- .
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
-
-
- {/* HTTP Method */}
-
-
- You can use either POST or GET HTTP method to query your Prometheus data source. POST is the
- recommended method as it allows bigger queries. Change this to GET if you have a Prometheus version
- older than 2.1 or if POST requests are restricted in your network.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- label={t('grafana-prometheus.configuration.prom-settings.label-http-method', 'HTTP method')}
- disabled={optionsWithDefaults.readOnly}
- >
- o.value === optionsWithDefaults.jsonData.httpMethod)}
- onChange={onChangeHandler('httpMethod', optionsWithDefaults, onOptionsChange)}
- data-testid={selectors.components.DataSource.Prometheus.configPage.httpMethod}
- />
-
-
-
- The limit applies to all resources (metrics, labels, and values) for both endpoints (series and
- labels). Leave the field empty to use the default limit (40000). Set to 0 to disable the limit and
- fetch everything — this may cause performance issues. Default limit is 40000.
-
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- >
- <>
- {
- setSeriesLimit(event.currentTarget.value);
- onOptionsChange({
- ...optionsWithDefaults,
- jsonData: {
- ...optionsWithDefaults.jsonData,
- seriesLimit: parseInt(event.currentTarget.value, 10),
- },
- });
- }}
- onBlur={(e) => validateInput(e.currentTarget.value, NON_NEGATIVE_INTEGER_REGEX, seriesLimitError)}
- data-testid={selectors.components.DataSource.Prometheus.configPage.seriesLimit}
- />
- {validateInput(seriesLimit, NON_NEGATIVE_INTEGER_REGEX, seriesLimitError)}
- >
-
-
-
- Checking this option will favor the series endpoint with {'{{exampleParameter}}'} parameter over the
- label values endpoint with {'{{exampleParameter}}'} parameter. While the label values endpoint is
- considered more performant, some users may prefer the series because it has a POST method while the
- label values endpoint only has a GET method.
- {' '}
- {docsTip()}
- >
- }
- interactive={true}
- disabled={optionsWithDefaults.readOnly}
- className={styles.switchField}
- >
-
-
-
-
-
-
- {!hideExemplars && (
-
- updateDatasourcePluginJsonDataOption(
- { onOptionsChange, options: optionsWithDefaults },
- 'exemplarTraceIdDestinations',
- exemplarOptions
- )
- }
- disabled={optionsWithDefaults.readOnly}
- />
- )}
- >
- );
-};
-
-export const getValueFromEventItem = (eventItem: SyntheticEvent | SelectableValue) => {
- if (!eventItem) {
- return '';
- }
-
- if ('currentTarget' in eventItem) {
- return eventItem.currentTarget.value;
- }
-
- return eventItem.value;
-};
-
-const onChangeHandler =
- (key: keyof PromOptions, options: Props['options'], onOptionsChange: Props['onOptionsChange']) =>
- (eventItem: SyntheticEvent | SelectableValue) => {
- onOptionsChange({
- ...options,
- jsonData: {
- ...options.jsonData,
- [key]: getValueFromEventItem(eventItem),
- },
- });
- };
diff --git a/packages/grafana-prometheus/src/configuration/shared/utils.tsx b/packages/grafana-prometheus/src/configuration/shared/utils.tsx
deleted file mode 100644
index 87b8db4ebfb..00000000000
--- a/packages/grafana-prometheus/src/configuration/shared/utils.tsx
+++ /dev/null
@@ -1,128 +0,0 @@
-import { css } from '@emotion/css';
-import type { JSX } from 'react';
-
-import { type GrafanaTheme2 } from '@grafana/data';
-import { Trans } from '@grafana/i18n';
-import { FieldValidationMessage, TextLink } from '@grafana/ui';
-
-/**
- * Use this to return a url in a tooltip in a field. Don't forget to make the field interactive to be able to click on the tooltip
- * @param url
- * @returns
- */
-export function docsTip(url?: string) {
- const docsUrl = 'https://grafana.com/docs/grafana/latest/datasources/prometheus/configure/';
-
- return (
-
-
- Visit docs for more details here.
-
-
- );
-}
-
-export const validateInput = (
- input: string,
- pattern: string | RegExp,
- errorMessage?: string
-): boolean | JSX.Element => {
- const defaultErrorMessage = 'Value is not valid';
- const inputTooLongErrorMessage = 'Input is too long';
- const validationTimeoutErrorMessage = 'Validation timeout - input too complex';
- const invalidValidationPatternErrorMessage = 'Invalid validation pattern';
- const MAX_INPUT_LENGTH = 1000; // Reasonable limit for most validation cases
-
- // Early return if no input
- if (!input) {
- return true;
- }
-
- // Check input length
- if (input.length > MAX_INPUT_LENGTH) {
- return {inputTooLongErrorMessage} ;
- }
-
- try {
- // Convert string pattern to RegExp if needed
- let regex = typeof pattern === 'string' ? new RegExp(pattern) : pattern;
-
- // Ensure pattern is properly anchored to prevent catastrophic backtracking
- if (typeof pattern === 'string' && !pattern.startsWith('^') && !pattern.endsWith('$')) {
- regex = new RegExp(`^${pattern}$`);
- }
-
- // Add timeout to prevent ReDoS
- const timeout = 100; // 100ms timeout
- const startTime = Date.now();
-
- const isValid = regex.test(input);
-
- // Check if execution took too long
- if (Date.now() - startTime > timeout) {
- return {validationTimeoutErrorMessage} ;
- }
-
- if (!isValid) {
- return {errorMessage || defaultErrorMessage} ;
- }
-
- return true;
- } catch (error) {
- return {invalidValidationPatternErrorMessage} ;
- }
-};
-
-export function overhaulStyles(theme: GrafanaTheme2) {
- return {
- additionalSettings: css({
- marginBottom: '25px',
- }),
- secondaryGrey: css({
- color: theme.colors.secondary.text,
- opacity: '65%',
- }),
- inlineError: css({
- margin: '0px 0px 4px 245px',
- }),
- switchField: css({
- alignItems: 'center',
- }),
- sectionHeaderPadding: css({
- paddingTop: '32px',
- }),
- sectionBottomPadding: css({
- paddingBottom: '28px',
- }),
- subsectionText: css({
- fontSize: '12px',
- }),
- hrBottomSpace: css({
- marginBottom: '56px',
- }),
- hrTopSpace: css({
- marginTop: '50px',
- }),
- textUnderline: css({
- textDecoration: 'underline',
- }),
- versionMargin: css({
- marginBottom: '12px',
- }),
- advancedHTTPSettingsMargin: css({
- margin: '24px 0 8px 0',
- }),
- advancedSettings: css({
- paddingTop: '32px',
- }),
- alertingTop: css({
- marginTop: '40px !important',
- }),
- overhaulPageHeading: css({
- fontWeight: 400,
- }),
- container: css({
- maxwidth: 578,
- }),
- };
-}
diff --git a/packages/grafana-prometheus/src/constants.ts b/packages/grafana-prometheus/src/constants.ts
deleted file mode 100644
index 053180f4a13..00000000000
--- a/packages/grafana-prometheus/src/constants.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-// Max number of items (metrics, labels, values) that we display as suggestions. Prevents from running out of memory.
-
-export const PROMETHEUS_QUERY_BUILDER_MAX_RESULTS = 1000;
-
-export const PROM_CONFIG_LABEL_WIDTH = 30;
-
-export const LIST_ITEM_SIZE = 25;
-
-export const LAST_USED_LABELS_KEY = 'grafana.datasources.prometheus.browser.labels';
-
-export const DURATION_REGEX = /^$|^\d+(ms|[Mwdhmsy])$/;
-
-export const MULTIPLE_DURATION_REGEX = /(\d+)(.+)/;
-
-export const NON_NEGATIVE_INTEGER_REGEX = /^(0|[1-9]\d*)(\.\d+)?(e\+?\d+)?$/; // non-negative integers, including scientific notation
-
-export const EMPTY_SELECTOR = '{}';
-
-export const DEFAULT_SERIES_LIMIT = 40000;
-
-export const DEFAULT_COMPLETION_LIMIT = 1000;
-
-/**
- * Only for /series endpoint. Don't use this anywhere else as it cause an expensive query
- */
-export const MATCH_ALL_LABELS = '{__name__!=""}';
-
-export const METRIC_LABEL = '__name__';
-
-export const durationError = 'Value is not valid, you can use number with time unit specifier: y, M, w, d, h, m, s';
-
-export const seriesLimitError =
- 'Value is not valid, you can use only numbers or leave it empty to use default limit or set 0 to have no limit.';
-
-export const InstantQueryRefIdIndex = '-Instant';
-
-export const GET_AND_POST_METADATA_ENDPOINTS = [
- 'api/v1/query',
- 'api/v1/query_range',
- 'api/v1/series',
- 'api/v1/labels',
- 'suggestions',
-];
diff --git a/packages/grafana-prometheus/src/dataquery.ts b/packages/grafana-prometheus/src/dataquery.ts
deleted file mode 100644
index 0651cdde21d..00000000000
--- a/packages/grafana-prometheus/src/dataquery.ts
+++ /dev/null
@@ -1,49 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/dataquery.ts
-import { type Scope, type ScopeSpec, type ScopeSpecFilter } from '@grafana/data';
-import type * as common from '@grafana/schema';
-
-export enum QueryEditorMode {
- Builder = 'builder',
- Code = 'code',
-}
-
-export type PromQueryFormat = 'time_series' | 'table' | 'heatmap';
-
-export interface Prometheus extends common.DataQuery {
- /**
- * Specifies which editor is being used to prepare the query. It can be "code" or "builder"
- */
- editorMode?: QueryEditorMode;
- /**
- * Execute an additional query to identify interesting raw samples relevant for the given expr
- */
- exemplar?: boolean;
- /**
- * The actual expression/query that will be evaluated by Prometheus
- */
- expr: string;
- /**
- * Query format to determine how to display data points in panel. It can be "time_series", "table", "heatmap"
- */
- format?: PromQueryFormat;
- /**
- * Returns only the latest value that Prometheus has scraped for the requested time series
- */
- instant?: boolean;
- /**
- * @deprecated Used to specify how many times to divide max data points by. We use max data points under query options
- * See https://github.com/grafana/grafana/issues/48081
- */
- intervalFactor?: number;
- /**
- * Series name override or template. Ex. {{hostname}} will be replaced with label value for hostname
- */
- legendFormat?: string;
- /**
- * Returns a Range vector, comprised of a set of time series containing a range of data points over time for each time series
- */
- range?: boolean;
- scopes?: Array>;
- adhocFilters?: ScopeSpecFilter[];
- groupByKeys?: string[];
-}
diff --git a/packages/grafana-prometheus/src/datasource.test.ts b/packages/grafana-prometheus/src/datasource.test.ts
deleted file mode 100644
index 2814441b37e..00000000000
--- a/packages/grafana-prometheus/src/datasource.test.ts
+++ /dev/null
@@ -1,1430 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/datasource.test.ts
-import { cloneDeep } from 'lodash';
-import { lastValueFrom, of } from 'rxjs';
-
-import {
- type AdHocVariableFilter,
- CoreApp,
- type CustomVariableModel,
- type DataQueryRequest,
- type DataSourceInstanceSettings,
- dateTime,
- LoadingState,
- type ScopeSpecFilter,
- type TimeRange,
- VariableHide,
-} from '@grafana/data';
-import { config, getBackendSrv, setBackendSrv, type TemplateSrv } from '@grafana/runtime';
-
-import { extractResourceMatcher, extractRuleMappingFromGroups, PrometheusDatasource } from './datasource';
-import { prometheusRegularEscape, prometheusSpecialRegexEscape } from './escaping';
-import { type PrometheusLanguageProviderInterface } from './language_provider';
-import { type CacheRequestInfo } from './querycache/QueryCache';
-import {
- createDataRequest,
- createDefaultPromResponse,
- fetchMockCalledWith,
- getMockTimeRange,
-} from './test/mocks/datasource';
-import {
- PromApplication,
- PrometheusCacheLevel,
- type PromOptions,
- type PromQuery,
- type PromQueryRequest,
- type RawRecordingRules,
-} from './types';
-
-const fetchMock = jest.fn().mockReturnValue(of(createDefaultPromResponse()));
-
-jest.mock('./metric_find_query');
-const origBackendSrv = getBackendSrv();
-setBackendSrv({
- ...origBackendSrv,
- fetch: fetchMock,
-});
-
-const replaceMock = jest.fn().mockImplementation((a: string, ...rest: unknown[]) => a);
-
-const templateSrvStub = {
- replace: replaceMock,
-} as unknown as TemplateSrv;
-
-const fromSeconds = 1674500289215;
-const toSeconds = 1674500349215;
-
-const mockTimeRangeOld: TimeRange = {
- from: dateTime(1531468681),
- to: dateTime(1531489712),
- raw: {
- from: '1531468681',
- to: '1531489712',
- },
-};
-
-const mockTimeRange: TimeRange = {
- from: dateTime(fromSeconds),
- to: dateTime(toSeconds),
- raw: {
- from: fromSeconds.toString(),
- to: toSeconds.toString(),
- },
-};
-
-beforeEach(() => {
- jest.clearAllMocks();
-});
-
-describe('PrometheusDatasource', () => {
- let ds: PrometheusDatasource;
- const instanceSettings = {
- url: 'proxied',
- uid: 'ABCDEF',
- access: 'proxy',
- user: 'test',
- password: 'mupp',
- jsonData: {
- customQueryParameters: '',
- cacheLevel: PrometheusCacheLevel.Low,
- } as Partial,
- } as unknown as DataSourceInstanceSettings;
-
- beforeEach(() => {
- ds = new PrometheusDatasource(instanceSettings, templateSrvStub);
- });
-
- // Some functions are required by the parent datasource class to provide functionality such as ad-hoc filters, which requires the definition of the getTagKeys, and getTagValues functions
- describe('Datasource contract', () => {
- it('has function called getTagKeys', () => {
- expect(Object.getOwnPropertyNames(Object.getPrototypeOf(ds))).toContain('getTagKeys');
- });
- it('has function called getTagValues', () => {
- expect(Object.getOwnPropertyNames(Object.getPrototypeOf(ds))).toContain('getTagValues');
- });
- });
-
- describe('Query', () => {
- it('throws if using direct access', async () => {
- const instanceSettings = {
- url: 'proxied',
- directUrl: 'direct',
- user: 'test',
- password: 'mupp',
- access: 'direct',
- jsonData: {
- customQueryParameters: '',
- prometheusVersion: '2.20.0',
- prometheusType: PromApplication.Prometheus,
- },
- } as unknown as DataSourceInstanceSettings;
- const directDs = new PrometheusDatasource(instanceSettings, templateSrvStub);
-
- await expect(
- lastValueFrom(
- directDs.query(
- createDataRequest(
- [
- {
- expr: '',
- refId: 'A',
- },
- { expr: '', refId: 'B' },
- ],
- { app: CoreApp.Dashboard }
- )
- )
- )
- ).rejects.toMatchObject({ message: expect.stringMatching('Browser access') });
- });
- });
-
- describe('Datasource metadata requests', () => {
- it('should perform a GET request with the default config', () => {
- ds.metadataRequest('/foo', { bar: 'baz baz', foo: 'foo' });
- expect(fetchMock.mock.calls.length).toBe(1);
- expect(fetchMock.mock.calls[0][0].method).toBe('GET');
- expect(fetchMock.mock.calls[0][0].url).toContain('bar=baz%20baz&foo=foo');
- });
- it('should still perform a GET request with the DS HTTP method set to POST and not POST-friendly endpoint', () => {
- const postSettings = cloneDeep(instanceSettings);
- postSettings.jsonData.httpMethod = 'POST';
- const promDs = new PrometheusDatasource(postSettings, templateSrvStub);
- promDs.metadataRequest('/foo');
- expect(fetchMock.mock.calls.length).toBe(1);
- expect(fetchMock.mock.calls[0][0].method).toBe('GET');
- });
- it('should try to perform a POST request with the DS HTTP method set to POST and POST-friendly endpoint', () => {
- const postSettings = cloneDeep(instanceSettings);
- postSettings.jsonData.httpMethod = 'POST';
- const promDs = new PrometheusDatasource(postSettings, templateSrvStub);
- promDs.metadataRequest('api/v1/series', { bar: 'baz baz', foo: 'foo' });
- expect(fetchMock.mock.calls.length).toBe(1);
- expect(fetchMock.mock.calls[0][0].method).toBe('POST');
- expect(fetchMock.mock.calls[0][0].url).not.toContain('bar=baz%20baz&foo=foo');
- expect(fetchMock.mock.calls[0][0].data).toEqual({ bar: 'baz baz', foo: 'foo' });
- });
- });
-
- describe('customQueryParams', () => {
- describe('with GET http method', () => {
- const promDs = new PrometheusDatasource(
- { ...instanceSettings, jsonData: { customQueryParameters: 'customQuery=123', httpMethod: 'GET' } },
- templateSrvStub
- );
-
- it('added to metadata request', () => {
- promDs.metadataRequest('/foo');
- expect(fetchMock.mock.calls.length).toBe(1);
- expect(fetchMock.mock.calls[0][0].url).toBe('/api/datasources/uid/ABCDEF/resources/foo?customQuery=123');
- });
- });
-
- describe('with POST http method', () => {
- const promDs = new PrometheusDatasource(
- { ...instanceSettings, jsonData: { customQueryParameters: 'customQuery=123', httpMethod: 'POST' } },
- templateSrvStub
- );
-
- it('added to metadata request with non-POST endpoint', () => {
- promDs.metadataRequest('/foo');
- expect(fetchMock.mock.calls.length).toBe(1);
- expect(fetchMock.mock.calls[0][0].url).toBe('/api/datasources/uid/ABCDEF/resources/foo?customQuery=123');
- });
-
- it('added to metadata request with POST endpoint', () => {
- promDs.metadataRequest('/api/v1/labels');
- expect(fetchMock.mock.calls.length).toBe(1);
- expect(fetchMock.mock.calls[0][0].url).toBe('/api/datasources/uid/ABCDEF/resources/api/v1/labels');
- expect(fetchMock.mock.calls[0][0].data.customQuery).toBe('123');
- });
- });
- });
-
- describe('When using adhoc filters', () => {
- const DEFAULT_QUERY_EXPRESSION = 'metric{job="foo"} - metric';
- const target: PromQuery = { expr: DEFAULT_QUERY_EXPRESSION, refId: 'A' };
-
- describe('with prometheusSpecialCharsInLabelValues disabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = false;
- });
-
- it('should not modify expression with no filters', async () => {
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({ expr: DEFAULT_QUERY_EXPRESSION });
- });
-
- it('should add filters to expression', () => {
- const filters = [
- {
- key: 'k1',
- operator: '=',
- value: 'v1',
- },
- {
- key: 'k2',
- operator: '!=',
- value: 'v2',
- },
- ];
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- filters,
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({ expr: 'metric{job="foo", k1="v1", k2!="v2"} - metric{k1="v1", k2!="v2"}' });
- });
-
- it('should add escaping if needed to regex filter expressions', () => {
- const filters = [
- {
- key: 'k1',
- operator: '=~',
- value: 'v.*',
- },
- {
- key: 'k2',
- operator: '=~',
- value: `v'.*`,
- },
- ];
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- filters,
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({
- expr: `metric{job="foo", k1=~"v.*", k2=~"v\\\\'.*"} - metric{k1=~"v.*", k2=~"v\\\\'.*"}`,
- });
- });
- });
-
- describe('with prometheusSpecialCharsInLabelValues enabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = true;
- });
-
- it('should not modify expression with no filters', async () => {
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({ expr: DEFAULT_QUERY_EXPRESSION });
- });
-
- it('should add escaping if needed to regex filter expressions', () => {
- const filters = [
- {
- key: 'k1',
- operator: '=~',
- value: 'v.*',
- },
- {
- key: 'k2',
- operator: '=~',
- value: `v'.*`,
- },
- {
- key: 'k3',
- operator: '=~',
- value: `v".*`,
- },
- {
- key: 'k4',
- operator: '=~',
- value: `\\v.*`,
- },
- ];
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- filters,
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({
- expr: `metric{job="foo", k1=~"v.*", k2=~"v'.*", k3=~"v\\".*", k4=~"\\\\v.*"} - metric{k1=~"v.*", k2=~"v'.*", k3=~"v\\".*", k4=~"\\\\v.*"}`,
- });
- });
- });
-
- describe('with multi-value operators', () => {
- it('should remap =| to =~ and apply filter to expression', () => {
- const filters = [
- {
- key: 'cluster',
- operator: '=|',
- value: 'prod-us-east-1',
- values: ['prod-us-east-1', 'staging-eu-west-1', 'dev-eu-west-2'],
- },
- ];
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- filters,
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({
- expr: `metric{job="foo", cluster=~"prod-us-east-1|staging-eu-west-1|dev-eu-west-2"} - metric{cluster=~"prod-us-east-1|staging-eu-west-1|dev-eu-west-2"}`,
- });
- });
-
- it('should remap !=| to !~ and apply filter to expression', () => {
- const filters = [
- {
- key: 'namespace',
- operator: '!=|',
- value: 'kube-system',
- values: ['kube-system', 'kube-public'],
- },
- ];
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- filters,
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({
- expr: `metric{job="foo", namespace!~"kube-system|kube-public"} - metric{namespace!~"kube-system|kube-public"}`,
- });
- });
-
- it('should handle =| with a single value', () => {
- const filters = [
- {
- key: 'cluster',
- operator: '=|',
- value: 'prod',
- values: ['prod'],
- },
- ];
- ds.query({
- interval: '15s',
- range: getMockTimeRange(),
- filters,
- targets: [target],
- } as DataQueryRequest);
- const [result] = fetchMockCalledWith(fetchMock);
- expect(result).toMatchObject({
- expr: `metric{job="foo", cluster=~"prod"} - metric{cluster=~"prod"}`,
- });
- });
- });
- });
-
- describe('Test query range snapping', () => {
- it('test default 1 minute quantization', () => {
- const dataSource = new PrometheusDatasource(
- {
- ...instanceSettings,
- jsonData: { ...instanceSettings.jsonData, cacheLevel: PrometheusCacheLevel.Low },
- },
- templateSrvStub as unknown as TemplateSrv
- );
- const quantizedRange = dataSource.getAdjustedInterval(mockTimeRange);
- // For "1 minute" the window contains all the minutes, so a query from 1:11:09 - 1:12:09 becomes 1:11 - 1:13
- expect(parseInt(quantizedRange.end, 10) - parseInt(quantizedRange.start, 10)).toBe(120);
- });
-
- it('test 10 minute quantization', () => {
- const dataSource = new PrometheusDatasource(
- {
- ...instanceSettings,
- jsonData: { ...instanceSettings.jsonData, cacheLevel: PrometheusCacheLevel.Medium },
- },
- templateSrvStub as unknown as TemplateSrv
- );
- const quantizedRange = dataSource.getAdjustedInterval(mockTimeRange);
- expect(parseInt(quantizedRange.end, 10) - parseInt(quantizedRange.start, 10)).toBe(600);
- });
-
- it('test 60 minute quantization', () => {
- const dataSource = new PrometheusDatasource(
- {
- ...instanceSettings,
- jsonData: { ...instanceSettings.jsonData, cacheLevel: PrometheusCacheLevel.High },
- },
- templateSrvStub as unknown as TemplateSrv
- );
- const quantizedRange = dataSource.getAdjustedInterval(mockTimeRange);
- expect(parseInt(quantizedRange.end, 10) - parseInt(quantizedRange.start, 10)).toBe(3600);
- });
-
- it('test quantization turned off', () => {
- const dataSource = new PrometheusDatasource(
- {
- ...instanceSettings,
- jsonData: { ...instanceSettings.jsonData, cacheLevel: PrometheusCacheLevel.None },
- },
- templateSrvStub as unknown as TemplateSrv
- );
- const quantizedRange = dataSource.getAdjustedInterval(mockTimeRange);
- expect(parseInt(quantizedRange.end, 10) - parseInt(quantizedRange.start, 10)).toBe(
- (toSeconds - fromSeconds) / 1000
- );
- });
- });
-
- describe('extractRuleMappingFromGroups()', () => {
- it('returns empty mapping for no rule groups', () => {
- expect(extractRuleMappingFromGroups([])).toEqual({});
- });
-
- it('returns a mapping for recording rules only', () => {
- const groups: RawRecordingRules[] = [
- {
- rules: [
- {
- name: 'HighRequestLatency',
- query: 'job:request_latency_seconds:mean5m{job="myjob"} > 0.5',
- type: 'alerting',
- },
- {
- name: 'job:http_inprogress_requests:sum',
- query: 'sum(http_inprogress_requests) by (job)',
- type: 'recording',
- },
- ],
- file: '/rules.yaml',
- interval: 60,
- name: 'example',
- },
- ];
- const mapping = extractRuleMappingFromGroups(groups);
- expect(mapping).toEqual({
- 'job:http_inprogress_requests:sum': [{ query: 'sum(http_inprogress_requests) by (job)' }],
- });
- });
-
- it('should extract rules with same name respecting its labels', () => {
- const groups: RawRecordingRules[] = [
- {
- name: 'nameOfTheGroup:uid11',
- file: 'the_file_123',
- rules: [
- {
- name: 'metric_5m',
- query: 'super_duper_query',
- labels: {
- uuid: 'uuid111',
- },
- type: 'recording',
- },
- ],
- },
- {
- name: 'nameOfTheGroup:uid22',
- file: 'the_file_456',
- rules: [
- {
- name: 'metric_5m',
- query: 'another_super_duper_query',
- labels: {
- uuid: 'uuid222',
- },
- type: 'recording',
- },
- ],
- },
- ];
-
- const mapping = extractRuleMappingFromGroups(groups);
- expect(mapping['metric_5m']).toBeDefined();
- expect(mapping['metric_5m'].length).toEqual(2);
- expect(mapping['metric_5m'][0].query).toEqual('super_duper_query');
- expect(mapping['metric_5m'][0].labels).toEqual({ uuid: 'uuid111' });
- expect(mapping['metric_5m'][1].query).toEqual('another_super_duper_query');
- expect(mapping['metric_5m'][1].labels).toEqual({ uuid: 'uuid222' });
- });
- });
-
- describe('Prometheus regular escaping', () => {
- describe('with prometheusSpecialCharsInLabelValues disabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = false;
- });
-
- it('should not escape non-string', () => {
- expect(prometheusRegularEscape(12)).toEqual(12);
- });
-
- it('should not escape strings without special characters', () => {
- expect(prometheusRegularEscape('cryptodepression')).toEqual('cryptodepression');
- });
-
- it('should escape single quotes', () => {
- expect(prometheusRegularEscape("looking'glass")).toEqual("looking\\\\'glass");
- });
-
- it('should escape backslashes', () => {
- expect(prometheusRegularEscape('looking\\glass')).toEqual('looking\\\\glass');
- });
- });
-
- describe('with prometheusSpecialCharsInLabelValues enabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = true;
- });
-
- it('should not escape non-string', () => {
- expect(prometheusRegularEscape(12)).toEqual(12);
- });
-
- it('should not escape strings without special characters', () => {
- expect(prometheusRegularEscape('cryptodepression')).toEqual('cryptodepression');
- });
-
- it('should not escape complete label matcher', () => {
- expect(prometheusRegularEscape('job="grafana"')).toEqual('job="grafana"');
- expect(prometheusRegularEscape('job!="grafana"')).toEqual('job!="grafana"');
- expect(prometheusRegularEscape('job=~"grafana"')).toEqual('job=~"grafana"');
- expect(prometheusRegularEscape('job!~"grafana"')).toEqual('job!~"grafana"');
- });
-
- it('should not escape single quotes', () => {
- expect(prometheusRegularEscape("looking'glass")).toEqual("looking'glass");
- });
-
- it('should escape double quotes', () => {
- expect(prometheusRegularEscape('looking"glass')).toEqual('looking\\"glass');
- });
-
- it('should escape backslashes', () => {
- expect(prometheusRegularEscape('looking\\glass')).toEqual('looking\\\\glass');
- });
-
- it('should handle complete label matchers with escaped content', () => {
- expect(prometheusRegularEscape('job="my\\"service"')).toEqual('job="my\\"service"');
- expect(prometheusRegularEscape('job="\\\\server"')).toEqual('job="\\\\server"');
- });
- });
- });
-
- describe('Prometheus regexes escaping', () => {
- describe('with prometheusSpecialCharsInLabelValues disabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = false;
- });
-
- it('should not escape strings without special characters', () => {
- expect(prometheusSpecialRegexEscape('cryptodepression')).toEqual('cryptodepression');
- });
-
- it('should escape special characters', () => {
- expect(prometheusSpecialRegexEscape('looking{glass')).toEqual('looking\\\\{glass');
- expect(prometheusSpecialRegexEscape('looking$glass')).toEqual('looking\\\\$glass');
- expect(prometheusSpecialRegexEscape('looking\\glass')).toEqual('looking\\\\\\\\glass');
- expect(prometheusSpecialRegexEscape('looking|glass')).toEqual('looking\\\\|glass');
- });
-
- it('should handle multiple special characters', () => {
- expect(prometheusSpecialRegexEscape('+looking$glass?')).toEqual('\\\\+looking\\\\$glass\\\\?');
- });
- });
-
- describe('with prometheusSpecialCharsInLabelValues enabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = true;
- });
-
- it('should not escape strings without special characters', () => {
- expect(prometheusSpecialRegexEscape('cryptodepression')).toEqual('cryptodepression');
- });
-
- it('should escape special characters', () => {
- expect(prometheusSpecialRegexEscape('looking{glass')).toEqual('looking\\\\{glass');
- expect(prometheusSpecialRegexEscape('looking}glass')).toEqual('looking\\\\}glass');
- expect(prometheusSpecialRegexEscape('looking[glass')).toEqual('looking\\\\[glass');
- expect(prometheusSpecialRegexEscape('looking]glass')).toEqual('looking\\\\]glass');
- expect(prometheusSpecialRegexEscape('looking$glass')).toEqual('looking\\\\$glass');
- expect(prometheusSpecialRegexEscape('looking^glass')).toEqual('looking\\\\^glass');
- expect(prometheusSpecialRegexEscape('looking*glass')).toEqual('looking\\\\*glass');
- expect(prometheusSpecialRegexEscape('looking+glass')).toEqual('looking\\\\+glass');
- expect(prometheusSpecialRegexEscape('looking?glass')).toEqual('looking\\\\?glass');
- expect(prometheusSpecialRegexEscape('looking.glass')).toEqual('looking\\\\.glass');
- expect(prometheusSpecialRegexEscape('looking(glass')).toEqual('looking\\\\(glass');
- expect(prometheusSpecialRegexEscape('looking)glass')).toEqual('looking\\\\)glass');
- expect(prometheusSpecialRegexEscape('looking\\glass')).toEqual('looking\\\\\\\\glass');
- expect(prometheusSpecialRegexEscape('looking|glass')).toEqual('looking\\\\|glass');
- });
-
- it('should escape double quotes with special regex escaping', () => {
- expect(prometheusSpecialRegexEscape('looking"glass')).toEqual('looking\\\\\\"glass');
- });
-
- it('should handle multiple special characters', () => {
- expect(prometheusSpecialRegexEscape('+looking$glass?')).toEqual('\\\\+looking\\\\$glass\\\\?');
- });
-
- it('should handle mixed quotes and special characters', () => {
- expect(prometheusSpecialRegexEscape('+looking"$glass?')).toEqual('\\\\+looking\\\\\\"\\\\$glass\\\\?');
- });
- });
- });
-
- describe('When interpolating variables', () => {
- let customVariable: CustomVariableModel;
- beforeEach(() => {
- customVariable = {
- id: '',
- global: false,
- multi: false,
- includeAll: false,
- allValue: null,
- query: '',
- options: [],
- current: {},
- name: '',
- type: 'custom',
- error: null,
- rootStateKey: '',
- state: LoadingState.Done,
- description: '',
- label: undefined,
- hide: VariableHide.dontHide,
- skipUrlSync: false,
- index: -1,
- };
- });
-
- describe('with prometheusSpecialCharsInLabelValues disabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = false;
- });
-
- describe('and value is a string', () => {
- it('should escape single quotes', () => {
- expect(ds.interpolateQueryExpr("abc'$^*{}[]+?.()|", customVariable)).toEqual("abc\\\\'$^*{}[]+?.()|");
- });
- });
- });
-
- describe('with prometheusSpecialCharsInLabelValues enabled', () => {
- beforeAll(() => {
- config.featureToggles.prometheusSpecialCharsInLabelValues = true;
- });
-
- describe('and value is a string', () => {
- it('should only escape double quotes and backslashes', () => {
- expect(ds.interpolateQueryExpr('abc\'"$^*{}[]+?.()|\\', customVariable)).toEqual('abc\'\\"$^*{}[]+?.()|\\\\');
- });
- });
- });
-
- describe('and value is a number', () => {
- it('should return a number', () => {
- expect(ds.interpolateQueryExpr(1000 as unknown as string, customVariable)).toEqual(1000);
- });
- });
-
- describe('and variable allows multi-value', () => {
- beforeEach(() => {
- customVariable.multi = true;
- });
-
- it('should regex escape values if the value is a string', () => {
- expect(ds.interpolateQueryExpr('looking*glass', customVariable)).toEqual('looking\\\\*glass');
- });
-
- it('should return pipe separated values if the value is an array of strings', () => {
- expect(ds.interpolateQueryExpr(['a|bc', 'de|f'], customVariable)).toEqual('(a\\\\|bc|de\\\\|f)');
- });
-
- it('should return 1 regex escaped value if there is just 1 value in an array of strings', () => {
- expect(ds.interpolateQueryExpr(['looking*glass'], customVariable)).toEqual('looking\\\\*glass');
- });
- });
-
- describe('and variable allows all', () => {
- beforeEach(() => {
- customVariable.includeAll = true;
- });
-
- it('should regex escape values if the array is a string', () => {
- expect(ds.interpolateQueryExpr('looking*glass', customVariable)).toEqual('looking\\\\*glass');
- });
-
- it('should return pipe separated values if the value is an array of strings', () => {
- expect(ds.interpolateQueryExpr(['a|bc', 'de|f'], customVariable)).toEqual('(a\\\\|bc|de\\\\|f)');
- });
-
- it('should return 1 regex escaped value if there is just 1 value in an array of strings', () => {
- expect(ds.interpolateQueryExpr(['looking*glass'], customVariable)).toEqual('looking\\\\*glass');
- });
- });
- });
-
- describe('interpolateVariablesInQueries', () => {
- it('should call replace function 3 times', () => {
- const query: PromQuery = {
- expr: 'test{job="testjob"}',
- format: 'time_series',
- interval: '$Interval',
- refId: 'A',
- };
- const interval = '10m';
- replaceMock.mockReturnValue(interval);
-
- const queries = ds.interpolateVariablesInQueries([query], { Interval: { text: interval, value: interval } });
- expect(templateSrvStub.replace).toBeCalledTimes(3);
- expect(queries[0].interval).toBe(interval);
- });
-
- it('should call enhanceExprWithAdHocFilters', () => {
- ds.enhanceExprWithAdHocFilters = jest.fn();
- const queries = [
- {
- refId: 'A',
- expr: 'rate({bar="baz", job="foo"} [5m]',
- },
- ];
- ds.interpolateVariablesInQueries(queries, {});
- expect(ds.enhanceExprWithAdHocFilters).toHaveBeenCalled();
- });
-
- it('should not apply adhoc filters when scopes with filters are present', () => {
- ds.enhanceExprWithAdHocFilters = jest.fn();
- ds.generateScopeFilters = jest.fn();
- // Fix: Use correct types for scopes and filters
- const typedScopes = [
- {
- name: 'test-scope',
- title: 'Test Scope',
- type: 'test',
- filters: [
- {
- key: 'bar',
- operator: 'equals' as const,
- value: 'baz',
- },
- ],
- },
- ];
- const typedQueries: PromQuery[] = [
- {
- refId: 'A',
- expr: 'rate({bar="baz", job="foo"} [5m]',
- scopes: typedScopes,
- },
- ];
- ds.interpolateVariablesInQueries(typedQueries, {});
- expect(ds.enhanceExprWithAdHocFilters).not.toHaveBeenCalled();
- expect(ds.generateScopeFilters).toHaveBeenCalled();
- });
- });
-
- describe('applyTemplateVariables', () => {
- afterAll(() => {
- replaceMock.mockImplementation((a: string, ...rest: unknown[]) => a);
- });
-
- it('should call replace function for legendFormat', () => {
- const query = {
- expr: 'test{job="bar"}',
- legendFormat: '$legend',
- refId: 'A',
- };
- const legend = 'baz';
- replaceMock.mockReturnValue(legend);
-
- const interpolatedQuery = ds.applyTemplateVariables(query, { legend: { text: legend, value: legend } });
- expect(interpolatedQuery.legendFormat).toBe(legend);
- });
-
- it('should call replace function for interval', () => {
- const query = {
- expr: 'test{job="bar"}',
- interval: '$step',
- refId: 'A',
- };
- const step = '5s';
- replaceMock.mockReturnValue(step);
-
- const interpolatedQuery = ds.applyTemplateVariables(query, { step: { text: step, value: step } });
- expect(interpolatedQuery.interval).toBe(step);
- });
-
- it('should call replace function for expr', () => {
- const query = {
- expr: 'test{job="$job"}',
- refId: 'A',
- };
- const job = 'bar';
- replaceMock.mockReturnValue(job);
-
- const interpolatedQuery = ds.applyTemplateVariables(query, { job: { text: job, value: job } });
- expect(interpolatedQuery.expr).toBe(job);
- });
-
- it('should add ad-hoc filters to expr', () => {
- replaceMock.mockImplementation((a: string) => a);
- const filters = [
- {
- key: 'k1',
- operator: '=',
- value: 'v1',
- },
- {
- key: 'k2',
- operator: '!=',
- value: 'v2',
- },
- ];
-
- const query = {
- expr: 'test{job="bar"}',
- refId: 'A',
- };
-
- const result = ds.applyTemplateVariables(query, {}, filters);
- expect(result).toMatchObject({ expr: 'test{job="bar", k1="v1", k2!="v2"}' });
- });
-
- it('should generate scope filters and **not** apply ad-hoc filters to expr', () => {
- const scopes = [
- {
- name: 'test-scope',
- title: 'Test Scope',
- type: 'test',
- filters: [
- {
- key: 'bar',
- operator: 'equals' as const,
- value: 'baz',
- },
- ],
- },
- ];
-
- replaceMock.mockImplementation((a: string) => a);
- const filters = [
- {
- key: 'k1',
- operator: '=',
- value: 'v1',
- },
- {
- key: 'k2',
- operator: '!=',
- value: 'v2',
- },
- ];
-
- const query = {
- expr: 'test{job="bar"}',
- refId: 'A',
- scopes: scopes,
- };
-
- const expectedScopeFilters: ScopeSpecFilter[] = [
- {
- key: 'k1',
- operator: 'equals' as const,
- value: 'v1',
- },
- {
- key: 'k2',
- operator: 'not-equals' as const,
- value: 'v2',
- },
- ];
-
- const result = ds.applyTemplateVariables(query, {}, filters);
- expect(result.expr).toBe('test{job="bar"}');
- expect(result.adhocFilters).toEqual(expectedScopeFilters);
- });
-
- it('should add ad-hoc filters only to expr', () => {
- replaceMock.mockImplementation((a: string) => a?.replace('$A', '99') ?? a);
- const filters = [
- {
- key: 'k1',
- operator: '=',
- value: 'v1',
- },
- {
- key: 'k2',
- operator: '!=',
- value: 'v2',
- },
- ];
-
- const query = {
- expr: 'test{job="bar"} > $A',
- refId: 'A',
- };
-
- const result = ds.applyTemplateVariables(query, {}, filters);
- expect(result).toMatchObject({ expr: 'test{job="bar", k1="v1", k2!="v2"} > 99' });
- });
-
- it('should add ad-hoc filters only to expr and expression has template variable as label value??', () => {
- const searchPattern = /\$A/g;
- replaceMock.mockImplementation((a: string) => a?.replace(searchPattern, '99') ?? a);
- const filters = [
- {
- key: 'k1',
- operator: '=',
- value: 'v1',
- },
- {
- key: 'k2',
- operator: '!=',
- value: 'v2',
- },
- ];
-
- const query = {
- expr: 'test{job="$A"} > $A',
- refId: 'A',
- };
-
- const result = ds.applyTemplateVariables(query, {}, filters);
- expect(result).toMatchObject({ expr: 'test{job="99", k1="v1", k2!="v2"} > 99' });
- });
-
- it('should replace variables in ad-hoc filters', () => {
- const searchPattern = /\$A/g;
- replaceMock.mockImplementation((a: string) => a?.replace(searchPattern, '99') ?? a);
-
- const query = {
- expr: 'test',
- refId: 'A',
- };
- const filters = [
- {
- key: 'job',
- operator: '=~',
- value: '$A',
- },
- ];
-
- const result = ds.applyTemplateVariables(query, {}, filters);
- expect(result).toMatchObject({ expr: 'test{job=~"99"}' });
- });
-
- it('should replace variables in adhoc filters on backend when promQLScope is enabled', () => {
- const scopes = [
- {
- name: 'test-scope',
- title: 'Test Scope',
- type: 'test',
- filters: [
- {
- key: 'bar',
- operator: 'equals' as const,
- value: 'baz',
- },
- ],
- },
- ];
- const searchPattern = /\$A/g;
- replaceMock.mockImplementation((a: string) => a?.replace(searchPattern, '99') ?? a);
-
- const query = {
- expr: 'test',
- refId: 'A',
- scopes: scopes,
- };
- const filters = [
- {
- key: 'job',
- operator: '=~',
- value: '$A',
- },
- ];
-
- const result = ds.applyTemplateVariables(query, {}, filters);
- expect(result).toMatchObject({
- expr: 'test',
- adhocFilters: [
- {
- key: 'job',
- operator: 'regex-match',
- value: '99',
- },
- ],
- });
- });
- });
-
- describe('metricFindQuery', () => {
- beforeEach(() => {
- const prometheusDatasource = new PrometheusDatasource(
- { ...instanceSettings, jsonData: { ...instanceSettings.jsonData, cacheLevel: PrometheusCacheLevel.None } },
- templateSrvStub
- );
- const query = 'query_result(topk(5,rate(http_request_duration_microseconds_count[$__interval])))';
- prometheusDatasource.metricFindQuery(query, { range: mockTimeRangeOld });
- });
-
- it('should call templateSrv.replace with scopedVars', () => {
- expect(replaceMock.mock.calls[0][1]).toBeDefined();
- });
-
- it('should have the correct range and range_ms', () => {
- const range = replaceMock.mock.calls[0][1].__range;
- const rangeMs = replaceMock.mock.calls[0][1].__range_ms;
- const rangeS = replaceMock.mock.calls[0][1].__range_s;
- expect(range).toEqual({ text: '21s', value: '21s' });
- expect(rangeMs).toEqual({ text: 21031, value: 21031 });
- expect(rangeS).toEqual({ text: 21, value: 21 });
- });
-
- it('should pass the default interval value', () => {
- const interval = replaceMock.mock.calls[0][1].__interval;
- const intervalMs = replaceMock.mock.calls[0][1].__interval_ms;
- expect(interval).toEqual({ text: '15s', value: '15s' });
- expect(intervalMs).toEqual({ text: 15000, value: 15000 });
- });
-
- it('should use the default time range when no range provided in options', () => {
- const prometheusDatasource = new PrometheusDatasource(
- { ...instanceSettings, jsonData: { ...instanceSettings.jsonData, cacheLevel: PrometheusCacheLevel.None } },
- templateSrvStub
- );
- const query = 'query_result(topk(5,rate(http_request_duration_microseconds_count[$__interval])))';
- prometheusDatasource.metricFindQuery(query);
-
- // Last 6h
- const range = replaceMock.mock.calls[1][1].__range;
- const rangeMs = replaceMock.mock.calls[1][1].__range_ms;
- const rangeS = replaceMock.mock.calls[1][1].__range_s;
- expect(range).toEqual({ text: '21600s', value: '21600s' });
- expect(rangeMs).toEqual({ text: 21600000, value: 21600000 });
- expect(rangeS).toEqual({ text: 21600, value: 21600 });
- });
- });
-
- describe('extractResourceMatcher', () => {
- it('should extract matcher from given query and filters', () => {
- const queries: PromQuery[] = [
- {
- refId: 'A',
- expr: 'metric_name{job="testjob"}',
- },
- ];
- const filters: AdHocVariableFilter[] = [
- {
- key: 'instance',
- operator: '=',
- value: 'localhost',
- },
- ];
-
- const result = extractResourceMatcher(queries, filters);
- expect(result).toBe('{__name__=~"metric_name",instance="localhost"}');
- });
-
- it('should extract matcher from given query and empty filters', () => {
- const queries: PromQuery[] = [
- {
- refId: 'A',
- expr: 'metric_name{job="testjob"}',
- },
- ];
- const filters: AdHocVariableFilter[] = [];
-
- const result = extractResourceMatcher(queries, filters);
- expect(result).toBe('{__name__=~"metric_name"}');
- });
-
- it('should extract matcher from given empty query expr and filters', () => {
- const queries: PromQuery[] = [
- {
- refId: 'A',
- expr: '',
- },
- ];
- const filters: AdHocVariableFilter[] = [
- {
- key: 'instance',
- operator: '=',
- value: 'localhost',
- },
- ];
-
- const result = extractResourceMatcher(queries, filters);
- expect(result).toBe('{instance="localhost"}');
- });
-
- it('should extract matcher from given filters only', () => {
- const queries: PromQuery[] = [];
- const filters: AdHocVariableFilter[] = [
- {
- key: 'instance',
- operator: '=',
- value: 'localhost',
- },
- {
- key: 'job',
- operator: '!=',
- value: 'testjob',
- },
- ];
-
- const result = extractResourceMatcher(queries, filters);
- expect(result).toBe('{instance="localhost",job!="testjob"}');
- });
-
- it('should extract matcher as match-all from no query and filter', () => {
- const queries: PromQuery[] = [];
- const filters: AdHocVariableFilter[] = [];
-
- const result = extractResourceMatcher(queries, filters);
- expect(result).toBeUndefined();
- });
-
- it('should extract the correct matcher for queries with `... or vector(0)`', () => {
- const queries: PromQuery[] = [
- {
- refId: 'A',
- expr: `sum(increase(go_cpu_classes_idle_cpu_seconds_total[$__rate_interval])) or vector(0)`,
- },
- ];
- const filters: AdHocVariableFilter[] = [];
-
- const result = extractResourceMatcher(queries, filters);
- expect(result).toBe('{__name__=~"go_cpu_classes_idle_cpu_seconds_total"}');
- });
- });
-});
-
-describe('PrometheusDatasource2', () => {
- const instanceSettings = {
- url: 'proxied',
- uid: 'ABCDEF',
- user: 'test',
- password: 'mupp',
- jsonData: { httpMethod: 'GET', cacheLevel: PrometheusCacheLevel.None },
- } as unknown as DataSourceInstanceSettings;
-
- let ds: PrometheusDatasource;
- beforeEach(() => {
- ds = new PrometheusDatasource(instanceSettings, templateSrvStub);
- });
-
- it('should give back 1 exemplar target when multiple queries with exemplar enabled and same metric', () => {
- const targetA: PromQuery = {
- refId: 'A',
- expr: 'histogram_quantile(0.95, sum(rate(tns_request_duration_seconds_bucket[5m])) by (le))',
- exemplar: true,
- };
- const targetB: PromQuery = {
- refId: 'B',
- expr: 'histogram_quantile(0.5, sum(rate(tns_request_duration_seconds_bucket[5m])) by (le))',
- exemplar: true,
- };
-
- ds.languageProvider = {
- retrieveHistogramMetrics: jest.fn().mockReturnValue(['tns_request_duration_seconds_bucket']),
- } as unknown as PrometheusLanguageProviderInterface;
-
- const request = {
- targets: [targetA, targetB],
- interval: '1s',
- panelId: '',
- } as unknown as DataQueryRequest;
-
- const Aexemplars = ds.shouldRunExemplarQuery(targetA, request);
- const BExpemplars = ds.shouldRunExemplarQuery(targetB, request);
-
- expect(Aexemplars).toBe(true);
- expect(BExpemplars).toBe(false);
- });
-});
-
-describe('When querying prometheus via check headers X-Dashboard-Id X-Panel-Id and X-Dashboard-UID', () => {
- const options = { panelId: 2, dashboardUID: 'WFlOM-jM1' } as DataQueryRequest;
- const httpOptions = {
- headers: {} as { [key: string]: number | undefined },
- } as PromQueryRequest;
- const instanceSettings = {
- url: 'proxied',
- directUrl: 'direct',
- user: 'test',
- password: 'mupp',
- access: 'proxy',
- jsonData: { httpMethod: 'POST' },
- } as unknown as DataSourceInstanceSettings;
-
- let ds: PrometheusDatasource;
- beforeEach(() => {
- ds = new PrometheusDatasource(instanceSettings, templateSrvStub as unknown as TemplateSrv);
- });
-
- it('with proxy access tracing headers should be added', () => {
- ds._addTracingHeaders(httpOptions, options);
- expect(httpOptions.headers['X-Panel-Id']).toBe(options.panelId);
- expect(httpOptions.headers['X-Dashboard-UID']).toBe(options.dashboardUID);
- });
-
- it('with direct access tracing headers should not be added', () => {
- const instanceSettings = {
- url: 'proxied',
- directUrl: 'direct',
- user: 'test',
- password: 'mupp',
- jsonData: { httpMethod: 'POST' },
- } as unknown as DataSourceInstanceSettings;
-
- const mockDs = new PrometheusDatasource({ ...instanceSettings, url: 'http://127.0.0.1:8000' }, templateSrvStub);
- mockDs._addTracingHeaders(httpOptions, options);
- expect(httpOptions.headers['X-Dashboard-Id']).toBe(undefined);
- expect(httpOptions.headers['X-Panel-Id']).toBe(undefined);
- expect(httpOptions.headers['X-Dashboard-UID']).toBe(undefined);
- });
-});
-
-describe('modifyQuery', () => {
- describe('when called with ADD_FILTER', () => {
- describe('and query has no labels', () => {
- it('then the correct label should be added', () => {
- const query: PromQuery = { refId: 'A', expr: 'go_goroutines' };
- const action = { options: { key: 'cluster', value: 'us-cluster' }, type: 'ADD_FILTER' };
- const instanceSettings = { jsonData: {} } as unknown as DataSourceInstanceSettings;
- const ds = new PrometheusDatasource(instanceSettings, templateSrvStub);
-
- const result = ds.modifyQuery(query, action);
-
- expect(result.refId).toEqual('A');
- expect(result.expr).toEqual('go_goroutines{cluster="us-cluster"}');
- });
- });
-
- describe('and query has labels', () => {
- it('then the correct label should be added', () => {
- const query: PromQuery = { refId: 'A', expr: 'go_goroutines{cluster="us-cluster"}' };
- const action = { options: { key: 'pod', value: 'pod-123' }, type: 'ADD_FILTER' };
- const instanceSettings = { jsonData: {} } as unknown as DataSourceInstanceSettings;
- const ds = new PrometheusDatasource(instanceSettings, templateSrvStub);
-
- const result = ds.modifyQuery(query, action);
-
- expect(result.refId).toEqual('A');
- expect(result.expr).toEqual('go_goroutines{cluster="us-cluster", pod="pod-123"}');
- });
- });
- });
-
- describe('when called with ADD_FILTER_OUT', () => {
- describe('and query has no labels', () => {
- it('then the correct label should be added', () => {
- const query: PromQuery = { refId: 'A', expr: 'go_goroutines' };
- const action = { options: { key: 'cluster', value: 'us-cluster' }, type: 'ADD_FILTER_OUT' };
- const instanceSettings = { jsonData: {} } as unknown as DataSourceInstanceSettings;
- const ds = new PrometheusDatasource(instanceSettings, templateSrvStub);
-
- const result = ds.modifyQuery(query, action);
-
- expect(result.refId).toEqual('A');
- expect(result.expr).toEqual('go_goroutines{cluster!="us-cluster"}');
- });
- });
-
- describe('and query has labels', () => {
- it('then the correct label should be added', () => {
- const query: PromQuery = { refId: 'A', expr: 'go_goroutines{cluster="us-cluster"}' };
- const action = { options: { key: 'pod', value: 'pod-123' }, type: 'ADD_FILTER_OUT' };
- const instanceSettings = { jsonData: {} } as unknown as DataSourceInstanceSettings;
- const ds = new PrometheusDatasource(instanceSettings, templateSrvStub);
-
- const result = ds.modifyQuery(query, action);
-
- expect(result.refId).toEqual('A');
- expect(result.expr).toEqual('go_goroutines{cluster="us-cluster", pod!="pod-123"}');
- });
- });
-
- describe('scope filters', () => {
- const instanceSettings = {
- access: 'proxy',
- jsonData: {},
- name: 'scoped-prom',
- readOnly: false,
- type: 'prometheus',
- uid: 'scoped-prom',
- } as unknown as DataSourceInstanceSettings;
- const ds = new PrometheusDatasource(instanceSettings, templateSrvStub);
-
- it('should convert each adhoc operator to scope operator properly', () => {
- const adhocFilter: AdHocVariableFilter[] = [
- { key: 'eq', value: 'eqv', operator: '=' },
- {
- key: 'neq',
- value: 'neqv',
- operator: '!=',
- },
- { key: 'reg', value: 'regv', operator: '=~' },
- { key: 'nreg', value: 'nregv', operator: '!~' },
- { key: 'foo', value: 'bar', operator: '=|' },
- { key: 'bar', value: 'baz', operator: '!=|' },
- ];
- const expectedScopeFilter: ScopeSpecFilter[] = [
- { key: 'eq', value: 'eqv', operator: 'equals' },
- {
- key: 'neq',
- value: 'neqv',
- operator: 'not-equals',
- },
- { key: 'reg', value: 'regv', operator: 'regex-match' },
- { key: 'nreg', value: 'nregv', operator: 'regex-not-match' },
- { key: 'foo', value: 'bar', operator: 'one-of' },
- { key: 'bar', value: 'baz', operator: 'not-one-of' },
- ];
- const result = ds.generateScopeFilters(adhocFilter);
- result.forEach((r, i) => {
- expect(r).toEqual(expectedScopeFilter[i]);
- });
- });
- });
- });
-});
-
-describe('PrometheusDatasource incremental query logic', () => {
- let ds: PrometheusDatasource;
- let mockCache: {
- requestInfo: jest.MockedFunction<(request: DataQueryRequest) => CacheRequestInfo>;
- procFrames: jest.MockedFunction<(...args: unknown[]) => unknown[]>;
- };
-
- beforeEach(() => {
- jest.clearAllMocks();
-
- mockCache = {
- requestInfo: jest.fn().mockReturnValue({
- requests: [{ targets: [], range: getMockTimeRange() }],
- targetSignatures: new Map(),
- shouldCache: true,
- }),
- procFrames: jest.fn().mockReturnValue([]),
- };
-
- const incrementalInstanceSettings = {
- url: 'proxied',
- uid: 'ABCDEF',
- access: 'proxy',
- user: 'test',
- password: 'mupp',
- jsonData: {
- customQueryParameters: '',
- cacheLevel: PrometheusCacheLevel.Low,
- incrementalQuerying: true,
- } as Partial,
- } as unknown as DataSourceInstanceSettings;
-
- ds = new PrometheusDatasource(incrementalInstanceSettings, templateSrvStub);
- ds.cache = mockCache as unknown as typeof ds.cache;
- });
-
- afterEach(() => {
- jest.restoreAllMocks();
- });
-
- it('should use incremental query for normal queries when incrementalQuerying is true', async () => {
- const request = createDataRequest([{ expr: 'up', refId: 'A' }]);
- await lastValueFrom(ds.query(request));
- expect(mockCache.requestInfo).toHaveBeenCalled();
- });
-
- it('should disable incremental query when query contains $__range', async () => {
- const request = createDataRequest([{ expr: 'rate(up[$__range])', refId: 'A' }]);
- await lastValueFrom(ds.query(request));
- expect(mockCache.requestInfo).not.toHaveBeenCalled();
- });
-
- it('should disable incremental query when public dashboards are being used', async () => {
- config.publicDashboardAccessToken = 'token';
- const request = createDataRequest([{ expr: 'rate(up[5m])', refId: 'A' }]);
- await lastValueFrom(ds.query(request));
- expect(mockCache.requestInfo).not.toHaveBeenCalled();
- });
-
- it('should disable incremental query when any target contains $__range', async () => {
- const request = createDataRequest([
- { expr: 'up', refId: 'A' },
- { expr: 'rate(cpu[$__range])', refId: 'B' },
- ]);
- await lastValueFrom(ds.query(request));
- expect(mockCache.requestInfo).not.toHaveBeenCalled();
- });
-
- it('should disable incremental query for instant queries', async () => {
- const request = createDataRequest([{ expr: 'up', refId: 'A', instant: true }]);
- await lastValueFrom(ds.query(request));
- expect(mockCache.requestInfo).not.toHaveBeenCalled();
- });
-});
diff --git a/packages/grafana-prometheus/src/datasource.ts b/packages/grafana-prometheus/src/datasource.ts
deleted file mode 100644
index 6094a015a52..00000000000
--- a/packages/grafana-prometheus/src/datasource.ts
+++ /dev/null
@@ -1,937 +0,0 @@
-import { defaults } from 'lodash';
-import { tz } from 'moment-timezone';
-import { lastValueFrom, type Observable, throwError } from 'rxjs';
-import { map, tap } from 'rxjs/operators';
-import { gte } from 'semver';
-
-import {
- type AbstractQuery,
- type AdHocVariableFilter,
- CoreApp,
- type CustomVariableModel,
- type DataQueryRequest,
- type DataQueryResponse,
- type DataSourceGetTagKeysOptions,
- type DataSourceGetTagValuesOptions,
- type DataSourceInstanceSettings,
- type DataSourceWithQueryExportSupport,
- type DataSourceWithQueryImportSupport,
- dateTime,
- getDefaultTimeRange,
- type LegacyMetricFindQueryOptions,
- type MetricFindValue,
- type QueryFixAction,
- type QueryVariableModel,
- rangeUtil,
- type ScopedVars,
- scopeFilterOperatorMap,
- type ScopeSpecFilter,
- type TimeRange,
-} from '@grafana/data';
-import {
- type BackendSrvRequest,
- config,
- DataSourceWithBackend,
- type FetchResponse,
- getBackendSrv,
- getTemplateSrv,
- isFetchError,
- type TemplateSrv,
-} from '@grafana/runtime';
-
-import { addLabelToQuery } from './add_label_to_query';
-import { PrometheusAnnotationSupport } from './annotations';
-import { DEFAULT_SERIES_LIMIT, GET_AND_POST_METADATA_ENDPOINTS, InstantQueryRefIdIndex } from './constants';
-import { interpolateQueryExpr, prometheusRegularEscape } from './escaping';
-import {
- exportToAbstractQuery,
- importFromAbstractQuery,
- populateMatchParamsFromQueries,
- PrometheusLanguageProvider,
- type PrometheusLanguageProviderInterface,
-} from './language_provider';
-import { expandRecordingRules, getPrometheusTime, getRangeSnapInterval } from './language_utils';
-import { PrometheusMetricFindQuery } from './metric_find_query';
-import { getQueryHints } from './query_hints';
-import { renderLabelsWithoutBrackets } from './querybuilder/shared/rendering/labels';
-import { type QueryBuilderLabelFilter, type QueryEditorMode } from './querybuilder/shared/types';
-import { type CacheRequestInfo, defaultPrometheusQueryOverlapWindow, QueryCache } from './querycache/QueryCache';
-import { transformV2 } from './result_transformer';
-import { trackQuery } from './tracking';
-import {
- type ExemplarTraceIdDestination,
- PromApplication,
- PrometheusCacheLevel,
- type PromOptions,
- type PromQuery,
- type PromQueryRequest,
- type RawRecordingRules,
- type RuleQueryMapping,
-} from './types';
-import { utf8Support, wrapUtf8Filters } from './utf8_support';
-import { PrometheusVariableSupport } from './variables';
-
-export class PrometheusDatasource
- extends DataSourceWithBackend
- implements DataSourceWithQueryImportSupport, DataSourceWithQueryExportSupport
-{
- access: 'direct' | 'proxy';
- basicAuth: any;
- cache: QueryCache;
- cacheLevel: PrometheusCacheLevel;
- customQueryParameters: URLSearchParams;
- datasourceConfigurationPrometheusFlavor?: PromApplication;
- datasourceConfigurationPrometheusVersion?: string;
- disableRecordingRules: boolean;
- exemplarTraceIdDestinations: ExemplarTraceIdDestination[] | undefined;
- exemplarsAvailable: boolean;
- hasIncrementalQuery: boolean;
- httpMethod: string;
- interval: string;
- languageProvider: PrometheusLanguageProviderInterface;
- lookupsDisabled: boolean;
- ruleMappings: RuleQueryMapping;
- seriesEndpoint: boolean;
- seriesLimit: number;
- type: string;
- url: string;
- withCredentials: boolean;
- defaultEditor?: QueryEditorMode;
-
- constructor(
- public readonly instanceSettings: DataSourceInstanceSettings,
- private readonly templateSrv: TemplateSrv = getTemplateSrv(),
- languageProvider?: PrometheusLanguageProviderInterface
- ) {
- super(instanceSettings);
-
- // DATASOURCE CONFIGURATION PROPERTIES
- this.access = instanceSettings.access;
- this.basicAuth = instanceSettings.basicAuth;
- this.cache = new QueryCache({
- getTargetSignature: this.getPrometheusTargetSignature.bind(this),
- overlapString: instanceSettings.jsonData.incrementalQueryOverlapWindow ?? defaultPrometheusQueryOverlapWindow,
- applyInterpolation: this.interpolateString.bind(this),
- });
- this.cacheLevel = instanceSettings.jsonData.cacheLevel ?? PrometheusCacheLevel.Low;
- this.customQueryParameters = new URLSearchParams(instanceSettings.jsonData.customQueryParameters);
- this.datasourceConfigurationPrometheusFlavor = instanceSettings.jsonData.prometheusType;
- this.datasourceConfigurationPrometheusVersion = instanceSettings.jsonData.prometheusVersion;
- this.disableRecordingRules = instanceSettings.jsonData.disableRecordingRules ?? false;
- this.exemplarTraceIdDestinations = instanceSettings.jsonData.exemplarTraceIdDestinations;
- this.exemplarsAvailable = true;
- this.hasIncrementalQuery = instanceSettings.jsonData.incrementalQuerying ?? false;
- this.httpMethod = instanceSettings.jsonData.httpMethod || 'GET';
- this.interval = instanceSettings.jsonData.timeInterval || '15s';
- this.lookupsDisabled = instanceSettings.jsonData.disableMetricsLookup ?? false;
- this.ruleMappings = {};
- this.seriesEndpoint = instanceSettings.jsonData.seriesEndpoint ?? false;
- this.seriesLimit = instanceSettings.jsonData.seriesLimit ?? DEFAULT_SERIES_LIMIT;
- this.type = 'prometheus';
- this.url = instanceSettings.url!;
- this.withCredentials = Boolean(instanceSettings.withCredentials);
- this.defaultEditor = instanceSettings.jsonData.defaultEditor;
-
- // INHERITED PROPERTIES
- this.annotations = PrometheusAnnotationSupport(this);
- this.variables = new PrometheusVariableSupport(this, this.templateSrv);
-
- // LANGUAGE PROVIDER
- // This needs to be the last thing we initialize.
- this.languageProvider = languageProvider ?? new PrometheusLanguageProvider(this);
- }
-
- /**
- * Initializes the Prometheus datasource by loading recording rules and checking exemplar availability.
- *
- * This method performs two key initialization tasks: Loads recording rules from the
- * Prometheus API and checks if exemplars are available by testing the exemplars API endpoint.
- */
- init = async (): Promise => {
- if (!this.disableRecordingRules) {
- this.loadRules();
- }
- this.exemplarsAvailable = await this.areExemplarsAvailable();
- };
-
- /**
- * Loads recording rules from the Prometheus API and extracts rule mappings.
- *
- * This method fetches rules from the `/api/v1/rules` endpoint and processes
- * them to create a mapping of rule names to their corresponding queries and labels.
- * The rules API is experimental, so errors are logged but not thrown.
- */
- private async loadRules(): Promise {
- try {
- const params = {};
- const options = { showErrorAlert: false };
- const res = await this.metadataRequest('/api/v1/rules', params, options);
- const ruleGroups = res.data?.data?.groups;
-
- if (ruleGroups) {
- this.ruleMappings = extractRuleMappingFromGroups(ruleGroups);
- }
- } catch (err) {
- console.log('Rules API is experimental. Ignore next error.');
- console.error(err);
- }
- }
-
- /**
- * Checks if exemplars are available by testing the exemplars API endpoint.
- *
- * This method makes a test request to the `/api/v1/query_exemplars` endpoint to determine
- * if the Prometheus instance supports exemplars. The test uses a simple query with a
- * 30-minute time range. If the request succeeds with a 'success' status, exemplars
- * are considered available. Errors are caught and return false to avoid breaking
- * the datasource initialization.
- */
- private async areExemplarsAvailable(): Promise {
- try {
- const params = {
- query: 'test',
- start: dateTime().subtract(30, 'minutes').valueOf().toString(),
- end: dateTime().valueOf().toString(),
- };
- const options = { showErrorAlert: false };
- const res = await this.metadataRequest('/api/v1/query_exemplars', params, options);
-
- return res.data.status === 'success';
- } catch (err) {
- return false;
- }
- }
-
- getQueryDisplayText(query: PromQuery) {
- return query.expr;
- }
-
- /**
- * Get target signature for query caching
- * @param request
- * @param query
- */
- getPrometheusTargetSignature(request: DataQueryRequest, query: PromQuery) {
- const targExpr = this.interpolateString(query.expr);
- return `${targExpr}|${query.interval ?? request.interval}|${JSON.stringify(request.rangeRaw ?? '')}|${
- query.exemplar
- }`;
- }
-
- hasLabelsMatchAPISupport(): boolean {
- // users may choose the series endpoint as it has a POST method
- // while the label values is only GET
- if (this.seriesEndpoint) {
- return false;
- }
-
- return (
- // https://github.com/prometheus/prometheus/releases/tag/v2.24.0
- this._isDatasourceVersionGreaterOrEqualTo('2.24.0', PromApplication.Prometheus) ||
- // All versions of Mimir support matchers for labels API
- this._isDatasourceVersionGreaterOrEqualTo('2.0.0', PromApplication.Mimir) ||
- // https://github.com/cortexproject/cortex/discussions/4542
- this._isDatasourceVersionGreaterOrEqualTo('1.11.0', PromApplication.Cortex) ||
- // https://github.com/thanos-io/thanos/pull/3566
- //https://github.com/thanos-io/thanos/releases/tag/v0.18.0
- this._isDatasourceVersionGreaterOrEqualTo('0.18.0', PromApplication.Thanos)
- );
- }
-
- _isDatasourceVersionGreaterOrEqualTo(targetVersion: string, targetFlavor: PromApplication): boolean {
- // User hasn't configured flavor/version yet, default behavior is to support labels match api support
- if (!this.datasourceConfigurationPrometheusVersion || !this.datasourceConfigurationPrometheusFlavor) {
- return true;
- }
-
- if (targetFlavor !== this.datasourceConfigurationPrometheusFlavor) {
- return false;
- }
-
- return gte(this.datasourceConfigurationPrometheusVersion, targetVersion);
- }
-
- _addTracingHeaders(httpOptions: PromQueryRequest, options: DataQueryRequest) {
- httpOptions.headers = {};
- if (this.access === 'proxy') {
- httpOptions.headers['X-Dashboard-UID'] = options.dashboardUID;
- httpOptions.headers['X-Panel-Id'] = options.panelId;
- }
- }
-
- directAccessError() {
- return throwError(
- () =>
- new Error(
- 'Browser access mode in the Prometheus datasource is no longer available. Switch to server access mode.'
- )
- );
- }
-
- /**
- * Any request done from this data source should go through here as it contains some common processing for the
- * request. Any processing done here needs to be also copied on the backend as this goes through data source proxy
- * but not through the same code as alerting.
- */
- _request(
- url: string,
- data: Record | null,
- overrides: Partial = {}
- ): Observable> {
- if (this.access === 'direct') {
- return this.directAccessError();
- }
-
- data = data || {};
- for (const [key, value] of this.customQueryParameters) {
- if (data[key] == null) {
- data[key] = value;
- }
- }
-
- let queryUrl = this.url + url;
- if (url.startsWith(`/api/datasources/uid/${this.uid}`)) {
- // This url is meant to be a replacement for the whole URL. Replace the entire URL
- queryUrl = url;
- }
-
- const options: BackendSrvRequest = defaults(overrides, {
- url: queryUrl,
- method: this.httpMethod,
- headers: {},
- });
-
- if (options.method === 'GET') {
- if (data && Object.keys(data).length) {
- options.url =
- options.url +
- (options.url.search(/\?/) >= 0 ? '&' : '?') +
- Object.entries(data)
- .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
- .join('&');
- }
- } else {
- if (!options.headers!['Content-Type']) {
- options.headers!['Content-Type'] = 'application/x-www-form-urlencoded';
- }
- options.data = data;
- }
-
- if (this.basicAuth || this.withCredentials) {
- options.withCredentials = true;
- }
-
- if (this.basicAuth) {
- options.headers!.Authorization = this.basicAuth;
- }
-
- return getBackendSrv().fetch(options);
- }
-
- async importFromAbstractQueries(abstractQueries: AbstractQuery[]): Promise {
- return abstractQueries.map((abstractQuery) => importFromAbstractQuery(abstractQuery));
- }
-
- async exportToAbstractQueries(queries: PromQuery[]): Promise {
- return queries.map((query) => exportToAbstractQuery(query));
- }
-
- // Use this for tab completion features, wont publish response to other components
- async metadataRequest(url: string, params = {}, options?: Partial) {
- // If URL includes endpoint that supports POST and GET method, try to use configured method. This might fail as POST is supported only in v2.10+.
- if (GET_AND_POST_METADATA_ENDPOINTS.some((endpoint) => url.includes(endpoint))) {
- try {
- return await lastValueFrom(
- this._request(`/api/datasources/uid/${this.uid}/resources${url}`, params, {
- method: this.httpMethod,
- hideFromInspector: true,
- showErrorAlert: false,
- ...options,
- })
- );
- } catch (err) {
- // If status code of error is Method Not Allowed (405) and HTTP method is POST, retry with GET
- if (this.httpMethod === 'POST' && isFetchError(err) && (err.status === 405 || err.status === 400)) {
- console.warn(`Couldn't use configured POST HTTP method for this request. Trying to use GET method instead.`);
- } else {
- throw err;
- }
- }
- }
-
- return await lastValueFrom(
- this._request(`/api/datasources/uid/${this.uid}/resources${url}`, params, {
- method: 'GET',
- hideFromInspector: true,
- ...options,
- })
- ); // toPromise until we change getTagValues, getLabelNames to Observable
- }
-
- interpolateQueryExpr(value: string | string[] = [], variable: QueryVariableModel | CustomVariableModel) {
- return interpolateQueryExpr(value, variable);
- }
-
- targetContainsTemplate(target: PromQuery) {
- return this.templateSrv.containsTemplate(target.expr);
- }
-
- shouldRunExemplarQuery(target: PromQuery, request: DataQueryRequest): boolean {
- if (target.exemplar) {
- // We check all already processed targets and only create exemplar target for not used metric names
- const metricName = this.languageProvider.retrieveHistogramMetrics().find((m) => target.expr.includes(m));
- // Remove targets that weren't processed yet (in targets array they are after current target)
- const currentTargetIdx = request.targets.findIndex((t) => t.refId === target.refId);
- const targets = request.targets.slice(0, currentTargetIdx).filter((t) => !t.hide);
-
- if (!metricName || (metricName && !targets.some((t) => t.expr.includes(metricName)))) {
- return true;
- }
- return false;
- }
- return false;
- }
-
- processTargetV2(target: PromQuery, request: DataQueryRequest) {
- // The `utcOffsetSec` parameter is required by the backend to correctly align time ranges.
- // This alignment ensures that relative time ranges (e.g., "Last N hours/days/years") are adjusted
- // according to the user's selected time zone, rather than defaulting to UTC.
- //
- // Example: If the user selects "Last 5 days," each day should begin at 00:00 in the chosen time zone,
- // rather than at 00:00 UTC, ensuring an accurate breakdown.
- //
- // This adjustment does not apply to absolute time ranges, where users explicitly set
- // the start and end timestamps.
- //
- // Handling `utcOffsetSec`:
- // - When using the browser's time zone, the UTC offset is derived from the request range object.
- // - When the user selects a custom time zone, the UTC offset must be calculated accordingly.
- // More details:
- // - Issue that led to the introduction of utcOffsetSec: https://github.com/grafana/grafana/issues/17278
- // - Implementation PR: https://github.com/grafana/grafana/pull/17477
- let utcOffset = request.range.to.utcOffset();
- if (request.timezone === 'browser') {
- // we need to check if the request is a relative or absolute range.
- // if it is absolute time range then utcOffset must be 0. we don't care the offset
- // because we are already sending the from and to values in utc. we don't need to adjust them again
- // for relative ranges we need utcOffset to adjust query range.
- utcOffset = this.isUsingRelativeTimeRange(request.range) ? utcOffset : 0;
- } else {
- utcOffset = tz(request.timezone).utcOffset();
- }
-
- const processedTargets: PromQuery[] = [];
- const processedTarget = {
- ...target,
- exemplar: this.shouldRunExemplarQuery(target, request),
- requestId: request.panelId + target.refId,
- utcOffsetSec: utcOffset * 60,
- };
-
- if (request.scopes) {
- processedTarget.scopes = (request.scopes ?? []).map((scope) => ({
- name: scope.metadata.name,
- ...scope.spec,
- }));
- }
-
- if (config.featureToggles.groupByVariable || config.featureToggles.dashboardUnifiedDrilldownControls) {
- processedTarget.groupByKeys = request.groupByKeys;
- }
-
- if (target.instant && target.range) {
- // We have query type "Both" selected
- // We should send separate queries with different refId
- processedTargets.push(
- {
- ...processedTarget,
- refId: processedTarget.refId,
- instant: false,
- },
- {
- ...processedTarget,
- refId: processedTarget.refId + InstantQueryRefIdIndex,
- range: false,
- exemplar: false,
- }
- );
- } else {
- processedTargets.push(processedTarget);
- }
-
- return processedTargets;
- }
-
- query(request: DataQueryRequest): Observable {
- if (this.access === 'direct') {
- return this.directAccessError();
- }
-
- // Use incremental query only if enabled and no instant queries or no $__range variables
- const shouldUseIncrementalQuery =
- this.hasIncrementalQuery &&
- !config.publicDashboardAccessToken &&
- !request.targets.some((target) => target.instant || target.expr?.includes('$__range'));
-
- let fullOrPartialRequest: DataQueryRequest = request;
- let requestInfo: CacheRequestInfo | undefined = undefined;
-
- if (shouldUseIncrementalQuery) {
- requestInfo = this.cache.requestInfo(request);
- fullOrPartialRequest = requestInfo.requests[0];
- }
-
- const targets = fullOrPartialRequest.targets.map((target) => this.processTargetV2(target, fullOrPartialRequest));
- const startTime = new Date();
- return super.query({ ...fullOrPartialRequest, targets: targets.flat() }).pipe(
- map((response) => {
- const amendedResponse = {
- ...response,
- data: this.cache.procFrames(request, requestInfo, response.data),
- };
- return transformV2(amendedResponse, request, {
- exemplarTraceIdDestinations: this.exemplarTraceIdDestinations,
- });
- }),
- tap((response: DataQueryResponse) => {
- trackQuery(response, request, startTime);
- })
- );
- }
-
- metricFindQuery(query: string, options?: LegacyMetricFindQueryOptions) {
- if (!query) {
- return Promise.resolve([]);
- }
-
- const timeRange = options?.range ?? getDefaultTimeRange();
-
- const scopedVars = {
- ...this.getIntervalVars(),
- ...this.getRangeScopedVars(timeRange),
- };
- const interpolated = this.templateSrv.replace(query, scopedVars, this.interpolateQueryExpr);
- const metricFindQuery = new PrometheusMetricFindQuery(this, interpolated);
- return metricFindQuery.process(timeRange);
- }
-
- getIntervalVars() {
- return {
- __interval: { text: this.interval, value: this.interval },
- __interval_ms: { text: rangeUtil.intervalToMs(this.interval), value: rangeUtil.intervalToMs(this.interval) },
- };
- }
-
- getRangeScopedVars(range: TimeRange) {
- const msRange = range.to.diff(range.from);
- const sRange = Math.round(msRange / 1000);
- return {
- __range_ms: { text: msRange, value: msRange },
- __range_s: { text: sRange, value: sRange },
- __range: { text: sRange + 's', value: sRange + 's' },
- };
- }
-
- // By implementing getTagKeys and getTagValues we add ad-hoc filters functionality
- // this is used to get label keys, a.k.a label names
- // it is used in metric_find_query.ts
- // and in Tempo here grafana/public/app/plugins/datasource/tempo/QueryEditor/ServiceGraphSection.tsx
- async getTagKeys(options: DataSourceGetTagKeysOptions): Promise {
- if (!options.timeRange) {
- options.timeRange = getDefaultTimeRange();
- }
-
- if ((options?.scopes?.length ?? 0) > 0) {
- const suggestions = await this.languageProvider.fetchSuggestions(
- options.timeRange,
- options.queries,
- options.scopes,
- options.filters
- );
-
- // filter out already used labels and empty labels
- return suggestions
- .filter((labelName) => !!labelName && !options.filters.find((filter) => filter.key === labelName))
- .map((k) => ({ value: k, text: k }));
- }
-
- const match = extractResourceMatcher(options.queries ?? [], options.filters);
-
- let labelKeys: string[] = await this.languageProvider.queryLabelKeys(options.timeRange, match);
-
- // filter out already used labels
- return labelKeys
- .filter((labelName) => !options.filters.find((filter) => filter.key === labelName))
- .map((k) => ({ value: k, text: k }));
- }
-
- // By implementing getGroupByKeys we add group by variable support independently from adhoc filters.
- // It delegates to getTagKeys
- async getGroupByKeys(options: DataSourceGetTagKeysOptions): Promise {
- return this.getTagKeys(options);
- }
-
- // By implementing getTagKeys and getTagValues we add ad-hoc filters functionality
- async getTagValues(options: DataSourceGetTagValuesOptions): Promise {
- if (!options.timeRange) {
- options.timeRange = getDefaultTimeRange();
- }
-
- const requestId = `[${this.uid}][${options.key}]`;
- if ((options?.scopes?.length ?? 0) > 0) {
- return (
- await this.languageProvider.fetchSuggestions(
- options.timeRange,
- options.queries,
- options.scopes,
- options.filters,
- options.key,
- undefined,
- requestId
- )
- ).map((v) => ({ value: v, text: v }));
- }
-
- const match = extractResourceMatcher(options.queries ?? [], options.filters);
-
- return (await this.languageProvider.queryLabelValues(options.timeRange, options.key, match)).map((v) => ({
- value: v,
- text: v,
- }));
- }
-
- interpolateVariablesInQueries(
- queries: PromQuery[],
- scopedVars: ScopedVars,
- filters?: AdHocVariableFilter[]
- ): PromQuery[] {
- let expandedQueries = queries;
- if (queries && queries.length) {
- expandedQueries = queries.map((query) => {
- const interpolatedQuery = this.templateSrv.replace(
- query.expr,
- scopedVars,
- this.interpolateExploreMetrics(query.fromExploreMetrics)
- );
- const replacedInterpolatedQuery = targetHasScopes(query)
- ? interpolatedQuery
- : this.templateSrv.replace(
- this.enhanceExprWithAdHocFilters(filters, interpolatedQuery),
- scopedVars,
- this.interpolateQueryExpr
- );
-
- const expandedQuery = {
- ...query,
- ...(query.scopes && query.scopes.length > 0 ? { adhocFilters: this.generateScopeFilters(filters) } : {}),
- datasource: this.getRef(),
- expr: replacedInterpolatedQuery,
- interval: this.templateSrv.replace(query.interval, scopedVars),
- };
-
- return expandedQuery;
- });
- }
- return expandedQueries;
- }
-
- getQueryHints(query: PromQuery, result: unknown[]) {
- return getQueryHints(query.expr ?? '', result, this);
- }
-
- modifyQuery(query: PromQuery, action: QueryFixAction): PromQuery {
- let expression = query.expr ?? '';
- switch (action.type) {
- case 'ADD_FILTER': {
- const { key, value } = action.options ?? {};
- if (key && value) {
- expression = addLabelToQuery(expression, key, value);
- }
-
- break;
- }
- case 'ADD_FILTER_OUT': {
- const { key, value } = action.options ?? {};
- if (key && value) {
- expression = addLabelToQuery(expression, key, value, '!=');
- }
- break;
- }
- case 'ADD_HISTOGRAM_QUANTILE': {
- expression = `histogram_quantile(0.95, sum(rate(${expression}[$__rate_interval])) by (le))`;
- break;
- }
- case 'ADD_HISTOGRAM_AVG': {
- expression = `histogram_avg(rate(${expression}[$__rate_interval]))`;
- break;
- }
- case 'ADD_HISTOGRAM_FRACTION': {
- expression = `histogram_fraction(0,0.2,rate(${expression}[$__rate_interval]))`;
- break;
- }
- case 'ADD_HISTOGRAM_COUNT': {
- expression = `histogram_count(rate(${expression}[$__rate_interval]))`;
- break;
- }
- case 'ADD_HISTOGRAM_SUM': {
- expression = `histogram_sum(rate(${expression}[$__rate_interval]))`;
- break;
- }
- case 'ADD_HISTOGRAM_STDDEV': {
- expression = `histogram_stddev(rate(${expression}[$__rate_interval]))`;
- break;
- }
- case 'ADD_HISTOGRAM_STDVAR': {
- expression = `histogram_stdvar(rate(${expression}[$__rate_interval]))`;
- break;
- }
- case 'ADD_RATE': {
- expression = `rate(${expression}[$__rate_interval])`;
- break;
- }
- case 'ADD_SUM': {
- expression = `sum(${expression.trim()}) by ($1)`;
- break;
- }
- case 'EXPAND_RULES': {
- if (action.options) {
- expression = expandRecordingRules(expression, action.options as any);
- }
- break;
- }
- default:
- break;
- }
- return { ...query, expr: expression };
- }
-
- /**
- * Returns the adjusted "snapped" interval parameters
- */
- getAdjustedInterval(timeRange: TimeRange): { start: string; end: string } {
- return getRangeSnapInterval(this.cacheLevel, timeRange);
- }
-
- /**
- * This will return a time range that always includes the users current time range,
- * and then a little extra padding to round up/down to the nearest nth minute,
- * defined by the result of the getCacheDurationInMinutes.
- *
- * For longer cache durations, and shorter query durations,
- * the window we're calculating might be much bigger then the user's current window,
- * resulting in us returning labels/values that might not be applicable for the given window,
- * this is a necessary trade-off if we want to cache larger durations
- */
- getTimeRangeParams(timeRange: TimeRange): { start: string; end: string } {
- return {
- start: getPrometheusTime(timeRange.from, false).toString(),
- end: getPrometheusTime(timeRange.to, true).toString(),
- };
- }
-
- /**
- * This converts the adhocVariableFilter array and converts it to scopeFilter array
- * @param filters
- */
- generateScopeFilters(filters?: AdHocVariableFilter[]): ScopeSpecFilter[] {
- if (!filters) {
- return [];
- }
-
- return filters.map((f) => ({
- key: f.key,
- operator: scopeFilterOperatorMap[f.operator],
- value: this.templateSrv.replace(f.value, {}, this.interpolateQueryExpr),
- values: f.values?.map((v) => this.templateSrv.replace(v, {}, this.interpolateQueryExpr)),
- }));
- }
-
- enhanceExprWithAdHocFilters(filters: AdHocVariableFilter[] | undefined, expr: string) {
- if (!filters || filters.length === 0) {
- return expr;
- }
-
- const finalQuery = filters.map(remapOneOf).reduce((acc, filter) => {
- const { key, operator } = filter;
- let { value } = filter;
- if (operator === '=~' || operator === '!~') {
- value = prometheusRegularEscape(value);
- }
- return addLabelToQuery(acc, key, value, operator);
- }, expr);
- return finalQuery;
- }
-
- // Used when running queries through backend
- filterQuery(query: PromQuery): boolean {
- if (query.hide || !query.expr) {
- return false;
- }
- return true;
- }
-
- // Used when running queries through backend
- applyTemplateVariables(target: PromQuery, scopedVars: ScopedVars, filters?: AdHocVariableFilter[]) {
- const variables = { ...scopedVars };
-
- // We want to interpolate these variables on backend.
- // The pre-calculated values are replaced withe the variable strings.
- variables.__interval = {
- value: '$__interval',
- };
- variables.__interval_ms = {
- value: '$__interval_ms',
- };
-
- // interpolate expression
-
- // We need a first replace to evaluate variables before applying adhoc filters
- // This is required for an expression like `metric > $VAR` where $VAR is a float to which we must not add adhoc filters
- const expr = this.templateSrv.replace(
- target.expr,
- variables,
- this.interpolateExploreMetrics(target.fromExploreMetrics)
- );
-
- // Apply ad-hoc filters
- // When ad-hoc filters are applied, we replace again the variables in case the ad-hoc filters also reference a variable
- const exprWithAdhoc = targetHasScopes(target)
- ? expr
- : this.templateSrv.replace(this.enhanceExprWithAdHocFilters(filters, expr), variables, this.interpolateQueryExpr);
-
- return {
- ...target,
- ...(targetHasScopes(target) ? { adhocFilters: this.generateScopeFilters(filters) } : {}),
- expr: exprWithAdhoc,
- interval: this.templateSrv.replace(target.interval, variables),
- legendFormat: this.templateSrv.replace(target.legendFormat, variables),
- };
- }
-
- getVariables(): string[] {
- return this.templateSrv.getVariables().map((v) => `$${v.name}`);
- }
-
- interpolateString(string: string, scopedVars?: ScopedVars) {
- return this.templateSrv.replace(string, scopedVars, this.interpolateQueryExpr);
- }
-
- interpolateExploreMetrics(fromExploreMetrics?: boolean) {
- return (value: string | string[] = [], variable: QueryVariableModel | CustomVariableModel) => {
- if (typeof value === 'string' && fromExploreMetrics) {
- if (variable.name === 'filters') {
- return wrapUtf8Filters(value);
- }
- if (variable.name === 'groupby') {
- return utf8Support(value);
- }
- }
- return this.interpolateQueryExpr(value, variable);
- };
- }
-
- isUsingRelativeTimeRange(range: TimeRange): boolean {
- if (typeof range.raw.from !== 'string' || typeof range.raw.to !== 'string') {
- return false;
- }
-
- return range.raw.from.includes('now') || range.raw.to.includes('now');
- }
-
- getDefaultQuery(app: CoreApp): PromQuery {
- const defaults = {
- refId: 'A',
- expr: '',
- range: true,
- instant: false,
- };
-
- if (app === CoreApp.UnifiedAlerting) {
- return {
- ...defaults,
- instant: true,
- range: false,
- };
- }
-
- if (app === CoreApp.Explore) {
- return {
- ...defaults,
- instant: true,
- range: true,
- };
- }
-
- return defaults;
- }
-}
-
-function targetHasScopes(target: PromQuery): boolean {
- return !!(target.scopes && target.scopes.length > 0);
-}
-
-export function extractRuleMappingFromGroups(groups: RawRecordingRules[]): RuleQueryMapping {
- return groups.reduce(
- (mapping, group) =>
- group.rules
- .filter((rule) => rule.type === 'recording')
- .reduce((acc, rule) => {
- // retrieve existing record
- const existingRule = acc[rule.name] ?? [];
- // push a new query with labels
- existingRule.push({
- query: rule.query,
- labels: rule.labels,
- });
- acc[rule.name] = existingRule;
- return acc;
- }, mapping),
- {}
- );
-}
-
-/**
- * It creates a matcher string for resource calls
- * @param queries
- * @param adhocFilters
- *
- * @example
- * queries=[{expr:`metricName{label="value"}`}]
- * adhocFilters={key:"instance", operator:"=", value:"localhost"}
- * returns {__name__=~"metricName", instance="localhost"}
- */
-export const extractResourceMatcher = (
- queries: PromQuery[],
- adhocFilters: AdHocVariableFilter[]
-): string | undefined => {
- // Extract metric names from queries we have already
- const metricMatch = populateMatchParamsFromQueries(queries);
- const labelFilters: QueryBuilderLabelFilter[] = adhocFilters.map((f) => ({
- label: f.key,
- value: f.value,
- op: f.operator,
- }));
- // Extract label filters from the filters we have already
- const labelsMatch = renderLabelsWithoutBrackets(labelFilters);
-
- if (metricMatch.length === 0 && labelsMatch.length === 0) {
- return undefined;
- }
-
- // Create a matcher using metric names and label filters
- return `{${[...metricMatch, ...labelsMatch].join(',')}}`;
-};
-
-export function remapOneOf(filter: AdHocVariableFilter) {
- let { operator, value, values } = filter;
- if (operator === '=|' || operator === '!=|') {
- operator = operator === '=|' ? '=~' : '!~';
- value = values?.map(prometheusRegularEscape).join('|') ?? '';
- }
-
- return {
- ...filter,
- operator,
- value,
- };
-}
diff --git a/packages/grafana-prometheus/src/escaping.ts b/packages/grafana-prometheus/src/escaping.ts
deleted file mode 100644
index 2ea0b6840d8..00000000000
--- a/packages/grafana-prometheus/src/escaping.ts
+++ /dev/null
@@ -1,95 +0,0 @@
-// NOTE: these two functions are similar to the escapeLabelValueIn* functions
-// in language_utils.ts, but they are not exactly the same algorithm, and we found
-
-import { type QueryVariableModel, type CustomVariableModel } from '@grafana/data';
-import { config } from '@grafana/runtime';
-
-export function interpolateQueryExpr(
- value: string | string[] = [],
- variable: QueryVariableModel | CustomVariableModel
-) {
- // if no multi or include all do not regexEscape
- if (!variable.multi && !variable.includeAll) {
- return prometheusRegularEscape(value);
- }
-
- if (typeof value === 'string') {
- return prometheusSpecialRegexEscape(value);
- }
-
- const escapedValues = value.map((val) => prometheusSpecialRegexEscape(val));
-
- if (escapedValues.length === 1) {
- return escapedValues[0];
- }
-
- return '(' + escapedValues.join('|') + ')';
-}
-
-// no way to reuse one in the another or vice versa.
-export function prometheusRegularEscape(value: T) {
- if (typeof value !== 'string') {
- return value;
- }
-
- if (config.featureToggles.prometheusSpecialCharsInLabelValues) {
- // if the string looks like a complete label matcher (e.g. 'job="grafana"' or 'job=~"grafana"'),
- // don't escape the encapsulating quotes
- if (/^\w+(=|!=|=~|!~)".*"$/.test(value)) {
- return value;
- }
-
- return value
- .replace(/\\/g, '\\\\') // escape backslashes
- .replace(/"/g, '\\"'); // escape double quotes
- }
-
- // classic behavior
- return value
- .replace(/\\/g, '\\\\') // escape backslashes
- .replace(/'/g, "\\\\'"); // escape single quotes
-}
-
-export function prometheusSpecialRegexEscape(value: T) {
- if (typeof value !== 'string') {
- return value;
- }
-
- if (config.featureToggles.prometheusSpecialCharsInLabelValues) {
- return value
- .replace(/\\/g, '\\\\\\\\') // escape backslashes
- .replace(/"/g, '\\\\\\"') // escape double quotes
- .replace(/[$^*{}\[\]\'+?.()|]/g, '\\\\$&'); // escape regex metacharacters
- }
-
- // classic behavior
- return value
- .replace(/\\/g, '\\\\\\\\') // escape backslashes
- .replace(/[$^*{}\[\]+?.()|]/g, '\\\\$&'); // escape regex metacharacters
-}
-
-// NOTE: the following 2 exported functions are very similar to the prometheus*Escape
-// functions in datasource.ts, but they are not exactly the same algorithm, and we found
-// no way to reuse one in the another or vice versa.
-
-// Prometheus regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),
-// so every character that matches something in that list has to be escaped.
-// the list of metacharacters is: *+?()|\.[]{}^$
-// we make a javascript regular expression that matches those characters:
-const RE2_METACHARACTERS = /[*+?()|\\.\[\]{}^$]/g;
-
-function escapePrometheusRegexp(value: string): string {
- return value.replace(RE2_METACHARACTERS, '\\$&');
-}
-
-// based on the openmetrics-documentation, the 3 symbols we have to handle are:
-// - \n ... the newline character
-// - \ ... the backslash character
-// - " ... the double-quote character
-export function escapeLabelValueInExactSelector(labelValue: string): string {
- return labelValue.replace(/\\/g, '\\\\').replace(/\n/g, '\\n').replace(/"/g, '\\"');
-}
-
-export function escapeLabelValueInRegexSelector(labelValue: string): string {
- return escapeLabelValueInExactSelector(escapePrometheusRegexp(labelValue));
-}
diff --git a/packages/grafana-prometheus/src/img/cortex_logo.svg b/packages/grafana-prometheus/src/img/cortex_logo.svg
deleted file mode 100644
index 48ec08428e1..00000000000
--- a/packages/grafana-prometheus/src/img/cortex_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/img/mimir_logo.svg b/packages/grafana-prometheus/src/img/mimir_logo.svg
deleted file mode 100644
index bd9605f592b..00000000000
--- a/packages/grafana-prometheus/src/img/mimir_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/img/prometheus_logo.svg b/packages/grafana-prometheus/src/img/prometheus_logo.svg
deleted file mode 100644
index 4c4448862e6..00000000000
--- a/packages/grafana-prometheus/src/img/prometheus_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/img/thanos_logo.svg b/packages/grafana-prometheus/src/img/thanos_logo.svg
deleted file mode 100644
index 1e7be785776..00000000000
--- a/packages/grafana-prometheus/src/img/thanos_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/packages/grafana-prometheus/src/index.ts b/packages/grafana-prometheus/src/index.ts
deleted file mode 100644
index d9298817464..00000000000
--- a/packages/grafana-prometheus/src/index.ts
+++ /dev/null
@@ -1,93 +0,0 @@
-// The Grafana Prometheus library exports a number of components.
-// There are main components that can be imported directly into your plugin module.ts file.
-// There are also more granular components that can be used to build components, for example, the config section can be built with granular parts to allow for custom auths.
-
-// COMPONENTS/
-// Main export
-export { PromQueryEditorByApp } from './components/PromQueryEditorByApp';
-// The parts
-export { MonacoQueryFieldLazy } from './components/monaco-query-field/MonacoQueryFieldLazy';
-export { AnnotationQueryEditor } from './components/AnnotationQueryEditor';
-export { PromCheatSheet } from './components/PromCheatSheet';
-export { MetricsBrowser } from './components/metrics-browser/MetricsBrowser';
-export { PromExemplarField } from './components/PromExemplarField';
-export { PromExploreExtraField } from './components/PromExploreExtraField';
-export { PromQueryEditorForAlerting } from './components/PromQueryEditorForAlerting';
-export { PromQueryField } from './components/PromQueryField';
-export { PromVariableQueryEditor } from './components/VariableQueryEditor';
-
-// CONFIGURATION/
-// Main export
-export { ConfigEditor } from './configuration/ConfigEditor';
-export { overhaulStyles, validateInput, docsTip } from './configuration/shared/utils';
-export { PROM_CONFIG_LABEL_WIDTH, InstantQueryRefIdIndex } from './constants';
-// The parts
-export { AlertingSettingsOverhaul } from './configuration/AlertingSettingsOverhaul';
-export { DataSourceHttpSettingsOverhaul } from './configuration/DataSourceHttpSettingsOverhaul';
-export { ExemplarSetting } from './configuration/ExemplarSetting';
-export { ExemplarsSettings } from './configuration/ExemplarsSettings';
-export { PromFlavorVersions } from './configuration/PromFlavorVersions';
-export { PromSettings } from './configuration/PromSettings';
-
-// QUERYBUILDER/
-// The parts (The query builder is imported into PromQueryEditorByApp)
-export { QueryPattern } from './querybuilder/QueryPattern';
-export { QueryPatternsModal } from './querybuilder/QueryPatternsModal';
-
-// QUERYBUILDER/COMPONENTS/
-export { LabelFilterItem } from './querybuilder/components/LabelFilterItem';
-export { LabelFilters } from './querybuilder/components/LabelFilters';
-export { LabelParamEditor } from './querybuilder/components/LabelParamEditor';
-export { MetricCombobox } from './querybuilder/components/MetricCombobox';
-export { MetricsLabelsSection } from './querybuilder/components/MetricsLabelsSection';
-export { NestedQuery } from './querybuilder/components/NestedQuery';
-export { NestedQueryList } from './querybuilder/components/NestedQueryList';
-export { PromQueryBuilder } from './querybuilder/components/PromQueryBuilder';
-export { PromQueryBuilderContainer } from './querybuilder/components/PromQueryBuilderContainer';
-export { PromQueryBuilderExplained } from './querybuilder/components/PromQueryBuilderExplained';
-export { PromQueryBuilderOptions } from './querybuilder/components/PromQueryBuilderOptions';
-export { PromQueryCodeEditor } from './querybuilder/components/PromQueryCodeEditor';
-export { PromQueryEditorSelector } from './querybuilder/components/PromQueryEditorSelector';
-export { PromQueryLegendEditor } from './querybuilder/components/PromQueryLegendEditor';
-export { QueryPreview } from './querybuilder/components/QueryPreview';
-export { MetricsModal } from './querybuilder/components/metrics-modal/MetricsModal';
-
-// SRC/
-// Main export
-export { PrometheusDatasource } from './datasource';
-// The parts
-export { addLabelToQuery } from './add_label_to_query';
-export { type QueryEditorMode, type PromQueryFormat, type Prometheus } from './dataquery';
-export { interpolateQueryExpr } from './escaping';
-export { loadResources } from './loadResources';
-export { PrometheusMetricFindQuery } from './metric_find_query';
-export { promqlGrammar } from './promql';
-export { getQueryHints, getInitHints } from './query_hints';
-export { transformV2, transformDFToTable, parseSampleValue, sortSeriesByLabel } from './result_transformer';
-export {
- type PromQuery,
- PrometheusCacheLevel,
- PromApplication,
- type PromOptions,
- type ExemplarTraceIdDestination,
- type PromQueryRequest,
- type PromMetricsMetadataItem,
- type PromMetricsMetadata,
- type PromValue,
- type PromMetric,
- type PromBuildInfoResponse,
- LegendFormatMode,
- PromVariableQueryType,
- type PromVariableQuery,
- type StandardPromVariableQuery,
-} from './types';
-export { PrometheusVariableSupport } from './variables';
-
-export type { PrometheusLanguageProviderInterface } from './language_provider';
-
-// For Metrics Drilldown
-export { getPrometheusTime } from './language_utils';
-export { isValidLegacyName, utf8Support, wrapUtf8Filters } from './utf8_support';
-export { buildVisualQueryFromString } from './querybuilder/parsing';
-export { PromQueryModeller } from './querybuilder/PromQueryModeller';
-export { type QueryBuilderLabelFilter } from './querybuilder/shared/types';
diff --git a/packages/grafana-prometheus/src/language_provider.mock.ts b/packages/grafana-prometheus/src/language_provider.mock.ts
deleted file mode 100644
index adf97211cb6..00000000000
--- a/packages/grafana-prometheus/src/language_provider.mock.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/language_provider.mock.ts
-export class EmptyLanguageProviderMock {
- metrics = [];
-
- constructor() {}
-
- start() {
- return new Promise((resolve) => {
- resolve('');
- });
- }
-
- retrieveMetrics = jest.fn().mockReturnValue(['metric']);
- queryLabelKeys = jest.fn().mockResolvedValue([]);
- queryLabelValues = jest.fn().mockResolvedValue([]);
- retrieveLabelKeys = jest.fn().mockReturnValue([]);
- retrieveMetricsMetadata = jest
- .fn()
- .mockReturnValue({ histogram_metric_sum: { type: 'counter', help: '', unit: 'sum' } });
- queryMetricsMetadata = jest.fn().mockResolvedValue({});
-}
diff --git a/packages/grafana-prometheus/src/language_provider.test.ts b/packages/grafana-prometheus/src/language_provider.test.ts
deleted file mode 100644
index 8f1c8348f47..00000000000
--- a/packages/grafana-prometheus/src/language_provider.test.ts
+++ /dev/null
@@ -1,549 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/language_provider.test.ts
-import { AbstractLabelOperator, dateTime, type TimeRange } from '@grafana/data';
-
-import { getCacheDurationInMinutes } from './caching';
-import { DEFAULT_SERIES_LIMIT } from './constants';
-import { type PrometheusDatasource } from './datasource';
-import {
- exportToAbstractQuery,
- importFromAbstractQuery,
- populateMatchParamsFromQueries,
- PrometheusLanguageProvider,
-} from './language_provider';
-import { getPrometheusTime, getRangeSnapInterval } from './language_utils';
-import { PrometheusCacheLevel, type PromQuery } from './types';
-
-jest.mock('./language_utils', () => ({
- ...jest.requireActual('./language_utils'),
- getPrometheusTime: jest.requireActual('./language_utils').getPrometheusTime,
- getRangeSnapInterval: jest.requireActual('./language_utils').getRangeSnapInterval,
-}));
-
-const now = new Date(1681300293392).getTime();
-const timeRangeDurationSeconds = 1;
-const toPrometheusTime = getPrometheusTime(dateTime(now), false);
-const fromPrometheusTime = getPrometheusTime(dateTime(now - timeRangeDurationSeconds * 1000), false);
-const toPrometheusTimeString = toPrometheusTime.toString(10);
-const fromPrometheusTimeString = fromPrometheusTime.toString(10);
-
-const getMockTimeRange = (): TimeRange => {
- return {
- to: dateTime(now).utc(),
- from: dateTime(now).subtract(timeRangeDurationSeconds, 'second').utc(),
- raw: {
- from: fromPrometheusTimeString,
- to: toPrometheusTimeString,
- },
- };
-};
-
-const getTimeRangeParams = (
- timRange: TimeRange,
- override?: Partial<{ start: string; end: string }>
-): { start: string; end: string } => ({
- start: fromPrometheusTimeString,
- end: toPrometheusTimeString,
- ...override,
-});
-
-const getMockQuantizedTimeRangeParams = (override?: Partial): TimeRange => ({
- from: dateTime(fromPrometheusTime * 1000),
- to: dateTime(toPrometheusTime * 1000),
- raw: {
- from: `now-${timeRangeDurationSeconds}s`,
- to: 'now',
- },
- ...override,
-});
-
-describe('PrometheusLanguageProvider', () => {
- const defaultDatasource: PrometheusDatasource = {
- metadataRequest: () => ({ data: { data: [] } }),
- getTimeRangeParams: getTimeRangeParams,
- interpolateString: (string: string) => string,
- hasLabelsMatchAPISupport: () => false,
- getDaysToCacheMetadata: () => 1,
- getAdjustedInterval: () => getRangeSnapInterval(PrometheusCacheLevel.None, getMockQuantizedTimeRangeParams()),
- cacheLevel: PrometheusCacheLevel.None,
- getIntervalVars: () => ({}),
- getRangeScopedVars: () => ({}),
- seriesLimit: DEFAULT_SERIES_LIMIT,
- } as unknown as PrometheusDatasource;
-
- describe('constructor', () => {
- it('should initialize with SeriesApiClient when labels match API is not supported', () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- expect(provider).toBeInstanceOf(PrometheusLanguageProvider);
- });
-
- it('should initialize with LabelsApiClient when labels match API is supported', () => {
- const datasourceWithLabelsAPI = {
- ...defaultDatasource,
- hasLabelsMatchAPISupport: () => true,
- } as unknown as PrometheusDatasource;
- const provider = new PrometheusLanguageProvider(datasourceWithLabelsAPI);
- expect(provider).toBeInstanceOf(PrometheusLanguageProvider);
- });
- });
-
- describe('start', () => {
- it('should not start when lookups are disabled', async () => {
- const datasourceWithLookupsDisabled = {
- ...defaultDatasource,
- lookupsDisabled: true,
- } as unknown as PrometheusDatasource;
- const provider = new PrometheusLanguageProvider(datasourceWithLookupsDisabled);
- const result = await provider.start();
- expect(result).toEqual([]);
- });
-
- it('should use resource client and metricsMetadata is available', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const mockMetadata = { metric1: { type: 'counter', help: 'help text' } };
-
- // Mock the resource client's start method
- const resourceClientStartSpy = jest.spyOn(provider['resourceClient'], 'start');
- const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(mockMetadata);
-
- await provider.start();
-
- expect(resourceClientStartSpy).toHaveBeenCalled();
- expect(queryMetadataSpy).toHaveBeenCalled();
- expect(provider.retrieveMetricsMetadata()).toEqual(mockMetadata);
- });
-
- it('should call queryMetricsMetadata with datasource seriesLimit during start', async () => {
- const customSeriesLimit = 5000;
- const datasourceWithCustomLimit = {
- ...defaultDatasource,
- seriesLimit: customSeriesLimit,
- } as PrometheusDatasource;
-
- const provider = new PrometheusLanguageProvider(datasourceWithCustomLimit);
- const mockMetadata = { metric1: { type: 'counter', help: 'help text' } };
-
- // Mock the resource client's start method
- const resourceClientStartSpy = jest.spyOn(provider['resourceClient'], 'start').mockResolvedValue();
- const queryMetricsMetadataSpy = jest.spyOn(provider, 'queryMetricsMetadata').mockResolvedValue(mockMetadata);
-
- await provider.start();
-
- expect(resourceClientStartSpy).toHaveBeenCalled();
- expect(queryMetricsMetadataSpy).toHaveBeenCalledWith(customSeriesLimit);
- });
- });
-
- describe('queryMetricsMetadata', () => {
- it('should fetch and store metadata without limit', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const mockMetadata = { metric1: { type: 'counter', help: 'help text' } };
- const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(mockMetadata);
-
- const result = await provider.queryMetricsMetadata();
-
- expect(queryMetadataSpy).toHaveBeenCalledWith(undefined);
- expect(result).toEqual(mockMetadata);
- expect(provider.retrieveMetricsMetadata()).toEqual(mockMetadata);
- });
-
- it('should fetch and store metadata with custom limit', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const mockMetadata = { metric1: { type: 'counter', help: 'help text' } };
- const customLimit = 1000;
- const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(mockMetadata);
-
- // TODO spy on /api/v1/metadata endpoint or fetch
- const result = await provider.queryMetricsMetadata(customLimit);
-
- expect(queryMetadataSpy).toHaveBeenCalledWith(customLimit);
- expect(result).toEqual(mockMetadata);
- expect(provider.retrieveMetricsMetadata()).toEqual(mockMetadata);
- });
-
- it('should pass limit parameter to the metadata API endpoint', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const requestSpy = jest.spyOn(provider, 'request').mockResolvedValue({
- metric1: { type: 'counter', help: 'help text' },
- });
- const customLimit = 500;
-
- await provider.queryMetricsMetadata(customLimit);
-
- expect(requestSpy).toHaveBeenCalledWith(
- '/api/v1/metadata',
- { limit: customLimit },
- expect.objectContaining({
- showErrorAlert: false,
- })
- );
- });
-
- it('should use DEFAULT_SERIES_LIMIT when no limit is provided', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const requestSpy = jest.spyOn(provider, 'request').mockResolvedValue({
- metric1: { type: 'counter', help: 'help text' },
- });
-
- await provider.queryMetricsMetadata();
-
- expect(requestSpy).toHaveBeenCalledWith(
- '/api/v1/metadata',
- { limit: DEFAULT_SERIES_LIMIT },
- expect.objectContaining({
- showErrorAlert: false,
- })
- );
- });
-
- it('should pass zero limit when explicitly set', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const requestSpy = jest.spyOn(provider, 'request').mockResolvedValue({
- metric1: { type: 'counter', help: 'help text' },
- });
-
- await provider.queryMetricsMetadata(0);
-
- expect(requestSpy).toHaveBeenCalledWith(
- '/api/v1/metadata',
- { limit: 0 },
- expect.objectContaining({
- showErrorAlert: false,
- })
- );
- });
-
- it('should include cache headers in the request', async () => {
- const provider = new PrometheusLanguageProvider({
- ...defaultDatasource,
- cacheLevel: PrometheusCacheLevel.Medium,
- } as PrometheusDatasource);
- const requestSpy = jest.spyOn(provider, 'request').mockResolvedValue({});
-
- await provider.queryMetricsMetadata(1000);
-
- expect(requestSpy).toHaveBeenCalledWith(
- '/api/v1/metadata',
- { limit: 1000 },
- expect.objectContaining({
- showErrorAlert: false,
- headers: expect.objectContaining({
- 'X-Grafana-Cache': expect.stringMatching(/private, max-age=\d+/),
- }),
- })
- );
- });
-
- it('should handle undefined metadata response', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(undefined);
-
- const result = await provider.queryMetricsMetadata();
-
- expect(queryMetadataSpy).toHaveBeenCalled();
- expect(result).toEqual({});
- expect(provider.retrieveMetricsMetadata()).toEqual({});
- });
-
- it('should handle null metadata response', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(null);
-
- const result = await provider.queryMetricsMetadata(1000);
-
- expect(queryMetadataSpy).toHaveBeenCalledWith(1000);
- expect(result).toEqual({});
- expect(provider.retrieveMetricsMetadata()).toEqual({});
- });
-
- it('should handle endpoint errors and set empty metadata', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const queryMetadataSpy = jest
- .spyOn(provider as any, '_queryMetadata')
- .mockRejectedValue(new Error('Endpoint not found'));
-
- const result = await provider.queryMetricsMetadata(1000);
-
- expect(queryMetadataSpy).toHaveBeenCalledWith(1000);
- expect(result).toEqual({});
- expect(provider.retrieveMetricsMetadata()).toEqual({});
- });
-
- it('should handle network timeout errors gracefully', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const timeoutError = new Error('Request timeout');
- timeoutError.name = 'TimeoutError';
- const queryMetadataSpy = jest.spyOn(provider as any, '_queryMetadata').mockRejectedValue(timeoutError);
-
- const result = await provider.queryMetricsMetadata(500);
-
- expect(queryMetadataSpy).toHaveBeenCalledWith(500);
- expect(result).toEqual({});
- expect(provider.retrieveMetricsMetadata()).toEqual({});
- });
-
- it('should maintain backward compatibility by setting deprecated metricsMetadata property', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const mockMetadata = { metric1: { type: 'counter', help: 'help text' } };
- jest.spyOn(provider as any, '_queryMetadata').mockResolvedValue(mockMetadata);
-
- await provider.queryMetricsMetadata(250);
-
- expect(provider.retrieveMetricsMetadata()).toEqual(mockMetadata);
- });
- });
-
- describe('queryLabelKeys and queryLabelValues', () => {
- const timeRange = getMockTimeRange();
-
- it('should delegate to resource client queryLabelKeys', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const resourceClientSpy = jest
- .spyOn(provider['resourceClient'], 'queryLabelKeys')
- .mockResolvedValue(['label1', 'label2']);
-
- const result = await provider.queryLabelKeys(timeRange, '{job="grafana"}');
-
- expect(resourceClientSpy).toHaveBeenCalledWith(timeRange, '{job="grafana"}', undefined);
- expect(result).toEqual(['label1', 'label2']);
- });
-
- it('queryLabelKeys should interpolate variables', async () => {
- const provider = new PrometheusLanguageProvider({
- ...defaultDatasource,
- interpolateString: (string: string) => string.replace(/\$/g, 'interpolated_'),
- } as PrometheusDatasource);
- const resourceClientSpy = jest
- .spyOn(provider['resourceClient'], 'queryLabelKeys')
- .mockResolvedValue(['label1', 'label2']);
-
- const result = await provider.queryLabelKeys(timeRange, '{job="$job"}');
-
- expect(resourceClientSpy).toHaveBeenCalledWith(timeRange, '{job="interpolated_job"}', undefined);
- expect(result).toEqual(['label1', 'label2']);
- });
-
- it('should delegate to resource client queryLabelValues', async () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const resourceClientSpy = jest
- .spyOn(provider['resourceClient'], 'queryLabelValues')
- .mockResolvedValue(['value1', 'value2']);
-
- const result = await provider.queryLabelValues(timeRange, 'job', '{job="grafana"}');
-
- expect(resourceClientSpy).toHaveBeenCalledWith(timeRange, 'job', '{job="grafana"}', undefined);
- expect(result).toEqual(['value1', 'value2']);
- });
-
- it('queryLabelValues should interpolate variables', async () => {
- const provider = new PrometheusLanguageProvider({
- ...defaultDatasource,
- interpolateString: (string: string) => string.replace(/\$/g, 'interpolated_'),
- } as PrometheusDatasource);
- const resourceClientSpy = jest
- .spyOn(provider['resourceClient'], 'queryLabelValues')
- .mockResolvedValue(['label1', 'label2']);
-
- const result = await provider.queryLabelValues(timeRange, '$label', '{job="$job"}');
-
- expect(resourceClientSpy).toHaveBeenCalledWith(
- timeRange,
- 'interpolated_label',
- '{job="interpolated_job"}',
- undefined
- );
- expect(result).toEqual(['label1', 'label2']);
- });
- });
-
- describe('retrieveMethods', () => {
- it('should delegate to resource client for metrics and labels', () => {
- const provider = new PrometheusLanguageProvider(defaultDatasource);
- const mockResourceClient = {
- histogramMetrics: ['histogram1', 'histogram2'],
- metrics: ['metric1', 'metric2'],
- labelKeys: ['label1', 'label2'],
- };
-
- // Mock the resource client properties
- Object.defineProperty(provider, '_resourceClient', {
- value: mockResourceClient,
- writable: true,
- });
-
- expect(provider.retrieveHistogramMetrics()).toEqual(['histogram1', 'histogram2']);
- expect(provider.retrieveMetrics()).toEqual(['metric1', 'metric2']);
- expect(provider.retrieveLabelKeys()).toEqual(['label1', 'label2']);
- });
- });
-
- describe('populateMatchParamsFromQueries', () => {
- it('should add match params from queries', () => {
- const queries: PromQuery[] = [
- { expr: 'metric1', refId: '1' },
- { expr: 'metric2', refId: '2' },
- ];
- const result = populateMatchParamsFromQueries(queries);
- expect(result).toEqual([`__name__=~"metric1|metric2"`]);
- });
-
- it('should handle binary queries', () => {
- const queries: PromQuery[] = [{ expr: 'binary{label="val"} + second{}', refId: '1' }];
- const result = populateMatchParamsFromQueries(queries);
- expect(result).toEqual([`__name__=~"binary|second"`]);
- });
-
- it('should handle undefined queries', () => {
- const result = populateMatchParamsFromQueries(undefined);
- expect(result).toEqual([]);
- });
-
- it('should handle UTF8 metrics', () => {
- const queries: PromQuery[] = [{ expr: '{"utf8.metric", label="value"}', refId: '1' }];
- const result = populateMatchParamsFromQueries(queries);
- expect(result).toContain('__name__=~"utf8.metric"');
- });
-
- it('should handle UTF8 metrics with normal metrics', () => {
- const queries: PromQuery[] = [{ expr: '{"utf8.metric", label="value"} + second{}', refId: '1' }];
- const result = populateMatchParamsFromQueries(queries);
- expect(result).toContain('__name__=~"utf8.metric|second"');
- });
-
- it('should return match-all matcher if there is no expr in queries', () => {
- const queries: PromQuery[] = [{ expr: '', refId: '1' }];
- const result = populateMatchParamsFromQueries(queries);
- expect(result).toEqual([]);
- });
-
- it('should return match-all matcher if there is no query', () => {
- const queries: PromQuery[] = [];
- const result = populateMatchParamsFromQueries(queries);
- expect(result).toEqual([]);
- });
-
- it('should extract the correct matcher for queries with `... or vector(0)`', () => {
- const queries: PromQuery[] = [
- {
- refId: 'A',
- expr: `sum(increase(go_cpu_classes_idle_cpu_seconds_total[$__rate_interval])) or vector(0)`,
- },
- ];
- const result = populateMatchParamsFromQueries(queries);
- expect(result).toEqual(['__name__=~"go_cpu_classes_idle_cpu_seconds_total"']);
- });
- });
-
- describe('fetchSuggestions', () => {
- it('should send POST request with correct parameters', async () => {
- const timeRange = getMockTimeRange();
- const mockQueries: PromQuery[] = [{ refId: 'A', expr: 'metric1' }];
-
- const languageProvider = new PrometheusLanguageProvider({
- ...defaultDatasource,
- interpolateString: (string: string) => `interpolated_${string}`,
- getIntervalVars: () => ({ __interval: '1m' }),
- getRangeScopedVars: () => ({ __range: { text: '1h', value: '1h' } }),
- } as unknown as PrometheusDatasource);
-
- const requestSpy = jest.spyOn(languageProvider, 'request').mockResolvedValue(['suggestion1', 'suggestion2']);
-
- // Simplifying the test by not passing complex scope objects that require more type definitions
- const result = await languageProvider.fetchSuggestions(
- timeRange,
- mockQueries,
- undefined, // omitting scopes parameter
- [{ key: 'instance', operator: '=', value: 'localhost' }],
- 'metric',
- 100
- );
-
- expect(requestSpy).toHaveBeenCalled();
- expect(requestSpy.mock.calls[0][0]).toBe('/suggestions');
-
- // Check method and content type
- expect(requestSpy.mock.calls[0][2]).toMatchObject({
- headers: { 'Content-Type': 'application/json' },
- method: 'POST',
- });
-
- // Check query parameters
- expect(requestSpy.mock.calls[0][1]).toMatchObject({
- labelName: 'metric',
- limit: 100,
- queries: ['interpolated_metric1'],
- });
-
- expect(result).toEqual(['suggestion1', 'suggestion2']);
- });
-
- it('should use default time range if not provided', async () => {
- const languageProvider = new PrometheusLanguageProvider(defaultDatasource);
- const requestSpy = jest.spyOn(languageProvider, 'request').mockResolvedValue(['result']);
-
- await languageProvider.fetchSuggestions(undefined, [], [], [], 'test');
-
- expect(requestSpy).toHaveBeenCalled();
- // Default time range should be used
- expect(requestSpy.mock.calls[0][1]).toHaveProperty('start');
- expect(requestSpy.mock.calls[0][1]).toHaveProperty('end');
- });
-
- it('should handle empty response gracefully', async () => {
- const languageProvider = new PrometheusLanguageProvider(defaultDatasource);
- jest.spyOn(languageProvider, 'request').mockResolvedValue(null);
-
- const result = await languageProvider.fetchSuggestions(getMockTimeRange(), [], [], [], 'test');
-
- expect(result).toEqual([]);
- });
-
- it('should include cache headers when cacheLevel is set', async () => {
- const timeSnapMinutes = getCacheDurationInMinutes(PrometheusCacheLevel.Medium);
- const languageProvider = new PrometheusLanguageProvider({
- ...defaultDatasource,
- cacheLevel: PrometheusCacheLevel.Medium,
- } as PrometheusDatasource);
-
- const requestSpy = jest.spyOn(languageProvider, 'request').mockResolvedValue(['result']);
-
- await languageProvider.fetchSuggestions(getMockTimeRange(), [], [], [], 'test');
-
- expect(requestSpy).toHaveBeenCalled();
- expect(requestSpy.mock.calls[0][2]?.headers).toHaveProperty('X-Grafana-Cache');
- expect(requestSpy.mock.calls[0][2]?.headers?.['X-Grafana-Cache']).toContain(
- `private, max-age=${timeSnapMinutes * 60}`
- );
- });
- });
-});
-
-describe('Query transformation', () => {
- describe('importFromAbstractQuery', () => {
- it('should handle empty queries', async () => {
- const result = importFromAbstractQuery({ refId: 'bar', labelMatchers: [] });
- expect(result).toEqual({ refId: 'bar', expr: '', range: true });
- });
- });
-
- describe('exportToAbstractQuery', () => {
- it('should extract labels and metric name from PromQL', async () => {
- const abstractQuery = exportToAbstractQuery({
- refId: 'bar',
- expr: 'metric_name{label1="value1", label2!="value2", label3=~"value3", label4!~"value4"}',
- instant: true,
- range: false,
- });
-
- expect(abstractQuery).toMatchObject({
- refId: 'bar',
- labelMatchers: [
- { name: 'label1', operator: AbstractLabelOperator.Equal, value: 'value1' },
- { name: 'label2', operator: AbstractLabelOperator.NotEqual, value: 'value2' },
- { name: 'label3', operator: AbstractLabelOperator.EqualRegEx, value: 'value3' },
- { name: 'label4', operator: AbstractLabelOperator.NotEqualRegEx, value: 'value4' },
- { name: '__name__', operator: AbstractLabelOperator.Equal, value: 'metric_name' },
- ],
- });
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/language_provider.ts b/packages/grafana-prometheus/src/language_provider.ts
deleted file mode 100644
index dee28fd3ebe..00000000000
--- a/packages/grafana-prometheus/src/language_provider.ts
+++ /dev/null
@@ -1,448 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/language_provider.ts
-import Prism from 'prismjs';
-
-import {
- type AbstractLabelMatcher,
- AbstractLabelOperator,
- type AbstractQuery,
- type AdHocVariableFilter,
- getDefaultTimeRange,
- type Scope,
- scopeFilterOperatorMap,
- type ScopeSpecFilter,
- type TimeRange,
-} from '@grafana/data';
-import { type BackendSrvRequest } from '@grafana/runtime';
-
-import { buildCacheHeaders, getDaysToCacheMetadata, getDefaultCacheHeaders } from './caching';
-import { type PrometheusDatasource } from './datasource';
-import { extractLabelMatchers, fixSummariesMetadata, toPromLikeQuery } from './language_utils';
-import { promqlGrammar } from './promql';
-import { buildVisualQueryFromString } from './querybuilder/parsing';
-import { LabelsApiClient, type ResourceApiClient, SeriesApiClient } from './resource_clients';
-import { type PromMetricsMetadata, type PromQuery } from './types';
-
-interface PrometheusBaseLanguageProvider {
- datasource: PrometheusDatasource;
-
- /**
- * When no timeRange provided, we will use the default time range (now/now-6h)
- * @param timeRange
- */
- start: (timeRange?: TimeRange) => Promise;
-
- request: (url: string, params?: any, options?: Partial) => Promise;
-
- fetchSuggestions: (
- timeRange?: TimeRange,
- queries?: PromQuery[],
- scopes?: Scope[],
- adhocFilters?: AdHocVariableFilter[],
- labelName?: string,
- limit?: number,
- requestId?: string
- ) => Promise;
-}
-
-/**
- * Modern implementation of the Prometheus language provider that abstracts API endpoint selection.
- *
- * Features:
- * - Automatically selects the most efficient API endpoint based on Prometheus version and configuration
- * - Supports both labels and series endpoints for backward compatibility
- * - Handles match[] parameters for filtering time series data
- * - Implements automatic request limiting (default: 40,000 series if not configured otherwise)
- * - Provides unified interface for both modern and legacy Prometheus versions
- * - Provides caching mechanism based on time range, limit, and match parameters
- *
- * @see LabelsApiClient For modern Prometheus versions using the labels API
- * @see SeriesApiClient For legacy Prometheus versions using the series API
- */
-export interface PrometheusLanguageProviderInterface extends PrometheusBaseLanguageProvider {
- /**
- * Initializes the language provider by fetching metrics, label keys, and metrics metadata using Resource Clients.
- * All calls use the limit parameter from datasource configuration (default: 40,000 if not set).
- *
- * For backward compatibility, it calls _backwardCompatibleStart.
- * Some places still rely on deprecated fields. Until we replace them, we need _backwardCompatibleStart method.
- */
- start: (timeRange?: TimeRange) => Promise;
-
- /**
- * Returns already cached metrics metadata including type and help information.
- * If there is no cached metadata, it returns an empty object.
- * To get fresh metadata, use queryMetricsMetadata instead.
- */
- retrieveMetricsMetadata: () => PromMetricsMetadata;
-
- /**
- * Returns already cached list of histogram metrics (identified by '_bucket' suffix).
- * If there are no cached histogram metrics, it returns an empty array.
- */
- retrieveHistogramMetrics: () => string[];
-
- /**
- * Returns already cached list of all available metric names.
- * If there are no cached metrics, it returns an empty array.
- */
- retrieveMetrics: () => string[];
-
- /**
- * Returns already cached list of available label keys.
- * If there are no cached label keys, it returns an empty array.
- */
- retrieveLabelKeys: () => string[];
-
- /**
- * Fetches fresh metrics metadata from Prometheus with optional limit.
- * Uses datasource's default limit if not specified.
- */
- queryMetricsMetadata: (limit?: number) => Promise;
-
- /**
- * Queries Prometheus for label keys within time range, optionally filtered by match selector.
- * Automatically selects labels or series endpoint based on datasource configuration.
- * If no limit is provided, uses the datasource's default limit configuration.
- * Use zero (0) to fetch all label keys, but this might return huge amounts of data.
- */
- queryLabelKeys: (timeRange: TimeRange, match?: string, limit?: number) => Promise;
-
- /**
- * Queries Prometheus for values of a specific label key, optionally filtered by match selector.
- * Automatically selects labels or series endpoint based on datasource configuration.
- * If no limit is provided, uses the datasource's default limit configuration.
- * Use zero (0) to fetch all label values, but this might return huge amounts of data.
- */
- queryLabelValues: (timeRange: TimeRange, labelKey: string, match?: string, limit?: number) => Promise;
-}
-
-export class PrometheusLanguageProvider implements PrometheusLanguageProviderInterface {
- public datasource: PrometheusDatasource;
-
- private _metricsMetadata?: PromMetricsMetadata;
- private _resourceClient?: ResourceApiClient;
-
- constructor(datasource: PrometheusDatasource) {
- this.datasource = datasource;
- }
-
- request = async (url: string, params = {}, options?: Partial) => {
- try {
- const res = await this.datasource.metadataRequest(url, params, options);
- return res.data.data;
- } catch (error) {
- if (!isCancelledError(error)) {
- console.error(error);
- }
- }
-
- return undefined;
- };
-
- /**
- * Lazily initializes and returns the appropriate resource client based on Prometheus version.
- *
- * The client selection logic:
- * - For Prometheus v2.6+ with labels API: Uses LabelsApiClient for efficient label-based queries
- * - For older versions: Falls back to SeriesApiClient for backward compatibility
- *
- * The client instance is cached after first initialization to avoid repeated creation.
- *
- * @returns {ResourceApiClient} An instance of either LabelsApiClient or SeriesApiClient
- */
- private get resourceClient(): ResourceApiClient {
- if (!this._resourceClient) {
- this._resourceClient = this.datasource.hasLabelsMatchAPISupport()
- ? new LabelsApiClient(this.request, this.datasource)
- : new SeriesApiClient(this.request, this.datasource);
- }
-
- return this._resourceClient;
- }
-
- /**
- * Same start logic but it uses resource clients. Backward compatibility it calls _backwardCompatibleStart.
- * Some places still relies on deprecated fields. Until we replace them we need _backwardCompatibleStart method
- */
- start = async (timeRange: TimeRange = getDefaultTimeRange()): Promise => {
- if (this.datasource.lookupsDisabled) {
- return [];
- }
- return await Promise.all([
- this.resourceClient.start(timeRange),
- this.queryMetricsMetadata(this.datasource.seriesLimit),
- ]);
- };
-
- /**
- * Fetches metadata for metrics from Prometheus.
- * Sets cache headers based on the configured metadata cache duration.
- *
- * @returns {Promise} Promise that resolves when metadata has been fetched
- */
- private _queryMetadata = async (limit?: number): Promise => {
- const secondsInDay = 86400;
- const headers = buildCacheHeaders(getDaysToCacheMetadata(this.datasource.cacheLevel) * secondsInDay);
- const metadata = await this.request(
- `/api/v1/metadata`,
- { limit: limit ?? this.datasource.seriesLimit },
- {
- showErrorAlert: false,
- ...headers,
- }
- );
- return fixSummariesMetadata(metadata);
- };
-
- /**
- * Retrieves the cached Prometheus metrics metadata.
- * This metadata includes type information (counter, gauge, etc.) and help text for metrics.
- *
- * @returns {PromMetricsMetadata} Cached metadata or empty object if not yet fetched
- */
- public retrieveMetricsMetadata = (): PromMetricsMetadata => {
- return this._metricsMetadata ?? {};
- };
-
- /**
- * Retrieves the list of histogram metrics from the current resource client.
- * Histogram metrics are identified by the '_bucket' suffix and are used for percentile calculations.
- *
- * @returns {string[]} Array of histogram metric names
- */
- public retrieveHistogramMetrics = (): string[] => {
- return this.resourceClient?.histogramMetrics;
- };
-
- /**
- * Retrieves the complete list of available metrics from the current resource client.
- * This includes all metric names regardless of their type (counter, gauge, histogram).
- *
- * @returns {string[]} Array of all metric names
- */
- public retrieveMetrics = (): string[] => {
- return this.resourceClient?.metrics;
- };
-
- /**
- * Retrieves the list of available label keys from the current resource client.
- * Label keys are the names of labels that can be used to filter and group metrics.
- *
- * @returns {string[]} Array of label key names
- */
- public retrieveLabelKeys = (): string[] => {
- return this.resourceClient?.labelKeys;
- };
-
- /**
- * Fetches fresh metrics metadata from Prometheus and updates the cache.
- * This includes querying for metric types, help text, and unit information.
- * If the fetch fails, the cache is set to an empty object to prevent stale data.
- *
- * @returns {Promise} Promise that resolves to the fetched metadata
- */
- public queryMetricsMetadata = async (limit?: number): Promise => {
- try {
- this._metricsMetadata = (await this._queryMetadata(limit)) ?? {};
- } catch (error) {
- this._metricsMetadata = {};
- }
- return this._metricsMetadata;
- };
-
- /**
- * Fetches all available label keys that match the specified criteria.
- *
- * This method queries Prometheus for label keys within the specified time range.
- * The results can be filtered using the match parameter and limited in size.
- * Uses either the labels API (Prometheus v2.6+) or series API based on version.
- *
- * @param {TimeRange} timeRange - Time range to search for label keys
- * @param {string} [match] - Optional PromQL selector to filter label keys (e.g., '{job="grafana"}')
- * @param {string} [limit] - Optional maximum number of label keys to return
- * @returns {Promise} Array of matching label key names, sorted alphabetically
- */
- public queryLabelKeys = async (timeRange: TimeRange, match?: string, limit?: number): Promise => {
- const interpolatedMatch = match ? this.datasource.interpolateString(match) : match;
- return await this.resourceClient.queryLabelKeys(timeRange, interpolatedMatch, limit);
- };
-
- /**
- * Fetches all values for a specific label key that match the specified criteria.
- *
- * This method queries Prometheus for label values within the specified time range.
- * Results can be filtered using the match parameter to find values in specific contexts.
- * Supports both modern (labels API) and legacy (series API) Prometheus versions.
- *
- * The method automatically handles UTF-8 encoded label keys by properly escaping them
- * before making API requests. This means you can safely pass label keys containing
- * special characters like dots, colons, or Unicode characters (e.g., 'http.status:code',
- * 'μs', 'response.time').
- *
- * @param {TimeRange} timeRange - Time range to search for label values
- * @param {string} labelKey - The label key to fetch values for (e.g., 'job', 'instance', 'http.status:code')
- * @param {string} [match] - Optional PromQL selector to filter values (e.g., '{job="grafana"}')
- * @param {string} [limit] - Optional maximum number of values to return
- * @returns {Promise} Array of matching label values, sorted alphabetically
- * @example
- * // Fetch all values for the 'job' label
- * const values = await queryLabelValues(timeRange, 'job');
- * // Fetch 'instance' values only for jobs matching 'grafana'
- * const instances = await queryLabelValues(timeRange, 'instance', '{job="grafana"}');
- * // Fetch values for a label key with special characters
- * const statusCodes = await queryLabelValues(timeRange, 'http.status:code');
- */
- public queryLabelValues = async (
- timeRange: TimeRange,
- labelKey: string,
- match?: string,
- limit?: number
- ): Promise => {
- const interpolatedMatch = match ? this.datasource.interpolateString(match) : match;
- return await this.resourceClient.queryLabelValues(
- timeRange,
- this.datasource.interpolateString(labelKey),
- interpolatedMatch,
- limit
- );
- };
-
- /**
- * Fetch labels or values for a label based on the queries, scopes, filters and time range
- */
- fetchSuggestions = async (
- timeRange?: TimeRange,
- queries?: PromQuery[],
- scopes?: Scope[],
- adhocFilters?: AdHocVariableFilter[],
- labelName?: string,
- limit?: number,
- requestId?: string
- ): Promise => {
- if (!timeRange) {
- timeRange = getDefaultTimeRange();
- }
-
- const url = '/suggestions';
- const timeParams = this.datasource.getAdjustedInterval(timeRange);
- const value = await this.request(
- url,
- {
- labelName,
- queries: queries?.map((q) =>
- this.datasource.interpolateString(q.expr, {
- ...this.datasource.getIntervalVars(),
- ...this.datasource.getRangeScopedVars(timeRange),
- })
- ),
- scopes: scopes?.reduce((acc, scope) => {
- if (scope.spec.filters) {
- acc.push(...scope.spec.filters);
- }
-
- return acc;
- }, []),
- adhocFilters: adhocFilters?.map((filter) => ({
- key: filter.key,
- operator: scopeFilterOperatorMap[filter.operator],
- value: filter.value,
- values: filter.values,
- })),
- limit,
- ...timeParams,
- },
- {
- ...(requestId && { requestId }),
- headers: {
- ...getDefaultCacheHeaders(this.datasource.cacheLevel)?.headers,
- 'Content-Type': 'application/json',
- },
- method: 'POST',
- }
- );
-
- return value ?? [];
- };
-}
-
-export const importFromAbstractQuery = (labelBasedQuery: AbstractQuery): PromQuery => {
- return toPromLikeQuery(labelBasedQuery);
-};
-
-export const exportToAbstractQuery = (query: PromQuery): AbstractQuery => {
- const promQuery = query.expr;
- if (!promQuery || promQuery.length === 0) {
- return { refId: query.refId, labelMatchers: [] };
- }
- const tokens = Prism.tokenize(promQuery, promqlGrammar);
- const labelMatchers: AbstractLabelMatcher[] = extractLabelMatchers(tokens);
- const nameLabelValue = getNameLabelValue(promQuery, tokens);
- if (nameLabelValue && nameLabelValue.length > 0) {
- labelMatchers.push({
- name: '__name__',
- operator: AbstractLabelOperator.Equal,
- value: nameLabelValue,
- });
- }
-
- return {
- refId: query.refId,
- labelMatchers,
- };
-};
-
-/**
- * Checks if an error is a cancelled request error.
- * Used to avoid logging cancelled request errors.
- *
- * @param {unknown} error - Error to check
- * @returns {boolean} True if the error is a cancelled request error
- */
-function isCancelledError(error: unknown): error is {
- cancelled: boolean;
-} {
- return typeof error === 'object' && error !== null && 'cancelled' in error && error.cancelled === true;
-}
-
-function getNameLabelValue(promQuery: string, tokens: Array): string {
- let nameLabelValue = '';
-
- for (const token of tokens) {
- if (typeof token === 'string') {
- nameLabelValue = token;
- break;
- }
- }
- return nameLabelValue;
-}
-
-/**
- * Extracts metrics from queries and populates match parameters.
- * This is used to filter time series data based on existing queries.
- * Handles UTF8 metrics by properly escaping them.
- *
- * @param {PromQuery[]} queries - Array of Prometheus queries
- * @returns {string[]} Metric names as a regex matcher inside the array for easy handling
- */
-export const populateMatchParamsFromQueries = (queries?: PromQuery[]): string[] => {
- if (!queries) {
- return [];
- }
-
- const metrics = (queries ?? []).reduce((params, query) => {
- const visualQuery = buildVisualQueryFromString(query.expr);
- if (visualQuery.query.metric !== '') {
- params.push(visualQuery.query.metric);
- }
- if (visualQuery.query.binaryQueries) {
- visualQuery.query.binaryQueries.forEach((bq) => {
- if (bq.query.metric !== '') {
- params.push(bq.query.metric);
- }
- });
- }
- return params;
- }, []);
-
- return metrics.length === 0 ? [] : [`__name__=~"${metrics.join('|')}"`];
-};
diff --git a/packages/grafana-prometheus/src/language_utils.test.ts b/packages/grafana-prometheus/src/language_utils.test.ts
deleted file mode 100644
index 4aacc433b14..00000000000
--- a/packages/grafana-prometheus/src/language_utils.test.ts
+++ /dev/null
@@ -1,563 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/language_utils.test.ts
-import { type Moment } from 'moment';
-
-import { AbstractLabelOperator, type AbstractQuery, type DateTime, dateTime, type TimeRange } from '@grafana/data';
-
-import { escapeLabelValueInExactSelector, escapeLabelValueInRegexSelector } from './escaping';
-import {
- expandRecordingRules,
- fixSummariesMetadata,
- getPrometheusTime,
- getRangeSnapInterval,
- removeQuotesIfExist,
- toPromLikeQuery,
- truncateResult,
-} from './language_utils';
-import { PrometheusCacheLevel } from './types';
-
-describe('fixSummariesMetadata', () => {
- const synthetics = {
- ALERTS: {
- type: 'gauge',
- help: 'Time series showing pending and firing alerts. The sample value is set to 1 as long as the alert is in the indicated active (pending or firing) state.',
- },
- };
- it('returns only synthetics on empty metadata', () => {
- expect(fixSummariesMetadata({})).toEqual({ ...synthetics });
- });
-
- it('returns unchanged metadata if no summary is present', () => {
- const metadataRaw = {
- foo: [{ type: 'not_a_summary', help: 'foo help' }],
- };
-
- const metadata = {
- foo: { type: 'not_a_summary', help: 'foo help' },
- };
- expect(fixSummariesMetadata(metadataRaw)).toEqual({ ...metadata, ...synthetics });
- });
-
- it('returns metadata with added count and sum for a summary', () => {
- const metadata = {
- foo: [{ type: 'not_a_summary', help: 'foo help' }],
- bar: [{ type: 'summary', help: 'bar help' }],
- };
- const expected = {
- foo: { type: 'not_a_summary', help: 'foo help' },
- bar: { type: 'summary', help: 'bar help' },
- bar_count: {
- type: 'counter',
- help: 'Count of events that have been observed for the base metric (bar help)',
- },
- bar_sum: { type: 'counter', help: 'Total sum of all observed values for the base metric (bar help)' },
- };
- expect(fixSummariesMetadata(metadata)).toEqual({ ...expected, ...synthetics });
- });
-
- it('returns metadata with added bucket/count/sum for a histogram', () => {
- const metadata = {
- foo: [{ type: 'not_a_histogram', help: 'foo help' }],
- bar: [{ type: 'histogram', help: 'bar help' }],
- };
- const expected = {
- foo: { type: 'not_a_histogram', help: 'foo help' },
- bar: { type: 'histogram', help: 'bar help' },
- bar_bucket: { type: 'counter', help: 'Cumulative counters for the observation buckets (bar help)' },
- bar_count: {
- type: 'counter',
- help: 'Count of events that have been observed for the histogram metric (bar help)',
- },
- bar_sum: { type: 'counter', help: 'Total sum of all observed values for the histogram metric (bar help)' },
- };
- expect(fixSummariesMetadata(metadata)).toEqual({ ...expected, ...synthetics });
- });
-});
-
-describe('expandRecordingRules()', () => {
- it('returns query w/o recording rules as is', () => {
- expect(expandRecordingRules('metric', {})).toBe('metric');
- expect(expandRecordingRules('metric + metric', {})).toBe('metric + metric');
- expect(expandRecordingRules('metric{}', {})).toBe('metric{}');
- });
-
- it('does not modify recording rules name in label values', () => {
- expect(
- expandRecordingRules('{__name__="metric"} + bar', {
- metric: { expandedQuery: 'foo' },
- bar: { expandedQuery: 'super' },
- })
- ).toBe('{__name__="metric"} + super');
- });
-
- it('returns query with expanded recording rules', () => {
- expect(expandRecordingRules('metric', { metric: { expandedQuery: 'foo' } })).toBe('foo');
- expect(expandRecordingRules('metric + metric', { metric: { expandedQuery: 'foo' } })).toBe('foo + foo');
- expect(expandRecordingRules('metric{}', { metric: { expandedQuery: 'foo' } })).toBe('foo{}');
- expect(expandRecordingRules('metric[]', { metric: { expandedQuery: 'foo' } })).toBe('foo[]');
- expect(
- expandRecordingRules('metric + foo', {
- metric: { expandedQuery: 'foo' },
- foo: { expandedQuery: 'bar' },
- })
- ).toBe('foo + bar');
- });
-
- it('returns query with labels with expanded recording rules', () => {
- expect(
- expandRecordingRules('metricA{label1="value1"} / metricB{label2="value2"}', {
- metricA: { expandedQuery: 'fooA' },
- metricB: { expandedQuery: 'fooB' },
- })
- ).toBe('fooA{label1="value1"} / fooB{label2="value2"}');
- expect(
- expandRecordingRules('metricA{label1="value1",label2="value,2"}', {
- metricA: { expandedQuery: 'rate(fooA[])' },
- })
- ).toBe('rate(fooA{label1="value1", label2="value,2"}[])');
- expect(
- expandRecordingRules('metricA{label1="value1"} / metricB{label2="value2"}', {
- metricA: { expandedQuery: 'rate(fooA[])' },
- metricB: { expandedQuery: 'rate(fooB[])' },
- })
- ).toBe('rate(fooA{label1="value1"}[]) / rate(fooB{label2="value2"}[])');
- expect(
- expandRecordingRules('metricA{label1="value1",label2="value2"} / metricB{label3="value3"}', {
- metricA: { expandedQuery: 'rate(fooA[])' },
- metricB: { expandedQuery: 'rate(fooB[])' },
- })
- ).toBe('rate(fooA{label1="value1", label2="value2"}[]) / rate(fooB{label3="value3"}[])');
- });
-
- it('expands the query even it is wrapped with parentheses', () => {
- expect(
- expandRecordingRules('sum (metric{label1="value1"}) by (env)', {
- metric: { expandedQuery: 'foo{labelInside="valueInside"}' },
- })
- ).toBe('sum (foo{labelInside="valueInside", label1="value1"}) by (env)');
- });
-
- it('expands the query with regex match', () => {
- expect(
- expandRecordingRules('sum (metric{label1=~"/value1/(sa|sb)"}) by (env)', {
- metric: { expandedQuery: 'foo{labelInside="valueInside"}' },
- })
- ).toBe('sum (foo{labelInside="valueInside", label1=~"/value1/(sa|sb)"}) by (env)');
- });
-
- it('ins:metric:per{pid="val-42", comp="api"}', () => {
- const query = `aaa:111{pid="val-42", comp="api"} + bbb:222{pid="val-42"}`;
- const mapping = {
- 'aaa:111': {
- expandedQuery:
- '(max without (mp) (targetMetric{device=~"/dev/(sda1|sdb)"}) / max without (mp) (targetMetric2{device=~"/dev/(sda1|sdb)"}))',
- },
- 'bbb:222': { expandedQuery: '(targetMetric2{device=~"/dev/(sda1|sdb)"})' },
- };
- const expected = `(max without (mp) (targetMetric{device=~"/dev/(sda1|sdb)", pid="val-42", comp="api"}) / max without (mp) (targetMetric2{device=~"/dev/(sda1|sdb)", pid="val-42", comp="api"})) + (targetMetric2{device=~"/dev/(sda1|sdb)", pid="val-42"})`;
- const result = expandRecordingRules(query, mapping);
- expect(result).toBe(expected);
- });
-
- it('when there is an identifier, identifier must be removed from expanded query', () => {
- const query = `ins:metric:per{uuid="111", comp="api"}`;
- const mapping = {
- 'ins:metric:per': {
- expandedQuery: 'targetMetric{device="some_device"}',
- identifier: 'uuid',
- identifierValue: '111',
- },
- };
- const expected = `targetMetric{device="some_device", comp="api"}`;
- const result = expandRecordingRules(query, mapping);
- expect(result).toBe(expected);
- });
-
- it('when there is an identifier, identifier must be removed from complex expanded query', () => {
- const query = `instance_path:requests:rate5m{uuid="111", four="tops"} + instance_path:requests:rate15m{second="album", uuid="222"}`;
- const mapping = {
- 'instance_path:requests:rate5m': {
- expandedQuery: `rate(prometheus_http_requests_total{job="prometheus"}`,
- identifier: 'uuid',
- identifierValue: '111',
- },
- 'instance_path:requests:rate15m': {
- expandedQuery: `prom_http_requests_sum{job="prometheus"}`,
- identifier: 'uuid',
- identifierValue: '222',
- },
- };
- const expected = `rate(prometheus_http_requests_total{job="prometheus", four="tops"} + prom_http_requests_sum{job="prometheus", second="album"}`;
- const result = expandRecordingRules(query, mapping);
- expect(result).toBe(expected);
- });
-
- it('when there is an empty label value it should still be able to expand the rule', () => {
- const query = `sum(max by (cluster, container) (pod_cpu:active:kube_limits{container!="", cluster=~"pink"}))`;
- const mapping = {
- 'pod_cpu:active:kube_limits': {
- expandedQuery: `kube_limits{job!="", resource="cpu"} * on (namespace, pod, cluster) group_left () max by (namespace, pod, cluster) ((kube_pod_status_phase{phase=~"Pending|Running"} == 1))`,
- },
- };
- const expected = `sum(max by (cluster, container) (kube_limits{job!="", resource="cpu", container!="", cluster=~"pink"} * on (namespace, pod, cluster) group_left () max by (namespace, pod, cluster) ((kube_pod_status_phase{phase=~"Pending|Running", container!="", cluster=~"pink"} == 1))))`;
- const result = expandRecordingRules(query, mapping);
- expect(result).toBe(expected);
- });
-});
-
-describe('escapeLabelValueInExactSelector()', () => {
- it('handles newline characters', () => {
- expect(escapeLabelValueInExactSelector('t\nes\nt')).toBe('t\\nes\\nt');
- });
-
- it('handles backslash characters', () => {
- expect(escapeLabelValueInExactSelector('t\\es\\t')).toBe('t\\\\es\\\\t');
- });
-
- it('handles double-quote characters', () => {
- expect(escapeLabelValueInExactSelector('t"es"t')).toBe('t\\"es\\"t');
- });
-
- it('handles all together', () => {
- expect(escapeLabelValueInExactSelector('t\\e"st\nl\nab"e\\l')).toBe('t\\\\e\\"st\\nl\\nab\\"e\\\\l');
- });
-});
-
-describe('escapeLabelValueInRegexSelector()', () => {
- it('handles newline characters', () => {
- expect(escapeLabelValueInRegexSelector('t\nes\nt')).toBe('t\\nes\\nt');
- });
-
- it('handles backslash characters', () => {
- expect(escapeLabelValueInRegexSelector('t\\es\\t')).toBe('t\\\\\\\\es\\\\\\\\t');
- });
-
- it('handles double-quote characters', () => {
- expect(escapeLabelValueInRegexSelector('t"es"t')).toBe('t\\"es\\"t');
- });
-
- it('handles regex-meaningful characters', () => {
- expect(escapeLabelValueInRegexSelector('t+es$t')).toBe('t\\\\+es\\\\$t');
- });
-
- it('handles all together', () => {
- expect(escapeLabelValueInRegexSelector('t\\e"s+t\nl\n$ab"e\\l')).toBe(
- 't\\\\\\\\e\\"s\\\\+t\\nl\\n\\\\$ab\\"e\\\\\\\\l'
- );
- });
-});
-
-describe('getRangeSnapInterval', () => {
- it('will not change input if set to no cache', () => {
- const intervalSeconds = 10 * 60; // 10 minutes
- const now = new Date().valueOf();
-
- const expectedFrom = dateTime(now - intervalSeconds * 1000);
- const expectedTo = dateTime(now);
-
- const range: TimeRange = {
- from: expectedFrom,
- to: expectedTo,
- } as TimeRange;
-
- expect(getRangeSnapInterval(PrometheusCacheLevel.None, range)).toEqual({
- start: getPrometheusTime(expectedFrom, false).toString(),
- end: getPrometheusTime(expectedTo, true).toString(),
- });
- });
-
- it('will snap range to closest minute', () => {
- const queryDurationMinutes = 10;
- const intervalSeconds = queryDurationMinutes * 60; // 10 minutes
- const now = 1680901009826;
- const nowPlusOneMinute = now + 1000 * 60;
- const nowPlusTwoMinute = now + 1000 * 60 * 2;
-
- const nowTime = dateTime(now) as Moment;
-
- const expectedFrom = nowTime.clone().startOf('minute').subtract(queryDurationMinutes, 'minute');
- const expectedTo = nowTime.clone().startOf('minute').add(1, 'minute');
-
- const range: TimeRange = {
- from: dateTime(now - intervalSeconds * 1000),
- to: dateTime(now),
- } as TimeRange;
-
- const range2: TimeRange = {
- from: dateTime(nowPlusOneMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusOneMinute),
- raw: {
- from: dateTime(nowPlusOneMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusOneMinute),
- },
- };
- const range3: TimeRange = {
- from: dateTime(nowPlusTwoMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusTwoMinute),
- raw: {
- from: dateTime(nowPlusTwoMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusTwoMinute),
- },
- };
-
- const first = getRangeSnapInterval(PrometheusCacheLevel.Low, range);
- const second = getRangeSnapInterval(PrometheusCacheLevel.Low, range2);
- const third = getRangeSnapInterval(PrometheusCacheLevel.Low, range3);
-
- expect(first).toEqual({
- start: getPrometheusTime(expectedFrom as DateTime, false).toString(10),
- end: getPrometheusTime(expectedTo as DateTime, false).toString(10),
- });
-
- expect(second).toEqual({
- start: getPrometheusTime(expectedFrom.clone().add(1, 'minute') as DateTime, false).toString(10),
- end: getPrometheusTime(expectedTo.clone().add(1, 'minute') as DateTime, false).toString(10),
- });
-
- expect(third).toEqual({
- start: getPrometheusTime(expectedFrom.clone().add(2, 'minute') as DateTime, false).toString(10),
- end: getPrometheusTime(expectedTo.clone().add(2, 'minute') as DateTime, false).toString(10),
- });
- });
-
- it('will snap range to closest 10 minute', () => {
- const queryDurationMinutes = 60;
- const intervalSeconds = queryDurationMinutes * 60; // 10 minutes
- const now = 1680901009826;
- const nowPlusOneMinute = now + 1000 * 60;
- const nowPlusTwoMinute = now + 1000 * 60 * 2;
-
- const nowTime = dateTime(now) as Moment;
- const nowTimePlusOne = dateTime(nowPlusOneMinute) as Moment;
- const nowTimePlusTwo = dateTime(nowPlusTwoMinute) as Moment;
-
- const calculateClosest10 = (date: Moment): Moment => {
- const numberOfMinutes = Math.floor(date.minutes() / 10) * 10;
- const numberOfHours = numberOfMinutes < 60 ? date.hours() : date.hours() + 1;
- return date
- .clone()
- .minutes(numberOfMinutes % 60)
- .hours(numberOfHours);
- };
-
- const expectedFromFirst = calculateClosest10(
- nowTime.clone().startOf('minute').subtract(queryDurationMinutes, 'minute')
- );
- const expectedToFirst = calculateClosest10(nowTime.clone().startOf('minute').add(1, 'minute'));
-
- const expectedFromSecond = calculateClosest10(
- nowTimePlusOne.clone().startOf('minute').subtract(queryDurationMinutes, 'minute')
- );
- const expectedToSecond = calculateClosest10(nowTimePlusOne.clone().startOf('minute').add(1, 'minute'));
-
- const expectedFromThird = calculateClosest10(
- nowTimePlusTwo.clone().startOf('minute').subtract(queryDurationMinutes, 'minute')
- );
- const expectedToThird = calculateClosest10(nowTimePlusTwo.clone().startOf('minute').add(1, 'minute'));
-
- const range: TimeRange = {
- from: dateTime(now - intervalSeconds * 1000),
- to: dateTime(now),
- } as TimeRange;
-
- const range2: TimeRange = {
- from: dateTime(nowPlusOneMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusOneMinute),
- raw: {
- from: dateTime(nowPlusOneMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusOneMinute),
- },
- };
- const range3: TimeRange = {
- from: dateTime(nowPlusTwoMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusTwoMinute),
- raw: {
- from: dateTime(nowPlusTwoMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusTwoMinute),
- },
- };
-
- const first = getRangeSnapInterval(PrometheusCacheLevel.Medium, range);
- const second = getRangeSnapInterval(PrometheusCacheLevel.Medium, range2);
- const third = getRangeSnapInterval(PrometheusCacheLevel.Medium, range3);
-
- expect(first).toEqual({
- start: getPrometheusTime(expectedFromFirst as DateTime, false).toString(10),
- end: getPrometheusTime(expectedToFirst as DateTime, false).toString(10),
- });
-
- expect(second).toEqual({
- start: getPrometheusTime(expectedFromSecond.clone() as DateTime, false).toString(10),
- end: getPrometheusTime(expectedToSecond.clone() as DateTime, false).toString(10),
- });
-
- expect(third).toEqual({
- start: getPrometheusTime(expectedFromThird.clone() as DateTime, false).toString(10),
- end: getPrometheusTime(expectedToThird.clone() as DateTime, false).toString(10),
- });
- });
-
- it('will snap range to closest 60 minute', () => {
- const queryDurationMinutes = 120;
- const intervalSeconds = queryDurationMinutes * 60;
- const now = 1680901009826;
- const nowPlusOneMinute = now + 1000 * 60;
- const nowPlusTwoMinute = now + 1000 * 60 * 2;
-
- const nowTime = dateTime(now) as Moment;
- const nowTimePlusOne = dateTime(nowPlusOneMinute) as Moment;
- const nowTimePlusTwo = dateTime(nowPlusTwoMinute) as Moment;
-
- const calculateClosest60 = (date: Moment): Moment => {
- const numberOfMinutes = Math.floor(date.minutes() / 60) * 60;
- const numberOfHours = numberOfMinutes < 60 ? date.hours() : date.hours() + 1;
- return date
- .clone()
- .minutes(numberOfMinutes % 60)
- .hours(numberOfHours);
- };
-
- const expectedFromFirst = calculateClosest60(
- nowTime.clone().startOf('minute').subtract(queryDurationMinutes, 'minute')
- );
- const expectedToFirst = calculateClosest60(nowTime.clone().startOf('minute').add(1, 'minute'));
-
- const expectedFromSecond = calculateClosest60(
- nowTimePlusOne.clone().startOf('minute').subtract(queryDurationMinutes, 'minute')
- );
- const expectedToSecond = calculateClosest60(nowTimePlusOne.clone().startOf('minute').add(1, 'minute'));
-
- const expectedFromThird = calculateClosest60(
- nowTimePlusTwo.clone().startOf('minute').subtract(queryDurationMinutes, 'minute')
- );
- const expectedToThird = calculateClosest60(nowTimePlusTwo.clone().startOf('minute').add(1, 'minute'));
-
- const range: TimeRange = {
- from: dateTime(now - intervalSeconds * 1000),
- to: dateTime(now),
- } as TimeRange;
-
- const range2: TimeRange = {
- from: dateTime(nowPlusOneMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusOneMinute),
- raw: {
- from: dateTime(nowPlusOneMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusOneMinute),
- },
- };
- const range3: TimeRange = {
- from: dateTime(nowPlusTwoMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusTwoMinute),
- raw: {
- from: dateTime(nowPlusTwoMinute - intervalSeconds * 1000),
- to: dateTime(nowPlusTwoMinute),
- },
- };
-
- const first = getRangeSnapInterval(PrometheusCacheLevel.High, range);
- const second = getRangeSnapInterval(PrometheusCacheLevel.High, range2);
- const third = getRangeSnapInterval(PrometheusCacheLevel.High, range3);
-
- expect(first).toEqual({
- start: getPrometheusTime(expectedFromFirst as DateTime, false).toString(10),
- end: getPrometheusTime(expectedToFirst as DateTime, false).toString(10),
- });
-
- expect(second).toEqual({
- start: getPrometheusTime(expectedFromSecond.clone() as DateTime, false).toString(10),
- end: getPrometheusTime(expectedToSecond.clone() as DateTime, false).toString(10),
- });
-
- expect(third).toEqual({
- start: getPrometheusTime(expectedFromThird.clone() as DateTime, false).toString(10),
- end: getPrometheusTime(expectedToThird.clone() as DateTime, false).toString(10),
- });
- });
-});
-
-describe('toPromLikeQuery', () => {
- it('export abstract query to PromQL-like query', () => {
- const abstractQuery: AbstractQuery = {
- refId: 'bar',
- labelMatchers: [
- { name: 'label1', operator: AbstractLabelOperator.Equal, value: 'value1' },
- { name: 'label2', operator: AbstractLabelOperator.NotEqual, value: 'value2' },
- { name: 'label3', operator: AbstractLabelOperator.EqualRegEx, value: 'value3' },
- { name: 'label4', operator: AbstractLabelOperator.NotEqualRegEx, value: 'value4' },
- ],
- };
-
- expect(toPromLikeQuery(abstractQuery)).toMatchObject({
- refId: 'bar',
- expr: '{label1="value1", label2!="value2", label3=~"value3", label4!~"value4"}',
- range: true,
- });
- });
-});
-
-describe('truncateResult', () => {
- it('truncates array longer then 1k from the start of array', () => {
- // creates an array of 1k + 1 elements with values from 0 to 1k
- const array = Array.from(Array(1001).keys());
- expect(array[1000]).toBe(1000);
- truncateResult(array);
- expect(array.length).toBe(1000);
- expect(array[0]).toBe(0);
- expect(array[999]).toBe(999);
- });
-});
-
-describe('removeQuotesIfExist', () => {
- it('removes quotes from a string with double quotes', () => {
- const input = '"hello"';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('hello');
- });
-
- it('returns the original string if it does not start and end with quotes', () => {
- const input = 'hello';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('hello');
- });
-
- it('returns the original string if it has mismatched quotes', () => {
- const input = '"hello';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('"hello');
- });
-
- it('removes quotes for strings with special characters inside quotes', () => {
- const input = '"hello, world!"';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('hello, world!');
- });
-
- it('removes quotes for strings with spaces inside quotes', () => {
- const input = '" "';
- const result = removeQuotesIfExist(input);
- expect(result).toBe(' ');
- });
-
- it('returns the original string for an empty string', () => {
- const input = '';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('');
- });
-
- it('returns the original string if the string only has a single quote character', () => {
- const input = '"';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('"');
- });
-
- it('handles strings with nested quotes correctly', () => {
- const input = '"nested \"quotes\""';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('nested \"quotes\"');
- });
-
- it('removes quotes from a numeric string wrapped in quotes', () => {
- const input = '"12345"';
- const result = removeQuotesIfExist(input);
- expect(result).toBe('12345');
- });
-});
diff --git a/packages/grafana-prometheus/src/language_utils.ts b/packages/grafana-prometheus/src/language_utils.ts
deleted file mode 100644
index 203d1e3eae6..00000000000
--- a/packages/grafana-prometheus/src/language_utils.ts
+++ /dev/null
@@ -1,420 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/language_utils.ts
-import { invert } from 'lodash';
-import { Token } from 'prismjs';
-
-import {
- type AbstractLabelMatcher,
- AbstractLabelOperator,
- type AbstractQuery,
- type DataQuery,
- dateMath,
- type DateTime,
- incrRoundDn,
- type TimeRange,
-} from '@grafana/data';
-
-import { addLabelToQuery } from './add_label_to_query';
-import { getCacheDurationInMinutes } from './caching';
-import { PROMETHEUS_QUERY_BUILDER_MAX_RESULTS } from './constants';
-import {
- PrometheusCacheLevel,
- type PromMetricsMetadata,
- type PromMetricsMetadataItem,
- type RecordingRuleIdentifier,
-} from './types';
-
-export const processHistogramMetrics = (metrics: string[]) => {
- const resultSet: Set = new Set();
- const regexp = new RegExp('_bucket($|:)');
- for (let index = 0; index < metrics.length; index++) {
- const metric = metrics[index];
- const isHistogramValue = regexp.test(metric);
- if (isHistogramValue) {
- resultSet.add(metric);
- }
- }
- return [...resultSet];
-};
-
-// This will capture 4 groups. Example label filter => {instance="10.4.11.4:9003"}
-// 1. label: instance
-// 2. operator: =
-// 3. value: "10.4.11.4:9003"
-// 4. comma: if there is a comma it will give ,
-// 5. space: if there is a space after comma it will give the whole space
-// comma and space is useful for addLabelsToExpression function
-const labelRegexp = /\b(\w+)(!?=~?)("[^"\n]*?")(,)?(\s*)?/g;
-
-export function expandRecordingRules(query: string, mapping: { [name: string]: RecordingRuleIdentifier }): string {
- const getRuleRegex = (ruleName: string) => new RegExp(`(\\s|\\(|^)(${ruleName})(\\s|$|\\(|\\[|\\{)`, 'ig');
-
- // For each mapping key we iterate over the query and split them in parts.
- // recording:rule{label=~"/label/value"} * some:other:rule{other_label="value"}
- // We want to keep parts in here like this:
- // recording:rule
- // {label=~"/label/value"} *
- // some:other:rule
- // {other_label="value"}
- const tmpSplitParts = Object.keys(mapping).reduce(
- (prev, curr) => {
- let parts: string[] = [];
- let tmpParts: string[] = [];
- let removeIdx: number[] = [];
-
- // we iterate over prev because it might be like this after first loop
- // recording:rule and {label=~"/label/value"} * some:other:rule{other_label="value"}
- // so we need to split the second part too
- prev.filter(Boolean).forEach((p, i) => {
- const doesMatch = p.match(getRuleRegex(curr));
- if (doesMatch) {
- parts = p.split(curr);
- if (parts.length === 2) {
- // this is the case when we have such result for this query
- // max (metric{label="value"})
- // "max(", "{label="value"}"
- removeIdx.push(i);
- tmpParts.push(...[parts[0], curr, parts[1]].filter(Boolean));
- } else if (parts.length > 2) {
- // this is the case when we have such query
- // metric + metric
- // when we split it we have such data
- // "", " + ", ""
- removeIdx.push(i);
- parts = parts.map((p) => (p === '' ? curr : p));
- tmpParts.push(...parts);
- }
- }
- });
-
- // if we have idx to remove that means we split the value in that index.
- // No need to keep it. Have the new split values instead.
- removeIdx.forEach((ri) => (prev[ri] = ''));
- prev = prev.filter(Boolean);
- prev.push(...tmpParts);
-
- return prev;
- },
- [query]
- );
-
- // we have the separate parts. we need to replace the metric and apply the labels if there is any
- let labelFound = false;
- const trulyExpandedQuery = tmpSplitParts.map((tsp, i) => {
- // if we know this loop tsp is a label, not the metric we want to expand
- if (labelFound) {
- labelFound = false;
- return '';
- }
-
- // check if the mapping is there
- if (mapping[tsp]) {
- const { expandedQuery: recordingRule, identifierValue, identifier } = mapping[tsp];
- // it is a recording rule. if the following is a label then apply it
- if (i + 1 !== tmpSplitParts.length && tmpSplitParts[i + 1].match(labelRegexp)) {
- // the next value in the loop is label. Let's apply labels to the metric
- labelFound = true;
- const regexp = new RegExp(`(,)?(\\s)?(${identifier}=\\"${identifierValue}\\")(,)?(\\s)?`, 'g');
- const labels = tmpSplitParts[i + 1].replace(regexp, '');
- const invalidLabelsRegex = /(\)\{|\}\{|\]\{)/;
- return addLabelsToExpression(recordingRule + labels, invalidLabelsRegex);
- } else {
- // it is not a recording rule and might be a binary operation in between two recording rules
- // So no need to do anything. just return it.
- return recordingRule;
- }
- }
-
- return tsp;
- });
-
- // Remove empty strings and merge them
- return trulyExpandedQuery.filter(Boolean).join('');
-}
-
-function addLabelsToExpression(expr: string, invalidLabelsRegexp: RegExp) {
- const match = expr.match(invalidLabelsRegexp);
- if (!match) {
- return expr;
- }
-
- // Split query into 2 parts - before the invalidLabelsRegex match and after.
- const indexOfRegexMatch = match.index ?? 0;
- const exprBeforeRegexMatch = expr.slice(0, indexOfRegexMatch + 1);
- const exprAfterRegexMatch = expr.slice(indexOfRegexMatch + 1);
-
- // Create arrayOfLabelObjects with label objects that have key, operator and value.
- const arrayOfLabelObjects: Array<{
- key: string;
- operator: string;
- value: string;
- comma?: string;
- space?: string;
- }> = [];
- exprAfterRegexMatch.replace(labelRegexp, (label, key, operator, value, comma, space) => {
- arrayOfLabelObjects.push({ key, operator, value, comma, space });
- return '';
- });
-
- // Loop through all label objects and add them to query.
- // As a starting point we have valid query without the labels.
- let result = exprBeforeRegexMatch;
- arrayOfLabelObjects.filter(Boolean).forEach((obj) => {
- // Remove extra set of quotes from obj.value
- const value = obj.value.slice(1, -1);
- result = addLabelToQuery(result, obj.key, value, obj.operator);
- });
-
- // reconstruct the labels
- let existingLabel = arrayOfLabelObjects.reduce((prev, curr) => {
- prev += `${curr.key}${curr.operator}${curr.value}${curr.comma ?? ''}${curr.space ?? ''}`;
- return prev;
- }, '');
-
- // Check if there is anything besides labels
- // Useful for this kind of metrics sum (recording_rule_metric{label1="value1"}) by (env)
- // if we don't check this part, ) by (env) part will be lost
- existingLabel = '{' + existingLabel + '}';
- const potentialLeftOver = exprAfterRegexMatch.replace(existingLabel, '');
-
- return result + potentialLeftOver;
-}
-
-/**
- * Adds metadata for synthetic metrics for which the API does not provide metadata.
- * See https://github.com/grafana/grafana/issues/22337 for details.
- *
- * @param metadata HELP and TYPE metadata from /api/v1/metadata
- */
-export function fixSummariesMetadata(metadata: { [metric: string]: PromMetricsMetadataItem[] }): PromMetricsMetadata {
- if (!metadata) {
- return metadata;
- }
- const baseMetadata: PromMetricsMetadata = {};
- const summaryMetadata: PromMetricsMetadata = {};
- for (const metric in metadata) {
- // NOTE: based on prometheus-documentation, we can receive
- // multiple metadata-entries for the given metric, it seems
- // it happens when the same metric is on multiple targets
- // and their help-text differs
- // (https://prometheus.io/docs/prometheus/latest/querying/api/#querying-metric-metadata)
- // for now we just use the first entry.
- const item = metadata[metric][0];
- baseMetadata[metric] = item;
-
- if (item.type === 'histogram') {
- summaryMetadata[`${metric}_bucket`] = {
- type: 'counter',
- help: `Cumulative counters for the observation buckets (${item.help})`,
- };
- summaryMetadata[`${metric}_count`] = {
- type: 'counter',
- help: `Count of events that have been observed for the histogram metric (${item.help})`,
- };
- summaryMetadata[`${metric}_sum`] = {
- type: 'counter',
- help: `Total sum of all observed values for the histogram metric (${item.help})`,
- };
- }
- if (item.type === 'summary') {
- summaryMetadata[`${metric}_count`] = {
- type: 'counter',
- help: `Count of events that have been observed for the base metric (${item.help})`,
- };
- summaryMetadata[`${metric}_sum`] = {
- type: 'counter',
- help: `Total sum of all observed values for the base metric (${item.help})`,
- };
- }
- }
- // Synthetic series
- const syntheticMetadata: PromMetricsMetadata = {};
- syntheticMetadata['ALERTS'] = {
- type: 'gauge',
- help: 'Time series showing pending and firing alerts. The sample value is set to 1 as long as the alert is in the indicated active (pending or firing) state.',
- };
-
- return { ...baseMetadata, ...summaryMetadata, ...syntheticMetadata };
-}
-
-export function roundMsToMin(milliseconds: number): number {
- return roundSecToMin(milliseconds / 1000);
-}
-
-function roundSecToMin(seconds: number): number {
- return Math.floor(seconds / 60);
-}
-
-// Returns number of minutes rounded up to the nearest nth minute
-function roundSecToNextMin(seconds: number, secondsToRound = 1): number {
- return Math.ceil(seconds / 60) - (Math.ceil(seconds / 60) % secondsToRound);
-}
-
-const FromPromLikeMap: Record = {
- '=': AbstractLabelOperator.Equal,
- '!=': AbstractLabelOperator.NotEqual,
- '=~': AbstractLabelOperator.EqualRegEx,
- '!~': AbstractLabelOperator.NotEqualRegEx,
-};
-
-const ToPromLikeMap: Record = invert(FromPromLikeMap) as Record<
- AbstractLabelOperator,
- string
->;
-
-function toPromLikeExpr(labelBasedQuery: AbstractQuery): string {
- const expr = labelBasedQuery.labelMatchers
- .map((selector: AbstractLabelMatcher) => {
- const operator = ToPromLikeMap[selector.operator];
- if (operator) {
- return `${selector.name}${operator}"${selector.value}"`;
- } else {
- return '';
- }
- })
- .filter((e: string) => e !== '')
- .join(', ');
-
- return expr ? `{${expr}}` : '';
-}
-
-export function toPromLikeQuery(labelBasedQuery: AbstractQuery): PromLikeQuery {
- return {
- refId: labelBasedQuery.refId,
- expr: toPromLikeExpr(labelBasedQuery),
- range: true,
- };
-}
-
-interface PromLikeQuery extends DataQuery {
- expr: string;
- range: boolean;
-}
-
-function getMaybeTokenStringContent(token: Token): string {
- if (typeof token.content === 'string') {
- return token.content;
- }
-
- return '';
-}
-
-export function extractLabelMatchers(tokens: Array): AbstractLabelMatcher[] {
- const labelMatchers: AbstractLabelMatcher[] = [];
-
- for (const token of tokens) {
- if (!(token instanceof Token)) {
- continue;
- }
-
- if (token.type === 'context-labels') {
- let labelKey = '';
- let labelValue = '';
- let labelOperator = '';
-
- const contentTokens = Array.isArray(token.content) ? token.content : [token.content];
-
- for (let currentToken of contentTokens) {
- if (typeof currentToken === 'string') {
- let currentStr: string;
- currentStr = currentToken;
- if (currentStr === '=' || currentStr === '!=' || currentStr === '=~' || currentStr === '!~') {
- labelOperator = currentStr;
- }
- } else if (currentToken instanceof Token) {
- switch (currentToken.type) {
- case 'label-key':
- labelKey = getMaybeTokenStringContent(currentToken);
- break;
- case 'label-value':
- labelValue = getMaybeTokenStringContent(currentToken);
- labelValue = labelValue.substring(1, labelValue.length - 1);
- const labelComparator = FromPromLikeMap[labelOperator];
- if (labelComparator) {
- labelMatchers.push({ name: labelKey, operator: labelComparator, value: labelValue });
- }
- break;
- }
- }
- }
- }
- }
-
- return labelMatchers;
-}
-
-/**
- * Calculates new interval "snapped" to the closest Nth minute, depending on cache level datasource setting
- * @param cacheLevel
- * @param range
- */
-export function getRangeSnapInterval(
- cacheLevel: PrometheusCacheLevel,
- range: TimeRange
-): {
- start: string;
- end: string;
-} {
- // Don't round the range if we're not caching
- if (cacheLevel === PrometheusCacheLevel.None) {
- return {
- start: getPrometheusTime(range.from, false).toString(),
- end: getPrometheusTime(range.to, true).toString(),
- };
- }
- // Otherwise round down to the nearest nth minute for the start time
- const startTime = getPrometheusTime(range.from, false);
- const startTimeQuantizedSeconds = incrRoundDn(startTime, getCacheDurationInMinutes(cacheLevel) * 60);
-
- // And round up to the nearest nth minute for the end time
- const endTime = getPrometheusTime(range.to, true);
- const endTimeQuantizedSeconds = roundSecToNextMin(endTime, getCacheDurationInMinutes(cacheLevel)) * 60;
-
- // If the interval was too short, we could have rounded both start and end to the same time, if so let's add one step to the end
- if (startTimeQuantizedSeconds === endTimeQuantizedSeconds) {
- const endTimePlusOneStep = endTimeQuantizedSeconds + getCacheDurationInMinutes(cacheLevel) * 60;
- return { start: startTimeQuantizedSeconds.toString(), end: endTimePlusOneStep.toString() };
- }
-
- const start = startTimeQuantizedSeconds.toString();
- const end = endTimeQuantizedSeconds.toString();
-
- return { start, end };
-}
-
-export function getPrometheusTime(date: string | DateTime, roundUp: boolean) {
- if (typeof date === 'string') {
- date = dateMath.parse(date, roundUp)!;
- }
-
- return Math.ceil(date.valueOf() / 1000);
-}
-
-/**
- * Used to truncate metrics, label names and label value in the query builder select components
- * to improve frontend performance. This is best used with an async select component including
- * the loadOptions property where we should still allow users to search all results with a string.
- * This can be done either storing the total results or querying an api that allows for matching a query.
- *
- * @param array
- * @param limit
- * @returns
- */
-export function truncateResult(array: T[], limit?: number): T[] {
- if (limit === undefined) {
- limit = PROMETHEUS_QUERY_BUILDER_MAX_RESULTS;
- }
- array.length = Math.min(array.length, limit);
- return array;
-}
-
-/**
- * Removes quotes from a string if they exist.
- * Used to handle utf8 label keys in Prometheus queries.
- *
- * @param {string} input - Input string that may have surrounding quotes
- * @returns {string} String with surrounding quotes removed if they existed
- */
-export function removeQuotesIfExist(input: string): string {
- const match = input.match(/^"(.*)"$/); // extract the content inside the quotes
- return match?.[1] ?? input;
-}
diff --git a/packages/grafana-prometheus/src/loadResources.ts b/packages/grafana-prometheus/src/loadResources.ts
deleted file mode 100644
index 98774001988..00000000000
--- a/packages/grafana-prometheus/src/loadResources.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-import { LANGUAGES, type ResourceLoader, type Resources } from '@grafana/i18n';
-
-const resources = LANGUAGES.reduce Promise<{ default: Resources }>>>((acc, lang) => {
- acc[lang.code] = async () => await import(`./locales/${lang.code}/grafana-prometheus.json`);
- return acc;
-}, {});
-
-export const loadResources: ResourceLoader = async (resolvedLanguage: string) => {
- const translation = await resources[resolvedLanguage]();
- return translation.default;
-};
diff --git a/packages/grafana-prometheus/src/locales/cs-CZ/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/cs-CZ/grafana-prometheus.json
deleted file mode 100644
index cc20f760391..00000000000
--- a/packages/grafana-prometheus/src/locales/cs-CZ/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Chyba načtení dat vysvětlivky!",
- "aria-label-lower-limit-parameter": "Nastavit dolní limit pro parametr kroku",
- "label-min-step": "Min. krok",
- "label-series-value-as-timestamp": "Hodnota řady jako časové razítko",
- "label-tags": "Tagy",
- "label-text": "Text",
- "label-title": "Název",
- "placeholder-auto": "auto.",
- "tooltip-either-pattern-example-instance-replaced-label": "Použijte buď název, nebo vzor. Například {{labelTemplate}} je nahrazeno hodnotou štítku pro štítek {{labelName}}.",
- "tooltip-min-step": "Dodatečný dolní limit pro parametr kroku dotazu Prometheus a pro proměnné <2>{{intervalVar}}2> a <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Jednotka časového razítka je milisekunda. Pokud je jednotkou hodnoty řady sekunda, vynásobte její vektor rozsahu 1 000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Spustit okamžitý dotaz a dotaz na rozsah"
- },
- "label": {
- "both": "Oba"
- },
- "range-options": {
- "description": {
- "query-range": "Spustit dotaz v časovém rozsahu"
- },
- "label": {
- "instant": "Instantní",
- "range": "Rozsah"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filtrovat výraz pro štítek",
- "description-select-labels": "Po výběru hodnot štítků se zobrazí pouze možné kombinace štítků.",
- "select-labels-to-search-in": "2. Vyberte štítky, ve kterých chcete hledat"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filtrovat výraz pro metriku",
- "aria-label-limit-results-from-series-endpoint": "Omezit výsledky z koncového bodu řady",
- "description-series-limit": "Limit se vztahuje na všechny metriky, štítky a hodnoty. Ponechte pole prázdné pro použití výchozího limitu. Nastavením na 0 zakážete limit a načtete vše – může to způsobit problémy s výkonem.",
- "label-select-metric": "Po výběru metriky se zobrazí pouze možné štítky. Štítky jsou omezeny limitem řady níže.",
- "select-a-metric": "1. Vyberte metriku",
- "series-limit": "Limit řady"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Přehled PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Příklady",
- "tooltip-disable-query": "Zakázat dotaz s příklady",
- "tooltip-enable-query": "Povolit dotaz s příklady"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Extra pole Prometheus",
- "aria-label-query-type-field": "Pole typu dotazu",
- "aria-label-step-field": "Pole kroku",
- "min-step": "Min. krok",
- "query-type": "Typ dotazu",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Zde lze použít časové jednotky a vestavěné proměnné, například: {{example1}}, {{example2}}, {{example3}} {{example4}}, {{example5}}, {{example6}}, {{example7}} (výchozí, pokud není zadána žádná jednotka: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Zadejte dotaz PromQL…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Klasický dotaz",
- "aria-label-metric-regex": "Metrický regulární výraz",
- "aria-label-metric-selector": "Volič metriky",
- "aria-label-prometheus-query": "Dotaz Prometheus",
- "aria-label-query-type": "Typ dotazu",
- "aria-label-series-query": "Dotaz na řadu",
- "label-classic-query": "Klasický dotaz",
- "label-label": "Štítek",
- "label-metric-regex": "Metrický regulární výraz",
- "label-query": "Dotaz",
- "label-query-type": "Typ dotazu",
- "label-series-query": "Dotaz na řadu",
- "placeholder-classic-query": "Klasický dotaz",
- "placeholder-metric-regex": "Metrický regulární výraz",
- "placeholder-prometheus-query": "Dotaz Prometheus",
- "placeholder-select-query-type": "Vyberte typ dotazu",
- "placeholder-series-query": "Dotaz na řadu",
- "returns-metrics-matching-specified-metric-regex": "Vrátí seznam metrik odpovídajících zadanému metrickému regulárnímu výrazu.",
- "tooltip-classic-query": "Původní implementace editoru proměnných dotazů Prometheus. Zadejte řetězec se správným typem dotazu a parametry, jak je popsáno v těchto dokumentech. Například {{exampleQuery}}.",
- "tooltip-label": "Vrátí seznam hodnot štítků pro název štítku ve všech metrikách, pokud není metrika zadána.",
- "tooltip-metric-regex": "Vrátí seznam názvů štítků, volitelně filtrování podle zadaného metrického regulárního výrazu.",
- "tooltip-query": "Vrátí seznam výsledků dotazu Prometheus pro daný dotaz. To může zahrnovat funkce Prometheus, tj. {{exampleQuery}}.",
- "tooltip-query-type": "Plugin zdroje dat Prometheus poskytuje následující typy dotazů pro proměnné šablony.",
- "tooltip-series-query": "Zadejte metriku se štítky, pouze metriku nebo pouze štítky, tj. {{example1}}, {{example2}} nebo {{example3}}. Vrátí seznam časových řad spojených se zadanými daty."
- },
- "selector-actions": {
- "aria-label-selector": "volič",
- "aria-label-selector-clear-button": "Tlačítko Vymazat volič",
- "aria-label-use-selector-as-metrics-button": "Tlačítko Použít volič jako metriku",
- "aria-label-use-selector-for-query-button": "Tlačítko Použít volič pro dotaz",
- "aria-label-validate-submit-button": "Tlačítko Ověřit odeslání",
- "clear": "Vymazat",
- "resulting-selector": "4. Výsledný volič",
- "use-as-rate-query": "Použít jako dotaz na sazbu",
- "use-query": "Použít dotaz",
- "validate-selector": "Ověřit volič"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filtrovat výraz pro hodnoty štítků",
- "aria-label-values-for": "Hodnoty pro {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Použijte vyhledávací pole pro hledání hodnot napříč vybranými štítky.",
- "select-multiple-values-for-your-labels": "3. Vyberte (více) hodnot pro štítky"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Povolit jako cíl pravidel nahrávání",
- "label-manage-alerts-via-alerting-ui": "Spravovat výstrahy prostřednictvím uživatelského rozhraní upozorňování",
- "title-alerting": "Výstrahy",
- "tooltip-allow-as-recording-rules-target": "Povolit výběr tohoto zdroje dat jako cíle pro zápis pravidel nahrávání.",
- "tooltip-manage-alerts-via-alerting-ui": "Spravovat pravidla výstrah pro tento zdroj dat. Chcete-li spravovat další zdroje Alerting, přidejte zdroj dat Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "Režim přístupu z prohlížeče ve zdroji dat Prometheus již není k dispozici. Přepněte na režim přístupu k serveru.",
- "description-advanced-settings": "Další nastavení jsou volitelná nastavení, která lze nakonfigurovat pro větší kontrolu nad zdrojem dat.",
- "title-advanced-settings": "Pokročilá nastavení",
- "title-error": "Chyba"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Vaše metoda přístupu je <1>Prohlížeč1>, to znamená, že adresa URL musí být přístupná z prohlížeče.",
- "tooltip-http-url": "Zadejte úplnou adresu URL HTTP (například {{exampleURL}})",
- "tooltip-server-access-mode": "Vaše metoda přístupu je <1>Server1>, to znamená, že adresa URL musí být přístupná z backendu/serveru Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Další podrobnosti najdete v dokumentaci zde."
- },
- "exemplar-setting": {
- "label-data-source": "Zdroj dat",
- "label-internal-link": "Interní odkaz",
- "label-label-name": "Název štítku",
- "label-remove-exemplar-link": "Odebrat příklad odkazu",
- "label-url": "URL",
- "label-url-label": "Štítek adresy URL",
- "placeholder-go-to-examplecom": "Přejít na example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Odebrat příklad odkazu",
- "tooltip-data-source": "Zdroj dat, na který bude exemplář odkazovat.",
- "tooltip-internal-link": "Tuto možnost povolte, pokud máte interní odkaz. Pokud je tato možnost povolena, zobrazí se výběr zdroje dat. Vyberte úložiště dat pro sledování backendu pro vaše vzorová data.",
- "tooltip-label-name": "Název pole v objektu štítků, které by mělo být použito k získání traceID.",
- "tooltip-url": "Adresa URL backendu stopy pro uživatele za účelem trasování",
- "tooltip-url-label": "Použijte k přepsání štítku tlačítka v poli traceID exempláře."
- },
- "exemplars-settings": {
- "add": "Přidat",
- "no-exemplars-configurations": "Žádné příklady konfigurace",
- "title-exemplars": "Příklady"
- },
- "prom-settings": {
- "aria-label-default-editor": "Výchozí editor (kód nebo nástroj pro tvorbu)",
- "aria-label-prom-type-type": "{{promType}} typ",
- "aria-label-prometheus-type": "Typ Prometheus",
- "aria-label-select-http-method": "Vyberte metodu HTTP",
- "editor-options": {
- "label-builder": "Nástroj pro tvorbu",
- "label-code": "Kód"
- },
- "label-cache-level": "Úroveň vyrovnávací paměti",
- "label-custom-query-parameters": "Vlastní parametry dotazu",
- "label-default-editor": "Výchozí editor",
- "label-disable-metrics-lookup": "Zakázat vyhledávání metrik",
- "label-disable-recording-rules-beta": "Zakázat pravidla nahrávání (beta)",
- "label-http-method": "Metoda HTTP",
- "label-incremental-querying-beta": "Přírůstkové dotazování (beta)",
- "label-prom-type-version": "{{promType}} verze",
- "label-prometheus-type": "Typ Prometheus",
- "label-query-overlap-window": "Okno překrytí dotazu",
- "label-query-timeout": "Časový limit dotazu",
- "label-scrape-interval": "Interval scrapingu",
- "label-series-limit": "Limit řady",
- "label-use-series-endpoint": "Použít koncový bod řady",
- "more-info": "Další informace o konfiguraci typu a verze Prometheus ve zdrojích dat najdete v <2>dokumentaci k zajišťování2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Příklad: {{example}}",
- "title-interval-behaviour": "Chování intervalu",
- "title-other": "Ostatní",
- "title-performance": "Výkon",
- "title-query-editor": "Editor dotazů",
- "tooltip-cache-level": "Nastaví úroveň ukládání do vyrovnávací paměti prohlížeče pro dotazy editoru. Pro zdroje dat s vysokou kardinalitou se doporučuje nastavit vyšší úroveň vyrovnávací paměti.",
- "tooltip-custom-query-parameters": "Přidejte vlastní parametry do adresy URL dotazu Prometheus. Například {{example1}}, {{example2}}, {{example3}} nebo {{example4}}. Více parametrů by mělo být pospojováno pomocí {{concatenationChar}}.",
- "tooltip-default-editor": "Nastavit výchozí možnost editoru pro všechny uživatele tohoto zdroje dat.",
- "tooltip-disable-metrics-lookup": "Zaškrtnutím této možnosti zakážete výběr metrik a podporu metrik/štítků v automatickém doplňování pole dotazu. Užitečné, pokud máte problémy s výkonem u větších instancí Prometheus. ",
- "tooltip-disable-recording-rules-beta": "Tato funkce zakáže pravidla nahrávání. Zapněte tuto možnost pro zlepšení výkonu nástěnky",
- "tooltip-http-method": "K dotazu na zdroj dat Prometheus můžete použít metodu POST nebo GET HTTP. Doporučenou metodou je POST, protože umožňuje větší dotazy. Změňte na GET, pokud máte verzi Prometheus starší než 2.1 nebo pokud jsou požadavky POST ve vaší síti omezeny.",
- "tooltip-incremental-querying-beta": "Tato funkce změní výchozí chování relativních dotazů tak, aby vždy požadovaly aktuální data z instance Prometheus. Místo toho budou výsledky dotazů uloženy do vyrovnávací paměti a budou požadovány pouze nové záznamy. Povolte tuto možnost pro snížení zatížení databáze a sítě.",
- "tooltip-prom-type-version": "Tímto nastavíte verzi své instance {{promType}}, pokud není automaticky nakonfigurována.",
- "tooltip-prometheus-type": "Nastavte hodnotu na typ databáze Prometheus, např. Prometheus, Cortex, Mimir nebo Thanos. Změna tohoto pole uloží aktuální nastavení. Některé typy Prometheus podporují nebo nepodporují různá rozhraní API. Některé typy například podporují shodu regulérního výrazu pro dotazy na štítky za účelem zlepšení výkonu. Některé typy mají API pro metadata. Pokud toto nastavíte nesprávně, při dotazování na metriky a štítky můžete zaznamenat neobvyklé chování. Zkontrolujte dokumentaci Prometheus a ujistěte se, že zadáváte správný typ.",
- "tooltip-query-overlap-window": "Nastavte dobu trvání, například {{example1}} nebo {{example2}} nebo {{example3}}. Výchozí hodnota: {{default}}. Tato doba trvání bude přidána k době trvání každého přírůstkového požadavku.",
- "tooltip-query-timeout": "Nastavte časový limit dotazu Prometheus.",
- "tooltip-scrape-interval": "Tento interval udává, jak často Prometheus shromažďuje cíle. Nastavte hodnotu na typický interval shromažďování a vyhodnocování nakonfigurovaný v konfiguračním souboru Prometheus. Pokud nastavíte hodnotu vyšší než interval konfiguračního souboru Prometheus, Grafana vyhodnotí data podle tohoto intervalu a uvidíte méně datových bodů. Výchozí nastavení je {{default}}.",
- "tooltip-series-limit": "Limit se vztahuje na všechny zdroje (metriky, štítky a hodnoty) pro oba koncové body (řady a štítky). Ponechte pole prázdné pro použití výchozího limitu (40 000). Nastavením na 0 zakážete limit a načtete vše – může to způsobit problémy s výkonem. Výchozí limit je 40 000.",
- "tooltip-use-series-endpoint": "Zaškrtnutím této možnosti upřednostníte koncový bod řady s parametrem {{exampleParameter}} před koncovým bodem hodnot štítků s parametrem {{exampleParameter}}. Zatímco koncový bod hodnot štítků je považován za výkonnější, někteří uživatelé mohou upřednostňovat řady kvůli metodě POST, zatímco koncový bod hodnot štítků má pouze metodu GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(zakázáno)",
- "enabled-label": "Prohlížeč metrik"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Zahrnuje pouze jedinečné štítky",
- "description-custom": "Zadejte šablonu pro pojmenování",
- "description-verbose": "Všechny názvy a hodnoty štítků",
- "label-auto": "Auto.",
- "label-custom": "Vlastní",
- "label-verbose": "Podrobný"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Vypočítat průměr z rozměrů",
- "documentation-bottomk": "Nejmenší k prvky podle hodnoty vzorku",
- "documentation-count": "Spočítat prvky ve vektoru",
- "documentation-count-values": "Spočítat počet prvků se stejnou hodnotou",
- "documentation-group": "Všechny hodnoty ve výsledném vektoru jsou 1",
- "documentation-max": "Vybrat maximum nad rozměry",
- "documentation-min": "Vybrat minimum podle rozměrů",
- "documentation-quantile": "Vypočítat φ-kvantil (0 ≤ φ ≤ 1) podle rozměrů",
- "documentation-stddev": "Vypočítat populační směrodatnou odchylku podle rozměrů",
- "documentation-stdvar": "Vypočítat standardní rozptyl populace podle rozměrů",
- "documentation-sum": "Vypočítat součet podle rozměrů",
- "documentation-topk": "Největší k prvky podle hodnoty vzorku"
- },
- "getFunctions": {
- "documentation-abs": "Vrátí vstupní vektor se všemi hodnotami vzorku převedenými na jejich absolutní hodnotu.",
- "documentation-absent": "Vrátí prázdný vektor, pokud vektor, který mu byl předán, obsahuje nějaké prvky, a vektor s jedním prvkem s hodnotou 1, pokud vektor, který mu byl předán, neobsahuje žádné prvky. To je užitečné pro upozorňování, když pro danou kombinaci názvu metriky a štítku neexistuje žádná časová řada.",
- "documentation-absent-over-time": "Vrátí prázdný vektor, pokud vektor rozsahu, který mu byl předán, obsahuje nějaké prvky, a vektor s jedním prvkem s hodnotou 1, pokud vektor rozsahu, který mu byl předán, neobsahuje žádné prvky.",
- "documentation-avg-over-time": "Průměrná hodnota všech bodů v zadaném intervalu.",
- "documentation-ceil": "Zaokrouhlí vzorové hodnoty všech prvků v části „v“ nahoru na nejbližší celé číslo.",
- "documentation-changes": "Pro každou vstupní časovou řadu vrátí „changes(v range-vector)“ počet změn její hodnoty v zadaném časovém rozsahu jako okamžitý vektor.",
- "documentation-clamp": "Omezí hodnoty všech prvků v části „v“ tak, aby měly dolní hranici „min“ a horní hranici „max“.",
- "documentation-clamp-max": "Omezí hodnoty všech prvků v části „v“ tak, aby měly horní hranici „max“.",
- "documentation-clamp-min": "Omezí hodnoty všech prvků v části „v“ tak, aby měly dolní hranici „min“.",
- "documentation-count-over-time": "Počet všech hodnot v zadaném intervalu.",
- "documentation-count-scalar": "Vrací počet prvků vektoru časové řady jako skalární hodnotu. To je rozdíl od agregačního operátoru „count()“, který vždy vrací vektor (prázdný, pokud je vstupní vektor prázdný) a umožňuje seskupování podle štítků pomocí klauzule „by“.",
- "documentation-day-of-month": "Vrátí den v měsíci pro každý z daných časů v UTC. Vrácené hodnoty jsou od 1 do 31.",
- "documentation-day-of-week": "Vrátí den v týdnu pro každý z daných časů v UTC. Vrácené hodnoty jsou od 0 do 6, kde 0 znamená neděli atd.",
- "documentation-day-of-year": "Vrátí den v roce pro každý z daných časů v UTC. Vrácené hodnoty jsou od 1 do 365 pro roky, které nejsou přestupné, a od 1 do 366 pro přestupné roky.",
- "documentation-days-in-month": "Vrátí počet dní v měsíci pro každý z daných časů v UTC. Vrácené hodnoty jsou od 28 do 31.",
- "documentation-deg": "Převádí radiány na stupně pro všechny prvky v",
- "documentation-delta": "Vypočítá rozdíl mezi první a poslední hodnotou každého prvku časové řady ve vektoru rozsahu „v“ a vrátí okamžitý vektor s danými deltami a ekvivalentními štítky. Delta je extrapolována tak, aby pokrývala celý časový rozsah, jak je specifikováno ve voliči vektoru rozsahu, takže je možné získat neceločíselný výsledek, i když jsou všechny hodnoty vzorku celá čísla.",
- "documentation-deriv": "Vypočítá derivaci časové řady za sekundu ve vektoru rozsahu „v“ pomocí jednoduché lineární regrese.",
- "documentation-double-exponential-smoothing": "Vytvoří vyhlazenou hodnotu pro časové řady na základě rozsahu v části „v“. Čím nižší je vyhlazovací faktor „sf“, tím větší důležitost je přikládána starým datům. Čím vyšší je trendový faktor „tf“, tím více trendů v datech je zvažováno. „sf“ i „tf“ musí být mezi 0 a 1.",
- "documentation-drop-common-labels": "Vynechá všechny štítky, které mají stejný název a hodnotu ve všech řadách ve vstupním vektoru.",
- "documentation-exp": "Vypočítá exponenciální funkci pro všechny prvky v části „v“.\nZvláštní případy jsou:\n* „Exp(+Inf) = +Inf“ \n* „Exp(NaN) = NaN“",
- "documentation-floor": "Zaokrouhlí vzorové hodnoty všech prvků v části „v“ dolů na nejbližší celé číslo.",
- "documentation-histogram-avg": "Vrátí aritmetický průměr pozorovaných hodnot uložených v nativním histogramu. Vzorky, které nejsou nativními histogramy, jsou ignorovány a ve vráceném vektoru se nezobrazují.",
- "documentation-histogram-count": "Vrátí počet pozorování uložených v nativním histogramu.",
- "documentation-histogram-fraction": "Vrátí odhadovaný zlomek pozorování mezi zadanou dolní a horní hodnotou.",
- "documentation-histogram-quantile": "Vypočítá φ-kvantil (0 ≤ φ ≤ 1) ze segmentů „b“ histogramu. Vzorky v „b“ jsou počty pozorování v každém segmentu. Každý vzorek musí mít štítek „le“, kde hodnota štítku označuje inkluzivní horní hranici segmentu. (Vzorky bez takového štítku jsou tiše ignorovány.) Typ metriky histogramu automaticky poskytuje časové řady s příponou „_bucket“ a příslušnými štítky.",
- "documentation-histogram-stddev": "Vrátí odhadovanou směrodatnou odchylku pozorování v nativním histogramu na základě geometrického průměru segmentů, kde se pozorování nacházejí.",
- "documentation-histogram-stdvar": "Vrátí odhadovaný standardní rozptyl pozorování v nativním histogramu.",
- "documentation-histogram-sum": "Vrátí součet pozorování uložených v nativním histogramu.",
- "documentation-holt-winters": "Přejmenováno na double_exponential_smoothing v prometheus v3.x. Pro verze Prometheus rovné a větší než v3.0 použijte double_exponential_smoothing. \n\nVytváří vyhlazenou hodnotu pro časové řady na základě rozsahu v „v“. Čím nižší je vyhlazovací faktor „sf“, tím větší význam je přikládán starým datům. Čím vyšší je trendový faktor „tf“, tím více trendů v datech je zvažováno. „sf“ i „tf“ musí být mezi 0 a 1.",
- "documentation-hour": "Vrátí hodinu dne pro každý z daných časů v UTC. Vrácené hodnoty jsou od 0 do 23.",
- "documentation-idelta": "Vypočítá rozdíl mezi posledními dvěma vzorky ve vektoru rozsahu „v“ a vrátí okamžitý vektor s danými deltami a ekvivalentními štítky.",
- "documentation-increase": "Vypočítá nárůst časové řady ve vektoru rozsahu. Přerušení monotónnosti (například resetování počítadla v důsledku restartů cíle) se automaticky upravují. Nárůst je extrapolován tak, aby pokrýval celý časový rozsah, jak je specifikováno ve voliči vektoru rozsahu, takže je možné získat neceločíselný výsledek, i když se počítadlo zvyšuje pouze o celočíselné přírůstky.",
- "documentation-info": "Vrátí nejnovější podrobnosti a metadata o skupině metrik, jako jsou jejich štítky a aktuální hodnoty, bez provádění jakýchkoli výpočtů",
- "documentation-irate": "Vypočítá okamžitou rychlost nárůstu časové řady ve vektoru rozsahu za sekundu. Vychází z posledních dvou datových bodů. Přerušení monotónnosti (například resetování počítadla v důsledku restartu cíle) se automaticky upravují.",
- "documentation-label-join": "Pro každou časovou řadu v části „v“ spojí všechny hodnoty všech „src_labels“ pomocí „separator“ a vrátí časové řady se štítkem „dst_label“ obsahujícím spojenou hodnotu. V této funkci může být libovolný počet „src_labels“.",
- "documentation-label-replace": "Pro každou časovou řadu v části „v“ porovná „label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)“ regulární výraz „regulérní výraz“ se štítkem „src_label“. Pokud se shoduje, pak se vrátí časová řada se štítkem „dst_label“ nahrazeným rozšířením „replacement“. „$1“ se nahradí první odpovídající podskupinou, „$2“ druhou atd. Pokud se regulární výraz neshoduje, pak se časová řada vrátí beze změny.",
- "documentation-last-over-time": "Nejnovější bodová hodnota v zadaném intervalu.",
- "documentation-ln": "Vypočítá přirozený logaritmus pro všechny prvky v části „v“.\nZvláštní případy jsou:\n * „ln(+Inf) = +Inf“\n * „ln(0) = -Inf“\n * „ln(x < 0) = NaN“\n * „ln(NaN) = NaN“",
- "documentation-log10": "Vypočítá desetinný logaritmus pro všechny prvky v části „v“. Zvláštní případy jsou ekvivalentní těm v „ln“.",
- "documentation-log2": "Vypočítá binární logaritmus pro všechny prvky v části „v“. Zvláštní případy jsou ekvivalentní těm v části „ln“.",
- "documentation-max-over-time": "Maximální hodnota všech bodů v zadaném intervalu.",
- "documentation-min-over-time": "Minimální hodnota všech bodů v zadaném intervalu.",
- "documentation-minute": "Vrátí minutu hodiny pro každý z daných časů v UTC. Vrácené hodnoty jsou od 0 do 59.",
- "documentation-month": "Vrátí měsíc v roce pro každý z daných časů v UTC. Vrácené hodnoty jsou od 1 do 12, kde 1 znamená leden atd.",
- "documentation-pi": "Vrátí pí",
- "documentation-predict-linear": "Předpovídá hodnotu časové řady „t“ sekund od této chvíle na základě vektoru rozsahu „v“ pomocí jednoduché lineární regrese.",
- "documentation-present-over-time": "Hodnota 1 pro libovolnou řadu v zadaném intervalu.",
- "documentation-quantile-over-time": "φ-kvantil (0 ≤ φ ≤ 1) hodnot v zadaném intervalu.",
- "documentation-rad": "Převádí stupně na radiány pro všechny prvky v části v",
- "documentation-rate": "Vypočítá průměrnou rychlost nárůstu časové řady za sekundu ve vektoru rozsahu. Přerušení monotónnosti (například resetování počítadla v důsledku restartů cíle) se automaticky upravují. Výpočet také extrapoluje na konce časového rozsahu, což umožňuje vynechané metriky nebo nedokonalé srovnání cyklů metrik s časovým obdobím rozsahu.",
- "documentation-resets": "Pro každou vstupní časovou řadu vrátí „resets(v range-vector)“ počet resetů počítadla v zadaném časovém rozsahu jako okamžitý vektor. Jakékoli snížení hodnoty mezi dvěma po sobě jdoucími vzorky je interpretováno jako reset počítadla.",
- "documentation-round": "Zaokrouhlí vzorové hodnoty všech prvků v části „v“ na nejbližší celé číslo. Shody se zaokrouhlují nahoru. Volitelný argument „to_nearest“ umožňuje určit nejbližší násobek, na který by měly být vzorové hodnoty zaokrouhleny. Tento násobek může být také zlomkem.",
- "documentation-scalar": "Vzhledem k jednoprvkovému vstupnímu vektoru vrátí „scalar(v instant-vector)“ hodnotu vzorku tohoto jednoho prvku jako skalární hodnotu. Pokud vstupní vektor nemá přesně jeden prvek, „scalar“ vrátí „NaN“.",
- "documentation-sgn": "Vrátí vektor se všemi hodnotami vzorku převedenými na jejich znaménko, definované takto: 1, pokud je v kladné, -1, pokud je v záporné, a 0, pokud se v rovná nule.",
- "documentation-sort": "Vrátí vektorové prvky seřazené podle jejich vzorových hodnot ve vzestupném pořadí.",
- "documentation-sort-desc": "Vrátí vektorové prvky seřazené podle jejich vzorových hodnot v sestupném pořadí.",
- "documentation-sqrt": "Vypočítá druhou odmocninu všech prvků v části „v“.",
- "documentation-stddev-over-time": "Standardní odchylka hodnot v zadaném intervalu.",
- "documentation-stdvar-over-time": "Standardní rozptyl hodnot v zadaném intervalu.",
- "documentation-sum-over-time": "Součet všech hodnot v zadaném intervalu.",
- "documentation-time": "Vrátí počet sekund od 1. ledna 1970 UTC. Upozorňujeme, že se nejedná o aktuální čas, ale o čas, kdy má být výraz vyhodnocen.",
- "documentation-timestamp": "Vrátí časové razítko každého ze vzorků daného vektoru jako počet sekund od 1. ledna 1970 UTC.",
- "documentation-vector": "Vrátí skalární hodnotu jako vektor bez štítků.",
- "documentation-year": "Vrátí rok pro každý z daných časů v UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "vypočítá arkus kosinus všech prvků v {{argument}}",
- "documentation-acosh": "vypočítá inverzní hyperbolický kosinus všech prvků v {{argument}}",
- "documentation-asin": "vypočítá arkus sinus všech prvků v {{argument}}",
- "documentation-asinh": "vypočítá inverzní hyperbolický sinus všech prvků v {{argument}}",
- "documentation-atan": "vypočítá arkus tangens všech prvků v {{argument}}",
- "documentation-atanh": "vypočítá inverzní hyperbolický tangens všech prvků v {{argument}}",
- "documentation-cos": "vypočítá kosinus všech prvků v {{argument}}",
- "documentation-cosh": "vypočítá hyperbolický kosinus všech prvků v {{argument}}",
- "documentation-sin": "vypočítá sinus všech prvků v {{argument}}",
- "documentation-sinh": "vypočítá hyperbolický sinus všech prvků v {{argument}}",
- "documentation-tan": "vypočítá tangens všech prvků v {{argument}}",
- "documentation-tanh": "vypočítá hyperbolický tangens všech prvků v {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Poskytnout zpětnou vazbu",
- "title-give-feedback": "Průzkumník metrik je nový. Dejte nám prosím vědět, jak ho můžeme vylepšit"
- },
- "get-collapsed-info": {
- "exemplars": "Příklady: {{value}}",
- "format": "Formát: {{value}}",
- "legend": "Legenda: {{value}}",
- "step": "Krok: {{value}}",
- "type": "Typ: {{value}}"
- },
- "get-placeholders": {
- "browse": "Hledat metriky podle názvu",
- "type": "Filtrovat podle typu"
- },
- "get-prom-types": {
- "description-counter": "Kumulativní metrika, která představuje jedno monotónně rostoucí počítadlo, jehož hodnota se může při restartu pouze zvýšit nebo vynulovat.",
- "description-gauge": "Metrika, která představuje jednu číselnou hodnotu, která může libovolně stoupat a klesat.",
- "description-histogram": "Histogram vzorkuje pozorování (obvykle údaje jako doba trvání požadavků nebo velikosti odpovědí) a počítá je v konfigurovatelných segmentech.",
- "description-native-histogram": "Nativní histogramy se od klasických histogramů Prometheus liší v několika ohledech: Hranice nativních histogramových segmentů se počítají podle vzorce, který závisí na měřítku (rozlišení) nativního histogramu, a nejsou definovány uživatelem.",
- "description-no-type": "Tyto metriky nemají v metadatech definovaný typ.",
- "description-summary": "Shrnuje vzorky pozorování (obvykle údaje jako délka požadavků a velikost odpovědí) a dokáže vypočítat konfigurovatelné kvantily v posuvném časovém okně.",
- "description-unknown": "Těmto metrikám byl v metadatech přiřazen neznámý typ.",
- "label-counter": "Počítadlo",
- "label-gauge": "Měřidlo",
- "label-histogram": "Histogram",
- "label-native-histogram": "Nativní histogram",
- "label-no-type": "Žádný typ",
- "label-summary": "Shrnutí",
- "label-unknown": "Neznámé"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Analýza dotazu je nejednoznačná."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Odebrat {{name}}",
- "placeholder-select-label": "Vybrat štítek",
- "placeholder-select-value": "Vyberte hodnotu"
- },
- "label-filters": {
- "label-filters": "Filtry štítků",
- "label-label-filters": "Filtry štítků",
- "tooltip-label-filters": "Volitelné: používá se k filtrování metriky vybrané pro tento typ dotazu."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Načítání štítků",
- "noOptionsMessage-no-labels-found": "Nebyly nalezeny žádné štítky"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Otevřít průzkumníka metrik",
- "placeholder-select-metric": "Vybrat metriku",
- "tooltip-open-metrics-explorer": "Otevřít průzkumníka metrik"
- },
- "label-metric": "Metrika",
- "tooltip-metric": "Volitelné: vrátí seznam hodnot štítků pro název štítku v zadané metrice."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Procházet metriky",
- "currently-selected": "Aktuálně vybráno: {{selected}}",
- "metrics-pre-filtered": "Tyto metriky byly předem filtrovány štítky vybranými ve filtrech štítků.",
- "title-metrics-explorer": "Průzkumník metrik"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorování",
- "on": "Zapnuto"
- },
- "operator": "Operátor",
- "tooltip-remove-match": "Odebrat shodu",
- "vector-matches": "Vektorové shody"
- },
- "operation-editor": {
- "not-found": "Operace {{id}} nebyla nalezena",
- "title-remove": "Odebrat {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Nahradit",
- "title-click-to-view-alternative-operations": "Kliknutím zobrazíte alternativní operace",
- "title-remove-operation": "Odebrat operaci"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Kliknutím zobrazíte popis",
- "title-remove-operation": "Odebrat operaci"
- },
- "operation-list": {
- "operations": "Operace",
- "placeholder-search": "Hledat",
- "title-add-operation": "Přidat operaci"
- },
- "operation-param-editor": {
- "title-add": "Přidat {{name}}",
- "title-remove": "Odebrat {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Vypočítá {{aggregationName}} podle rozměrů při zachování {{labelWord}} {{labels}}.",
- "label-default": "Vypočítá {{aggregationName}} podle rozměrů.",
- "label-without": "Vypočítá {{aggregationName}} podle rozměrů {{labels}}. Všechny ostatní štítky jsou zachovány."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Přepínač příkladů.",
- "aria-label-format": "Formátovat kombinované pole",
- "aria-label-lower-limit-parameter": "Textové pole „Min. krok“, nastaví dolní limit pro parametr kroku",
- "aria-label-select-resolution": "Vyberte rozlišení",
- "aria-label-type": "Skupina přepínačů typu rádio",
- "format-options": {
- "label-heatmap": "Teplotní mapa",
- "label-table": "Tabulka",
- "label-time-series": "Časové řady"
- },
- "label-exemplars": "Příklady",
- "label-format": "Formát",
- "label-min-step": "Min. krok",
- "label-resolution": "Rozlišení",
- "label-type": "Typ",
- "placeholder-auto": "auto.",
- "title-options": "Možnosti",
- "tooltip-min-step": "Dodatečný dolní limit pro parametr kroku dotazu Prometheus a pro proměnné <2>{{interval}}2> a <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Došlo k syntaktické chybě nebo nelze vizualizovat strukturu dotazu při přepnutí do režimu nástroje pro tvorbu. Části dotazu mohou být ztraceny.",
- "confirmText-continue": "Pokračovat",
- "kick-start-your-query": "Spustit dotaz",
- "label-explain": "Vysvětlit",
- "run-queries": "Spustit dotazy",
- "title-parsing-error-switch-builder": "Chyba analýzy: Přepnout do režimu nástroje pro tvorbu?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Kombinované pole legendy",
- "label-legend": "Legenda",
- "placeholder-select-legend-mode": "Vyberte režim legendy",
- "tooltip-legend": "Přepsání názvu řady nebo šablony. Např. {{templateExample}} bude nahrazeno hodnotou štítku pro {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "nápověda: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Nástroj pro tvorbu",
- "label-code": "Kód"
- }
- },
- "query-pattern": {
- "apply-query": "Použít dotaz",
- "aria-label-apply-query-starter-button": "tlačítko Použít spouštěč dotazu",
- "aria-label-back-button": "tlačítko Zpět",
- "aria-label-create-new-query-button": "tlačítko Vytvořit nový dotaz",
- "aria-label-raw-query": "Nezpracovaný dotaz: {{patternName}}",
- "aria-label-use-this-query-button": "použít toto tlačítko dotazu",
- "back": "Zpět",
- "create-new-query": "Vytvořit nový dotaz",
- "use-this-query": "Použít tento dotaz"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "zavřít modální okno spuštění dotazu",
- "aria-label-kick-start-your-query-modal": "Spustit modální okno dotazu",
- "aria-label-toggle-query-starter": "otevřít a zavřít {{patternType}} kartu spouštěče dotazu",
- "close": "Zavřít",
- "description-kick-start-your-query": "Spusťte dotaz výběrem jednoho z těchto dotazů. Poté můžete pokračovat v dokončení dotazu.",
- "label-toggle-query-starter": "Spouštěče dotazů: {{patternType}}",
- "title-kick-start-your-query": "Spustit dotaz"
- },
- "raw-query": {
- "aria-label-selector": "volič"
- },
- "results-table": {
- "content-descriptive-type": "Při vytváření {{descriptiveType}} Prometheus zobrazí více řad s počítadlem typů. ",
- "description": "Popis",
- "message-expand-label-filters": "Nebyly nalezeny žádné metriky. Zkuste rozšířit filtry štítků.",
- "message-expand-search": "Nebyly nalezeny žádné metriky. Zkuste rozšířit vyhledávání a filtry.",
- "message-no-metrics-found": "Ve zdroji dat nebyly nalezeny žádné metriky.",
- "name": "Název",
- "type": "Typ"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/de-DE/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/de-DE/grafana-prometheus.json
deleted file mode 100644
index 33cbcedeb8e..00000000000
--- a/packages/grafana-prometheus/src/locales/de-DE/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Fehler beim Laden der Anmerkungsdaten!",
- "aria-label-lower-limit-parameter": "Untergrenze für den Schrittparameter festlegen",
- "label-min-step": "Min. Schritt",
- "label-series-value-as-timestamp": "Reihenwert als Zeitstempel",
- "label-tags": "Tags",
- "label-text": "Text",
- "label-title": "Titel",
- "placeholder-auto": "Auto",
- "tooltip-either-pattern-example-instance-replaced-label": "Verwenden Sie entweder den Namen oder ein Muster. Ein Beispiel: {{labelTemplate}} wird durch den Label-Wert für das Label {{labelName}} ersetzt.",
- "tooltip-min-step": "Eine zusätzliche Untergrenze für den Schrittparameter der Prometheus-Abfrage und für die Variablen <2>{{intervalVar}}2> und <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Die Einheit des Zeitstempels ist Millisekunden. Wenn die Einheit des Reihenwerts Sekunden ist, multiplizieren Sie den Bereichsvektor mit 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Eine Instant-Abfrage und eine Bereichsabfrage ausführen"
- },
- "label": {
- "both": "Beides"
- },
- "range-options": {
- "description": {
- "query-range": "Abfrage über einen bestimmten Zeitraum ausführen"
- },
- "label": {
- "instant": "Instant",
- "range": "Bereich"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filterausdruck für Label",
- "description-select-labels": "Sobald die Label-Werte ausgewählt sind, werden nur mögliche Label-Kombinationen angezeigt.",
- "select-labels-to-search-in": "2. Wählen Sie Labels aus, in denen gesucht werden soll"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filterausdruck für Metrik",
- "aria-label-limit-results-from-series-endpoint": "Ergebnisse vom Reihenendpunkt begrenzen",
- "description-series-limit": "Die Grenze gilt für alle Metriken, Labels und Werte. Wenn Sie das Feld leer lassen, wird die Standardgrenze verwendet. Durch eine Einstellung auf 0 wird die Grenze deaktiviert und alles abgerufen – dies kann zu Leistungsproblemen führen.",
- "label-select-metric": "Sobald eine Metrik ausgewählt ist, werden nur mögliche Labels angezeigt. Labels werden durch die folgende Reihengrenze begrenzt.",
- "select-a-metric": "1. Metrik auswählen",
- "series-limit": "Reihengrenze"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL Cheat Sheet"
- },
- "prom-exemplar-field": {
- "exemplars": "Exemplare",
- "tooltip-disable-query": "Abfrage mit Exemplaren deaktivieren",
- "tooltip-enable-query": "Abfrage mit Exemplaren aktivieren"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Zusätzliches Feld in Prometheus",
- "aria-label-query-type-field": "Abfragetyp-Feld",
- "aria-label-step-field": "Schrittfeld",
- "min-step": "Min. Schritt",
- "query-type": "Abfragetyp",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Hier können Zeiteinheiten und integrierte Variablen verwendet werden, zum Beispiel: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Standardwert bei fehlender Einheit: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Geben Sie eine PromQL-Abfrage ein …"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Klassische Abfrage",
- "aria-label-metric-regex": "Metrik-Regex",
- "aria-label-metric-selector": "Metrik-Selektor",
- "aria-label-prometheus-query": "Prometheus-Abfrage",
- "aria-label-query-type": "Abfragetyp",
- "aria-label-series-query": "Reihenabfrage",
- "label-classic-query": "Klassische Abfrage",
- "label-label": "Label",
- "label-metric-regex": "Metrik-RegEx",
- "label-query": "Abfrage",
- "label-query-type": "Abfragetyp",
- "label-series-query": "Reihenabfrage",
- "placeholder-classic-query": "Klassische Abfrage",
- "placeholder-metric-regex": "Metrik-Regex",
- "placeholder-prometheus-query": "Prometheus-Abfrage",
- "placeholder-select-query-type": "Abfragetyp auswählen",
- "placeholder-series-query": "Reihenabfrage",
- "returns-metrics-matching-specified-metric-regex": "Gibt eine Liste von Metriken zurück, die mit dem angegebenen Metrik-Regex übereinstimmen.",
- "tooltip-classic-query": "Die ursprüngliche Implementierung des Prometheus-Variablen-Abfrageeditors. Geben Sie eine Zeichenfolge mit dem richtigen Abfragetyp und den richtigen Parametern ein, wie in diesen Dokumenten beschrieben. Zum Beispiel: {{exampleQuery}}.",
- "tooltip-label": "Gibt eine Liste von Label-Werten für den Label-Namen in allen Metriken zurück, es sei denn, die Metrik ist angegeben.",
- "tooltip-metric-regex": "Gibt eine Liste von Label-Namen zurück, die optional gemäß dem angegebenen Metrik-Regex gefiltert werden.",
- "tooltip-query": "Gibt eine Liste der Prometheus-Abfrageergebnisse für die Abfrage zurück. Dies kann Prometheus-Funktionen umfassen, z. B. {{exampleQuery}}.",
- "tooltip-query-type": "Das Prometheus-Datenquellen-Plugin bietet die folgenden Abfragetypen für Vorlagenvariablen.",
- "tooltip-series-query": "Geben Sie eine Metrik mit Labels ein, nur eine Metrik oder nur Labels, z. B. {{example1}}, {{example2}} oder {{example3}}. Gibt eine Liste der Zeitreihen zurück, die den eingegebenen Daten zugeordnet sind."
- },
- "selector-actions": {
- "aria-label-selector": "Selektor",
- "aria-label-selector-clear-button": "Löschen-Schaltfläche des Selektors",
- "aria-label-use-selector-as-metrics-button": "Schaltfläche zur Verwendung des Selektors als Metrik",
- "aria-label-use-selector-for-query-button": "Schaltfläche zur Verwendung des Selektors für die Abfrage",
- "aria-label-validate-submit-button": "Validieren und Absenden-Schaltfläche",
- "clear": "Löschen",
- "resulting-selector": "4. Resultierender Selektor",
- "use-as-rate-query": "Als Bewertungsabfrage verwenden",
- "use-query": "Abfrage verwenden",
- "validate-selector": "Selektor validieren"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filterausdruck für Label-Werte",
- "aria-label-values-for": "Werte für {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Verwenden Sie das Suchfeld, um Werte über mehrere ausgewählte Labels zu finden.",
- "select-multiple-values-for-your-labels": "3. Wählen Sie (mehrere) Werte für Ihre Labels aus"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Als Ziel für Aufnahmeregeln zulassen",
- "label-manage-alerts-via-alerting-ui": "Benachrichtigungen über Alerting-UI verwalten",
- "title-alerting": "Meldungen",
- "tooltip-allow-as-recording-rules-target": "Erlauben, dass diese Datenquelle als Ziel für das Schreiben von Aufnahmeregeln ausgewählt wird.",
- "tooltip-manage-alerts-via-alerting-ui": "Verwalten Sie Warnregeln für diese Datenquelle. Fügen Sie eine Altermanager-Datenquelle hinzu, um andere Warnressourcen zu verwalten."
- },
- "config-editor": {
- "browser-access-mode-error": "Der Browserzugriffsmodus in der Prometheus-Datenquelle ist nicht mehr verfügbar. Wechseln Sie in den Serverzugriffsmodus.",
- "description-advanced-settings": "Zusätzliche Einstellungen sind optionale Einstellungen, die für mehr Kontrolle über Ihre Datenquelle konfiguriert werden können.",
- "title-advanced-settings": "Erweiterte Einstellungen",
- "title-error": "Fehler"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Ihre Zugriffsmethode ist <1>Browser1>, d. h. die URL muss über den Browser zugänglich sein.",
- "tooltip-http-url": "Geben Sie eine vollständige HTTP-URL an (z. B. {{exampleURL}})",
- "tooltip-server-access-mode": "Ihre Zugriffsmethode ist <1>Server1>, d. h. die URL muss über das Grafana-Backend/den Grafana-Server zugänglich sein."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Weitere Details finden Sie hier in der Dokumentation."
- },
- "exemplar-setting": {
- "label-data-source": "Datenquelle",
- "label-internal-link": "Interner Link",
- "label-label-name": "Label-Name",
- "label-remove-exemplar-link": "Exemplar-Link entfernen",
- "label-url": "URL",
- "label-url-label": "URL-Label",
- "placeholder-go-to-examplecom": "Zu example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Exemplar-Link entfernen",
- "tooltip-data-source": "Die Datenquelle, zu der das Exemplar navigiert.",
- "tooltip-internal-link": "Aktivieren Sie diese Option, wenn Sie einen internen Link haben. Wenn dies aktiviert ist, wird der Datenquellen-Selektor angezeigt. Wählen Sie den Backend-Tracing-Datenspeicher für Ihre Exemplar-Daten aus.",
- "tooltip-label-name": "Der Name des Felds im Label-Objekt, das für den Erhalt der TraceID verwendet werden soll.",
- "tooltip-url": "Die URL des Trace-Backends, die der Nutzer zur Ansicht des Trace aufrufen würde",
- "tooltip-url-label": "Damit können Sie das Schaltflächen-Label im Feld der Exemplar-TraceID überschreiben."
- },
- "exemplars-settings": {
- "add": "Hinzufügen",
- "no-exemplars-configurations": "Keine Exemplar-Konfigurationen",
- "title-exemplars": "Exemplare"
- },
- "prom-settings": {
- "aria-label-default-editor": "Standard-Editor (Code oder Builder)",
- "aria-label-prom-type-type": "{{promType}} Typ",
- "aria-label-prometheus-type": "Prometheus-Typ",
- "aria-label-select-http-method": "HTTP-Methode auswählen",
- "editor-options": {
- "label-builder": "Builder",
- "label-code": "Code"
- },
- "label-cache-level": "Cache-Level",
- "label-custom-query-parameters": "Benutzerdefinierte Abfrageparameter",
- "label-default-editor": "Standard-Editor",
- "label-disable-metrics-lookup": "Metrik-Suche deaktivieren",
- "label-disable-recording-rules-beta": "Aufnahmeregeln deaktivieren (Beta)",
- "label-http-method": "HTTP-Methode",
- "label-incremental-querying-beta": "Inkrementelle Abfrage (Beta)",
- "label-prom-type-version": "{{promType}} Version",
- "label-prometheus-type": "Prometheus-Typ",
- "label-query-overlap-window": "Fenster der Abfrage-Überschneidung",
- "label-query-timeout": "Abfrage-Timeout",
- "label-scrape-interval": "Scrape-Intervall",
- "label-series-limit": "Reihengrenze",
- "label-use-series-endpoint": "Reihenendpunkt verwenden",
- "more-info": "Weitere Informationen zur Konfiguration des Typs und der Version von Prometheus in Datenquellen finden Sie in der <2>Bereitstellungsdokumentation2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Beispiel: {{example}}",
- "title-interval-behaviour": "Intervallverhalten",
- "title-other": "Sonstiges",
- "title-performance": "Leistung",
- "title-query-editor": "Abfrage-Editor",
- "tooltip-cache-level": "Legt die Browser-Cache-Level für Editor-Abfragen fest. Für Datenquellen mit hoher Kardinalität werden höhere Cache-Einstellungen empfohlen.",
- "tooltip-custom-query-parameters": "Fügen Sie der URL der Prometheus-Abfrage benutzerdefinierte Parameter hinzu. Zum Beispiel {{example1}}, {{example2}}, {{example3}} oder {{example4}}. Mehrere Parameter sollten mit {{concatenationChar}} verknüpft werden.",
- "tooltip-default-editor": "Legen Sie die Standard-Editoroption für alle Nutzer dieser Datenquelle fest.",
- "tooltip-disable-metrics-lookup": "Wenn diese Option aktiviert ist, werden die Metrikauswahl und die Unterstützung für Metriken/Labels im Rahmen der Autovervollständigung des Abfragefelds deaktiviert. Dies hilft, wenn Sie Leistungsprobleme mit größeren Prometheus-Instanzen haben. ",
- "tooltip-disable-recording-rules-beta": "Diese Funktion deaktiviert die Aufnahmeregeln. Wenn Sie dies aktivieren, wird die Dashboard-Leistung verbessert",
- "tooltip-http-method": "Sie können entweder die HTTP-Methode POST oder GET für die Abfrage Ihrer Prometheus-Datenquelle verwenden. POST ist die empfohlene Methode, da sie größere Abfragen ermöglicht. Ändern Sie dies zu GET, wenn Ihre Prometheus-Version älter als 2.1 ist oder POST-Abfragen in Ihrem Netzwerk beschränkt sind.",
- "tooltip-incremental-querying-beta": "Diese Funktion ändert das Standardverhalten von relativen Abfragen, sodass immer neue Daten von der Prometheus-Instanz abgefragt werden. Stattdessen werden Abfrageergebnisse zwischengespeichert und nur neue Datensätze abgefragt. Wenn Sie dies aktivieren, wird die Datenbank- und Netzwerklast reduziert.",
- "tooltip-prom-type-version": "Nutzen Sie diese Option, um die Version Ihrer Instanz von {{promType}} festzulegen, wenn sie nicht automatisch konfiguriert wird.",
- "tooltip-prometheus-type": "Stellen Sie dies auf den Typ Ihrer Prometheus-Datenbank ein, z. B. Prometheus, Cortex, Mimir oder Thanos. Wenn Sie dieses Feld ändern, werden Ihre aktuellen Einstellungen gespeichert. Bestimmte Typen von Prometheus unterstützen entweder verschiedene APIs oder nicht. Zum Beispiel unterstützen manche Typen Regex-Matching für Label-Abfragen, um die Leistung zu verbessern. Manche Typen haben eine API für Metadaten. Wenn Sie dies falsch einstellen, kann es bei der Abfrage von Metriken und Labels zu einem ungewöhnlichen Verhalten kommen. Bitte prüfen Sie Ihre Prometheus-Dokumentation, um sicherzugehen, dass Sie den richtigen Typ eingeben.",
- "tooltip-query-overlap-window": "Stellen Sie eine Dauer ein, zum Beispiel {{example1}} oder {{example2}} oder {{example3}}. Standardwert: {{default}}. Diese Dauer wird zur Dauer jeder inkrementellen Abfrage hinzugefügt.",
- "tooltip-query-timeout": "Legen Sie das Prometheus-Abfrage-Timeout fest.",
- "tooltip-scrape-interval": "Dieses Intervall gibt an, wie oft Prometheus ein Scraping für Ziele durchführt. Stellen Sie dies auf das typische Scrape- und Bewertungsintervall ein, das in Ihrer Prometheus-Konfigurationsdatei konfiguriert ist. Wenn Sie dies auf einen größeren Wert als das Intervall Ihrer Prometheus-Konfigurationsdatei einstellen, wertet Grafana die Daten gemäß diesem Intervall aus und Sie sehen weniger Datenpunkte. Standardmäßig {{default}}.",
- "tooltip-series-limit": "Die Grenze gilt für alle Ressourcen (Metriken, Labels und Werte) für beide Endpunkte (Reihen und Labels). Wenn Sie das Feld leer lassen, wird die Standardgrenze verwendet (40.000). Durch eine Einstellung auf 0 wird die Grenze deaktiviert und alles abgerufen – dies kann zu Leistungsproblemen führen. Die Standardgrenze beträgt 40.000.",
- "tooltip-use-series-endpoint": "Wenn diese Option aktiviert ist, wird der Reihenendpunkt mit dem Parameter {{exampleParameter}} gegenüber dem Endpunkt der Label-Werte mit dem Parameter {{exampleParameter}} bevorzugt. Obwohl der Endpunkt der Label-Werte als leistungsfähiger gilt, könnten manche Nutzer die Reihe bevorzugen, da sie über eine POST-Methode verfügt, während der Endpunkt der Label-Werte nur über eine GET-Methode verfügt."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Deaktiviert)",
- "enabled-label": "Metriken-Browser"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Enthält nur eindeutige Labels",
- "description-custom": "Namensvorlage bereitstellen",
- "description-verbose": "Alle Label-Namen und -Werte",
- "label-auto": "Auto",
- "label-custom": "Benutzerdefiniert",
- "label-verbose": "Ausführlich"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Durchschnitt über Dimensionen berechnen",
- "documentation-bottomk": "Kleinste k-Elemente nach Probenwert",
- "documentation-count": "Anzahl der Elemente im Vektor zählen",
- "documentation-count-values": "Anzahl der Elemente mit selbem Wert zählen",
- "documentation-group": "Alle Werte im resultierenden Vektor sind 1",
- "documentation-max": "Maximum über Dimensionen auswählen",
- "documentation-min": "Minimum über Dimensionen auswählen",
- "documentation-quantile": "φ-Quantil (0 ≤ φ ≤ 1) über Dimensionen berechnen",
- "documentation-stddev": "Populationsstandardabweichung über Dimensionen berechnen",
- "documentation-stdvar": "Populationsstandardvarianz über Dimensionen berechnen",
- "documentation-sum": "Summe über Dimensionen berechnen",
- "documentation-topk": "Größte k-Elemente nach Stichprobenwert"
- },
- "getFunctions": {
- "documentation-abs": "Gibt den Eingabevektor mit allen Probenwerten zurück, die zu ihrem Absolutwert umgerechnet wurden.",
- "documentation-absent": "Gibt einen leeren Vektor zurück, wenn der übergebene Vektor Elemente enthält, und einen 1-Element-Vektor mit dem Wert 1, wenn der übergebene Vektor keine Elemente enthält. Dies ist nützlich, um zu warnen, wenn für eine bestimmte Kombination aus Metrikname und Label keine Zeitreihen vorhanden sind.",
- "documentation-absent-over-time": "Gibt einen leeren Vektor zurück, wenn der übergebene Bereichsvektor Elemente enthält, und einen 1-Element-Vektor mit dem Wert 1, wenn der übergebene Bereichsvektor keine Elemente enthält.",
- "documentation-avg-over-time": "Der Durchschnittswert aller Punkte im angegebenen Intervall.",
- "documentation-ceil": "Rundet die Probenwerte aller Elemente in „v“ auf die nächste ganze Zahl auf.",
- "documentation-changes": "Für jede Eingabezeitreihe gibt „changes(v range-vector)“ die Anzahl der Änderungen seines Werts innerhalb des angegebenen Zeitbereichs als Momentanvektor zurück.",
- "documentation-clamp": "Begrenzt die Probenwerte aller Elemente in „v“ auf eine Untergrenze von „min“ und eine Obergrenze von „max“.",
- "documentation-clamp-max": "Begrenzt die Probenwerte aller Elemente in „v“ auf eine Obergrenze von „max“.",
- "documentation-clamp-min": "Begrenzt die Probenwerte aller Elemente in „v“ auf eine Untergrenze von „min“.",
- "documentation-count-over-time": "Die Anzahl aller Werte im angegebenen Intervall.",
- "documentation-count-scalar": "Gibt die Anzahl der Elemente in einem Zeitreihenvektor als Skalar zurück. Dies steht im Gegensatz zum Aggregationsoperator „count()“, der immer einen Vektor zurückgibt (einen leeren, wenn der Eingabevektor leer ist) und die Gruppierung nach Labels über eine „by“-Klausel ermöglicht.",
- "documentation-day-of-month": "Gibt den Tag des Monats für jede der angegebenen Zeiten in UTC zurück. Die zurückgegebenen Werte liegen zwischen 1 und 31.",
- "documentation-day-of-week": "Gibt den Tag der Woche für jede der angegebenen Zeiten in UTC zurück. Die zurückgegebenen Werte liegen zwischen 0 und 6, wobei 0 für Sonntag steht usw.",
- "documentation-day-of-year": "Gibt den Tag des Jahres für jede der angegebenen Zeiten in UTC zurück. Die zurückgegebenen Werte liegen zwischen 1 und 365 für Nicht-Schaltjahre und zwischen 1 und 366 für Schaltjahre.",
- "documentation-days-in-month": "Gibt die Anzahl der Tage im Monat für jede der angegebenen Zeiten in UTC zurück. Die zurückgegebenen Werte liegen zwischen 28 und 31.",
- "documentation-deg": "Rechnet Radianten in Grad um, bei allen Elementen in v",
- "documentation-delta": "Berechnet die Differenz zwischen dem ersten und dem letzten Wert jedes Zeitreihenelements in einem Bereichsvektor „v“ und gibt einen Momentanvektor mit den angegebenen Deltas und äquivalenten Labels zurück. Das Delta wird extrapoliert, um den gesamten Zeitbereich zu umfassen, wie im Bereichsvektor-Selektor angegeben, sodass es möglich ist, ein nicht ganzzahliges Ergebnis zu erhalten, auch wenn die Probenwerte alle ganze Zahlen sind.",
- "documentation-deriv": "Berechnet die Ableitung pro Sekunde der Zeitreihe in einem Bereichsvektor „v“ mithilfe einer einfachen linearen Regression.",
- "documentation-double-exponential-smoothing": "Erzeugt einen geglätteten Wert für Zeitreihen basierend auf dem Bereich in „v“. Je niedriger der Glättungsfaktor „sf“ ist, desto mehr Bedeutung kommt alten Daten zu. Je höher der Trendfaktor „tf“ ist, desto mehr Trends in den Daten werden berücksichtigt. Sowohl „sf“ als auch „tf“ müssen zwischen 0 und 1 liegen.",
- "documentation-drop-common-labels": "Löscht alle Labels, die den gleichen Namen und Wert über alle Reihen im Eingabevektor aufweisen.",
- "documentation-exp": "Berechnet die Exponentialfunktion für alle Elemente in „v“.\nSonderfälle sind:\n* „Exp(+Inf) = +Inf“ \n* „Exp(NaN) = NaN“",
- "documentation-floor": "Rundet die Probenwerte aller Elemente in „v“ auf die nächste ganze Zahl ab.",
- "documentation-histogram-avg": "Gibt den arithmetischen Mittelwert der beobachteten Werte zurück, die in einem nativen Histogramm gespeichert sind. Proben, die keine nativen Histogramme sind, werden ignoriert und nicht im zurückgegebenen Vektor angezeigt.",
- "documentation-histogram-count": "Gibt die Anzahl der in einem nativen Histogramm gespeicherten Beobachtungen zurück.",
- "documentation-histogram-fraction": "Gibt den geschätzten Anteil der Beobachtungen zwischen den angegebenen unteren und oberen Werten zurück.",
- "documentation-histogram-quantile": "Berechnet das φ-Quantil (0 ≤ φ ≤ 1) von den Buckets „b“ eines Histogramms. Die Proben in „b“ sind die Anzahl der Beobachtungen in jedem Bucket. Jede Probe muss ein Label „le“ haben, wobei der Labelwert die inklusive obere Grenze des Buckets angibt. (Proben ohne ein solches Label werden still ignoriert.) Der Histogramm-Metriktyp stellt automatisch Zeitreihen mit dem Suffix „_bucket“ und den entsprechenden Labels bereit.",
- "documentation-histogram-stddev": "Gibt die geschätzte Standardabweichung der Beobachtungen in einem nativen Histogramm zurück, basierend auf dem geometrischen Mittel der Buckets, wo die Beobachtungen liegen.",
- "documentation-histogram-stdvar": "Gibt die geschätzte Standardabweichung von Beobachtungen in einem nativen Histogramm zurück.",
- "documentation-histogram-sum": "Gibt die Summe der in einem nativen Histogramm gespeicherten Beobachtungen zurück.",
- "documentation-holt-winters": "Umbenannt in double_exponential_smoothing in Prometheus v3.x. Bitte verwenden Sie für Prometheus-Versionen gleich und höher als v3.0 double_exponential_smoothing. \n\nErzeugt einen geglätteten Wert für Zeitreihen, basierend auf dem Bereich in „v“. Je niedriger der Glättungsfaktor „sf“ ist, desto mehr Bedeutung kommt alten Daten zu. Je höher der Trendfaktor „tf“ ist, desto mehr Trends in den Daten werden berücksichtigt. Sowohl „sf“ als auch „tf“ müssen zwischen 0 und 1 liegen.",
- "documentation-hour": "Gibt die Stunde des Tages für jede der angegebenen Zeiten in UTC zurück. Die zurückgegebenen Werte liegen zwischen 0 und 23.",
- "documentation-idelta": "Berechnet die Differenz zwischen den letzten beiden Proben im Bereichsvektor „v“ und gibt einen Momentanvektor mit den angegebenen Deltas und äquivalenten Labels zurück.",
- "documentation-increase": "Berechnet die Zunahme der Zeitreihe im Bereichsvektor. Brüche in der Monotonie (z. B. Zählerzurücksetzungen aufgrund von Zielneustarts) werden automatisch angepasst. Die Zunahme wird extrapoliert, um den gesamten Zeitbereich zu umfassen, wie im Bereichsvektor-Selektor angegeben, sodass es möglich ist, ein nicht ganzzahliges Ergebnis zu erhalten, auch wenn ein Zähler nur um ganzzahlige Inkremente zunimmt.",
- "documentation-info": "Gibt die neuesten Details und Metadaten zu einer Gruppe von Metriken zurück, z. B. ihre Labels und aktuellen Werte, ohne Berechnungen durchzuführen",
- "documentation-irate": "Berechnet die momentane Anstiegsrate (pro Sekunde) der Zeitreihe im Bereichsvektor. Dies basiert auf den letzten beiden Datenpunkten. Brüche in der Monotonie (z. B. Zählerzurücksetzungen aufgrund von Zielneustarts) werden automatisch angepasst.",
- "documentation-label-join": "Verbindet für jede Zeitreihe in „v“ alle Werte aller „src_labels“ mit „separator“ und gibt die Zeitreihe mit dem Label „dst_label“ zurück, das den verbundenen Wert enthält. Es kann eine beliebige Anzahl von „src_labels“ in dieser Funktion geben.",
- "documentation-label-replace": "Für jede Zeitreihe in „v“ gleicht „label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)“ den regulären Ausdruck „regex“ mit dem Label „src_label“ ab. Bei einer Übereinstimmung wird die Zeitreihe mit dem Label „dst_label“ zurückgegeben, das durch die Erweiterung von „replacement“ ersetzt wird. „$1“ wird durch die erste übereinstimmende Untergruppe ersetzt, „$2“ durch die zweite usw. Wenn der reguläre Ausdruck nicht übereinstimmt, wird die Zeitreihe unverändert zurückgegeben.",
- "documentation-last-over-time": "Der letzte Punktwert im angegebenen Intervall.",
- "documentation-ln": "Berechnet den natürlichen Logarithmus für alle Elemente in „v“.\nSonderfälle sind:\n * „ln(+Inf) = +Inf“\n * „ln(0) = -Inf“\n * „ln(x < 0) = NaN“\n * „ln(NaN) = NaN“",
- "documentation-log10": "Berechnet den Dezimal-Logarithmus für alle Elemente in „v“. Die Sonderfälle entsprechen denen in „ln“.",
- "documentation-log2": "Berechnet den binären Logarithmus für alle Elemente in „v“. Die Sonderfälle entsprechen denen in „ln“.",
- "documentation-max-over-time": "Der Maximalwert aller Punkte im angegebenen Intervall.",
- "documentation-min-over-time": "Der Minimalwert aller Punkte im angegebenen Intervall.",
- "documentation-minute": "Gibt die Minute der Stunde für jede der angegebenen Zeiten in UTC zurück. Die zurückgegebenen Werte liegen zwischen 0 und 59.",
- "documentation-month": "Gibt den Monat des Jahres für jede der angegebenen Zeiten in UTC zurück. Die zurückgegebenen Werte liegen zwischen 1 und 12, wobei 1 für Januar steht usw.",
- "documentation-pi": "Gibt pi zurück",
- "documentation-predict-linear": "Prognostiziert den Wert der Zeitreihe „t“ Sekunden ab jetzt, basierend auf dem Bereichsvektor „v“, mithilfe einer einfachen linearen Regression.",
- "documentation-present-over-time": "Der Wert 1 für jede Reihe im angegebenen Intervall.",
- "documentation-quantile-over-time": "Das φ-Quantil (0 ≤ φ ≤ 1) der Werte im angegebenen Intervall.",
- "documentation-rad": "Rechnet Grad in Radianten um, bei allen Elementen in v",
- "documentation-rate": "Berechnet die durchschnittliche Anstiegsrate (pro Sekunde) der Zeitreihe im Bereichsvektor. Brüche in der Monotonie (z. B. Zählerzurücksetzungen aufgrund von Zielneustarts) werden automatisch angepasst. Außerdem extrapoliert die Berechnung zu den Enden des Zeitbereichs, um ausgelassene Scrapes oder eine unvollkommene Ausrichtung der Scrape-Zyklen mit dem Zeitraum des Bereichs zu ermöglichen.",
- "documentation-resets": "Für jede Eingabezeitreihe gibt „resets(v range-vector)“ die Anzahl der Zählerzurücksetzungen innerhalb des angegebenen Zeitbereichs als Momentanvektor zurück. Jede Abnahme des Werts zwischen zwei aufeinanderfolgenden Proben wird als Zählerzurücksetzung interpretiert.",
- "documentation-round": "Rundet die Probenwerte aller Elemente in „v“ auf die nächste ganze Zahl. Gleichstände werden durch Aufrunden gelöst. Mit dem optionalen Argument „to_nearest“ können Sie das nächste Vielfache angeben, auf das die Probenwerte gerundet werden sollen. Dieses Vielfache kann auch ein Bruch sein.",
- "documentation-scalar": "Bei einem Eingabevektor mit einem einzelnen Element gibt „scalar(v instant-vector)“ den Probenwert dieses einzelnen Elements als Skalar zurück. Wenn der Eingabevektor nicht genau ein Element hat, gibt „scalar“ „NaN“ zurück.",
- "documentation-sgn": "Gibt einen Vektor mit allen Probenwerten zurück, die in ihr Vorzeichen umgewandelt wurden, wie folgt definiert: 1, wenn v positiv ist, -1, wenn v negativ ist und 0, wenn v gleich Null ist.",
- "documentation-sort": "Gibt Vektorelemente zurück, die in aufsteigender Reihenfolge nach ihren Probenwerten sortiert sind.",
- "documentation-sort-desc": "Gibt Vektorelemente zurück, die in absteigender Reihenfolge nach ihren Probenwerten sortiert sind.",
- "documentation-sqrt": "Berechnet die Quadratwurzel aller Elemente in „v“.",
- "documentation-stddev-over-time": "Die Populationsstandardabweichung der Werte im angegebenen Intervall.",
- "documentation-stdvar-over-time": "Die Populationsstandardvarianz der Werte im angegebenen Intervall.",
- "documentation-sum-over-time": "Die Summe aller Werte im angegebenen Intervall.",
- "documentation-time": "Gibt die Anzahl der Sekunden seit dem 1. Januar 1970 UTC zurück. Beachten Sie, dass dies nicht tatsächlich die aktuelle Zeit wiedergibt, sondern den Zeitpunkt, zu dem der Ausdruck ausgewertet werden soll.",
- "documentation-timestamp": "Gibt den Zeitstempel jeder der Proben des angegebenen Vektors als Anzahl der Sekunden seit dem 1. Januar 1970 UTC zurück.",
- "documentation-vector": "Gibt den Skalar „s“ als Vektor ohne Labels zurück.",
- "documentation-year": "Gibt das Jahr für jede der angegebenen Zeiten in UTC zurück."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "berechnet den Arkuskosinus aller Elemente in {{argument}}",
- "documentation-acosh": "berechnet den inversen hyperbolischen Kosinus aller Elemente in {{argument}}",
- "documentation-asin": "berechnet den Arkussinus aller Elemente in {{argument}}",
- "documentation-asinh": "berechnet den inversen hyperbolischen Sinus aller Elemente in {{argument}}",
- "documentation-atan": "berechnet den Arkustangens aller Elemente in {{argument}}",
- "documentation-atanh": "berechnet den inversen hyperbolischen Tangens aller Elemente in {{argument}}",
- "documentation-cos": "berechnet den Kosinus aller Elemente in {{argument}}",
- "documentation-cosh": "berechnet den hyperbolischen Kosinus aller Elemente in {{argument}}",
- "documentation-sin": "berechnet den Sinus aller Elemente in {{argument}}",
- "documentation-sinh": "berechnet den hyperbolischen Sinus aller Elemente in {{argument}}",
- "documentation-tan": "berechnet den Tangens aller Elemente in {{argument}}",
- "documentation-tanh": "berechnet den hyperbolischen Tangens aller Elemente in {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Feedback geben",
- "title-give-feedback": "Der Metrik-Explorer ist neu. Bitte teilen Sie uns mit, wie wir ihn verbessern können."
- },
- "get-collapsed-info": {
- "exemplars": "Exemplare: {{value}}",
- "format": "Format: {{value}}",
- "legend": "Legende: {{value}}",
- "step": "Schritt: {{value}}",
- "type": "Typ: {{value}}"
- },
- "get-placeholders": {
- "browse": "Metriken nach Namen suchen",
- "type": "Nach Typ filtern"
- },
- "get-prom-types": {
- "description-counter": "Eine kumulative Metrik, die einen einzelnen monoton ansteigenden Zähler darstellt, dessen Wert nur ansteigen oder beim Neustart auf Null zurückgesetzt werden kann.",
- "description-gauge": "Eine Metrik, die einen einzelnen numerischen Wert darstellt, der beliebig nach oben und unten verlaufen kann.",
- "description-histogram": "Ein Histogramm fragt Beobachtungen ab (in der Regel Dinge wie Anfragedauer oder Antwortgrößen) und zählt sie in konfigurierbaren Buckets.",
- "description-native-histogram": "Native Histogramme unterscheiden sich in mehrerer Hinsicht von klassischen Prometheus-Histogrammen: Die Grenzen der nativen Histogramm-Buckets werden durch eine Formel berechnet, die von der Skala (Auflösung) des nativen Histogramms abhängt, und sind nicht benutzerdefiniert.",
- "description-no-type": "Diese Metriken haben keinen festgelegten Typ in den Metadaten.",
- "description-summary": "Eine Zusammenfassung fragt Beobachtungen ab (in der Regel Dinge wie Anfragedauer und Antwortgrößen) und kann konfigurierbare Quantile über ein gleitendes Zeitfenster berechnen.",
- "description-unknown": "Diesen Metriken wurde in den Metadaten der Typ „unbekannt“ zugewiesen.",
- "label-counter": "Zähler",
- "label-gauge": "Anzeige",
- "label-histogram": "Histogramm",
- "label-native-histogram": "Natives Histogramm",
- "label-no-type": "Kein Typ",
- "label-summary": "Zusammenfassung",
- "label-unknown": "Unbekannt"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Das Abfrage-Parsing ist unklar."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Entfernen von {{name}}",
- "placeholder-select-label": "Label auswählen",
- "placeholder-select-value": "Wert auswählen"
- },
- "label-filters": {
- "label-filters": "Label-Filter",
- "label-label-filters": "Label-Filter",
- "tooltip-label-filters": "Optional: wird verwendet, um die Metrikauswahl für diesen Abfragetyp zu filtern."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Labels werden geladen",
- "noOptionsMessage-no-labels-found": "Keine Labels gefunden"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Metrik-Explorer öffnen",
- "placeholder-select-metric": "Metrik auswählen",
- "tooltip-open-metrics-explorer": "Metrik-Explorer öffnen"
- },
- "label-metric": "Metrik",
- "tooltip-metric": "Optional: gibt eine Liste von Label-Werten für den Label-Namen in der angegebenen Metrik zurück."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Metriken durchsuchen",
- "currently-selected": "Aktuell ausgewählt: {{selected}}",
- "metrics-pre-filtered": "Diese Metriken wurden anhand der Labels, die in den Label-Filtern ausgewählt wurden, vorgefiltert.",
- "title-metrics-explorer": "Metrik-Explorer"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorieren",
- "on": "Aktiviert"
- },
- "operator": "Bediener",
- "tooltip-remove-match": "Übereinstimmung entfernen",
- "vector-matches": "Vektorübereinstimmungen"
- },
- "operation-editor": {
- "not-found": "Vorgang {{id}} nicht gefunden",
- "title-remove": "Entfernen von {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Ersetzen mit",
- "title-click-to-view-alternative-operations": "Klicken Sie zur Anzeige alternativer Vorgänge",
- "title-remove-operation": "Vorgang entfernen"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Klicken Sie zur Ansicht der Beschreibung",
- "title-remove-operation": "Operation entfernen"
- },
- "operation-list": {
- "operations": "Vorgänge",
- "placeholder-search": "Suche",
- "title-add-operation": "Vorgang hinzufügen"
- },
- "operation-param-editor": {
- "title-add": "{{name}} hinzufügen",
- "title-remove": "{{name}} entfernen"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Berechnet {{aggregationName}} über Dimensionen unter Beibehaltung von {{labelWord}} {{labels}}.",
- "label-default": "Berechnet {{aggregationName}} über die Dimensionen.",
- "label-without": "Berechnet {{aggregationName}} über die Dimensionen {{labels}}. Alle anderen Labels werden beibehalten."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Exemplarwechsel.",
- "aria-label-format": "Format Kombinationsfeld",
- "aria-label-lower-limit-parameter": "Textfeld „Min. Schritt“, Untergrenze für den Schrittparameter festlegen",
- "aria-label-select-resolution": "Auflösung auswählen",
- "aria-label-type": "Typ-Radiobutton-Gruppe",
- "format-options": {
- "label-heatmap": "Heatmap",
- "label-table": "Tabelle",
- "label-time-series": "Zeitreihen"
- },
- "label-exemplars": "Exemplare",
- "label-format": "Format",
- "label-min-step": "Min. Schritt",
- "label-resolution": "Auflösung",
- "label-type": "Typ",
- "placeholder-auto": "Auto",
- "title-options": "Optionen",
- "tooltip-min-step": "Eine zusätzliche Untergrenze für den Schrittparameter der Prometheus-Abfrage und für die Variablen <2>{{interval}}2> und <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Es liegt ein Syntaxfehler vor oder die Abfragestruktur kann beim Wechsel in den Builder-Modus nicht visualisiert werden. Teile der Abfrage können verlorengehen.",
- "confirmText-continue": "Fortfahren",
- "kick-start-your-query": "Starten Sie Ihre Abfrage",
- "label-explain": "Erklären",
- "run-queries": "Abfragen ausführen",
- "title-parsing-error-switch-builder": "Parsing-Fehler: In den Builder-Modus wechseln?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Legende Kombinationsfeld",
- "label-legend": "Legende",
- "placeholder-select-legend-mode": "Legendenmodus auswählen",
- "tooltip-legend": "Überschreibung des Reihennamens oder Vorlage. Beispiel: {{templateExample}} wird durch den Label-Wert für {{labelName}} ersetzt."
- },
- "query-builder-hints": {
- "hint-details": "Hinweis: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Builder",
- "label-code": "Code"
- }
- },
- "query-pattern": {
- "apply-query": "Abfrage anwenden",
- "aria-label-apply-query-starter-button": "Schaltfläche zur Anwendung des Abfrage-Starters",
- "aria-label-back-button": "Zurück-Schaltfläche",
- "aria-label-create-new-query-button": "Schaltfläche zur Erstellung einer neuen Abfrage",
- "aria-label-raw-query": "{{patternName}} Rohabfrage",
- "aria-label-use-this-query-button": "Schaltfläche zum Nutzen dieser Abfrage",
- "back": "Zurück",
- "create-new-query": "Neue Abfrage erstellen",
- "use-this-query": "Diese Abfrage nutzen"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "Modal zum Starten Ihrer Abfrage schließen",
- "aria-label-kick-start-your-query-modal": "Starten Sie Ihr Abfrage-Modal",
- "aria-label-toggle-query-starter": "Öffnen und Schließen der {{patternType}} Abfrage-Starter-Karte",
- "close": "Schließen",
- "description-kick-start-your-query": "Starten Sie Ihre Abfrage, indem Sie eine dieser Abfragen auswählen. Sie können dann mit dem Abschluss Ihrer Abfrage fortfahren.",
- "label-toggle-query-starter": "{{patternType}} Abfrage-Starter",
- "title-kick-start-your-query": "Starten Sie Ihre Abfrage"
- },
- "raw-query": {
- "aria-label-selector": "Selektor"
- },
- "results-table": {
- "content-descriptive-type": "Bei der Erstellung von {{descriptiveType}} zeigt Prometheus mehrere Reihen mit dem Typ Counter. ",
- "description": "Beschreibung",
- "message-expand-label-filters": "Es wurden keine Metriken gefunden. Versuchen Sie, Ihre Label-Filter zu erweitern.",
- "message-expand-search": "Es wurden keine Metriken gefunden. Versuchen Sie, Ihre Suche und Ihre Filter zu erweitern.",
- "message-no-metrics-found": "Es wurden keine Metriken in der Datenquelle gefunden.",
- "name": "Name",
- "type": "Typ"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/en-US/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/en-US/grafana-prometheus.json
deleted file mode 100644
index 58c601d9514..00000000000
--- a/packages/grafana-prometheus/src/locales/en-US/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Annotation data load error!",
- "aria-label-lower-limit-parameter": "Set lower limit for the step parameter",
- "label-min-step": "Min step",
- "label-series-value-as-timestamp": "Series value as timestamp",
- "label-tags": "Tags",
- "label-text": "Text",
- "label-title": "Title",
- "placeholder-auto": "auto",
- "tooltip-either-pattern-example-instance-replaced-label": "Use either the name or a pattern. For example, {{labelTemplate}} is replaced with label value for the label {{labelName}}.",
- "tooltip-min-step": "An additional lower limit for the step parameter of the Prometheus query and for the <2>{{intervalVar}}2> and <4>{{rateIntervalVar}}4> variables.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "The unit of timestamp is milliseconds. If the unit of the series value is seconds, multiply its range vector by 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Run an Instant query and a Range query"
- },
- "label": {
- "both": "Both"
- },
- "range-options": {
- "description": {
- "query-range": "Run query over a range of time"
- },
- "label": {
- "instant": "Instant",
- "range": "Range"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filter expression for label",
- "description-select-labels": "Once label values are selected, only possible label combinations are shown.",
- "select-labels-to-search-in": "2. Select labels to search in"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filter expression for metric",
- "aria-label-limit-results-from-series-endpoint": "Limit results from series endpoint",
- "description-series-limit": "The limit applies to all metrics, labels, and values. Leave the field empty to use the default limit. Set to 0 to disable the limit and fetch everything — this may cause performance issues.",
- "label-select-metric": "Once a metric is selected only possible labels are shown. Labels are limited by the series limit below.",
- "select-a-metric": "1. Select a metric",
- "series-limit": "Series limit"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL Cheat Sheet"
- },
- "prom-exemplar-field": {
- "exemplars": "Exemplars",
- "tooltip-disable-query": "Disable query with exemplars",
- "tooltip-enable-query": "Enable query with exemplars"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus extra field",
- "aria-label-query-type-field": "Query type field",
- "aria-label-step-field": "Step field",
- "min-step": "Min step",
- "query-type": "Query type",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Time units and built-in variables can be used here, for example: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Default if no unit is specified: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Enter a PromQL query…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Classic Query",
- "aria-label-metric-regex": "Metric regex",
- "aria-label-metric-selector": "Metric selector",
- "aria-label-prometheus-query": "Prometheus Query",
- "aria-label-query-type": "Query type",
- "aria-label-series-query": "Series Query",
- "label-classic-query": "Classic Query",
- "label-label": "Label",
- "label-metric-regex": "Metric regex",
- "label-query": "Query",
- "label-query-type": "Query type",
- "label-series-query": "Series Query",
- "placeholder-classic-query": "Classic Query",
- "placeholder-metric-regex": "Metric regex",
- "placeholder-prometheus-query": "Prometheus Query",
- "placeholder-select-query-type": "Select query type",
- "placeholder-series-query": "Series Query",
- "returns-metrics-matching-specified-metric-regex": "Returns a list of metrics matching the specified metric regex.",
- "tooltip-classic-query": "The original implementation of the Prometheus variable query editor. Enter a string with the correct query type and parameters as described in these docs. For example, {{exampleQuery}}.",
- "tooltip-label": "Returns a list of label values for the label name in all metrics unless the metric is specified.",
- "tooltip-metric-regex": "Returns a list of label names, optionally filtering by specified metric regex.",
- "tooltip-query": "Returns a list of Prometheus query results for the query. This can include Prometheus functions, i.e.{{exampleQuery}}.",
- "tooltip-query-type": "The Prometheus data source plugin provides the following query types for template variables.",
- "tooltip-series-query": "Enter a metric with labels, only a metric or only labels, i.e.{{example1}}, {{example2}}, or {{example3}}. Returns a list of time series associated with the entered data."
- },
- "selector-actions": {
- "aria-label-selector": "selector",
- "aria-label-selector-clear-button": "Selector clear button",
- "aria-label-use-selector-as-metrics-button": "Use selector as metrics button",
- "aria-label-use-selector-for-query-button": "Use selector for query button",
- "aria-label-validate-submit-button": "Validate submit button",
- "clear": "Clear",
- "resulting-selector": "4. Resulting selector",
- "use-as-rate-query": "Use as rate query",
- "use-query": "Use query",
- "validate-selector": "Validate selector"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filter expression for label values",
- "aria-label-values-for": "Values for {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Use the search field to find values across selected labels.",
- "select-multiple-values-for-your-labels": "3. Select (multiple) values for your labels"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Allow as recording rules target",
- "label-manage-alerts-via-alerting-ui": "Manage alerts via Alerting UI",
- "title-alerting": "Alerting",
- "tooltip-allow-as-recording-rules-target": "Allow this data source to be selected as a target for writing recording rules.",
- "tooltip-manage-alerts-via-alerting-ui": "Manage alert rules for this data source. To manage other alerting resources, add an Alertmanager data source."
- },
- "config-editor": {
- "browser-access-mode-error": "Browser access mode in the Prometheus data source is no longer available. Switch to server access mode.",
- "description-advanced-settings": "Additional settings are optional settings that can be configured for more control over your data source.",
- "title-advanced-settings": "Advanced settings",
- "title-error": "Error"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Your access method is <1>Browser1>, this means the URL needs to be accessible from the browser.",
- "tooltip-http-url": "Specify a complete HTTP URL (for example {{exampleURL}})",
- "tooltip-server-access-mode": "Your access method is <1>Server1>, this means the URL needs to be accessible from the grafana backend/server."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Visit docs for more details here."
- },
- "exemplar-setting": {
- "label-data-source": "Data source",
- "label-internal-link": "Internal link",
- "label-label-name": "Label name",
- "label-remove-exemplar-link": "Remove exemplar link",
- "label-url": "URL",
- "label-url-label": "URL Label",
- "placeholder-go-to-examplecom": "Go to example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Remove exemplar link",
- "tooltip-data-source": "The data source the exemplar is going to navigate to.",
- "tooltip-internal-link": "Enable this option if you have an internal link. When enabled, this reveals the data source selector. Select the backend tracing data store for your exemplar data.",
- "tooltip-label-name": "The name of the field in the labels object that should be used to get the traceID.",
- "tooltip-url": "The URL of the trace backend the user would go to see its trace",
- "tooltip-url-label": "Use to override the button label on the exemplar traceID field."
- },
- "exemplars-settings": {
- "add": "Add",
- "no-exemplars-configurations": "No exemplars configurations",
- "title-exemplars": "Exemplars"
- },
- "prom-settings": {
- "aria-label-default-editor": "Default Editor (Code or Builder)",
- "aria-label-prom-type-type": "{{promType}} type",
- "aria-label-prometheus-type": "Prometheus type",
- "aria-label-select-http-method": "Select HTTP method",
- "editor-options": {
- "label-builder": "Builder",
- "label-code": "Code"
- },
- "label-cache-level": "Cache level",
- "label-custom-query-parameters": "Custom query parameters",
- "label-default-editor": "Default editor",
- "label-disable-metrics-lookup": "Disable metrics lookup",
- "label-disable-recording-rules-beta": "Disable recording rules (beta)",
- "label-http-method": "HTTP method",
- "label-incremental-querying-beta": "Incremental querying (beta)",
- "label-prom-type-version": "{{promType}} version",
- "label-prometheus-type": "Prometheus type",
- "label-query-overlap-window": "Query overlap window",
- "label-query-timeout": "Query timeout",
- "label-scrape-interval": "Scrape interval",
- "label-series-limit": "Series limit",
- "label-use-series-endpoint": "Use series endpoint",
- "more-info": "For more information on configuring prometheus type and version in data sources, see the <2>provisioning documentation2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Example: {{example}}",
- "title-interval-behaviour": "Interval behaviour",
- "title-other": "Other",
- "title-performance": "Performance",
- "title-query-editor": "Query editor",
- "tooltip-cache-level": "Sets the browser caching level for editor queries. Higher cache settings are recommended for high cardinality data sources.",
- "tooltip-custom-query-parameters": "Add custom parameters to the Prometheus query URL. For example {{example1}}, {{example2}}, {{example3}}, or{{example4}}. Multiple parameters should be concatenated together with {{concatenationChar}}.",
- "tooltip-default-editor": "Set default editor option for all users of this data source.",
- "tooltip-disable-metrics-lookup": "Checking this option will disable the metrics chooser and metric/label support in the query field's autocomplete. This helps if you have performance issues with bigger Prometheus instances. ",
- "tooltip-disable-recording-rules-beta": "This feature will disable recording rules. Turn this on to improve dashboard performance",
- "tooltip-http-method": "You can use either POST or GET HTTP method to query your Prometheus data source. POST is the recommended method as it allows bigger queries. Change this to GET if you have a Prometheus version older than 2.1 or if POST requests are restricted in your network.",
- "tooltip-incremental-querying-beta": "This feature will change the default behavior of relative queries to always request fresh data from the prometheus instance, instead query results will be cached, and only new records are requested. Turn this on to decrease database and network load.",
- "tooltip-prom-type-version": "Use this to set the version of your {{promType}} instance if it is not automatically configured.",
- "tooltip-prometheus-type": "Set this to the type of your prometheus database, e.g. Prometheus, Cortex, Mimir or Thanos. Changing this field will save your current settings. Certain types of Prometheus supports or does not support various APIs. For example, some types support regex matching for label queries to improve performance. Some types have an API for metadata. If you set this incorrectly you may experience odd behavior when querying metrics and labels. Please check your Prometheus documentation to ensure you enter the correct type.",
- "tooltip-query-overlap-window": "Set a duration like {{example1}} or {{example2}} or {{example3}}. Default of {{default}}. This duration will be added to the duration of each incremental request.",
- "tooltip-query-timeout": "Set the Prometheus query timeout.",
- "tooltip-scrape-interval": "This interval is how frequently Prometheus scrapes targets. Set this to the typical scrape and evaluation interval configured in your Prometheus config file. If you set this to a greater value than your Prometheus config file interval, Grafana will evaluate the data according to this interval and you will see less data points. Defaults to {{default}}.",
- "tooltip-series-limit": "The limit applies to all resources (metrics, labels, and values) for both endpoints (series and labels). Leave the field empty to use the default limit (40000). Set to 0 to disable the limit and fetch everything — this may cause performance issues. Default limit is 40000.",
- "tooltip-use-series-endpoint": "Checking this option will favor the series endpoint with {{exampleParameter}} parameter over the label values endpoint with {{exampleParameter}} parameter. While the label values endpoint is considered more performant, some users may prefer the series because it has a POST method while the label values endpoint only has a GET method."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Disabled)",
- "enabled-label": "Metrics browser"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Only includes unique labels",
- "description-custom": "Provide a naming template",
- "description-verbose": "All label names and values",
- "label-auto": "Auto",
- "label-custom": "Custom",
- "label-verbose": "Verbose"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Calculate the average over dimensions",
- "documentation-bottomk": "Smallest k elements by sample value",
- "documentation-count": "Count number of elements in the vector",
- "documentation-count-values": "Count number of elements with the same value",
- "documentation-group": "All values in the resulting vector are 1",
- "documentation-max": "Select maximum over dimensions",
- "documentation-min": "Select minimum over dimensions",
- "documentation-quantile": "Calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions",
- "documentation-stddev": "Calculate population standard deviation over dimensions",
- "documentation-stdvar": "Calculate population standard variance over dimensions",
- "documentation-sum": "Calculate sum over dimensions",
- "documentation-topk": "Largest k elements by sample value"
- },
- "getFunctions": {
- "documentation-abs": "Returns the input vector with all sample values converted to their absolute value.",
- "documentation-absent": "Returns an empty vector if the vector passed to it has any elements and a 1-element vector with the value 1 if the vector passed to it has no elements. This is useful for alerting on when no time series exist for a given metric name and label combination.",
- "documentation-absent-over-time": "Returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements.",
- "documentation-avg-over-time": "The average value of all points in the specified interval.",
- "documentation-ceil": "Rounds the sample values of all elements in `v` up to the nearest integer.",
- "documentation-changes": "For each input time series, `changes(v range-vector)` returns the number of times its value has changed within the provided time range as an instant vector.",
- "documentation-clamp": "Clamps the sample values of all elements in `v` to have a lower limit of `min` and an upper limit of `max`.",
- "documentation-clamp-max": "Clamps the sample values of all elements in `v` to have an upper limit of `max`.",
- "documentation-clamp-min": "Clamps the sample values of all elements in `v` to have a lower limit of `min`.",
- "documentation-count-over-time": "The count of all values in the specified interval.",
- "documentation-count-scalar": "Returns the number of elements in a time series vector as a scalar. This is in contrast to the `count()` aggregation operator, which always returns a vector (an empty one if the input vector is empty) and allows grouping by labels via a `by` clause.",
- "documentation-day-of-month": "Returns the day of the month for each of the given times in UTC. Returned values are from 1 to 31.",
- "documentation-day-of-week": "Returns the day of the week for each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc.",
- "documentation-day-of-year": "Returns the day of the year for each of the given times in UTC. Returned values are from 1 to 365 for non-leap years, and 1 to 366 in leap years.",
- "documentation-days-in-month": "Returns number of days in the month for each of the given times in UTC. Returned values are from 28 to 31.",
- "documentation-deg": "Converts radians to degrees for all elements in v",
- "documentation-delta": "Calculates the difference between the first and last value of each time series element in a range vector `v`, returning an instant vector with the given deltas and equivalent labels. The delta is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if the sample values are all integers.",
- "documentation-deriv": "Calculates the per-second derivative of the time series in a range vector `v`, using simple linear regression.",
- "documentation-double-exponential-smoothing": "Produces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.",
- "documentation-drop-common-labels": "Drops all labels that have the same name and value across all series in the input vector.",
- "documentation-exp": "Calculates the exponential function for all elements in `v`.\nSpecial cases are:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`",
- "documentation-floor": "Rounds the sample values of all elements in `v` down to the nearest integer.",
- "documentation-histogram-avg": "Returns the arithmetic average of observed values stored in a native histogram. Samples that are not native histograms are ignored and do not show up in the returned vector.",
- "documentation-histogram-count": "Returns the count of observations stored in a native histogram.",
- "documentation-histogram-fraction": "Returns the estimated fraction of observations between the provided lower and upper values.",
- "documentation-histogram-quantile": "Calculates the φ-quantile (0 ≤ φ ≤ 1) from the buckets `b` of a histogram. The samples in `b` are the counts of observations in each bucket. Each sample must have a label `le` where the label value denotes the inclusive upper bound of the bucket. (Samples without such a label are silently ignored.) The histogram metric type automatically provides time series with the `_bucket` suffix and the appropriate labels.",
- "documentation-histogram-stddev": "Returns the estimated standard deviation of observations in a native histogram, based on the geometric mean of the buckets where the observations lie.",
- "documentation-histogram-stdvar": "Returns the estimated standard variance of observations in a native histogram.",
- "documentation-histogram-sum": "Returns the sum of observations stored in a native histogram.",
- "documentation-holt-winters": "Renamed as double_exponential_smoothing in prometheus v3.x. For prometheus versions equal and greater than v3.0 please use double_exponential_smoothing. \n\nProduces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.",
- "documentation-hour": "Returns the hour of the day for each of the given times in UTC. Returned values are from 0 to 23.",
- "documentation-idelta": "Calculates the difference between the last two samples in the range vector `v`, returning an instant vector with the given deltas and equivalent labels.",
- "documentation-increase": "Calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.",
- "documentation-info": "Returns latest details and metadata about a group of metrics, such as their labels and current values, without doing any calculations",
- "documentation-irate": "Calculates the per-second instant rate of increase of the time series in the range vector. This is based on the last two data points. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for.",
- "documentation-label-join": "For each timeseries in `v`, joins all the values of all the `src_labels` using `separator` and returns the timeseries with the label `dst_label` containing the joined value. There can be any number of `src_labels` in this function.",
- "documentation-label-replace": "For each timeseries in `v`, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)` matches the regular expression `regex` against the label `src_label`. If it matches, then the timeseries is returned with the label `dst_label` replaced by the expansion of `replacement`. `$1` is replaced with the first matching subgroup, `$2` with the second etc. If the regular expression doesn't match then the timeseries is returned unchanged.",
- "documentation-last-over-time": "The most recent point value in specified interval.",
- "documentation-ln": "Calculates the natural logarithm for all elements in `v`.\nSpecial cases are:\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`",
- "documentation-log10": "Calculates the decimal logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.",
- "documentation-log2": "Calculates the binary logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.",
- "documentation-max-over-time": "The maximum value of all points in the specified interval.",
- "documentation-min-over-time": "The minimum value of all points in the specified interval.",
- "documentation-minute": "Returns the minute of the hour for each of the given times in UTC. Returned values are from 0 to 59.",
- "documentation-month": "Returns the month of the year for each of the given times in UTC. Returned values are from 1 to 12, where 1 means January etc.",
- "documentation-pi": "Returns pi",
- "documentation-predict-linear": "Predicts the value of time series `t` seconds from now, based on the range vector `v`, using simple linear regression.",
- "documentation-present-over-time": "The value 1 for any series in the specified interval.",
- "documentation-quantile-over-time": "The φ-quantile (0 ≤ φ ≤ 1) of the values in the specified interval.",
- "documentation-rad": "Converts degrees to radians for all elements in v",
- "documentation-rate": "Calculates the per-second average rate of increase of the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. Also, the calculation extrapolates to the ends of the time range, allowing for missed scrapes or imperfect alignment of scrape cycles with the range's time period.",
- "documentation-resets": "For each input time series, `resets(v range-vector)` returns the number of counter resets within the provided time range as an instant vector. Any decrease in the value between two consecutive samples is interpreted as a counter reset.",
- "documentation-round": "Rounds the sample values of all elements in `v` to the nearest integer. Ties are resolved by rounding up. The optional `to_nearest` argument allows specifying the nearest multiple to which the sample values should be rounded. This multiple may also be a fraction.",
- "documentation-scalar": "Given a single-element input vector, `scalar(v instant-vector)` returns the sample value of that single element as a scalar. If the input vector does not have exactly one element, `scalar` will return `NaN`.",
- "documentation-sgn": "Returns a vector with all sample values converted to their sign, defined as this: 1 if v is positive, -1 if v is negative and 0 if v is equal to zero.",
- "documentation-sort": "Returns vector elements sorted by their sample values, in ascending order.",
- "documentation-sort-desc": "Returns vector elements sorted by their sample values, in descending order.",
- "documentation-sqrt": "Calculates the square root of all elements in `v`.",
- "documentation-stddev-over-time": "The population standard deviation of the values in the specified interval.",
- "documentation-stdvar-over-time": "The population standard variance of the values in the specified interval.",
- "documentation-sum-over-time": "The sum of all values in the specified interval.",
- "documentation-time": "Returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated.",
- "documentation-timestamp": "Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.",
- "documentation-vector": "Returns the scalar `s` as a vector with no labels.",
- "documentation-year": "Returns the year for each of the given times in UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "calculates the arccosine of all elements in {{argument}}",
- "documentation-acosh": "calculates the inverse hyperbolic cosine of all elements in {{argument}}",
- "documentation-asin": "calculates the arcsine of all elements in {{argument}}",
- "documentation-asinh": "calculates the inverse hyperbolic sine of all elements in {{argument}}",
- "documentation-atan": "calculates the arctangent of all elements in {{argument}}",
- "documentation-atanh": "calculates the inverse hyperbolic tangent of all elements in {{argument}}",
- "documentation-cos": "calculates the cosine of all elements in {{argument}}",
- "documentation-cosh": "calculates the hyperbolic cosine of all elements in {{argument}}",
- "documentation-sin": "calculates the sine of all elements in {{argument}}",
- "documentation-sinh": "calculates the hyperbolic sine of all elements in {{argument}}",
- "documentation-tan": "calculates the tangent of all elements in {{argument}}",
- "documentation-tanh": "calculates the hyperbolic tangent of all elements in {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Give feedback",
- "title-give-feedback": "The metrics explorer is new, please let us know how we can improve it"
- },
- "get-collapsed-info": {
- "exemplars": "Exemplars: {{value}}",
- "format": "Format: {{value}}",
- "legend": "Legend: {{value}}",
- "step": "Step: {{value}}",
- "type": "Type: {{value}}"
- },
- "get-placeholders": {
- "browse": "Search metrics by name",
- "type": "Filter by type"
- },
- "get-prom-types": {
- "description-counter": "A cumulative metric that represents a single monotonically increasing counter whose value can only increase or be reset to zero on restart.",
- "description-gauge": "A metric that represents a single numerical value that can arbitrarily go up and down.",
- "description-histogram": "A histogram samples observations (usually things like request durations or response sizes) and counts them in configurable buckets.",
- "description-native-histogram": "Native histograms are different from classic Prometheus histograms in a number of ways: Native histogram bucket boundaries are calculated by a formula that depends on the scale (resolution) of the native histogram, and are not user defined.",
- "description-no-type": "These metrics have no defined type in the metadata.",
- "description-summary": "A summary samples observations (usually things like request durations and response sizes) and can calculate configurable quantiles over a sliding time window.",
- "description-unknown": "These metrics have been given the type unknown in the metadata.",
- "label-counter": "Counter",
- "label-gauge": "Gauge",
- "label-histogram": "Histogram",
- "label-native-histogram": "Native histogram",
- "label-no-type": "No type",
- "label-summary": "Summary",
- "label-unknown": "Unknown"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Query parsing is ambiguous."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Remove {{name}}",
- "placeholder-select-label": "Select label",
- "placeholder-select-value": "Select value"
- },
- "label-filters": {
- "label-filters": "Label filters",
- "label-label-filters": "Label filters",
- "tooltip-label-filters": "Optional: used to filter the metric select for this query type."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Loading labels",
- "noOptionsMessage-no-labels-found": "No labels found"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Open metrics explorer",
- "placeholder-select-metric": "Select metric",
- "tooltip-open-metrics-explorer": "Open metrics explorer"
- },
- "label-metric": "Metric",
- "tooltip-metric": "Optional: returns a list of label values for the label name in the specified metric."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Browse metrics",
- "currently-selected": "Currently selected: {{selected}}",
- "metrics-pre-filtered": "These metrics have been pre-filtered by labels chosen in the label filters.",
- "title-metrics-explorer": "Metrics explorer"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignoring",
- "on": "On"
- },
- "operator": "Operator",
- "tooltip-remove-match": "Remove match",
- "vector-matches": "Vector matches"
- },
- "operation-editor": {
- "not-found": "Operation {{id}} not found",
- "title-remove": "Remove {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Replace with",
- "title-click-to-view-alternative-operations": "Click to view alternative operations",
- "title-remove-operation": "Remove operation"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Click to show description",
- "title-remove-operation": "Remove operation"
- },
- "operation-list": {
- "operations": "Operations",
- "placeholder-search": "Search",
- "title-add-operation": "Add operation"
- },
- "operation-param-editor": {
- "title-add": "Add {{name}}",
- "title-remove": "Remove {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Calculates {{aggregationName}} over dimensions while preserving {{labelWord}} {{labels}}.",
- "label-default": "Calculates {{aggregationName}} over the dimensions.",
- "label-without": "Calculates {{aggregationName}} over the dimensions {{labels}}. All other labels are preserved."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Exemplars switch.",
- "aria-label-format": "Format combobox",
- "aria-label-lower-limit-parameter": "Min step text box, set lower limit for the step parameter",
- "aria-label-select-resolution": "Select resolution",
- "aria-label-type": "Type radio button group",
- "format-options": {
- "label-heatmap": "Heatmap",
- "label-table": "Table",
- "label-time-series": "Time series"
- },
- "label-exemplars": "Exemplars",
- "label-format": "Format",
- "label-min-step": "Min step",
- "label-resolution": "Resolution",
- "label-type": "Type",
- "placeholder-auto": "auto",
- "title-options": "Options",
- "tooltip-min-step": "An additional lower limit for the step parameter of the Prometheus query and for the <2>{{interval}}2> and <4>{{rateInterval}}4> variables."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "There is a syntax error, or the query structure cannot be visualized when switching to the builder mode. Parts of the query may be lost.",
- "confirmText-continue": "Continue",
- "kick-start-your-query": "Kick start your query",
- "label-explain": "Explain",
- "run-queries": "Run queries",
- "title-parsing-error-switch-builder": "Parsing error: Switch to the builder mode?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Legend combobox",
- "label-legend": "Legend",
- "placeholder-select-legend-mode": "Select legend mode",
- "tooltip-legend": "Series name override or template. Ex. {{templateExample}} will be replaced with label value for {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "hint: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Builder",
- "label-code": "Code"
- }
- },
- "query-pattern": {
- "apply-query": "Apply query",
- "aria-label-apply-query-starter-button": "apply query starter button",
- "aria-label-back-button": "back button",
- "aria-label-create-new-query-button": "create new query button",
- "aria-label-raw-query": "{{patternName}} raw query",
- "aria-label-use-this-query-button": "use this query button",
- "back": "Back",
- "create-new-query": "Create new query",
- "use-this-query": "Use this query"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "close kick start your query modal",
- "aria-label-kick-start-your-query-modal": "Kick start your query modal",
- "aria-label-toggle-query-starter": "open and close {{patternType}} query starter card",
- "close": "Close",
- "description-kick-start-your-query": "Kick start your query by selecting one of these queries. You can then continue to complete your query.",
- "label-toggle-query-starter": "{{patternType}} query starters",
- "title-kick-start-your-query": "Kick start your query"
- },
- "raw-query": {
- "aria-label-selector": "selector"
- },
- "results-table": {
- "content-descriptive-type": "When creating a {{descriptiveType}}, Prometheus exposes multiple series with the type counter. ",
- "description": "Description",
- "message-expand-label-filters": "There are no metrics found. Try to expand your label filters.",
- "message-expand-search": "There are no metrics found. Try to expand your search and filters.",
- "message-no-metrics-found": "There are no metrics found in the data source.",
- "name": "Name",
- "type": "Type"
- }
- }
- }
-}
diff --git a/packages/grafana-prometheus/src/locales/es-ES/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/es-ES/grafana-prometheus.json
deleted file mode 100644
index d136ade891f..00000000000
--- a/packages/grafana-prometheus/src/locales/es-ES/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "¡Error de carga de datos de anotación!",
- "aria-label-lower-limit-parameter": "Establecer límite inferior para el parámetro de paso",
- "label-min-step": "Paso mínimo",
- "label-series-value-as-timestamp": "Valor de la serie como marca de tiempo",
- "label-tags": "Etiquetas",
- "label-text": "Texto",
- "label-title": "Título",
- "placeholder-auto": "auto",
- "tooltip-either-pattern-example-instance-replaced-label": "Utiliza el nombre o un patrón. Por ejemplo, {{labelTemplate}} se reemplaza con el valor de etiqueta para la etiqueta {{labelName}}.",
- "tooltip-min-step": "Un límite inferior adicional para el parámetro de paso de la consulta de Prometheus y para las variables <2>{{intervalVar}}2> y <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "La unidad de la marca de tiempo es milisegundos. Si la unidad del valor de la serie es segundos, multiplica su vector de rango por 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Ejecutar una consulta instantánea y una consulta de rango"
- },
- "label": {
- "both": "Ambas"
- },
- "range-options": {
- "description": {
- "query-range": "Ejecutar consulta en un rango de tiempo"
- },
- "label": {
- "instant": "Instantánea",
- "range": "Rango"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Expresión de filtro para etiqueta",
- "description-select-labels": "Una vez seleccionados los valores de las etiquetas, solo se muestran las posibles combinaciones de etiquetas.",
- "select-labels-to-search-in": "2. Selecciona las etiquetas en las que buscar"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Expresión de filtro para métrica",
- "aria-label-limit-results-from-series-endpoint": "Limitar los resultados del punto de conexión de la serie",
- "description-series-limit": "El límite se aplica a todas las métricas, etiquetas y valores. Deja el campo vacío para usar el límite predeterminado. Define el valor en 0 para desactivar el límite y obtenerlo todo (esto puede causar problemas de rendimiento).",
- "label-select-metric": "Una vez seleccionada una métrica, solo se muestran las etiquetas posibles. Las etiquetas están limitadas por el límite de la serie a continuación.",
- "select-a-metric": "1. Seleccionar una métrica",
- "series-limit": "Límite de series"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Hoja de referencia de PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Ejemplos",
- "tooltip-disable-query": "Deshabilitar consulta con ejemplos",
- "tooltip-enable-query": "Habilitar consulta con ejemplos"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Campo adicional de Prometheus",
- "aria-label-query-type-field": "Campo de tipo de consulta",
- "aria-label-step-field": "Campo de paso",
- "min-step": "Paso mínimo",
- "query-type": "Tipo de consulta",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Aquí se pueden utilizar unidades de tiempo y variables integradas, por ejemplo: {{example1}}, {{example2}}, {{example3}}, {{example4}} {{example5}}, {{example6}}, {{example7}} (valor predeterminado si no se especifica ninguna unidad: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Introduce una consulta de PromQL..."
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Consulta clásica",
- "aria-label-metric-regex": "Expresión regular métrica",
- "aria-label-metric-selector": "Selector de métricas",
- "aria-label-prometheus-query": "Consulta de Prometheus",
- "aria-label-query-type": "Tipo de consulta",
- "aria-label-series-query": "Consulta de series",
- "label-classic-query": "Consulta clásica",
- "label-label": "Etiqueta",
- "label-metric-regex": "Expresión regular métrica",
- "label-query": "Consulta",
- "label-query-type": "Tipo de consulta",
- "label-series-query": "Consulta de series",
- "placeholder-classic-query": "Consulta clásica",
- "placeholder-metric-regex": "Expresión regular métrica",
- "placeholder-prometheus-query": "Consulta de Prometheus",
- "placeholder-select-query-type": "Seleccionar tipo de consulta",
- "placeholder-series-query": "Consulta de series",
- "returns-metrics-matching-specified-metric-regex": "Devuelve una lista de métricas que coinciden con la expresión regular de métrica especificada.",
- "tooltip-classic-query": "La implementación original del editor de consultas de variables de Prometheus. Introduce una cadena con el tipo de consulta y los parámetros correctos como se describe en estos documentos. Por ejemplo, {{exampleQuery}}.",
- "tooltip-label": "Devuelve una lista de valores de etiqueta para el nombre de etiqueta en todas las métricas, a menos que se especifique la métrica.",
- "tooltip-metric-regex": "Devuelve una lista de nombres de etiquetas, filtrando opcionalmente por la expresión regular de métrica especificada.",
- "tooltip-query": "Devuelve una lista de resultados de la consulta de Prometheus para la consulta. Esto puede incluir funciones de Prometheus, es decir, {{exampleQuery}}.",
- "tooltip-query-type": "El plugin de fuente de datos de Prometheus proporciona los siguientes tipos de consulta para las variables de plantilla.",
- "tooltip-series-query": "Introduzca una métrica con etiquetas, solo una métrica o solo etiquetas, es decir, {{example1}}, {{example2}} o {{example3}}. Devuelve una lista de series temporales asociadas con los datos introducidos."
- },
- "selector-actions": {
- "aria-label-selector": "selector",
- "aria-label-selector-clear-button": "Botón de borrado del selector",
- "aria-label-use-selector-as-metrics-button": "Utilizar el selector como botón de métricas",
- "aria-label-use-selector-for-query-button": "Utilizar el selector para el botón de consulta",
- "aria-label-validate-submit-button": "Validar botón de envío",
- "clear": "Borrar",
- "resulting-selector": "4. Selector resultante",
- "use-as-rate-query": "Utilizar como consulta de tasa",
- "use-query": "Utilizar consulta",
- "validate-selector": "Validar selector"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Expresión de filtro para valores de etiqueta",
- "aria-label-values-for": "Valores para {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Utiliza el campo de búsqueda para encontrar valores en las etiquetas seleccionadas.",
- "select-multiple-values-for-your-labels": "3. Selecciona (varios) valores para sus etiquetas"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Permitir como objetivo de las reglas de grabación",
- "label-manage-alerts-via-alerting-ui": "Gestionar alertas a través de la interfaz de usuario de Alerting",
- "title-alerting": "Alertas",
- "tooltip-allow-as-recording-rules-target": "Permite que esta fuente de datos se seleccione como objetivo para escribir reglas de log.",
- "tooltip-manage-alerts-via-alerting-ui": "Gestiona las reglas de alerta para esta fuente de datos. Para gestionar otros recursos de alerta, añade una fuente de datos de Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "El modo de acceso a través del navegador en la fuente de datos de Prometheus ya no está disponible. Cambia al modo de acceso al servidor.",
- "description-advanced-settings": "Los ajustes adicionales son ajustes opcionales que se pueden configurar para tener un mayor control sobre tu fuente de datos.",
- "title-advanced-settings": "Ajustes avanzados",
- "title-error": "Error"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Tu método de acceso es <1>Navegador1>, esto significa que la URL debe ser accesible desde el navegador.",
- "tooltip-http-url": "Especifica una URL HTTP completa (por ejemplo, {{exampleURL}})",
- "tooltip-server-access-mode": "Tu método de acceso es <1>Servidor1>, esto significa que la URL debe ser accesible desde el «backend» o servidor de Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Consulta los documentos aquí para obtener más información."
- },
- "exemplar-setting": {
- "label-data-source": "Fuente de datos",
- "label-internal-link": "Enlace interno",
- "label-label-name": "Nombre de la etiqueta",
- "label-remove-exemplar-link": "Eliminar enlace de ejemplo",
- "label-url": "URL",
- "label-url-label": "Etiqueta de URL",
- "placeholder-go-to-examplecom": "Ir a ejemplo.com",
- "placeholder-httpsexamplecomvalueraw": "https://ejemplo.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Eliminar enlace de ejemplo",
- "tooltip-data-source": "La fuente de datos a la que se dirigirá el ejemplo.",
- "tooltip-internal-link": "Habilita esta opción si tiene un enlace interno. Cuando está habilitado, indica el selector de fuente de datos. Selecciona el almacén de datos de trazas de backend para tus datos de ejemplo.",
- "tooltip-label-name": "El nombre del campo en el objeto de etiquetas que debe utilizarse para obtener el traceID.",
- "tooltip-url": "La URL del backend de traza al que el usuario iría para ver su traza",
- "tooltip-url-label": "Utilícelo para anular la etiqueta del botón en el campo traceID del ejemplo."
- },
- "exemplars-settings": {
- "add": "Añadir",
- "no-exemplars-configurations": "No hay configuraciones de ejemplos",
- "title-exemplars": "Ejemplos"
- },
- "prom-settings": {
- "aria-label-default-editor": "Editor predeterminado (Código o Creador)",
- "aria-label-prom-type-type": "Tipo {{promType}}",
- "aria-label-prometheus-type": "Tipo de Prometheus",
- "aria-label-select-http-method": "Seleccionar método HTTP",
- "editor-options": {
- "label-builder": "Constructor",
- "label-code": "Código"
- },
- "label-cache-level": "Nivel de caché",
- "label-custom-query-parameters": "Parámetros de consulta personalizados",
- "label-default-editor": "Editor predeterminado",
- "label-disable-metrics-lookup": "Deshabilitar la búsqueda de métricas",
- "label-disable-recording-rules-beta": "Deshabilitar reglas de registro (beta)",
- "label-http-method": "Método HTTP",
- "label-incremental-querying-beta": "Consulta incremental (beta)",
- "label-prom-type-version": "Versión de {{promType}}",
- "label-prometheus-type": "Tipo de Prometheus",
- "label-query-overlap-window": "Ventana de superposición de consultas",
- "label-query-timeout": "Tiempo de espera de la consulta",
- "label-scrape-interval": "Intervalo de recuperación de datos",
- "label-series-limit": "Límite de series",
- "label-use-series-endpoint": "Utilizar punto de conexión de la serie",
- "more-info": "Para obtener más información sobre cómo configurar el tipo y la versión de Prometheus en las fuentes de datos, consulte la <2>documentación de aprovisionamiento2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Ejemplo: {{example}}",
- "title-interval-behaviour": "Comportamiento del intervalo",
- "title-other": "Otro",
- "title-performance": "Rendimiento",
- "title-query-editor": "Editor de consultas",
- "tooltip-cache-level": "Establece el nivel de caché del navegador para las consultas del editor. Se recomienda una configuración de caché más alta para fuentes de datos de alta cardinalidad.",
- "tooltip-custom-query-parameters": "Añada parámetros personalizados a la URL de la consulta de Prometheus. Por ejemplo, {{example1}}, {{example2}}, {{example3}} o{{example4}}. Deben concatenarse varios parámetros junto con {{concatenationChar}}.",
- "tooltip-default-editor": "Establece la opción de editor predeterminada para todos los usuarios de esta fuente de datos.",
- "tooltip-disable-metrics-lookup": "Al marcar esta opción, se desactivará el selector de métricas y la compatibilidad con métricas/etiquetas en el autocompletado del campo de consulta. Esto es útil si tienes problemas de rendimiento con instancias de Prometheus de mayor tamaño. ",
- "tooltip-disable-recording-rules-beta": "Esta función deshabilitará las reglas de registro. Actívelo para mejorar el rendimiento del dashboard",
- "tooltip-http-method": "Puedes utilizar el método HTTP POST o GET para consultar tu fuente de datos de Prometheus. POST es el método recomendado, ya que permite consultas de mayor tamaño. Cámbialo a GET si tienes una versión de Prometheus anterior a la 2.1 o si las solicitudes POST están restringidas en tu red.",
- "tooltip-incremental-querying-beta": "Esta función cambiará el comportamiento predeterminado de las consultas relativas para solicitar siempre datos nuevos de la instancia de Prometheus, en lugar de almacenar en caché los resultados de las consultas y solo se solicitarán nuevos registros. Actívalo para disminuir la carga de la base de datos y de la red.",
- "tooltip-prom-type-version": "Utiliza esta opción para establecer la versión de tu instancia {{promType}} si no se configura automáticamente.",
- "tooltip-prometheus-type": "Define este valor en el tipo de tu base de datos de Prometheus, por ejemplo, Prometheus, Cortex, Mimir o Thanos. Si cambias este campo, se guardarán tus ajustes actuales. Ciertos tipos de Prometheus admiten o no admiten varias API. Por ejemplo, algunos tipos admiten la coincidencia de expresiones regulares para consultas de etiquetas para mejorar el rendimiento. Algunos tipos tienen una API para metadatos. Si configuraste valor incorrectamente, puedes experimentar un comportamiento extraño al consultar métricas y etiquetas. Consulta la documentación de Prometheus para asegurarte de introducir el tipo correcto.",
- "tooltip-query-overlap-window": "Establece una duración como {{example1}}, {{example2}} o {{example3}}. El valor predeterminado es {{default}}. Esta duración se añadirá a la duración de cada solicitud incremental.",
- "tooltip-query-timeout": "Establece el tiempo de espera de la consulta de Prometheus.",
- "tooltip-scrape-interval": "Este intervalo es la frecuencia con la que Prometheus recupera datos de los objetivos. Establece este valor en el intervalo típico de recuperación de datos y evaluación definido en tu archivo de configuración de Prometheus. Si estableces un valor mayor que el intervalo de tu archivo de configuración de Prometheus, Grafana evaluará los datos de acuerdo con este intervalo y verás menos puntos de datos. El valor predeterminado es {{default}}.",
- "tooltip-series-limit": "El límite se aplica a todos los recursos (métricas, etiquetas y valores) para ambos puntos finales (series y etiquetas). Deja el campo vacío para usar el límite predeterminado (40 000). Establece el valor en 0 para desactivar el límite y obtenerlo todo (esto puede causar problemas de rendimiento). El límite predeterminado es 40 000.",
- "tooltip-use-series-endpoint": "Al marcar esta opción, se favorecerá el punto de conexión de la serie con el parámetro {{exampleParameter}} sobre el punto final de los valores de la etiqueta con el parámetro {{exampleParameter}}. Aunque el punto de conexión de los valores de etiqueta se considera más eficiente, algunos usuarios pueden preferir la serie porque tiene un método POST, mientras que el punto de los valores de etiqueta solo tiene un método GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Deshabilitado)",
- "enabled-label": "Navegador de métricas"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Solo incluye etiquetas únicas",
- "description-custom": "Proporciona una plantilla de nombres",
- "description-verbose": "Todos los nombres y valores de etiqueta",
- "label-auto": "Automático",
- "label-custom": "Personalizado",
- "label-verbose": "Detallado"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Calcular la media sobre las dimensiones",
- "documentation-bottomk": "Elementos k más pequeños por valor de muestra",
- "documentation-count": "Contar el número de elementos en el vector",
- "documentation-count-values": "Contar el número de elementos con el mismo valor",
- "documentation-group": "Todos los valores en el vector resultante son 1",
- "documentation-max": "Seleccionar el máximo sobre las dimensiones",
- "documentation-min": "Seleccionar mínimo sobre dimensiones",
- "documentation-quantile": "Calcular el cuantil φ (0 ≤ φ ≤ 1) sobre las dimensiones",
- "documentation-stddev": "Calcular la desviación estándar de la población sobre las dimensiones",
- "documentation-stdvar": "Calcular la varianza estándar de la población sobre las dimensiones",
- "documentation-sum": "Calcular la suma sobre las dimensiones",
- "documentation-topk": "Elementos k más grandes por valor de muestra"
- },
- "getFunctions": {
- "documentation-abs": "Devuelve el vector de entrada con todos los valores de muestra convertidos a su valor absoluto.",
- "documentation-absent": "Devuelve un vector vacío si el vector que se le pasa tiene algún elemento y un vector de un elemento con el valor 1 si el vector que se le pasa no tiene elementos. Esto es útil para alertar cuando no existen series temporales para una combinación determinada de nombre y etiqueta de métrica.",
- "documentation-absent-over-time": "Devuelve un vector vacío si el vector de rango que se le pasa tiene algún elemento y un vector de 1 elemento con valor 1 si el vector de rango que se le pasa no tiene elementos.",
- "documentation-avg-over-time": "El valor medio de todos los puntos en el intervalo especificado.",
- "documentation-ceil": "Redondea los valores de muestra de todos los elementos en «v» hacia arriba al número entero más cercano.",
- "documentation-changes": "Para cada serie temporal de entrada, «changes(v range-vector)» devuelve el número de veces que su valor ha cambiado dentro del intervalo de tiempo proporcionado como un vector instantáneo.",
- "documentation-clamp": "Fija los valores de muestra de todos los elementos en «v» para tener un límite inferior de «mín.» y un límite superior de «máx.».",
- "documentation-clamp-max": "Limita los valores de muestra de todos los elementos en «v» para que tengan un límite superior de «máx.».",
- "documentation-clamp-min": "Limita los valores de muestra de todos los elementos en «v» para que tengan un límite inferior de «mín.».",
- "documentation-count-over-time": "El recuento de todos los valores en el intervalo especificado.",
- "documentation-count-scalar": "Devuelve el número de elementos en un vector de serie temporal como un escalar. Esto contrasta con el operador de agregación «count()», que siempre devuelve un vector (uno vacío si el vector de entrada está vacío) y permite la agrupación por etiquetas a través de una cláusula «by».",
- "documentation-day-of-month": "Devuelve el día del mes para cada una de las horas indicadas en UTC. Los valores devueltos van del 1 al 31.",
- "documentation-day-of-week": "Devuelve el día de la semana para cada una de las horas indicadas en UTC. Los valores devueltos van del 0 al 6, donde 0 significa domingo, etc.",
- "documentation-day-of-year": "Devuelve el día del año para cada una de las horas indicadas en UTC. Los valores devueltos van del 1 al 365 para los años no bisiestos y del 1 al 366 para los años bisiestos.",
- "documentation-days-in-month": "Devuelve el número de días del mes para cada una de las horas indicadas en UTC. Los valores devueltos van del 28 al 31.",
- "documentation-deg": "Convierte radianes a grados para todos los elementos en v",
- "documentation-delta": "Calcula la diferencia entre el primer y el último valor de cada elemento de la serie temporal en un vector de rango «v», devolviendo un vector instantáneo con los deltas dados y las etiquetas equivalentes. El delta se extrapola para cubrir el rango de tiempo completo como se especifica en el selector de vector de rango, de modo que es posible obtener un resultado no entero incluso si los valores de muestra son todos enteros.",
- "documentation-deriv": "Calcula la derivada por segundo de la serie temporal en un vector de rango «v», utilizando una regresión lineal simple.",
- "documentation-double-exponential-smoothing": "Produce un valor suavizado para las series temporales en función del rango en «v». Cuanto menor sea el factor de suavizado «sf», más importancia se le dará a los datos antiguos. Cuanto mayor sea el factor de tendencia «tf», más tendencias se considerarán en los datos. Tanto «sf» como «tf» deben estar entre 0 y 1.",
- "documentation-drop-common-labels": "Desecha todas las etiquetas que tienen el mismo nombre y valor en todas las series del vector de entrada.",
- "documentation-exp": "Calcula la función exponencial para todos los elementos en «v».\nLos casos especiales son:\n* «Exp(+Inf) = +Inf» \n* «Exp(NaN) = NaN»",
- "documentation-floor": "Redondea los valores de muestra de todos los elementos en «v» hacia abajo al número entero más cercano.",
- "documentation-histogram-avg": "Devuelve la media aritmética de los valores observados almacenados en un histograma nativo. Las muestras que no son histogramas nativos se ignoran y no aparecen en el vector devuelto.",
- "documentation-histogram-count": "Devuelve el recuento de observaciones almacenadas en un histograma nativo.",
- "documentation-histogram-fraction": "Devuelve la fracción estimada de observaciones entre los valores inferior y superior proporcionados.",
- "documentation-histogram-quantile": "Calcula el cuantil φ (0 ≤ φ ≤ 1) a partir de los cubos «b» de un histograma. Las muestras en «b» son los recuentos de observaciones en cada cubo. Cada muestra debe tener una etiqueta «le», donde el valor de la etiqueta denota el límite superior inclusivo del cubo. (Las muestras sin dicha etiqueta se ignoran silenciosamente). El tipo de métrica del histograma proporciona automáticamente series temporales con el sufijo «_bucket» y las etiquetas que correspondan.",
- "documentation-histogram-stddev": "Devuelve la desviación estándar estimada de las observaciones en un histograma nativo, basada en la media geométrica de los segmentos en los que se encuentran las observaciones.",
- "documentation-histogram-stdvar": "Devuelve la varianza estándar estimada de las observaciones en un histograma nativo.",
- "documentation-histogram-sum": "Devuelve la suma de observaciones almacenadas en un histograma nativo.",
- "documentation-holt-winters": "Renombrado como double_exponential_smoothing en Prometheus v3.x. Para versiones de Prometheus iguales y superiores a v3.0, utiliza double_exponential_smoothing. \n\nProduce un valor suavizado para las series temporales en función del rango en «v». Cuanto menor sea el factor de suavizado «sf», más importancia se le dará a los datos antiguos. Cuanto mayor sea el factor de tendencia «tf», más tendencias se considerarán en los datos. Tanto «sf» como «tf» deben estar entre 0 y 1.",
- "documentation-hour": "Devuelve la hora del día para cada una de las horas indicadas en UTC. Los valores devueltos van de 0 a 23.",
- "documentation-idelta": "Calcula la diferencia entre las dos últimas muestras en el vector de rango «v», devolviendo un vector instantáneo con los deltas dados y las etiquetas equivalentes.",
- "documentation-increase": "Calcula el aumento en la serie temporal en el vector de rango. Las interrupciones en la monotonía (como los reinicios del contador debido a reinicios del objetivo) se ajustan automáticamente. El aumento se extrapola para cubrir todo el rango de tiempo especificado en el selector de vector de rango, de modo que es posible obtener un resultado no entero incluso si un contador aumenta solo en incrementos enteros.",
- "documentation-info": "Devuelve los detalles y metadatos más recientes sobre un grupo de métricas, como sus etiquetas y valores actuales, sin realizar ningún cálculo",
- "documentation-irate": "Calcula la tasa de aumento instantánea por segundo de la serie temporal en el vector de rango. Se basa en los dos últimos puntos de datos. Las interrupciones en la monotonía (como los reinicios del contador debido a reinicios del objetivo) se ajustan automáticamente.",
- "documentation-label-join": "Para cada serie temporal en «v», une todos los valores de todas las «src_labels» usando «separator» y devuelve la serie temporal con la etiqueta «dst_label» que contiene el valor unido. Puede haber cualquier número de «src_labels» en esta función.",
- "documentation-label-replace": "Para cada serie temporal en «v», «label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)» coincide con la expresión regular «regex» en la etiqueta «src_label». Si coincide, la serie temporal se devuelve con la etiqueta «dst_label» reemplazada por la expansión de «replacement». «$1» se sustituye por el primer subgrupo coincidente, «$2» por el segundo, etc. Si la expresión regular no coincide, entonces la serie temporal se devuelve sin cambios.",
- "documentation-last-over-time": "El valor de punto más reciente en el intervalo especificado.",
- "documentation-ln": "Calcula el logaritmo natural para todos los elementos en «v».\nLos casos especiales son:\n * «ln(+Inf) = +Inf»\n * «ln(0) = -Inf»\n * «ln(x < 0) = NaN»\n * «ln(NaN) = NaN»",
- "documentation-log10": "Calcula el logaritmo decimal para todos los elementos en «v». Los casos especiales son equivalentes a los de «ln».",
- "documentation-log2": "Calcula el logaritmo binario para todos los elementos en «v». Los casos especiales son equivalentes a los de «ln».",
- "documentation-max-over-time": "El valor máximo de todos los puntos en el intervalo especificado.",
- "documentation-min-over-time": "El valor mínimo de todos los puntos en el intervalo especificado.",
- "documentation-minute": "Devuelve el minuto de la hora para cada una de las horas indicadas en UTC. Los valores devueltos van de 0 a 59.",
- "documentation-month": "Devuelve el mes del año para cada una de las horas indicadas en UTC. Los valores devueltos van del 1 al 12, donde 1 significa enero, etc.",
- "documentation-pi": "Devuelve pi",
- "documentation-predict-linear": "Predice el valor de la serie temporal «t» segundos a partir de ahora, en función del vector de rango «v», utilizando una regresión lineal simple.",
- "documentation-present-over-time": "El valor 1 para cualquier serie en el intervalo especificado.",
- "documentation-quantile-over-time": "El cuantil φ (0 ≤ φ ≤ 1) de los valores en el intervalo especificado.",
- "documentation-rad": "Convierte grados a radianes para todos los elementos en v",
- "documentation-rate": "Calcula la tasa media de aumento por segundo de la serie temporal en el vector de rango. Las interrupciones en la monotonía (como los reinicios del contador debido a reinicios del objetivo) se ajustan automáticamente. Además, el cálculo se extrapola a los extremos del rango de tiempo, lo que permite tener en cuenta los raspados perdidos o una alineación imperfecta de los ciclos de raspado con el periodo de tiempo del rango.",
- "documentation-resets": "Para cada serie temporal de entrada, «resets(v range-vector)» devuelve el número de reinicios del contador dentro del intervalo de tiempo proporcionado como un vector instantáneo. Cualquier disminución del valor entre dos muestras consecutivas se interpreta como un reinicio del contador.",
- "documentation-round": "Redondea los valores de muestra de todos los elementos en «v» al número entero más cercano. Los empates se resuelven redondeando hacia arriba. El argumento opcional «to_nearest» permite especificar el múltiplo más cercano al que se deben redondear los valores de muestra. Este múltiplo también puede ser una fracción.",
- "documentation-scalar": "Dado un vector de entrada de un solo elemento, «scalar(v instant-vector)» devuelve el valor de muestra de ese único elemento como un escalar. Si el vector de entrada no tiene exactamente un elemento, «scalar» devolverá «NaN».",
- "documentation-sgn": "Devuelve un vector con todos los valores de muestra convertidos a su signo, definido de la siguiente manera: 1 si v es positivo, -1 si v es negativo y 0 si v es igual a cero.",
- "documentation-sort": "Devuelve los elementos del vector ordenados por sus valores de muestra, en orden ascendente.",
- "documentation-sort-desc": "Devuelve los elementos del vector ordenados por sus valores de muestra, en orden descendente.",
- "documentation-sqrt": "Calcula la raíz cuadrada de todos los elementos en «v».",
- "documentation-stddev-over-time": "La desviación estándar de la población de los valores en el intervalo especificado.",
- "documentation-stdvar-over-time": "La varianza estándar de la población de los valores en el intervalo especificado.",
- "documentation-sum-over-time": "La suma de todos los valores en el intervalo especificado.",
- "documentation-time": "Devuelve el número de segundos desde el 1 de enero de 1970 UTC. Ten en cuenta que esto no devuelve la hora actual, sino la hora en la que se evaluará la expresión.",
- "documentation-timestamp": "Devuelve la marca de tiempo de cada una de las muestras del vector dado como el número de segundos desde el 1 de enero de 1970 UTC.",
- "documentation-vector": "Devuelve el escalar «s» como un vector sin etiquetas.",
- "documentation-year": "Devuelve el año para cada una de las horas indicadas en UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "calcula el arcocoseno de todos los elementos en {{argument}}",
- "documentation-acosh": "calcula el coseno hiperbólico inverso de todos los elementos en {{argument}}",
- "documentation-asin": "calcula el arcoseno de todos los elementos en {{argument}}",
- "documentation-asinh": "calcula el seno hiperbólico inverso de todos los elementos en {{argument}}",
- "documentation-atan": "calcula el arcotangente de todos los elementos en {{argument}}",
- "documentation-atanh": "calcula la tangente hiperbólica inversa de todos los elementos en {{argument}}",
- "documentation-cos": "calcula el coseno de todos los elementos en {{argument}}",
- "documentation-cosh": "calcula el coseno hiperbólico de todos los elementos en {{argument}}",
- "documentation-sin": "calcula el seno de todos los elementos en {{argument}}",
- "documentation-sinh": "calcula el seno hiperbólico de todos los elementos en {{argument}}",
- "documentation-tan": "calcula la tangente de todos los elementos en {{argument}}",
- "documentation-tanh": "calcula la tangente hiperbólica de todos los elementos en {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Enviar comentarios",
- "title-give-feedback": "El explorador de métricas es nuevo. Háganos saber cómo podemos mejorarlo"
- },
- "get-collapsed-info": {
- "exemplars": "Ejemplos: {{value}}",
- "format": "Formato: {{value}}",
- "legend": "Leyenda: {{value}}",
- "step": "Paso: {{value}}",
- "type": "Tipo: {{value}}"
- },
- "get-placeholders": {
- "browse": "Buscar métricas por nombre",
- "type": "Filtrar por tipo"
- },
- "get-prom-types": {
- "description-counter": "Una métrica acumulativa que representa un solo contador que aumenta de forma monótona cuyo valor solo puede aumentar o restablecerse a cero al reiniciar.",
- "description-gauge": "Una métrica que representa un solo valor numérico que puede subir y bajar arbitrariamente.",
- "description-histogram": "Un histograma toma muestras de observaciones (normalmente cosas como la duración de las solicitudes o el tamaño de las respuestas) y las cuenta en cubos configurables.",
- "description-native-histogram": "Los histogramas nativos se diferencian de los histogramas clásicos de Prometheus en varios aspectos: los límites de los cubos de los histogramas nativos se calculan mediante una fórmula que depende de la escala (resolución) del histograma nativo y no los define el usuario.",
- "description-no-type": "Estas métricas no tienen un tipo definido en los metadatos.",
- "description-summary": "Resume las observaciones de las muestras (normalmente aspectos como la duración de las solicitudes y el tamaño de las respuestas) y puede calcular cuantiles configurables en una ventana de tiempo deslizante.",
- "description-unknown": "A estas métricas se les ha dado el tipo «desconocido» en los metadatos.",
- "label-counter": "Contador",
- "label-gauge": "Medidor",
- "label-histogram": "Histograma",
- "label-native-histogram": "Histograma nativo",
- "label-no-type": "Ningún tipo",
- "label-summary": "Resumen",
- "label-unknown": "Desconocido"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "El análisis de la consulta es ambiguo."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Eliminar {{name}}",
- "placeholder-select-label": "Seleccionar etiqueta",
- "placeholder-select-value": "Seleccionar valor"
- },
- "label-filters": {
- "label-filters": "Filtros de etiquetas",
- "label-label-filters": "Filtros de etiquetas",
- "tooltip-label-filters": "Opcional: se utiliza para filtrar la selección de métricas para este tipo de consulta."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Cargando etiquetas",
- "noOptionsMessage-no-labels-found": "No se ha encontrado ninguna etiqueta"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Abrir el explorador de métricas",
- "placeholder-select-metric": "Seleccionar métrica",
- "tooltip-open-metrics-explorer": "Abrir el explorador de métricas"
- },
- "label-metric": "Métrica",
- "tooltip-metric": "Opcional: devuelve una lista de valores de etiqueta para el nombre de etiqueta en la métrica especificada."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Examinar métricas",
- "currently-selected": "Seleccionada actualmente: {{selected}}",
- "metrics-pre-filtered": "Estas métricas se han filtrado previamente por las etiquetas elegidas en los filtros de etiquetas.",
- "title-metrics-explorer": "Explorador de métricas"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorando",
- "on": "Activada"
- },
- "operator": "Operador",
- "tooltip-remove-match": "Eliminar coincidencia",
- "vector-matches": "Coincidencias de vector"
- },
- "operation-editor": {
- "not-found": "Operación {{id}} no encontrada",
- "title-remove": "Eliminar {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Reemplazar con",
- "title-click-to-view-alternative-operations": "Haz clic para ver operaciones alternativas",
- "title-remove-operation": "Eliminar operación"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Haz clic para mostrar la descripción",
- "title-remove-operation": "Eliminar operación"
- },
- "operation-list": {
- "operations": "Operaciones",
- "placeholder-search": "Buscar",
- "title-add-operation": "Añadir operación"
- },
- "operation-param-editor": {
- "title-add": "Añadir {{name}}",
- "title-remove": "Eliminar {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Calcula {{aggregationName}} sobre las dimensiones a la vez que conserva {{labelWord}} {{labels}}.",
- "label-default": "Calcula {{aggregationName}} sobre las dimensiones.",
- "label-without": "Calcula {{aggregationName}} sobre las dimensiones {{labels}}. Todas las demás etiquetas se conservan."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Cambio de ejemplos.",
- "aria-label-format": "Formatear cuadro combinado",
- "aria-label-lower-limit-parameter": "Cuadro de texto de paso mínimo, establecer límite inferior para el parámetro de paso",
- "aria-label-select-resolution": "Seleccionar resolución",
- "aria-label-type": "Grupo de botones de opción de tipo",
- "format-options": {
- "label-heatmap": "Mapa de calor",
- "label-table": "Tabla",
- "label-time-series": "Serie temporal"
- },
- "label-exemplars": "Ejemplos",
- "label-format": "Formato",
- "label-min-step": "Paso mínimo",
- "label-resolution": "Resolución",
- "label-type": "Tipo",
- "placeholder-auto": "auto",
- "title-options": "Opciones",
- "tooltip-min-step": "Un límite inferior adicional para el parámetro de paso de la consulta de Prometheus y para las variables <2>{{interval}}2> y <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Hay un error de sintaxis o la estructura de la consulta no se puede visualizar al cambiar al modo constructor. Es posible que se pierdan partes de la consulta.",
- "confirmText-continue": "Continuar",
- "kick-start-your-query": "Inicie su consulta",
- "label-explain": "Explicación",
- "run-queries": "Ejecutar consultas",
- "title-parsing-error-switch-builder": "Error de análisis: ¿cambiar al modo Creador?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Cuadro combinado de leyenda",
- "label-legend": "Leyenda",
- "placeholder-select-legend-mode": "Seleccionar modo de leyenda",
- "tooltip-legend": "Anulación o plantilla del nombre de la serie. Por ejemplo, {{templateExample}} se reemplazará con el valor de etiqueta para {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "pista: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Constructor",
- "label-code": "Código"
- }
- },
- "query-pattern": {
- "apply-query": "Aplicar consulta",
- "aria-label-apply-query-starter-button": "botón de inicio de aplicación de consulta",
- "aria-label-back-button": "botón para volver",
- "aria-label-create-new-query-button": "botón para crear una nueva consulta",
- "aria-label-raw-query": "Consulta sin procesar {{patternName}}",
- "aria-label-use-this-query-button": "utilizar este botón de consulta",
- "back": "Atrás",
- "create-new-query": "Crear una nueva consulta",
- "use-this-query": "Utilizar esta consulta"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "cerrar iniciar tu modo de consulta",
- "aria-label-kick-start-your-query-modal": "Inicie su modal de consulta",
- "aria-label-toggle-query-starter": "abrir y cerrar tarjeta de iniciador de consultas {{patternType}}",
- "close": "Cerrar",
- "description-kick-start-your-query": "Inicia tu consulta seleccionando una de estas consultas. A continuación, puedes continuar para completar tu consulta.",
- "label-toggle-query-starter": "iniciadores de consultas {{patternType}}",
- "title-kick-start-your-query": "Inicie su consulta"
- },
- "raw-query": {
- "aria-label-selector": "selector"
- },
- "results-table": {
- "content-descriptive-type": "Al crear un {{descriptiveType}}, Prometheus expone varias series con el contador de tipos. ",
- "description": "Descripción",
- "message-expand-label-filters": "No se han encontrado métricas. Intenta ampliar los filtros de etiquetas.",
- "message-expand-search": "No se han encontrado métricas. Intenta ampliar la búsqueda y los filtros.",
- "message-no-metrics-found": "No se han encontrado métricas en la fuente de datos.",
- "name": "Nombre",
- "type": "Tipo"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/fr-FR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/fr-FR/grafana-prometheus.json
deleted file mode 100644
index b4c67e9fb8f..00000000000
--- a/packages/grafana-prometheus/src/locales/fr-FR/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Erreur de chargement des données d’annotation !",
- "aria-label-lower-limit-parameter": "Définir la limite inférieure pour le paramètre d’étape",
- "label-min-step": "Étape minimum",
- "label-series-value-as-timestamp": "Valeur de la série en tant qu’horodatage",
- "label-tags": "Balises",
- "label-text": "Texte",
- "label-title": "Titre",
- "placeholder-auto": "auto",
- "tooltip-either-pattern-example-instance-replaced-label": "Utilisez le nom ou un modèle. Par exemple, {{labelTemplate}} est remplacé par la valeur de l’étiquette pour l’étiquette {{labelName}}.",
- "tooltip-min-step": "Une limite inférieure supplémentaire pour le paramètre d’étape de la requête Prometheus et pour les variables <2>{{intervalVar}}2> et <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "L’unité de l’horodatage est la milliseconde. Si l’unité de la valeur de la série est en secondes, multipliez son vecteur de plage par 1 000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Exécuter une requête instantanée et une requête de plage"
- },
- "label": {
- "both": "Les deux"
- },
- "range-options": {
- "description": {
- "query-range": "Exécuter la requête sur une plage de temps"
- },
- "label": {
- "instant": "Instantané",
- "range": "Plage"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filtrer l’expression pour l’étiquette",
- "description-select-labels": "Une fois les valeurs d’étiquette sélectionnées, seules les combinaisons d’étiquettes possibles sont affichées.",
- "select-labels-to-search-in": "2. Sélectionner les étiquettes à rechercher"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filtrer l’expression pour la métrique",
- "aria-label-limit-results-from-series-endpoint": "Limiter les résultats du point de terminaison de la série",
- "description-series-limit": "La limite s’applique à toutes les métriques, étiquettes et valeurs. Laissez le champ vide pour utiliser la limite par défaut. Définissez la valeur sur 0 pour désactiver la limite et tout récupérer. Cela peut entraîner des problèmes de performances.",
- "label-select-metric": "Une fois qu’une métrique est sélectionnée, seules les étiquettes possibles sont affichées. Les étiquettes sont limitées par la limite de séries ci-dessous.",
- "select-a-metric": "1. Sélectionner une métrique",
- "series-limit": "Limite de séries"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Aide-mémoire PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Exemples",
- "tooltip-disable-query": "Désactiver la requête avec des exemples",
- "tooltip-enable-query": "Activer la requête avec des exemples"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Champ supplémentaire Prometheus",
- "aria-label-query-type-field": "Champ de type de requête",
- "aria-label-step-field": "Champ d’étape",
- "min-step": "Étape minimum",
- "query-type": "Type de requête",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Les unités de temps et les variables intégrées peuvent être utilisées ici, par exemple : {{example1}}, {{example2}}, {{example3}} {{example4}}, {{example5}}, {{example6}}, {{example7}} (par défaut si aucune unité n’est spécifiée : {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Saisissez une requête PromQL…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Requête classique",
- "aria-label-metric-regex": "Expression régulière de métrique",
- "aria-label-metric-selector": "Sélecteur de métrique",
- "aria-label-prometheus-query": "Requête Prometheus",
- "aria-label-query-type": "Type de requête",
- "aria-label-series-query": "Requête de séries",
- "label-classic-query": "Requête classique",
- "label-label": "Étiquette",
- "label-metric-regex": "Expression régulière de métrique",
- "label-query": "Requête",
- "label-query-type": "Type de requête",
- "label-series-query": "Requête de séries",
- "placeholder-classic-query": "Requête classique",
- "placeholder-metric-regex": "Expression régulière de métrique",
- "placeholder-prometheus-query": "Requête Prometheus",
- "placeholder-select-query-type": "Sélectionner un type de requête",
- "placeholder-series-query": "Requête de séries",
- "returns-metrics-matching-specified-metric-regex": "Renvoie une liste de métriques correspondant à l’expression régulière de métrique spécifiée.",
- "tooltip-classic-query": "L’implémentation d’origine de l’éditeur de requêtes à variables Prometheus. Saisissez une chaîne de caractères avec le type de requête et les paramètres appropriés comme décrit dans la documentation. Par exemple, {{exampleQuery}}.",
- "tooltip-label": "Renvoie une liste de valeurs d’étiquette pour le nom d’étiquette dans toutes les métriques, sauf si la métrique est spécifiée.",
- "tooltip-metric-regex": "Renvoie une liste de noms d’étiquettes, en filtrant éventuellement par expression régulière de métrique spécifiée.",
- "tooltip-query": "Renvoie une liste de résultats de requête Prometheus pour la requête. Cela peut inclure des fonctions Prometheus, par exemple {{exampleQuery}}.",
- "tooltip-query-type": "Le plugin de source de données Prometheus fournit les types de requêtes suivants pour les variables de modèle.",
- "tooltip-series-query": "Saisissez une métrique avec des étiquettes, uniquement une métrique ou uniquement des étiquettes, c’est-à-dire {{example1}}, {{example2}} ou {{example3}}. Renvoie une liste de séries chronologiques associées aux données saisies."
- },
- "selector-actions": {
- "aria-label-selector": "sélecteur",
- "aria-label-selector-clear-button": "Bouton Effacer le sélecteur",
- "aria-label-use-selector-as-metrics-button": "Bouton Utiliser le sélecteur comme métrique",
- "aria-label-use-selector-for-query-button": "Bouton Utiliser le sélecteur pour la requête",
- "aria-label-validate-submit-button": "Bouton Valider l’envoi",
- "clear": "Effacer",
- "resulting-selector": "4. Sélecteur du résultat",
- "use-as-rate-query": "Utiliser comme requête de taux",
- "use-query": "Utiliser la requête",
- "validate-selector": "Valider le sélecteur"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filtrer l’expression pour les valeurs de l’étiquette",
- "aria-label-values-for": "Valeurs pour {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Utilisez le champ de recherche pour trouver des valeurs parmi les étiquettes sélectionnées.",
- "select-multiple-values-for-your-labels": "3. Sélectionner (plusieurs) valeurs pour vos étiquettes"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Autoriser comme cible des règles d’enregistrement",
- "label-manage-alerts-via-alerting-ui": "Gérer les alertes via l’interface utilisateur d’alerte",
- "title-alerting": "Alerte",
- "tooltip-allow-as-recording-rules-target": "Permettez à cette source de données d’être sélectionnée comme cible pour l’écriture des règles d’enregistrement.",
- "tooltip-manage-alerts-via-alerting-ui": "Gérez les règles d'alerte pour cette source de données. Pour gérer d'autres ressources d'alerte, ajoutez une source de données Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "Le mode d’accès via le navigateur à la source de données Prometheus n’est plus disponible. Passez en mode d’accès au serveur.",
- "description-advanced-settings": "Les paramètres supplémentaires sont des options facultatives que vous pouvez configurer pour un meilleur contrôle de votre source de données.",
- "title-advanced-settings": "Paramètres avancés",
- "title-error": "Erreur"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Votre méthode d'accès est <1>Navigateur1> ; cela signifie que l'URL doit être accessible à partir du navigateur.",
- "tooltip-http-url": "Spécifiez une URL HTTP complète (par exemple : {{exampleURL}})",
- "tooltip-server-access-mode": "Votre méthode d'accès est <1>Serveur1> ; cela signifie que l'URL doit être accessible à partir du serveur/back-end Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Consultez les documents pour en savoir plus ici."
- },
- "exemplar-setting": {
- "label-data-source": "Source de données",
- "label-internal-link": "Lien interne",
- "label-label-name": "Nom de l’étiquette",
- "label-remove-exemplar-link": "Supprimer le lien d’exemple",
- "label-url": "URL",
- "label-url-label": "Étiquette pour l’URL",
- "placeholder-go-to-examplecom": "Accéder à example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Supprimer le lien d’exemple",
- "tooltip-data-source": "La source de données vers laquelle l’exemple va naviguer.",
- "tooltip-internal-link": "Activez cette option si vous avez un lien interne. Lorsque cette option est activée, le sélecteur de source de données est affiché. Sélectionnez le magasin de données de traçage backend pour vos données d’exemple.",
- "tooltip-label-name": "Le nom du champ dans l’objet étiquette qui doit être utilisé pour obtenir le traceID.",
- "tooltip-url": "L’URL du backend de trace que l’utilisateur consulterait pour voir sa trace",
- "tooltip-url-label": "À utiliser pour remplacer l’étiquette du bouton sur le champ traceID d’exemple."
- },
- "exemplars-settings": {
- "add": "Ajouter",
- "no-exemplars-configurations": "Aucune configuration d’exemples",
- "title-exemplars": "Exemples"
- },
- "prom-settings": {
- "aria-label-default-editor": "Éditeur par défaut (Code ou Créateur)",
- "aria-label-prom-type-type": "Type {{promType}}",
- "aria-label-prometheus-type": "Type Prometheus",
- "aria-label-select-http-method": "Sélectionner la méthode HTTP",
- "editor-options": {
- "label-builder": "Builder",
- "label-code": "Code"
- },
- "label-cache-level": "Niveau du cache",
- "label-custom-query-parameters": "Paramètres de requête personnalisés",
- "label-default-editor": "Éditeur par défaut",
- "label-disable-metrics-lookup": "Désactiver la recherche de métriques",
- "label-disable-recording-rules-beta": "Désactiver les règles d’enregistrement (bêta)",
- "label-http-method": "Méthode HTTP",
- "label-incremental-querying-beta": "Requête incrémentale (bêta)",
- "label-prom-type-version": "Version {{promType}}",
- "label-prometheus-type": "Type Prometheus",
- "label-query-overlap-window": "Fenêtre de chevauchement de requête",
- "label-query-timeout": "Délai d’expiration de la requête",
- "label-scrape-interval": "Intervalle de scraping",
- "label-series-limit": "Limite de séries",
- "label-use-series-endpoint": "Utiliser le point de terminaison de la série",
- "more-info": "Pour en savoir plus sur la configuration du type et de la version de Prometheus dans les sources de données, consultez la <2>documentation sur le provisionnement2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Exemple : {{example}}",
- "title-interval-behaviour": "Comportement de l’intervalle",
- "title-other": "Autre",
- "title-performance": "Performance",
- "title-query-editor": "Éditeur de requêtes",
- "tooltip-cache-level": "Définit le niveau de mise en cache du navigateur pour les requêtes de l’éditeur. Des paramètres de cache plus élevés sont recommandés pour les sources de données à cardinalité élevée.",
- "tooltip-custom-query-parameters": "Ajoutez des paramètres personnalisés à l’URL de la requête Prometheus. Par exemple {{example1}}, {{example2}}, {{example3}}, ou {{example4}}. Plusieurs paramètres doivent être concaténés avec {{concatenationChar}}.",
- "tooltip-default-editor": "Définir l’option d’éditeur par défaut pour tous les utilisateurs de cette source de données.",
- "tooltip-disable-metrics-lookup": "Cocher cette option désactivera le sélecteur de métriques et la prise en charge des métriques/étiquettes dans la saisie semi-automatique du champ de requête. Cela vous aide si vous avez des problèmes de performances avec des instances Prometheus plus grandes. ",
- "tooltip-disable-recording-rules-beta": "Cette fonctionnalité désactivera les règles d’enregistrement. Activez cette option pour améliorer les performances du tableau de bord",
- "tooltip-http-method": "Vous pouvez utiliser la méthode POST ou GET HTTP pour interroger votre source de données Prometheus. POST est la méthode recommandée car elle permet des requêtes plus volumineuses. Changez ceci en GET si vous avez une version Prometheus antérieure à la version 2.1 ou si les demandes POST sont restreintes dans votre réseau.",
- "tooltip-incremental-querying-beta": "Cette fonctionnalité modifiera le comportement par défaut des requêtes relatives pour toujours demander des données récentes à l’instance Prometheus. Au lieu de cela, les résultats des requêtes seront mis en cache et seuls les nouveaux enregistrements seront demandés. Activez cette option pour réduire la charge de la base de données et du réseau.",
- "tooltip-prom-type-version": "Utilisez cette option pour définir la version de votre instance {{promType}} si elle n’est pas configurée automatiquement.",
- "tooltip-prometheus-type": "Définissez-la sur le type de votre base de données Prometheus, par exemple Prometheus, Cortex, Mimir ou Thanos. La modification de ce champ enregistrera vos paramètres actuels. Certains types de Prometheus prennent en charge ou non diverses API. Par exemple, certains types prennent en charge la correspondance d’expressions régulières pour les requêtes d’étiquettes afin d’améliorer les performances. Certains types ont une API pour les métadonnées. Si vous définissez cette option de manière incorrecte, vous risquez d’observer un comportement inhabituel lors de la requête de métriques et d’étiquettes. Veuillez consulter votre documentation Prometheus pour vous assurer que vous saisissez le bon type.",
- "tooltip-query-overlap-window": "Définissez une durée comme {{example1}} ou {{example2}} ou {{example3}}. Par défaut : {{default}}. Cette durée sera ajoutée à la durée de chaque demande incrémentielle.",
- "tooltip-query-timeout": "Définissez le délai d’expiration de la requête Prometheus.",
- "tooltip-scrape-interval": "Cet intervalle correspond à la fréquence à laquelle Prometheus récupère les cibles. Définissez-la sur l’intervalle de scraping et d’évaluation typique configuré dans votre fichier de configuration Prometheus. Si vous définissez cette valeur sur une valeur supérieure à l’intervalle de votre fichier de configuration Prometheus, Grafana évaluera les données en fonction de cet intervalle et vous verrez moins de points de données. La valeur par défaut est {{default}}.",
- "tooltip-series-limit": "La limite s’applique à toutes les ressources (métriques, étiquettes et valeurs) pour les deux points de terminaison (séries et étiquettes). Laissez le champ vide pour utiliser la limite par défaut (40 000). Définissez la valeur sur 0 pour désactiver la limite et tout récupérer. Cela peut nuire aux performances. La limite par défaut est de 40 000.",
- "tooltip-use-series-endpoint": "Cocher cette option favorisera le point de terminaison de la série avec le paramètre {{exampleParameter}} par rapport au point de terminaison des valeurs d’étiquette avec le paramètre {{exampleParameter}}. Bien que le point de terminaison des valeurs d’étiquette soit considéré comme plus performant, certains utilisateurs peuvent préférer la série, car elle dispose d’une méthode POST tandis que le point de terminaison des valeurs d’étiquette ne dispose que d’une méthode GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Désactivé)",
- "enabled-label": "Navigateur de métriques"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Inclut uniquement les étiquettes uniques",
- "description-custom": "Fournir un modèle de nommage",
- "description-verbose": "Tous les noms et valeurs d’étiquettes",
- "label-auto": "Auto",
- "label-custom": "Personnalisée",
- "label-verbose": "Verbeux"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Calculer la moyenne par dimension",
- "documentation-bottomk": "Les plus petits éléments k selon la valeur de l’échantillon",
- "documentation-count": "Compter le nombre d’éléments dans le vecteur",
- "documentation-count-values": "Compter le nombre d’éléments avec la même valeur",
- "documentation-group": "Toutes les valeurs du vecteur résultant sont égales à 1",
- "documentation-max": "Sélectionner la valeur maximale par dimension",
- "documentation-min": "Sélectionner la valeur minimale par dimension",
- "documentation-quantile": "Calculer le quantile φ (0 ≤ φ ≤ 1) par dimension",
- "documentation-stddev": "Calculer l’écart-type de la population par dimension",
- "documentation-stdvar": "Calculer la variance-type de la population par dimension",
- "documentation-sum": "Calculer la somme par dimension",
- "documentation-topk": "Les plus grands éléments k selon la valeur de l’échantillon"
- },
- "getFunctions": {
- "documentation-abs": "Renvoie le vecteur d’entrée avec toutes les valeurs converties en valeurs absolues.",
- "documentation-absent": "Renvoie un vecteur vide si le vecteur passé en paramètre contient des éléments et un vecteur à un élément contenant la valeur 1 s’il est vide. Utile pour déclencher des alertes lorsqu’aucune série chronologique n’existe pour une combinaison donnée de nom de métrique et d’étiquette.",
- "documentation-absent-over-time": "Renvoie un vecteur vide si le vecteur de plage passé en paramètre contient des éléments et un vecteur à un élément contenant la valeur 1 s’il est vide.",
- "documentation-avg-over-time": "La valeur moyenne de tous les points dans l’intervalle spécifié.",
- "documentation-ceil": "Arrondit à l’entier supérieur les valeurs d’échantillon de tous les éléments dans « v ».",
- "documentation-changes": "Pour chaque série chronologique d’entrée, « changes(v range-vector) » renvoie le nombre de fois où sa valeur a changé dans la période spécifiée, sous forme de vecteur instantané.",
- "documentation-clamp": "Saturation des valeurs d’échantillon des éléments de « v » : applique une borne inférieure « min. » et une borne supérieure « max. ».",
- "documentation-clamp-max": "Saturation des valeurs d’échantillon des éléments de « v » : applique une borne supérieure « max. ».",
- "documentation-clamp-min": "Saturation des valeurs d’échantillon des éléments de « v » : applique une borne inférieure « min. ».",
- "documentation-count-over-time": "Le nombre total de valeurs dans l’intervalle spécifié.",
- "documentation-count-scalar": "Renvoie le nombre d’éléments dans un vecteur de séries chronologiques sous forme scalaire. Contrairement à l’opérateur d’agrégation « count() », qui renvoie toujours un vecteur (même vide) et permet un regroupement via « by ».",
- "documentation-day-of-month": "Renvoie le jour du mois pour chaque horodatage fourni (en UTC). Les valeurs renvoyées vont de 1 à 31.",
- "documentation-day-of-week": "Renvoie le jour de la semaine pour chaque horodatage fourni (en UTC). Les valeurs renvoyées vont de 0 (dimanche) à 6 (samedi).",
- "documentation-day-of-year": "Renvoie le jour de l’année pour chaque horodatage fourni (en UTC). Les valeurs renvoyées vont de 1 à 365 pour les années non bissextiles et de 1 à 366 pour les années bissextiles.",
- "documentation-days-in-month": "Renvoie le nombre de jours dans le mois pour chaque horodatage fourni (en UTC). Les valeurs renvoyées vont de 28 à 31.",
- "documentation-deg": "Convertit des radians en degrés pour tous les éléments dans v",
- "documentation-delta": "Calcule la différence entre la première et la dernière valeur de chaque élément d’une série chronologique dans un vecteur de plage « v » et renvoie un vecteur instantané avec les écarts et les étiquettes correspondantes. L’écart est extrapolé sur toute la plage de temps, ce qui peut produire des résultats non entiers même avec des valeurs d’échantillon entières.",
- "documentation-deriv": "Calcule la dérivée par seconde d’une série chronologique dans un vecteur de plage « v », à l’aide d’une régression linéaire simple.",
- "documentation-double-exponential-smoothing": "Produit une valeur lissée pour une série chronologique à partir de la plage « v ». Plus le facteur de lissage « sf » est bas, plus l’importance est donnée aux anciennes données. Plus le facteur de tendance « tf » est élevé, plus les tendances sont prises en compte. Les valeurs de « sf » et de « tf » doivent être comprises entre 0 et 1.",
- "documentation-drop-common-labels": "Supprime toutes les étiquettes dont les noms et les valeurs sont identiques dans toutes les séries du vecteur d’entrée.",
- "documentation-exp": "Calcule la fonction exponentielle de tous les éléments de « v ».\nCas particuliers :\n* « Exp(+Inf) = +Inf » \n* « Exp(NaN) = NaN »",
- "documentation-floor": "Arrondit à l’entier inférieur les valeurs d’échantillon de tous les éléments dans « v ».",
- "documentation-histogram-avg": "Renvoie la moyenne arithmétique des valeurs observées dans un histogramme natif. Les échantillons non natifs sont ignorés et exclus du vecteur retourné.",
- "documentation-histogram-count": "Renvoie le nombre d’observations enregistrées dans un histogramme natif.",
- "documentation-histogram-fraction": "Renvoie la fraction estimée des observations comprises entre les valeurs inférieure et supérieure fournies.",
- "documentation-histogram-quantile": "Calcule le quantile φ (0 ≤ φ ≤ 1) à partir des buckets « b » d’un histogramme. Les échantillons dans « b » correspondent aux comptes d’observations dans chaque bucket. Chaque échantillon doit comporter une étiquette « le » dont la valeur indique la borne supérieure (incluse) du bucket. (Les échantillons ne comportant pas cette étiquette sont ignorés sans avertissement.) Le type de métrique histogramme fournit automatiquement des séries chronologiques avec le suffixe « _bucket » et les étiquettes appropriées.",
- "documentation-histogram-stddev": "Renvoie l’écart-type estimé des observations dans un histogramme natif, calculé à partir de la moyenne géométrique des buckets dans lesquels se trouvent les observations.",
- "documentation-histogram-stdvar": "Renvoie la variance-type estimée des observations dans un histogramme natif.",
- "documentation-histogram-sum": "Renvoie la somme des observations enregistrées dans un histogramme natif.",
- "documentation-holt-winters": "Renommée en double_exponential_smoothing dans Prometheus v3.x. Pour les versions de Prometheus égales ou supérieures à la v3.0, merci d’utiliser double_exponential_smoothing. \n\nGénère une valeur lissée pour une série chronologique en fonction de l’intervalle défini dans « v ». Plus le facteur de lissage « sf » est faible, plus l’importance est donnée aux données anciennes. Plus le facteur de tendance « tf » est élevé, plus les tendances des données sont prises en compte. Les valeurs de « sf » et de « tf » doivent être comprises entre 0 et 1.",
- "documentation-hour": "Renvoie l’heure de la journée pour chaque horodatage fourni (en UTC). Les valeurs renvoyées vont de 0 à 23.",
- "documentation-idelta": "Calcule la différence entre les deux derniers échantillons dans le vecteur de plage « v » et renvoie un vecteur instantané contenant les deltas et les étiquettes correspondantes.",
- "documentation-increase": "Calcule l’augmentation d’une série chronologique sur une période donnée. Les ruptures de monotonie (comme les remises à zéro du compteur liées à un redémarrage de la cible) sont automatiquement corrigées. L’augmentation est extrapolée sur l’ensemble de l’intervalle de temps spécifié dans le sélecteur de plage, ce qui permet d’obtenir un résultat non entier, même si le compteur n’augmente que par valeurs entières.",
- "documentation-info": "Renvoie les dernières métadonnées disponibles sur un groupe de métriques, comme leurs étiquettes et valeurs actuelles, sans effectuer de calcul",
- "documentation-irate": "Calcule le taux instantané d’augmentation par seconde d’une série chronologique sur l’intervalle donné. Ce calcul repose sur les deux derniers points de données. Les ruptures de monotonie (comme les remises à zéro du compteur dues à un redémarrage de la cible) sont automatiquement corrigées.",
- "documentation-label-join": "Pour chaque série chronologique dans « v », concatène toutes les valeurs des étiquettes « src_labels » en utilisant un « séparateur », puis renvoie la série avec une nouvelle étiquette « dst_label » contenant cette valeur concaténée. Cette fonction peut prendre un nombre quelconque de « src_labels ».",
- "documentation-label-replace": "Pour chaque série chronologique dans « v », la fonction « label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string) » applique l’expression régulière « regex » à l’étiquette « src_label ». Si elle correspond, la série est renvoyée avec l’étiquette « dst_label » remplacée selon la chaîne « replacement ». « $1 » est remplacé par le premier groupe capturé, « $2 » par le second, etc. Si l’expression régulière ne correspond pas, la série est renvoyée inchangée.",
- "documentation-last-over-time": "La valeur de point la plus récente dans l’intervalle spécifié.",
- "documentation-ln": "Calcule le logarithme népérien pour tous les éléments de « v ».\nCas particuliers :\n * « ln(+Inf) = +Inf »\n * « ln(0) = -Inf »\n * « ln(x < 0) = NaN »\n * « ln(NaN) = NaN »",
- "documentation-log10": "Calcule le logarithme décimal pour tous les éléments de « v ». Les cas particuliers sont identiques à ceux de « ln ».",
- "documentation-log2": "Calcule le logarithme binaire pour tous les éléments de « v ». Les cas particuliers sont identiques à ceux de « ln ».",
- "documentation-max-over-time": "La valeur maximale de tous les points sur l’intervalle spécifié.",
- "documentation-min-over-time": "La valeur minimale de tous les points sur l’intervalle spécifié.",
- "documentation-minute": "Renvoie la minute de l’heure pour chaque horodatage fourni (en UTC). Les valeurs renvoyées vont de 0 à 59.",
- "documentation-month": "Renvoie le mois de l’année pour chaque horodatage fourni (en UTC). Les valeurs renvoyées vont de 1 à 12 (1 correspondant à janvier, etc.).",
- "documentation-pi": "Renvoie la valeur de pi",
- "documentation-predict-linear": "Prédit la valeur de la série chronologique à « t » secondes dans le futur, en se basant sur le vecteur d’intervalle « v », à l’aide d’une régression linéaire simple.",
- "documentation-present-over-time": "La valeur 1 pour toute série dans l’intervalle spécifié.",
- "documentation-quantile-over-time": "Le quantile φ (0 ≤ φ ≤ 1) des valeurs dans l’intervalle spécifié.",
- "documentation-rad": "Convertit les degrés en radians pour tous les éléments de v",
- "documentation-rate": "Calcule le taux moyen d’augmentation par seconde de la série chronologique dans le vecteur d’intervalle. Les ruptures de monotonie (telles que les remises à zéro du compteur dues à un redémarrage de la cible) sont automatiquement corrigées. Le calcul est également extrapolé aux extrémités de l’intervalle de temps, afin de compenser d’éventuelles collectes manquées ou un mauvais alignement des cycles de collecte avec la période analysée.",
- "documentation-resets": "Pour chaque série chronologique d’entrée, « resets(v range-vector) » renvoie le nombre de remises à zéro du compteur sur la période donnée, sous forme de vecteur instantané. Toute diminution de la valeur entre deux échantillons consécutifs est interprétée comme une remise à zéro du compteur.",
- "documentation-round": "Arrondit les valeurs d’échantillon de tous les éléments de « v » à l’entier le plus proche. En cas d’égalité, l’arrondi est effectué vers le haut. L’argument optionnel « to_nearest » permet de spécifier le multiple auquel les valeurs doivent être arrondies. Ce multiple peut être fractionnaire.",
- "documentation-scalar": "À partir d’un vecteur contenant un seul élément, « scalar(v instant-vector) » renvoie la valeur de cet échantillon sous forme de scalaire. Si le vecteur d’entrée ne contient pas exactement un élément, « scalar » renvoie « NaN ».",
- "documentation-sgn": "Renvoie un vecteur avec toutes les valeurs converties en leur signe : 1 si la valeur est positive, -1 si elle est négative et 0 si elle est nulle.",
- "documentation-sort": "Renvoie les éléments du vecteur triés par valeur d’échantillon, par ordre croissant.",
- "documentation-sort-desc": "Renvoie les éléments du vecteur triés par valeur d’échantillon, par ordre décroissant.",
- "documentation-sqrt": "Calcule la racine carrée de tous les éléments de « v ».",
- "documentation-stddev-over-time": "L’écart-type de la population des valeurs dans l’intervalle spécifié.",
- "documentation-stdvar-over-time": "La variance-type de la population des valeurs dans l’intervalle spécifié.",
- "documentation-sum-over-time": "La somme de toutes les valeurs dans l’intervalle spécifié.",
- "documentation-time": "Renvoie le nombre de secondes écoulées depuis le 1er janvier 1970 (UTC). À noter : cette valeur ne correspond pas à l’heure actuelle, mais à l’instant auquel l’expression est évaluée.",
- "documentation-timestamp": "Renvoie l’horodatage de chaque échantillon du vecteur fourni, sous forme de nombre de secondes depuis le 1er janvier 1970 (UTC).",
- "documentation-vector": "Renvoie le scalaire « s » sous forme de vecteur sans étiquette.",
- "documentation-year": "Renvoie l’année correspondant à chaque horodatage fourni (en UTC)."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "calcule l’arc cosinus de tous les éléments dans {{argument}}",
- "documentation-acosh": "calcule le cosinus hyperbolique inverse de tous les éléments dans {{argument}}",
- "documentation-asin": "calcule l’arc sinus de tous les éléments dans {{argument}}",
- "documentation-asinh": "calcule le sinus hyperbolique inverse de tous les éléments dans {{argument}}",
- "documentation-atan": "calcule l’arc tangente de tous les éléments dans {{argument}}",
- "documentation-atanh": "calcule la tangente hyperbolique inverse de tous les éléments dans {{argument}}",
- "documentation-cos": "calcule le cosinus de tous les éléments dans {{argument}}",
- "documentation-cosh": "calcule le cosinus hyperbolique de tous les éléments dans {{argument}}",
- "documentation-sin": "calcule le sinus de tous les éléments dans {{argument}}",
- "documentation-sinh": "calcule le sinus hyperbolique de tous les éléments dans {{argument}}",
- "documentation-tan": "calcule la tangente de tous les éléments dans {{argument}}",
- "documentation-tanh": "calcule la tangente hyperbolique de tous les éléments dans {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Publiez votre commentaire",
- "title-give-feedback": "L’explorateur de métriques est une nouvelle fonctionnalité ; faites-nous part de vos retours pour l’améliorer"
- },
- "get-collapsed-info": {
- "exemplars": "Exemples : {{value}}",
- "format": "Format : {{value}}",
- "legend": "Légende : {{value}}",
- "step": "Étape : {{value}}",
- "type": "Type : {{value}}"
- },
- "get-placeholders": {
- "browse": "Rechercher des métriques par nom",
- "type": "Filtrer par type"
- },
- "get-prom-types": {
- "description-counter": "Une métrique cumulative qui représente un compteur croissant dont la valeur ne peut qu’augmenter ou être réinitialisée à zéro lors d’un redémarrage.",
- "description-gauge": "Une métrique représentant une valeur numérique unique pouvant fluctuer librement.",
- "description-histogram": "Un histogramme échantillonne des observations (par exemple, durées de requêtes ou tailles de réponse) et les répartit dans des classes configurables.",
- "description-native-histogram": "Les histogrammes natifs diffèrent des histogrammes classiques de Prometheus à plusieurs égards : leurs bornes de classe sont calculées à partir d’une formule dépendant de leur résolution et ne sont pas définies par l’utilisateur.",
- "description-no-type": "Ces métriques n’ont pas de type défini dans les métadonnées.",
- "description-summary": "Un résumé échantillonne des observations (par exemple, durées de requêtes ou tailles de réponse) et permet de calculer des quantiles configurables sur une fenêtre temporelle glissante.",
- "description-unknown": "Ces métriques sont marquées comme inconnues dans les métadonnées.",
- "label-counter": "Compteur",
- "label-gauge": "Jauge",
- "label-histogram": "Histogramme",
- "label-native-histogram": "Histogramme natif",
- "label-no-type": "Aucun type",
- "label-summary": "Résumé",
- "label-unknown": "Inconnu"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "L’analyse de la requête est ambiguë."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Supprimer {{name}}",
- "placeholder-select-label": "Sélectionner une étiquette",
- "placeholder-select-value": "Sélectionner une valeur"
- },
- "label-filters": {
- "label-filters": "Filtres d’étiquettes",
- "label-label-filters": "Filtres d’étiquettes",
- "tooltip-label-filters": "Facultatif : utilisé pour filtrer la sélection de métrique pour ce type de requête."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Chargement des étiquettes",
- "noOptionsMessage-no-labels-found": "Aucune étiquette trouvée"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Ouvrir l’explorateur de métriques",
- "placeholder-select-metric": "Sélectionner la métrique",
- "tooltip-open-metrics-explorer": "Ouvrir l’explorateur de métriques"
- },
- "label-metric": "Métrique",
- "tooltip-metric": "Facultatif : renvoie une liste de valeurs d’étiquette pour le nom d’étiquette dans la métrique spécifiée."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Parcourir les métriques",
- "currently-selected": "Sélection actuelle : {{selected}}",
- "metrics-pre-filtered": "Ces métriques ont été pré-filtrées par les étiquettes choisies dans les filtres d’étiquettes.",
- "title-metrics-explorer": "Explorateur de métriques"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorer",
- "on": "Activée"
- },
- "operator": "Opérateur",
- "tooltip-remove-match": "Supprimer la correspondance",
- "vector-matches": "Correspondances de vecteur"
- },
- "operation-editor": {
- "not-found": "Opération {{id}} introuvable",
- "title-remove": "Supprimer {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Remplacer par",
- "title-click-to-view-alternative-operations": "Cliquer pour afficher les autres opérations",
- "title-remove-operation": "Supprimer l’opération"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Cliquer pour afficher la description",
- "title-remove-operation": "Supprimer l’opération"
- },
- "operation-list": {
- "operations": "Opérations",
- "placeholder-search": "Rechercher",
- "title-add-operation": "Ajouter une opération"
- },
- "operation-param-editor": {
- "title-add": "Ajouter {{name}}",
- "title-remove": "Supprimer {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Calcule {{aggregationName}} sur les dimensions tout en conservant {{labelWord}} {{labels}}.",
- "label-default": "Calcule {{aggregationName}} sur les dimensions.",
- "label-without": "Calcule {{aggregationName}} sur les dimensions {{labels}}. Toutes les autres étiquettes sont conservées."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Commutateur d’exemples.",
- "aria-label-format": "Liste déroulante de format",
- "aria-label-lower-limit-parameter": "Champ de texte de pas minimal ; définit la limite inférieure du paramètre de pas",
- "aria-label-select-resolution": "Sélectionner une résolution",
- "aria-label-type": "Groupe de boutons radio de type",
- "format-options": {
- "label-heatmap": "Carte thermique",
- "label-table": "Tableau",
- "label-time-series": "Série chronologique"
- },
- "label-exemplars": "Exemples",
- "label-format": "Format",
- "label-min-step": "Étape minimum",
- "label-resolution": "Résolution",
- "label-type": "Type",
- "placeholder-auto": "auto",
- "title-options": "Options",
- "tooltip-min-step": "Une limite inférieure supplémentaire pour le paramètre d’étape de la requête Prometheus et pour les variables <2>{{interval}}2> et <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Une erreur de syntaxe ou une structure de requête invalide empêche l’affichage en mode Builder. Certaines parties de la requête peuvent être perdues.",
- "confirmText-continue": "Continuer",
- "kick-start-your-query": "Lancer votre requête",
- "label-explain": "Expliquer",
- "run-queries": "Exécuter les requêtes",
- "title-parsing-error-switch-builder": "Erreur d’analyse : passer en mode Créateur ?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Liste déroulante de légende",
- "label-legend": "Légende",
- "placeholder-select-legend-mode": "Sélectionner le mode légende",
- "tooltip-legend": "Remplacement ou modèle de nom de série. Par exemple, {{templateExample}} sera remplacé par la valeur de l’étiquette pour {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "indice : {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Builder",
- "label-code": "Code"
- }
- },
- "query-pattern": {
- "apply-query": "Appliquer la requête",
- "aria-label-apply-query-starter-button": "bouton appliquer le démarrage de la requête",
- "aria-label-back-button": "bouton retour",
- "aria-label-create-new-query-button": "bouton créer une requête",
- "aria-label-raw-query": "Requête brute {{patternName}}",
- "aria-label-use-this-query-button": "bouton utiliser cette requête",
- "back": "Précédent",
- "create-new-query": "Créer une requête",
- "use-this-query": "Utiliser cette requête"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "fermer la fenêtre modale lancer votre requête",
- "aria-label-kick-start-your-query-modal": "Lancer votre requête modale",
- "aria-label-toggle-query-starter": "ouvrir et fermer la carte de démarrage de la requête {{patternType}}",
- "close": "Fermer",
- "description-kick-start-your-query": "Lancez votre requête en sélectionnant l’une de ces requêtes. Vous pouvez ensuite continuer à compléter votre requête.",
- "label-toggle-query-starter": "démarreurs de requête {{patternType}}",
- "title-kick-start-your-query": "Lancer votre requête"
- },
- "raw-query": {
- "aria-label-selector": "sélecteur"
- },
- "results-table": {
- "content-descriptive-type": "Lors de la création d’un(e) {{descriptiveType}}, Prometheus expose plusieurs séries avec le compteur de type. ",
- "description": "Description",
- "message-expand-label-filters": "Aucune métrique trouvée. Essayez d’élargir vos filtres d’étiquettes.",
- "message-expand-search": "Aucune métrique trouvée. Essayez d’élargir votre recherche et vos filtres.",
- "message-no-metrics-found": "Aucune métrique trouvée dans la source de données.",
- "name": "Nom",
- "type": "Type"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/hu-HU/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/hu-HU/grafana-prometheus.json
deleted file mode 100644
index e78dc187e05..00000000000
--- a/packages/grafana-prometheus/src/locales/hu-HU/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Hiba a jegyzetadatok betöltése során.",
- "aria-label-lower-limit-parameter": "Állítsa be a léptékparaméter alsó határát",
- "label-min-step": "Min. lépték",
- "label-series-value-as-timestamp": "Sorozatérték időbélyegként",
- "label-tags": "Címkék",
- "label-text": "Szöveg",
- "label-title": "Cím",
- "placeholder-auto": "automatikus",
- "tooltip-either-pattern-example-instance-replaced-label": "Használja a nevet vagy egy mintázatot. Például a(z) {{labelTemplate}} helyébe a(z) {{labelName}} címke címkeértéke lép.",
- "tooltip-min-step": "További alsó határérték a Prometheus-lekérdezés lépésparaméteréhez, valamint a(z) <2>{{intervalVar}}2> és <4>{{rateIntervalVar}}4> változóhoz.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Az időbélyeg mértékegysége az ezredmásodperc. Ha a sorozatérték mértékegysége a másodperc, szorozza meg a tartományvektorát 1000-rel."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Azonnali lekérdezés és tartománylekérdezés futtatása"
- },
- "label": {
- "both": "Mindkettő"
- },
- "range-options": {
- "description": {
- "query-range": "Lekérdezés futtatása egy időtartományban"
- },
- "label": {
- "instant": "Azonnali",
- "range": "Tartomány"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Szűrőkifejezés címkéhez",
- "description-select-labels": "A címkeértékek kiválasztása után csak a lehetséges címkekombinációk jelennek meg.",
- "select-labels-to-search-in": "2. Válassza ki a kereséshez használni kívánt címkéket"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Szűrőkifejezés a metrikához",
- "aria-label-limit-results-from-series-endpoint": "A sorozat végpontjáról származó eredmények korlátozása",
- "description-series-limit": "A korlát minden metrikára, címkére és értékre vonatkozik. Hagyja üresen a mezőt az alapértelmezett korlát használatához. Állítsa 0-ra a korlát letiltásához és az összes lekéréséhez – ez teljesítményproblémákat okozhat.",
- "label-select-metric": "A metrika kiválasztása után csak a lehetséges címkék jelennek meg. A címkéket az alábbi sorozatkorlát korlátozza.",
- "select-a-metric": "1. Válasszon egy metrikát",
- "series-limit": "Sorozatkorlát"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL-puska"
- },
- "prom-exemplar-field": {
- "exemplars": "Mintapéldányok",
- "tooltip-disable-query": "Mintapéldányokkal rendelkező lekérdezések letiltása",
- "tooltip-enable-query": "Mintapéldányokkal rendelkező lekérdezések engedélyezése"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus extra mező",
- "aria-label-query-type-field": "Lekérdezéstípus mező",
- "aria-label-step-field": "Lépték mező",
- "min-step": "Min. lépték",
- "query-type": "Lekérdezés típusa",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Itt időegységek és beépített változók használhatók, például: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (alapértelmezett, ha nincs megadva mértékegység: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Írjon be egy PromQL-lekérdezést…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Klasszikus lekérdezés",
- "aria-label-metric-regex": "Metrika reguláris kifejezése",
- "aria-label-metric-selector": "Metrikaválasztó",
- "aria-label-prometheus-query": "Prometheus-lekérdezés",
- "aria-label-query-type": "Lekérdezés típusa",
- "aria-label-series-query": "Sorozatlekérdezés",
- "label-classic-query": "Klasszikus lekérdezés",
- "label-label": "Címke",
- "label-metric-regex": "Metrika reguláris kifejezése",
- "label-query": "Lekérdezés",
- "label-query-type": "Lekérdezés típusa",
- "label-series-query": "Sorozatlekérdezés",
- "placeholder-classic-query": "Klasszikus lekérdezés",
- "placeholder-metric-regex": "Metrika reguláris kifejezése",
- "placeholder-prometheus-query": "Prometheus-lekérdezés",
- "placeholder-select-query-type": "Lekérdezéstípus kiválasztása",
- "placeholder-series-query": "Sorozatlekérdezés",
- "returns-metrics-matching-specified-metric-regex": "A megadott metrikai reguláris kifejezésnek megfelelő metrikák listáját adja vissza.",
- "tooltip-classic-query": "A Prometheus változólekérdezés-szerkesztő eredeti implementációja. Adjon meg egy karakterláncot a megfelelő lekérdezéstípussal és paraméterekkel, a jelen dokumentumokban leírtak szerint. Például: {{exampleQuery}}.",
- "tooltip-label": "A címke nevéhez tartozó címkeértékek listáját adja vissza az összes metrikában, kivéve, ha a metrika meg van adva.",
- "tooltip-metric-regex": "A címkenevek listáját adja vissza, opcionálisan a megadott metrikai reguláris kifejezés szerint szűrve.",
- "tooltip-query": "A lekérdezéshez a Prometheus-lekérdezési eredmények listáját adja vissza. Ez magában foglalhatja a Prometheus-funkciókat, azaz {{exampleQuery}}.",
- "tooltip-query-type": "A Prometheus adatforrás-beépülőmodul a következő lekérdezéstípusokat biztosítja a sablonváltozókhoz.",
- "tooltip-series-query": "Adjon meg egy metrikát címkékkel, csak egy metrikát vagy csak címkéket: {{example1}}, {{example2}} vagy {{example3}}. A bevitt adatokhoz társított idősorok listáját adja vissza."
- },
- "selector-actions": {
- "aria-label-selector": "választó",
- "aria-label-selector-clear-button": "Választó törlése gomb",
- "aria-label-use-selector-as-metrics-button": "Választó használata metrikaként gomb",
- "aria-label-use-selector-for-query-button": "Választó használata lekérdezéshez gomb",
- "aria-label-validate-submit-button": "Küldés érvényesítése gomb",
- "clear": "Törlés",
- "resulting-selector": "4. Eredményként kapott választó",
- "use-as-rate-query": "Használat értékeléses lekérdezésként",
- "use-query": "Lekérdezés használata",
- "validate-selector": "Választó érvényesítése"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Szűrőkifejezés címkeértékekhez",
- "aria-label-values-for": "Értékek a következőhöz: {{labelKey}}",
- "description-search-field-values-across-selected-labels": "A keresőmező segítségével kereshet értékeket a kiválasztott címkék között.",
- "select-multiple-values-for-your-labels": "3. Válasszon (több) értéket a címkéihez"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Engedélyezés felvételkészítési szabályok céljaként",
- "label-manage-alerts-via-alerting-ui": "Riasztások kezelése az Alerting kezelőfelületén keresztül",
- "title-alerting": "Riasztás",
- "tooltip-allow-as-recording-rules-target": "Engedélyezze, hogy ez az adatforrás célként legyen kiválasztva a felvételkészítési szabályok írásához.",
- "tooltip-manage-alerts-via-alerting-ui": "Riasztási szabályok kezelése ehhez az adatforráshoz. Más Alerting-erőforrások kezeléséhez adjon hozzá egy Alertmanager-adatforrást."
- },
- "config-editor": {
- "browser-access-mode-error": "A Prometheus-adatforrás böngészős hozzáférési módja már nem érhető el. Váltás kiszolgáló-hozzáférési módra.",
- "description-advanced-settings": "A további beállítások olyan opcionális beállítások, amelyek konfigurálhatók az adatforrás nagyobb mértékű ellenőrzése érdekében.",
- "title-advanced-settings": "Speciális beállítások",
- "title-error": "Hiba"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Az Ön hozzáférési módja <1>Böngésző1>, ez azt jelenti, hogy az URL-címnek elérhetőnek kell lennie a böngészőből.",
- "tooltip-http-url": "Adjon meg egy teljes HTTP URL-címet (például: {{exampleURL}})",
- "tooltip-server-access-mode": "Az Ön hozzáférési módja <1>Kiszolgáló1>, ez azt jelenti, hogy az URL-címnek elérhetőnek kell lennie a Grafana-háttérrendszerből/-kiszolgálóról."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "További részletekért tekintse meg a dokumentumokat itt."
- },
- "exemplar-setting": {
- "label-data-source": "Adatforrás",
- "label-internal-link": "Belső hivatkozás",
- "label-label-name": "Címkenév",
- "label-remove-exemplar-link": "Mintapéldány-hivatkozás eltávolítása",
- "label-url": "URL-cím",
- "label-url-label": "URL-címke",
- "placeholder-go-to-examplecom": "Tovább az example.com webhelyre",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Mintapéldány-hivatkozás eltávolítása",
- "tooltip-data-source": "A mintapéldány ehhez az adatforráshoz fog navigálni.",
- "tooltip-internal-link": "Engedélyezze ezt a lehetőséget, ha van belső hivatkozása. Ha engedélyezve van, megjeleníti az adatforrás-választót. Válassza ki a háttérrendszeri követési adattárat a mintapéldány-adatokhoz.",
- "tooltip-label-name": "A címkeobjektum azon mezőjének neve, amelyet a traceID lekéréséhez kell használni.",
- "tooltip-url": "A nyomkövetési háttérrendszer URL-címe, ahová a felhasználó menne, hogy lássa a nyomkövetést",
- "tooltip-url-label": "Használja a gombcímke felülbírálásához a mintapéldány traceID mezőjén."
- },
- "exemplars-settings": {
- "add": "Hozzáadás",
- "no-exemplars-configurations": "Nincsenek mintapéldány-konfigurációk",
- "title-exemplars": "Mintapéldányok"
- },
- "prom-settings": {
- "aria-label-default-editor": "Alapértelmezett szerkesztő (kód vagy építő)",
- "aria-label-prom-type-type": "{{promType}} típusa",
- "aria-label-prometheus-type": "Prometheus-típus",
- "aria-label-select-http-method": "HTTP-módszer kiválasztása",
- "editor-options": {
- "label-builder": "Építő",
- "label-code": "Kód"
- },
- "label-cache-level": "Gyorsítótár szintje",
- "label-custom-query-parameters": "Egyéni lekérdezési paraméterek",
- "label-default-editor": "Alapértelmezett szerkesztő",
- "label-disable-metrics-lookup": "Metrikák keresésének letiltása",
- "label-disable-recording-rules-beta": "Felvételkészítési szabályok letiltása (béta)",
- "label-http-method": "HTTP-metódus",
- "label-incremental-querying-beta": "Növekményes lekérdezés (béta)",
- "label-prom-type-version": "{{promType}} verziója",
- "label-prometheus-type": "Prometheus-típus",
- "label-query-overlap-window": "Lekérdezésátfedési ablak",
- "label-query-timeout": "Lekérdezési időtúllépés",
- "label-scrape-interval": "Adatgyűjtési intervallum",
- "label-series-limit": "Sorozatkorlát",
- "label-use-series-endpoint": "Sorozat végpontjának használata",
- "more-info": "A Prometheus-típus és -verzió adatforrásokban történő konfigurálásával kapcsolatos további információkért tekintse meg a <2>kiépítési dokumentációt2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Példa: {{example}}",
- "title-interval-behaviour": "Intervallum viselkedése",
- "title-other": "Egyéb",
- "title-performance": "Teljesítmény",
- "title-query-editor": "Lekérdezésszerkesztő",
- "tooltip-cache-level": "Beállítja a böngésző gyorsítótárának szintjét a szerkesztői lekérdezésekhez. A magasabb számossági adatforrásokhoz magasabb gyorsítótár-beállítások ajánlottak.",
- "tooltip-custom-query-parameters": "Egyéni paraméterek hozzáadása a Prometheus lekérdezési URL-jéhez. Például: {{example1}}, {{example2}}, {{example3}} vagy {{example4}}. Több paramétert a következővel kell összefűzni: {{concatenationChar}}.",
- "tooltip-default-editor": "Beállítja az alapértelmezett szerkesztőopciót az adatforrás minden felhasználója számára.",
- "tooltip-disable-metrics-lookup": "Ennek az opciónak a bejelölése letiltja a metrikaválasztót és a metrika-/címketámogatást a lekérdezési mező automatikus kitöltésében. Ez segít, ha a nagyobb Prometheus-példányokkal teljesítményproblémái vannak. ",
- "tooltip-disable-recording-rules-beta": "Ez a funkció letiltja a felvételkészítési szabályokat. Kapcsolja be az irányítópult teljesítményének javítása érdekében",
- "tooltip-http-method": "A Prometheus-adatforrás lekérdezéséhez használhatja a POST- vagy a GET HTTP-metódust. A POST az ajánlott metódus, mivel nagyobb lekérdezéseket tesz lehetővé. Módosítsa ezt GET-re, ha a Prometheus-verziója régebbi, mint a 2.1-es, vagy ha a POST-kérések korlátozva vannak a hálózatában.",
- "tooltip-incremental-querying-beta": "Ez a funkció megváltoztatja a relatív lekérdezések azon alapértelmezett viselkedését, hogy mindig friss adatokat kérjenek le a Prometheus-példányból, ehelyett a lekérdezési eredményeket a rendszer gyorsítótárazza, és csak új rekordok lesznek lekérve. Kapcsolja be az adatbázis és a hálózat terhelésének csökkentése érdekében.",
- "tooltip-prom-type-version": "Ezzel állíthatja be a(z) {{promType}}-példány verzióját, ha nincs automatikusan konfigurálva.",
- "tooltip-prometheus-type": "Állítsa be a Prometheus-adatbázis típusára, pl.: Prometheus, Cortex, Mimir vagy Thanos. A mező módosításával menti az aktuális beállításokat. A Prometheus bizonyos típusai támogatják vagy nem támogatják a különböző API-kat. Például egyes típusok támogatják a reguláris kifejezéses egyeztetést a címkelekérdezésekhez a teljesítmény javítása érdekében. Egyes típusok rendelkeznek API-val a metaadatokhoz. Ha ezt helytelenül állítja be, furcsa viselkedést tapasztalhat a metrikák és címkék lekérdezésekor. Ellenőrizze a Prometheus dokumentációját, hogy biztosan a megfelelő típust adja meg.",
- "tooltip-query-overlap-window": "Állítson be egy időtartamot, például: {{example1}}, vagy {{example2}}, vagy {{example3}}. A(z) {{default}} alapértelmezése. Ez az időtartam hozzáadódik az egyes növekményes kérések időtartamához.",
- "tooltip-query-timeout": "Állítsa be a Prometheus lekérdezési időtúllépését.",
- "tooltip-scrape-interval": "Ez az intervallum azt mutatja, hogy a Prometheus milyen gyakran gyűjt adatokat a célokról. Állítsa be a Prometheus konfigurációs fájljában konfigurált tipikus adatgyűjtési és értékelési intervallumra. Ha ezt nagyobb értékre állítja, mint a Prometheus konfigurációs fájljának intervalluma, a Grafana ennek az intervallumnak megfelelően értékeli az adatokat, és kevesebb adatpontot fog látni. Alapértelmezett érték: {{default}}.",
- "tooltip-series-limit": "A korlát minden erőforrásra (metrikára, címkére és értékre) vonatkozik mindkét végpont (sorozatok és címkék) esetében. Hagyja üresen a mezőt az alapértelmezett korlát (40 000) használatához. Állítsa 0-ra a korlát letiltásához és az összes lekéréséhez – ez teljesítményproblémákat okozhat. Az alapértelmezett korlát 40 000.",
- "tooltip-use-series-endpoint": "Ennek az opciónak a bejelölésével előnyben részesíti a sorozat végpontját {{exampleParameter}} paraméterrel a címkeértékek végpontjához képest {{exampleParameter}} paraméterrel. Bár a címkeértékek végpontja hatékonyabbnak tekinthető, egyes felhasználók előnyben részesíthetik a sorozatot, mert rendelkezik POST-metódussal, míg a címkeértékek végpontja csak GET-metódussal rendelkezik."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Letiltva)",
- "enabled-label": "Metrikaböngésző"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Csak egyedi címkéket tartalmaz",
- "description-custom": "Adjon meg egy elnevezési sablont",
- "description-verbose": "Minden címkenév és -érték",
- "label-auto": "Automatikus",
- "label-custom": "Egyéni",
- "label-verbose": "Részletes"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Számítsa ki a méretek átlagát",
- "documentation-bottomk": "A legkisebb k elem mintaérték szerint",
- "documentation-count": "Számolja meg a vektor elemeinek számát",
- "documentation-count-values": "Számolja meg az azonos értékű elemek számát",
- "documentation-group": "Az eredményül kapott vektor összes értéke: 1",
- "documentation-max": "Válassza ki a maximális méreteket",
- "documentation-min": "Válassza ki a minimális méreteket",
- "documentation-quantile": "Számítsa ki a φ-kvantilist (0 ≤ φ ≤ 1) a dimenziók mentén",
- "documentation-stddev": "Számítsa ki a populáció szórását a dimenziók mentén",
- "documentation-stdvar": "Számítsa ki a populáció szabványos varianciáját a dimenziók mentén",
- "documentation-sum": "Számítsa ki az összeget a dimenziók mentén",
- "documentation-topk": "A legnagyobb k elemek mintaérték szerint"
- },
- "getFunctions": {
- "documentation-abs": "Visszaadja a bemeneti vektort, amelyben az összes mintaérték abszolút értékre van konvertálva.",
- "documentation-absent": "Üres vektort ad vissza, ha az átadott vektor tartalmaz elemeket, és 1 elemből álló vektort ad vissza, amelynek értéke 1, ha az átadott vektor nem tartalmaz elemeket. Ez akkor hasznos, ha figyelmeztetésre van szükség, amikor egy adott metrika név-címke kombinációjához nem létezik idősor.",
- "documentation-absent-over-time": "Üres vektort ad vissza, ha az átadott tartományvektor tartalmaz elemeket, és 1 elemből álló vektort ad vissza, amelynek értéke 1, ha az átadott tartományvektor nem tartalmaz elemeket.",
- "documentation-avg-over-time": "A megadott intervallum összes pontjának átlagértéke.",
- "documentation-ceil": "A „v” összes elemének mintavételi értékeit a legközelebbi egész számra felkerekíti.",
- "documentation-changes": "Minden bemeneti idősor esetében a „changes(v range-vector)” függvény az adott időtartományon belül az érték változásának számát adja vissza pillanatnyi vektorként.",
- "documentation-clamp": "A „v” összes elemének mintavételi értékeit úgy rögzíti, hogy az alsó határ „min”, a felső határ pedig „max” legyen.",
- "documentation-clamp-max": "A „v” összes elemének mintavételi értékeit úgy rögzíti, hogy a felső határ „max” legyen.",
- "documentation-clamp-min": "A „v” összes elemének mintavételi értékeit úgy rögzíti, hogy az alsó határ „min” legyen.",
- "documentation-count-over-time": "A megadott intervallum összes értékének száma.",
- "documentation-count-scalar": "Visszaadja az idősorvektor elemeinek számát skalárként. Ez ellentétben áll a „count()” összesítő operátorral, amely mindig vektort ad vissza (üreset, ha a bemeneti vektor üres) és lehetővé teszi a címkék szerinti csoportosítást a „by” záradékkal.",
- "documentation-day-of-month": "Visszaadja az időpontok adott hónapra vonatkozó napját UTC-ben. A visszaadott értékek 1 és 31 között lehetnek.",
- "documentation-day-of-week": "Visszaadja az időpontok adott hétre vonatkozó napját UTC-ben. A visszaadott értékek 0 és 6 között lehetnek, ahol a 0 vasárnapot jelent stb.",
- "documentation-day-of-year": "Visszaadja az időpontok adott évre vonatkozó napját UTC-ben. A visszaadott értékek 1 és 365 között lehetnek a nem szökőévek esetében, és 1 és 366 között a szökőévek esetében.",
- "documentation-days-in-month": "Visszaadja az adott időpontokhoz tartozó hónap napjainak számát UTC időzóna szerint. A visszaadott értékek 28 és 31 között lehetnek.",
- "documentation-deg": "A v összes elemének radiánjait fokokká alakítja át",
- "documentation-delta": "Kiszámítja a „v” tartományvektorban szereplő idősorelemek első és utolsó értéke közötti különbséget, és visszaad egy pillanatnyi vektort a megadott deltákkal és egyenértékű címkékkel. A delta extrapolálásra kerül, hogy lefedje a tartományvektor-választóban megadott teljes időtartományt, így lehetséges, hogy nem egész számú eredményt kapunk, még akkor is, ha a mintaértékek mind egész számok.",
- "documentation-deriv": "Egyszerű lineáris regresszió segítségével kiszámítja az idősor másodpercenkénti deriváltját egy „v” tartományvektorban.",
- "documentation-double-exponential-smoothing": "A „v” tartomány alapján simított értéket állít elő az idősorokhoz. Minél alacsonyabb az „sf” simítási tényező, annál nagyobb jelentőséget kapnak a régebbi adatok. Minél magasabb a „tf” trendtényező, annál nagyobb szerepet kapnak az adatokban a trendek. Mind az „sf”, mind a „tf” értékének 0 és 1 között kell lennie.",
- "documentation-drop-common-labels": "Eltávolít minden olyan címkét, amely azonos névvel és értékkel rendelkezik a bemeneti vektor összes sorozatában.",
- "documentation-exp": "Kiszámítja az exponenciális függvényt a „v” összes elemére.\nKülönleges esetek:\n* „Exp(+Inf) = +Inf”\n* „Exp(NaN) = NaN”",
- "documentation-floor": "A „v” összes elemének mintavételi értékeit a legközelebbi egész számra lekerekíti.",
- "documentation-histogram-avg": "Visszaadja a natív hisztogramban tárolt megfigyelt értékek számtani átlagát. A natív hisztogramokhoz nem tartozó minták figyelmen kívül maradnak, és nem jelennek meg a visszaadott vektorban.",
- "documentation-histogram-count": "Visszaadja a natív hisztogramban tárolt megfigyelések számát.",
- "documentation-histogram-fraction": "Visszaadja a megadott alsó és felső értékek közötti megfigyelések becsült arányát.",
- "documentation-histogram-quantile": "Kiszámítja a φ-kvantilt (0 ≤ φ ≤ 1) a hisztogram „b” gyűjtőiből. A „b” minták az egyes gyűjtőkben található megfigyelések számát jelentik. Minden mintának rendelkeznie kell egy „le” címkével, amelynek értéke a gyűjtő felső határát jelöli. (Az ilyen címkével nem rendelkező mintákat a rendszer figyelmen kívül hagyja.) A hisztogram metrikus típusa automatikusan ellátja az idősorokat a „_bucket” utótaggal és a megfelelő címkékkel.",
- "documentation-histogram-stddev": "Visszaadja a natív hisztogramban szereplő megfigyelések becsült szórását a megfigyelések helyét tartalmazó tartományok geometriai átlaga alapján.",
- "documentation-histogram-stdvar": "Visszaadja a natív hisztogramban szereplő megfigyelések becsült varianciáját.",
- "documentation-histogram-sum": "Visszaadja a natív hisztogramban tárolt megfigyelések összegét.",
- "documentation-holt-winters": "A Prometheus v3.x verzióban double_exponential_smoothing megnevezést kapott. A Prometheus v3.0 vagy annál újabb verzióknál használja a double_exponential_smoothing funkciót.\n\nA „v” tartomány alapján simított értéket állít elő az idősorokhoz. Minél alacsonyabb az „sf” simítási tényező, annál nagyobb jelentőséget kapnak a régebbi adatok. Minél magasabb a „tf” trendtényező, annál nagyobb szerepet kapnak az adatokban a trendek. Mind az „sf”, mind a „tf” értékének 0 és 1 között kell lennie.",
- "documentation-hour": "Visszaadja az adott időpontok óráját UTC-ben. A visszaadott értékek 0 és 23 között lehetnek.",
- "documentation-idelta": "Kiszámítja a „v” tartományvektor utolsó két mintája közötti különbséget, és visszaad egy pillanatnyi vektort a megadott deltákkal és egyenértékű címkékkel.",
- "documentation-increase": "Kiszámítja az idősor növekedését a tartományvektorban. A monotonitás megszakadásait (például a cél újraindítása miatt bekövetkező számláló-visszaállításokat) a rendszer automatikusan kiigazítja. A növekedés extrapolálásra kerül, hogy lefedje a tartományvektor-választóban megadott teljes időtartományt, így lehetséges, hogy nem egész számú eredményt kapunk, még akkor is, ha a számláló csak egész számmal növekszik.",
- "documentation-info": "A legfrissebb részleteket és metaadatokat adja vissza egy mutatócsoportról, például a címkéket és az aktuális értékeket, anélkül, hogy bármilyen számítást végezne.",
- "documentation-irate": "Kiszámítja az idősor másodpercenkénti növekedési sebességét a tartományvektorban. Ez az utolsó két adatponton alapul. A monotonitás megszakadásait (például a cél újraindítása miatt bekövetkező számláló-visszaállításokat) a rendszer automatikusan kiigazítja.",
- "documentation-label-join": "A „v” vektor minden idősorához összekapcsolja az összes „src_labels” értékét a „separator” segítségével, és visszaadja az összekapcsolt értéket tartalmazó, „dst_label” címkével ellátott idősorokat. Ebben a függvényben tetszőleges számú „src_labels” lehet.",
- "documentation-label-replace": "A „v” minden idősorához a „label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)” a „regex” reguláris kifejezést a „src_label” címkével hasonlítja össze. Ha egyezik, akkor az idősor a „dst_label” címkét adja vissza, amelyet a „replacement” kiterjesztése helyettesít. Az „$1” helyére az első egyező alcsoport, az „$2” helyére a második stb. kerül. Ha a reguláris kifejezés nem egyezik, akkor az idősor változatlanul kerül visszaadásra.",
- "documentation-last-over-time": "A legutóbbi pontérték a megadott intervallumban.",
- "documentation-ln": "Kiszámítja a természetes logaritmust a „v” összes elemére.\nKülönleges esetek:\n * „ln(+Inf) = +Inf”\n * „ln(0) = -Inf”\n * „ln(x < 0) = NaN”\n * „ln(NaN) = NaN”",
- "documentation-log10": "Kiszámítja a „v” összes elemének decimális logaritmusát. A különleges esetek megegyeznek az „ln” esetével.",
- "documentation-log2": "Kiszámítja a „v” összes elemének bináris logaritmusát. A különleges esetek megegyeznek az „ln” esetével.",
- "documentation-max-over-time": "A megadott intervallum összes pontjának maximális értéke.",
- "documentation-min-over-time": "A megadott intervallum összes pontjának minimális értéke.",
- "documentation-minute": "Visszaadja az adott időpontok percét UTC-ben. A visszaadott értékek 0 és 59 között lehetnek.",
- "documentation-month": "Visszaadja az év hónapját az adott időpontokhoz UTC-ben. A visszaadott értékek 1 és 12 között lehetnek, ahol 1 január, stb.",
- "documentation-pi": "A pi értékét adja vissza",
- "documentation-predict-linear": "Egyszerű lineáris regresszióval megjósolja a „t” másodperccel későbbi idősor értékét a „v” tartományvektor alapján.",
- "documentation-present-over-time": "Az 1-es érték a megadott intervallum bármely sorozata esetében.",
- "documentation-quantile-over-time": "A megadott intervallum értékeinek φ-kvantilise (0 ≤ φ ≤ 1).",
- "documentation-rad": "A „v” összes elemének fokjait radiánra alakítja át",
- "documentation-rate": "Kiszámítja az idősor másodpercenkénti átlagos növekedési sebességét a tartományvektorban. A monotonitás megszakadásait (például a cél újraindítása miatt bekövetkező számláló-visszaállításokat) a rendszer automatikusan kiigazítja. Ezenkívül a számítás extrapolálja az időtartomány végeit, figyelembe véve a kihagyott lekérdezéseket vagy a lekérdezési ciklusok és a tartomány időtartamának nem tökéletes összehangolását.",
- "documentation-resets": "Minden bemeneti idősor esetében a „resets(v range-vector)” a megadott időtartományon belüli számláló-visszaállítások számát azonnali vektorként adja vissza. Két egymást követő minta közötti értékcsökkenést a program számláló-visszaállításként értelmez.",
- "documentation-round": "A „v” összes elemének mintaértékeit a legközelebbi egész számra kerekíti. Az egyenlő értékeket felfelé kerekíti. Az opcionális „to_nearest” argumentum lehetővé teszi a mintaértékek kerekítésének legközelebbi többszörösének megadását. Ez a többszörös lehet törtszám is.",
- "documentation-scalar": "Egy egyelemes bemeneti vektor esetén a „scalar(v instant-vector)” az adott egy elem mintavételi értékét skalárként adja vissza. Ha a bemeneti vektor nem pontosan egy elemmel rendelkezik, a „scalar” a „NaN” értéket adja vissza.",
- "documentation-sgn": "Egy vektort ad vissza, amelyben az összes mintaérték az előjelére van konvertálva, az alábbiak szerint: 1, ha „v” pozitív, -1, ha „v” negatív, és 0, ha „v” nulla.",
- "documentation-sort": "A mintavételi értékeik szerint növekvő sorrendbe rendezve adja vissza a vektorelemeket.",
- "documentation-sort-desc": "A mintavételi értékeik szerint csökkenő sorrendbe rendezve adja vissza a vektorelemeket.",
- "documentation-sqrt": "Kiszámítja a „v” összes elemének négyzetgyökét.",
- "documentation-stddev-over-time": "A megadott intervallum értékeinek populációs szórása.",
- "documentation-stdvar-over-time": "A megadott intervallum értékeinek populációs varianciája.",
- "documentation-sum-over-time": "A megadott intervallum összes értékének összege.",
- "documentation-time": "Visszaadja az 1970. január 1-től eltelt másodpercek számát UTC-időzóna szerint. Ne feledje, hogy ez valójában nem a jelenlegi időt adja vissza, hanem azt az időpontot, amikor a kifejezés kiértékelésre kerül.",
- "documentation-timestamp": "Visszaadja az adott vektor minden mintájának időbélyegét az 1970. január 1. óta eltelt másodpercek számaként UTC-időzónában.",
- "documentation-vector": "Visszaadja a skaláris „s” értéket címkék nélküli vektorként.",
- "documentation-year": "Visszaadja az adott időpontok évét UTC-ben."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "kiszámítja a(z) {{argument}} összes elemének arkusz koszinuszát",
- "documentation-acosh": "kiszámítja a(z) {{argument}} összes elemének inverz hiperbolikus koszinuszát",
- "documentation-asin": "kiszámítja a(z) {{argument}} összes elemének arkusz szinuszát",
- "documentation-asinh": "kiszámítja a(z) {{argument}} összes elemének inverz hiperbolikus szinuszát",
- "documentation-atan": "kiszámítja a(z) {{argument}} összes elemének arkusz tangensét",
- "documentation-atanh": "kiszámítja a(z) {{argument}} összes elemének inverz hiperbolikus tangensét",
- "documentation-cos": "kiszámítja a(z) {{argument}} összes elemének koszinuszát",
- "documentation-cosh": "kiszámítja a(z) {{argument}} összes elemének hiperbolikus koszinuszát",
- "documentation-sin": "kiszámítja a(z) {{argument}} összes elemének szinuszát",
- "documentation-sinh": "kiszámítja a(z) {{argument}} összes elemének hiperbolikus szinuszát",
- "documentation-tan": "kiszámítja a(z) {{argument}} összes elemének tangensét",
- "documentation-tanh": "kiszámítja a(z) {{argument}} összes elemének hiperbolikus tangensét"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Visszajelzés küldése",
- "title-give-feedback": "A metrikaböngésző új, és számítunk az építő jellegű visszajelzésére"
- },
- "get-collapsed-info": {
- "exemplars": "Mintapéldányok: {{value}}",
- "format": "Formátum: {{value}}",
- "legend": "Jelmagyarázat: {{value}}",
- "step": "Lépés: {{value}}",
- "type": "Típus: {{value}}"
- },
- "get-placeholders": {
- "browse": "Metrikák keresése név alapján",
- "type": "Szűrés típus szerint"
- },
- "get-prom-types": {
- "description-counter": "Egyetlen, monoton növekvő számlálóhoz tartozó kumulatív mutató, amelynek értéke csak növekedhet, vagy újraindításkor nullára állítható vissza.",
- "description-gauge": "Egyetlen numerikus értéket képviselő mutató, amely szabadon növekedhet és csökkenhet.",
- "description-histogram": "A hisztogram mintákat vesz a megfigyelésekből (általában olyanokból, mint a kérések időtartama vagy a válaszok mérete), és konfigurálható kategóriákba sorolja őket.",
- "description-native-histogram": "A natív hisztogramok számos szempontból eltérnek a klasszikus Prometheus hisztogramoktól: A natív hisztogramok tartományhatárai egy képlet alapján kerülnek kiszámolásra, amely a natív hisztogram méretarányától (felbontásától) függ, és nem a felhasználó határozza meg.",
- "description-no-type": "Ezeknek a mutatóknak nincs meghatározott típusa a metaadatokban.",
- "description-summary": "Összefoglalja a mintavételi megfigyeléseket (általában olyanokat, mint a kérések időtartama és a válaszok mérete), és konfigurálható kvantiliseket számíthat ki egy változó időablakban.",
- "description-unknown": "Ezek a mutatók a metaadatokban ismeretlen típusúak.",
- "label-counter": "Számláló",
- "label-gauge": "Mérőeszköz",
- "label-histogram": "Hisztogram",
- "label-native-histogram": "Natív hisztogram",
- "label-no-type": "Nincs típus",
- "label-summary": "Összegzés",
- "label-unknown": "Ismeretlen"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "A lekérdezés elemzése nem egyértelmű."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "{{name}} eltávolítása",
- "placeholder-select-label": "Címke kiválasztása",
- "placeholder-select-value": "Érték kijelölése"
- },
- "label-filters": {
- "label-filters": "Címkeszűrők",
- "label-label-filters": "Címkeszűrők",
- "tooltip-label-filters": "Opcionális: a lekérdezéstípushoz kiválasztott metrika szűrésére szolgál."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Címkék betöltése",
- "noOptionsMessage-no-labels-found": "Nem található címke"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Metrikaböngésző megnyitása",
- "placeholder-select-metric": "Metrika kiválasztása",
- "tooltip-open-metrics-explorer": "Metrikaböngésző megnyitása"
- },
- "label-metric": "Metrika",
- "tooltip-metric": "Opcionális: a megadott metrikában a címke nevéhez tartozó címkeértékek listáját adja vissza."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Metrikák böngészése",
- "currently-selected": "Jelenleg kiválasztott: {{selected}}",
- "metrics-pre-filtered": "Ezek a metrikák előszűrtek a címkeszűrőkben kiválasztott címkék alapján.",
- "title-metrics-explorer": "Metrikaböngésző"
- },
- "nested-query": {
- "label": {
- "ignoring": "Mellőzés",
- "on": "Be"
- },
- "operator": "Műveleti jel",
- "tooltip-remove-match": "Egyezés eltávolítása",
- "vector-matches": "Vektoregyezések"
- },
- "operation-editor": {
- "not-found": "A(z) {{id}} művelet nem található",
- "title-remove": "{{name}} eltávolítása"
- },
- "operation-header": {
- "placeholder-replace-with": "Csere ezzel:",
- "title-click-to-view-alternative-operations": "Kattintson az alternatív műveletek megtekintéséhez",
- "title-remove-operation": "Művelet eltávolítása"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Kattintson a leírás megjelenítéséhez",
- "title-remove-operation": "Művelet eltávolítása"
- },
- "operation-list": {
- "operations": "Műveletek",
- "placeholder-search": "Keresés",
- "title-add-operation": "Művelet hozzáadása"
- },
- "operation-param-editor": {
- "title-add": "{{name}} hozzáadása",
- "title-remove": "{{name}} eltávolítása"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Kiszámítja a(z) {{aggregationName}} összesítést a dimenziók mentén, miközben megőrzi a(z) {{labelWord}} {{labels}} címkéket.",
- "label-default": "Kiszámítja a(z) {{aggregationName}} összesítést a dimenziók mentén.",
- "label-without": "Kiszámítja a(z) {{aggregationName}} összesítést a(z) {{labels}} dimenziók mentén. Minden más címke megmarad."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Mintapéldányok váltása.",
- "aria-label-format": "Formátum kombinált listája",
- "aria-label-lower-limit-parameter": "Minimális léptetés szövegmező, beállíthatja a léptetésparaméter alsó határát",
- "aria-label-select-resolution": "Felbontás kiválasztása",
- "aria-label-type": "Típus választógomb-csoport",
- "format-options": {
- "label-heatmap": "Hőtérkép",
- "label-table": "Táblázat",
- "label-time-series": "Idősor"
- },
- "label-exemplars": "Mintapéldányok",
- "label-format": "Formátum",
- "label-min-step": "Min. lépték",
- "label-resolution": "Felbontás",
- "label-type": "Típus",
- "placeholder-auto": "automatikus",
- "title-options": "Beállítások",
- "tooltip-min-step": "További alsó határérték a Prometheus-lekérdezés léptékparaméteréhez, valamint a(z) <2>{{interval}}2> és <4>{{rateInterval}}4> változóhoz."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Szintaktikai hiba történt, vagy a lekérdezési struktúra nem jeleníthető meg szerkesztő módra való váltáskor. A lekérdezés egyes részei elveszhetnek.",
- "confirmText-continue": "Folytatás",
- "kick-start-your-query": "Előbeállításos lekérdezés",
- "label-explain": "Magyarázat",
- "run-queries": "Lekérdezések futtatása",
- "title-parsing-error-switch-builder": "Elemzési hiba: Váltás építő módba?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Jelmagyarázat kombinált listája",
- "label-legend": "Jelmagyarázat",
- "placeholder-select-legend-mode": "Jelmagyarázat mód kiválasztása",
- "tooltip-legend": "Sorozatnév felülbírálása vagy sablon. Például a(z) {{templateExample}} helyébe a(z) {{labelName}} címkeértéke lép."
- },
- "query-builder-hints": {
- "hint-details": "tipp: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Építő",
- "label-code": "Kód"
- }
- },
- "query-pattern": {
- "apply-query": "Lekérdezés alkalmazása",
- "aria-label-apply-query-starter-button": "lekérdezés-előbeállító alkalmazása gomb",
- "aria-label-back-button": "vissza gomb",
- "aria-label-create-new-query-button": "új lekérdezés létrehozása gomb",
- "aria-label-raw-query": "{{patternName}} nyers lekérdezés",
- "aria-label-use-this-query-button": "használja ezt a lekérdezést gomb",
- "back": "Vissza",
- "create-new-query": "Új lekérdezés létrehozása",
- "use-this-query": "Használja ezt a lekérdezést"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "előbeállításos lekérdezés modális ablakának bezárása",
- "aria-label-kick-start-your-query-modal": "Előbeállításos lekérdezés modális ablak",
- "aria-label-toggle-query-starter": "{{patternType}} lekérdezés-előbeállító kártya megnyitása és bezárása",
- "close": "Bezárás",
- "description-kick-start-your-query": "Kezdje el létrehozni a lekérdezést előbeállításokkal az alábbi lekérdezések egyikének kiválasztásával. Ezután folytathatja a lekérdezés befejezését.",
- "label-toggle-query-starter": "{{patternType}} lekérdezés-előbeállítók",
- "title-kick-start-your-query": "Előbeállításos lekérdezés"
- },
- "raw-query": {
- "aria-label-selector": "választó"
- },
- "results-table": {
- "content-descriptive-type": "{{descriptiveType}} létrehozásakor a Prometheus több, számláló típusú sorozatot jelenít meg. ",
- "description": "Leírás",
- "message-expand-label-filters": "Nem található metrika. Próbálja meg kibővíteni a címkeszűrőket.",
- "message-expand-search": "Nem található metrika. Próbálja meg kibővíteni a keresést és a szűrőket.",
- "message-no-metrics-found": "Nem található metrika az adatforrásban.",
- "name": "Név",
- "type": "Típus"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/id-ID/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/id-ID/grafana-prometheus.json
deleted file mode 100644
index 740b10e9337..00000000000
--- a/packages/grafana-prometheus/src/locales/id-ID/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Terjadi kesalahan pemuatan data anotasi!",
- "aria-label-lower-limit-parameter": "Tetapkan batas bawah untuk parameter langkah",
- "label-min-step": "Langkah minimum",
- "label-series-value-as-timestamp": "Nilai data seri sebagai stempel waktu",
- "label-tags": "Tag",
- "label-text": "Teks",
- "label-title": "Judul",
- "placeholder-auto": "otomatis",
- "tooltip-either-pattern-example-instance-replaced-label": "Gunakan nama atau pola. Misalnya, {{labelTemplate}} diganti dengan nilai label untuk label {{labelName}}.",
- "tooltip-min-step": "Batas bawah tambahan untuk parameter langkah kueri Prometheus dan untuk variabel <2>{{intervalVar}}2> dan <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Unit stempel waktu adalah milidetik. Jika satuan nilai data seri adalah detik, kalikan vektor rentangnya dengan 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Jalankan kueri Instan dan kueri Rentang"
- },
- "label": {
- "both": "Keduanya"
- },
- "range-options": {
- "description": {
- "query-range": "Jalankan kueri selama rentang waktu tertentu"
- },
- "label": {
- "instant": "Instan",
- "range": "Rentang"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filter persamaan berdasarkan label",
- "description-select-labels": "Setelah nilai label dipilih, hanya kombinasi label yang mungkin yang ditampilkan.",
- "select-labels-to-search-in": "2. Pilih label untuk pencarian"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filter persamaan berdasarkan metrik",
- "aria-label-limit-results-from-series-endpoint": "Batasi hasil dari titik akhir data seri",
- "description-series-limit": "Batas ini berlaku untuk semua metrik, label, dan nilai. Biarkan bidang kosong untuk menggunakan batas default. Atur ke 0 untuk menonaktifkan batas dan mengambil semuanya — ini dapat menyebabkan masalah kinerja.",
- "label-select-metric": "Setelah metrik dipilih, hanya label yang mungkin yang ditampilkan. Label dibatasi oleh batas data seri di bawah ini.",
- "select-a-metric": "1. Pilih metrik",
- "series-limit": "Batas data seri"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Lembar Ringkasan PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Contoh",
- "tooltip-disable-query": "Nonaktifkan kueri dengan contoh",
- "tooltip-enable-query": "Aktifkan kueri dengan contoh"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Bidang tambahan Prometheus",
- "aria-label-query-type-field": "Bidang jenis kueri",
- "aria-label-step-field": "Bidang langkah",
- "min-step": "Langkah minimum",
- "query-type": "Jenis kueri",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Unit waktu dan variabel bawaan dapat digunakan di sini, misalnya: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Default jika tidak ada unit yang ditentukan: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Masukkan kueri PromQL…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Kueri Klasik",
- "aria-label-metric-regex": "Ekspresi reguler metrik",
- "aria-label-metric-selector": "Selektor metrik",
- "aria-label-prometheus-query": "Kueri Prometheus",
- "aria-label-query-type": "Jenis kueri",
- "aria-label-series-query": "Kueri Data Seri",
- "label-classic-query": "Kueri Klasik",
- "label-label": "Label",
- "label-metric-regex": "Ekspresi reguler metrik",
- "label-query": "Kueri",
- "label-query-type": "Jenis kueri",
- "label-series-query": "Kueri Data Seri",
- "placeholder-classic-query": "Kueri Klasik",
- "placeholder-metric-regex": "Ekspresi reguler metrik",
- "placeholder-prometheus-query": "Kueri Prometheus",
- "placeholder-select-query-type": "Pilih jenis kueri",
- "placeholder-series-query": "Kueri Data Seri",
- "returns-metrics-matching-specified-metric-regex": "Mengembalikan daftar metrik yang sesuai dengan regex metrik yang ditentukan.",
- "tooltip-classic-query": "Implementasi awal dari editor kueri variabel Prometheus. Masukkan string dengan jenis kueri dan parameter yang benar seperti yang dijelaskan dalam dokumen ini. Misalnya, {{exampleQuery}}.",
- "tooltip-label": "Mengembalikan daftar nilai label untuk nama label di semua metrik kecuali metrik tersebut ditentukan.",
- "tooltip-metric-regex": "Mengembalikan daftar nama label, secara opsional menyaring berdasarkan regex metrik yang ditentukan.",
- "tooltip-query": "Mengembalikan daftar hasil kueri Prometheus untuk kueri tersebut. Ini dapat mencakup fungsi Prometheus, yaitu {{exampleQuery}}.",
- "tooltip-query-type": "Plugin sumber data Prometheus menyediakan jenis kueri berikut untuk variabel templat.",
- "tooltip-series-query": "Masukkan metrik dengan label, hanya metrik atau hanya label, yaitu {{example1}}, {{example2}}, atau {{example3}}. Mengembalikan daftar deret waktu yang terkait dengan data yang dimasukkan."
- },
- "selector-actions": {
- "aria-label-selector": "selektor",
- "aria-label-selector-clear-button": "Tombol hapus selektor",
- "aria-label-use-selector-as-metrics-button": "Gunakan selektor sebagai tombol metrik",
- "aria-label-use-selector-for-query-button": "Gunakan selektor untuk tombol kueri",
- "aria-label-validate-submit-button": "Validasi tombol kirim",
- "clear": "Hapus",
- "resulting-selector": "4. Selektor yang dihasilkan",
- "use-as-rate-query": "Gunakan sebagai kueri rate",
- "use-query": "Gunakan kueri",
- "validate-selector": "Validasi selektor"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filter persamaan berdasarkan nilai label",
- "aria-label-values-for": "Nilai untuk {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Gunakan bidang pencarian untuk menemukan nilai di seluruh label yang dipilih.",
- "select-multiple-values-for-your-labels": "3. Pilih (beberapa) nilai untuk label Anda"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Izinkan sebagai target aturan perekaman",
- "label-manage-alerts-via-alerting-ui": "Kelola peringatan melalui UI Peringatan",
- "title-alerting": "Alerting",
- "tooltip-allow-as-recording-rules-target": "Izinkan sumber data ini dipilih sebagai target untuk menulis aturan perekaman.",
- "tooltip-manage-alerts-via-alerting-ui": "Kelola aturan peringatan untuk sumber data ini. Untuk mengelola sumber daya alerting lainnya, tambahkan sumber data Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "Mode akses browser di sumber data Prometheus tidak lagi tersedia. Beralih ke mode akses server.",
- "description-advanced-settings": "Pengaturan tambahan adalah pengaturan opsional yang dapat dikonfigurasi agar memiliki kendali lebih besar atas sumber data Anda.",
- "title-advanced-settings": "Pengaturan lanjutan",
- "title-error": "Kesalahan"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Metode akses Anda adalah <1>Browser1>, ini berarti URL harus dapat diakses dari browser.",
- "tooltip-http-url": "Tentukan URL HTTP lengkap (misalnya {{exampleURL}})",
- "tooltip-server-access-mode": "Metode akses Anda adalah <1>Server1>, ini berarti URL harus dapat diakses dari backend/server grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Kunjungi dokumen untuk detail selengkapnya di sini."
- },
- "exemplar-setting": {
- "label-data-source": "Sumber data",
- "label-internal-link": "Tautan internal",
- "label-label-name": "Nama label",
- "label-remove-exemplar-link": "Hapus tautan contoh",
- "label-url": "URL",
- "label-url-label": "Label URL",
- "placeholder-go-to-examplecom": "Buka example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Hapus tautan contoh",
- "tooltip-data-source": "Sumber data yang akan dinavigasi oleh contoh.",
- "tooltip-internal-link": "Aktifkan opsi ini jika Anda memiliki tautan internal. Saat diaktifkan, ini akan menampilkan selektor sumber data. Pilih penyimpanan data pelacakan backend untuk data contoh Anda.",
- "tooltip-label-name": "Nama bidang dalam objek label yang harus digunakan untuk mendapatkan traceID.",
- "tooltip-url": "URL backend jejak yang akan digunakan pengguna untuk melihat jejaknya",
- "tooltip-url-label": "Gunakan untuk mengganti label tombol pada bidang traceID contoh."
- },
- "exemplars-settings": {
- "add": "Tambahkan",
- "no-exemplars-configurations": "Tidak ada konfigurasi contoh",
- "title-exemplars": "Contoh"
- },
- "prom-settings": {
- "aria-label-default-editor": "Editor Default (Kode atau Pembuat)",
- "aria-label-prom-type-type": "Jenis {{promType}}",
- "aria-label-prometheus-type": "Jenis Prometheus",
- "aria-label-select-http-method": "Pilih metode HTTP",
- "editor-options": {
- "label-builder": "Pembangun",
- "label-code": "Kode"
- },
- "label-cache-level": "Level cache",
- "label-custom-query-parameters": "Parameter kueri kustom",
- "label-default-editor": "Editor default",
- "label-disable-metrics-lookup": "Nonaktifkan pencarian metrik",
- "label-disable-recording-rules-beta": "Nonaktifkan aturan perekaman (beta)",
- "label-http-method": "Metode HTTP",
- "label-incremental-querying-beta": "Kueri inkremental (beta)",
- "label-prom-type-version": "Versi {{promType}}",
- "label-prometheus-type": "Jenis Prometheus",
- "label-query-overlap-window": "Jendela kueri tumpang tindih",
- "label-query-timeout": "Batas waktu kueri habis",
- "label-scrape-interval": "Interval scrape",
- "label-series-limit": "Batas data seri",
- "label-use-series-endpoint": "Gunakan titik akhir data seri",
- "more-info": "Untuk informasi lengkap tentang mengonfigurasi jenis dan versi prometheus dalam sumber data, lihat <2>dokumentasi penyediaan2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Contoh: {{example}}",
- "title-interval-behaviour": "Perilaku interval",
- "title-other": "Lainnya",
- "title-performance": "Kinerja",
- "title-query-editor": "Editor kueri",
- "tooltip-cache-level": "Mengatur level cache peramban untuk kueri editor. Pengaturan cache yang lebih tinggi disarankan untuk sumber data dengan kardinalitas tinggi.",
- "tooltip-custom-query-parameters": "Tambahkan parameter kustom ke URL kueri Prometheus. Misalnya {{example1}}, {{example2}}, {{example3}}, atau {{example4}}. Beberapa parameter harus digabungkan bersama dengan {{concatenationChar}}.",
- "tooltip-default-editor": "Atur opsi editor default untuk semua pengguna sumber data ini.",
- "tooltip-disable-metrics-lookup": "Memeriksa opsi ini akan menonaktifkan pemilih metrik dan dukungan metrik/label dalam pelengkapan otomatis bidang kueri. Ini membantu jika Anda memiliki masalah kinerja dengan instans Prometheus yang lebih besar. ",
- "tooltip-disable-recording-rules-beta": "Fitur ini akan menonaktifkan aturan perekaman. Aktifkan ini untuk meningkatkan kinerja dasbor",
- "tooltip-http-method": "Anda dapat menggunakan metode HTTP POST atau GET untuk melakukan kueri sumber data Prometheus Anda. POST adalah metode yang disarankan karena memungkinkan kueri yang lebih besar. Ubah ini menjadi GET jika Anda memiliki versi Prometheus yang lebih lama dari 2.1 atau jika permintaan POST dibatasi di jaringan Anda.",
- "tooltip-incremental-querying-beta": "Fitur ini akan mengubah perilaku default kueri relatif: alih-alih selalu meminta data terbaru dari instance Prometheus, hasil kueri akan disimpan sementara, dan hanya data baru yang akan diminta. Aktifkan ini untuk mengurangi load database dan jaringan.",
- "tooltip-prom-type-version": "Gunakan ini untuk mengatur versi instance {{promType}} Anda jika tidak dikonfigurasi secara otomatis.",
- "tooltip-prometheus-type": "Atur ini ke jenis database prometheus Anda, misalnya Prometheus, Cortex, Mimir, atau Thanos. Mengubah bidang ini akan menyimpan pengaturan Anda saat ini. Jenis Prometheus tertentu mendukung atau tidak mendukung berbagai API. Misalnya, beberapa jenis mendukung pencocokan regex bagi kueri label untuk meningkatkan kinerja. Beberapa jenis memiliki API untuk metadata. Jika Anda mengatur ini secara tidak benar, Anda mungkin mengalami perilaku tidak biasa saat melakukan kueri metrik dan label. Periksa dokumentasi Prometheus Anda untuk memastikan Anda memasukkan jenis yang benar.",
- "tooltip-query-overlap-window": "Tetapkan durasi seperti {{example1}} atau {{example2}} atau {{example3}}. Default {{default}}. Durasi ini akan ditambahkan ke durasi setiap permintaan tambahan.",
- "tooltip-query-timeout": "Atur batas waktu kueri Prometheus.",
- "tooltip-scrape-interval": "Interval ini adalah seberapa sering Prometheus melakukan scrape pada target. Atur ini ke interval scrape dan evaluasi umum yang dikonfigurasi dalam file konfigurasi Prometheus Anda. Jika Anda mengatur ini ke nilai yang lebih besar dari interval file konfigurasi Prometheus Anda, Grafana akan mengevaluasi data sesuai dengan interval ini dan Anda akan melihat lebih sedikit titik data. Default ke {{default}}.",
- "tooltip-series-limit": "Batas ini berlaku untuk semua sumber daya (metrik, label, dan nilai) untuk kedua endpoint (deret dan label). Biarkan bidang kosong untuk menggunakan batas default (40000). Atur ke 0 untuk menonaktifkan batas dan mengambil semuanya — ini dapat menyebabkan masalah kinerja. Batas default adalah 40000.",
- "tooltip-use-series-endpoint": "Memeriksa opsi ini akan mengutamakan titik akhir data seri dengan {{exampleParameter}} parameter daripada titik akhir nilai label dengan {{exampleParameter}} parameter. Meskipun titik akhir nilai label dianggap memiliki kinerja yang lebih baik, beberapa pengguna mungkin lebih menyukai data seri karena memiliki metode POST, sementara titik akhir nilai label hanya memiliki metode GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Dinonaktifkan)",
- "enabled-label": "Browser metrik"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Hanya menyertakan label unik",
- "description-custom": "Berikan templat penamaan",
- "description-verbose": "Semua nama dan nilai label",
- "label-auto": "Otomatis",
- "label-custom": "Kustom",
- "label-verbose": "Verbose"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Hitung rata-rata atas dimensi",
- "documentation-bottomk": "Elemen k terkecil berdasarkan nilai sampel",
- "documentation-count": "Hitung jumlah elemen dalam vektor",
- "documentation-count-values": "Hitung jumlah elemen dengan nilai yang sama",
- "documentation-group": "Semua nilai dalam vektor yang dihasilkan adalah 1",
- "documentation-max": "Pilih dimensi maksimum",
- "documentation-min": "Pilih dimensi minimum",
- "documentation-quantile": "Hitung φ-kuantil (0 ≤ φ ≤ 1) berdasarkan dimensi",
- "documentation-stddev": "Hitung standar deviasi populasi berdasarkan dimensi",
- "documentation-stdvar": "Hitung varians standar populasi berdasarkan dimensi",
- "documentation-sum": "Hitung jumlah berdasarkan dimensi",
- "documentation-topk": "Elemen k terbesar berdasarkan nilai sampel"
- },
- "getFunctions": {
- "documentation-abs": "Mengembalikan vektor input dengan semua nilai sampel dikonversi ke nilai absolutnya.",
- "documentation-absent": "Mengembalikan vektor kosong jika vektor yang diteruskan memiliki elemen, dan vektor dengan satu elemen bernilai 1 jika vektor tersebut tidak memiliki elemen. Ini berguna untuk memberi peringatan saat tidak ada deret waktu yang tersedia untuk kombinasi nama metrik dan label tertentu.",
- "documentation-absent-over-time": "Mengembalikan vektor kosong jika vektor rentang yang diteruskan memiliki elemen, dan vektor dengan satu elemen bernilai 1 jika vektor rentang tersebut tidak memiliki elemen.",
- "documentation-avg-over-time": "Nilai rata-rata dari semua poin dalam interval yang ditentukan.",
- "documentation-ceil": "Membulatkan nilai sampel dari semua elemen dalam `v` ke bilangan bulat terdekat.",
- "documentation-changes": "Untuk setiap deret waktu input, `changes(v range-vector)` mengembalikan berapa kali nilainya telah berubah dalam rentang waktu yang diberikan sebagai vektor instan.",
- "documentation-clamp": "Menjepit nilai sampel dari semua elemen dalam `v` untuk memiliki batas bawah `min` dan batas atas `max`.",
- "documentation-clamp-max": "Menjepit nilai sampel dari semua elemen dalam `v` agar memiliki batas atas `maks`.",
- "documentation-clamp-min": "Menjepit nilai sampel dari semua elemen dalam `v` untuk memiliki batas bawah `min`.",
- "documentation-count-over-time": "Hitungan semua nilai dalam interval yang ditentukan.",
- "documentation-count-scalar": "Mengembalikan jumlah elemen dalam vektor deret waktu sebagai skalar. Ini bertentangan dengan operator agregasi `count()`, yang selalu mengembalikan vektor (kosong jika vektor input kosong) dan memungkinkan pengelompokan berdasarkan label melalui klausa `by`.",
- "documentation-day-of-month": "Mengembalikan hari dalam sebulan untuk setiap waktu yang diberikan dalam UTC. Nilai yang dikembalikan adalah dari 1 hingga 31.",
- "documentation-day-of-week": "Mengembalikan hari dalam seminggu untuk setiap waktu yang diberikan dalam UTC. Nilai yang dikembalikan adalah dari 0 hingga 6, di mana 0 berarti hari Minggu, dll.",
- "documentation-day-of-year": "Mengembalikan hari dalam setahun untuk setiap waktu yang diberikan dalam UTC. Nilai yang dikembalikan adalah dari 1 hingga 365 untuk tahun non-kabisat, dan 1 hingga 366 pada tahun kabisat.",
- "documentation-days-in-month": "Mengembalikan jumlah hari dalam sebulan untuk setiap waktu yang diberikan dalam UTC. Nilai yang dikembalikan adalah dari 28 hingga 31.",
- "documentation-deg": "Mengonversi radian ke derajat untuk semua elemen dalam v",
- "documentation-delta": "Menghitung perbedaan antara nilai pertama dan terakhir dari setiap elemen deret waktu dalam vektor rentang `v`, lalu mengembalikan vektor instan dengan delta dan label yang sesuai. Delta tersebut diekstrapolasi untuk mencakup seluruh rentang waktu yang ditentukan oleh pemilih vektor, sehingga memungkinkan hasil berupa bilangan non-integer meskipun nilai sampelnya semuanya bilangan bulat.",
- "documentation-deriv": "Menghitung turunan per detik dari deret waktu dalam vektor rentang `v`, menggunakan regresi linier sederhana.",
- "documentation-double-exponential-smoothing": "Menghasilkan nilai yang dihaluskan untuk deret waktu berdasarkan rentang dalam `v`. Semakin rendah faktor penghalusan `sf`, semakin besar bobot yang diberikan ke data lama. Semakin tinggi faktor tren `tf`, semakin banyak tren dalam data yang dipertimbangkan. `sf` dan `tf` harus antara 0 dan 1.",
- "documentation-drop-common-labels": "Menghapus semua label yang memiliki nama dan nilai yang sama di semua deret dalam vektor input.",
- "documentation-exp": "Menghitung fungsi eksponensial untuk semua elemen dalam `v`.\nKasus khusus adalah:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`",
- "documentation-floor": "Membulatkan nilai sampel dari semua elemen dalam `v` ke bilangan bulat terdekat.",
- "documentation-histogram-avg": "Mengembalikan rata-rata aritmatika dari nilai yang diamati yang disimpan dalam histogram asli. Sampel yang bukan histogram asli diabaikan dan tidak muncul dalam vektor yang dikembalikan.",
- "documentation-histogram-count": "Mengembalikan jumlah pengamatan yang disimpan dalam histogram asli.",
- "documentation-histogram-fraction": "Mengembalikan perkiraan fraksi pengamatan antara nilai bawah dan atas yang diberikan.",
- "documentation-histogram-quantile": "Menghitung φ-kuantil (0 ≤ φ ≤ 1) dari bucket `b` dari histogram. Sampel dalam 'b' adalah jumlah pengamatan di setiap bucket. Setiap sampel harus memiliki label `le` di mana nilai label menunjukkan batas atas inklusif dari bucket. (Sampel tanpa label seperti itu akan diabaikan tanpa peringatan.) Tipe metrik histogram secara otomatis menyediakan deret waktu dengan akhiran `_bucket` dan label yang sesuai.",
- "documentation-histogram-stddev": "Mengembalikan estimasi standar deviasi pengamatan dalam histogram asli, berdasarkan rata-rata geometris dari bucket tempat pengamatan berada.",
- "documentation-histogram-stdvar": "Mengembalikan perkiraan varians standar pengamatan dalam histogram asli.",
- "documentation-histogram-sum": "Mengembalikan jumlah pengamatan yang disimpan dalam histogram asli.",
- "documentation-holt-winters": "Diganti namanya menjadi double_exponential_smoothing di prometheus v3.x. Untuk versi prometheus yang sama dan lebih besar dari v3.0, gunakan double_exponential_smoothing. \n\nMenghasilkan nilai yang dihaluskan untuk deret waktu berdasarkan rentang dalam `v`. Semakin rendah faktor penghalusan `sf`, semakin besar bobot yang diberikan ke data lama. Semakin tinggi faktor tren `tf`, semakin banyak tren dalam data yang dipertimbangkan. `sf` dan `tf` harus antara 0 dan 1.",
- "documentation-hour": "Mengembalikan jam dalam sehari untuk setiap waktu yang diberikan dalam UTC. Nilai yang dikembalikan adalah dari 0 hingga 23.",
- "documentation-idelta": "Menghitung perbedaan antara dua sampel terakhir dalam vektor rentang `v`, mengembalikan vektor instan dengan delta dan label yang setara yang diberikan.",
- "documentation-increase": "Menghitung peningkatan dalam deret waktu pada vektor rentang. Pemutusan dalam monotonisitas (seperti pengaturan ulang penghitung akibat target dimulai ulang) disesuaikan secara otomatis. Nilai peningkatan diekstrapolasi untuk mencakup seluruh rentang waktu seperti yang ditentukan dalam pemilih vektor rentang, sehingga memungkinkan diperolehnya hasil non-integer meskipun penghitung hanya bertambah dalam satuan bulat.",
- "documentation-info": "Mengembalikan detail dan metadata terbaru tentang sekelompok metrik, seperti label dan nilai saat ini, tanpa melakukan perhitungan apa pun",
- "documentation-irate": "Menghitung laju kenaikan instan per detik dari deret waktu dalam vektor rentang, berdasarkan dua titik data terakhir. Pemutusan dalam monotonisitas (seperti reset penghitung karena target dimulai ulang) disesuaikan secara otomatis.",
- "documentation-label-join": "Untuk setiap deret waktu dalam `v`, gabungkan semua nilai dari semua `src_labels` menggunakan `separator` dan kembalikan rangkaian waktu dengan label `dst_label` yang berisi nilai yang digabungkan. Dalam fungsi ini, dapat ada sejumlah `src_labels`.",
- "documentation-label-replace": "Untuk setiap deret waktu dalam `v`, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)` mencocokkan ekspresi reguler `regex` terhadap label `src_label`. Jika cocok, rangkaian waktu dikembalikan dengan label `dst_label` diganti dengan perluasan `replacement`. `$1` diganti dengan subkelompok pertama yang cocok, `$2` dengan yang kedua, dll. Jika ekspresi reguler tidak cocok, deret waktu dikembalikan tanpa perubahan.",
- "documentation-last-over-time": "Nilai poin terbaru dalam interval yang ditentukan.",
- "documentation-ln": "Menghitung logaritma alami untuk semua elemen dalam `v`.\nKasus khusus adalah:\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`",
- "documentation-log10": "Menghitung logaritma desimal untuk semua elemen dalam `v`. Kasus khusus setara dengan yang ada di `ln`.",
- "documentation-log2": "Menghitung logaritma biner untuk semua elemen dalam `v`. Kasus khusus setara dengan yang ada di `ln`.",
- "documentation-max-over-time": "Nilai maksimum dari semua poin dalam interval yang ditentukan.",
- "documentation-min-over-time": "Nilai minimum dari semua poin dalam interval yang ditentukan.",
- "documentation-minute": "Mengembalikan menit dari jam untuk setiap waktu yang diberikan dalam UTC. Nilai yang dikembalikan adalah dari 0 hingga 59.",
- "documentation-month": "Mengembalikan bulan dalam setahun untuk setiap waktu yang diberikan dalam UTC. Nilai yang dikembalikan adalah dari 1 hingga 12, di mana 1 berarti Januari, dll.",
- "documentation-pi": "Mengembalikan pi",
- "documentation-predict-linear": "Memprediksi nilai deret waktu `t` detik dari sekarang, berdasarkan vektor rentang `v`, menggunakan regresi linier sederhana.",
- "documentation-present-over-time": "Nilai 1 untuk setiap deret dalam interval yang ditentukan.",
- "documentation-quantile-over-time": "Nilai φ-kuantil (0 ≤ φ ≤ 1) dalam interval yang ditentukan.",
- "documentation-rad": "Mengonversi derajat menjadi radian untuk semua elemen dalam v",
- "documentation-rate": "Menghitung laju peningkatan rata-rata per detik dari deret waktu dalam vektor rentang. Pemutusan monotonisitas (seperti reset penghitung akibat target yang dimulai ulang) akan disesuaikan secara otomatis. Selain itu, perhitungan ini juga melakukan ekstrapolasi hingga ke ujung rentang waktu, sehingga tetap memperhitungkan scrape yang terlewat atau ketidaksesuaian waktu antara siklus scrape dan periode waktu rentang.",
- "documentation-resets": "Untuk setiap deret waktu input, `resets(v range-vector)` mengembalikan jumlah reset penghitung dalam rentang waktu yang diberikan sebagai vektor instan. Setiap penurunan nilai antara dua sampel berturut-turut ditafsirkan sebagai reset penghitung.",
- "documentation-round": "Membulatkan nilai sampel dari semua elemen dalam `v` ke bilangan bulat terdekat. Ikatan diselesaikan dengan pembulatan ke atas. Argumen opsional `to_nearest` memungkinkan untuk menentukan kelipatan terdekat di mana nilai sampel harus dibulatkan. Kelipatan ini juga mungkin pecahan.",
- "documentation-scalar": "Dengan vektor input elemen tunggal, `skalar(v instant-vector)` mengembalikan nilai sampel dari elemen tunggal tersebut sebagai skalar. Jika vektor input tidak memiliki satu elemen persis, `skalar` akan mengembalikan `NaN`.",
- "documentation-sgn": "Mengembalikan vektor dengan semua nilai sampel dikonversi ke tanda mereka, didefinisikan sebagai berikut: 1 jika v positif, -1 jika v negatif dan 0 jika v sama dengan nol.",
- "documentation-sort": "Mengembalikan elemen vektor yang diurutkan berdasarkan nilai sampelnya, dalam urutan naik.",
- "documentation-sort-desc": "Mengembalikan elemen vektor yang diurutkan berdasarkan nilai sampelnya, dalam urutan menurun.",
- "documentation-sqrt": "Menghitung akar kuadrat dari semua elemen dalam `v`.",
- "documentation-stddev-over-time": "Standar deviasi populasi dari nilai dalam interval yang ditentukan.",
- "documentation-stdvar-over-time": "Varians standar populasi dari nilai dalam interval yang ditentukan.",
- "documentation-sum-over-time": "Jumlah semua nilai dalam interval yang ditentukan.",
- "documentation-time": "Mengembalikan jumlah detik sejak 1 Januari 1970 UTC. Perhatikan bahwa ini tidak benar-benar mengembalikan waktu saat ini, tetapi waktu saat ekspresi dievaluasi.",
- "documentation-timestamp": "Mengembalikan stempel waktu dari setiap sampel vektor yang diberikan sebagai jumlah detik sejak 1 Januari 1970 UTC.",
- "documentation-vector": "Mengembalikan skalar `s` sebagai vektor tanpa label.",
- "documentation-year": "Mengembalikan tahun untuk setiap waktu yang diberikan dalam UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "menghitung arkus kosinus dari semua elemen di {{argument}}",
- "documentation-acosh": "menghitung kosinus hiperbolik inversi dari semua elemen di {{argument}}",
- "documentation-asin": "menghitung arcsin dari semua elemen di {{argument}}",
- "documentation-asinh": "menghitung sinus hiperbolik inversi dari semua elemen di {{argument}}",
- "documentation-atan": "menghitung arctangent dari semua elemen di {{argument}}",
- "documentation-atanh": "menghitung tanget hiperbolik inversi dari semua elemen di {{argument}}",
- "documentation-cos": "menghitung kosinus dari semua elemen di {{argument}}",
- "documentation-cosh": "menghitung kosinus hiperbolik dari semua elemen di {{argument}}",
- "documentation-sin": "menghitung sinus dari semua elemen di {{argument}}",
- "documentation-sinh": "menghitung sinus hiperbolik dari semua elemen di {{argument}}",
- "documentation-tan": "menghitung tangent dari semua elemen di {{argument}}",
- "documentation-tanh": "menghitung tanget hiperbolik dari semua elemen di {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Berikan umpan balik",
- "title-give-feedback": "Penjelajah metrik ini masih baru, beri tahu kami cara untuk meningkatkannya"
- },
- "get-collapsed-info": {
- "exemplars": "Contoh: {{value}}",
- "format": "Format: {{value}}",
- "legend": "Legenda: {{value}}",
- "step": "Langkah: {{value}}",
- "type": "Tipe: {{value}}"
- },
- "get-placeholders": {
- "browse": "Cari metrik berdasarkan nama",
- "type": "Filter berdasarkan jenis"
- },
- "get-prom-types": {
- "description-counter": "Metrik kumulatif yang merepresentasikan satu penghitung yang meningkat secara monoton, yang nilainya hanya dapat bertambah atau direset ke nol saat sistem dimulai ulang.",
- "description-gauge": "Metrik yang merepresentasikan satu nilai numerik yang dapat naik turun secara bebas.",
- "description-histogram": "Histogram mengambil sampel pengamatan (biasanya seperti durasi permintaan atau ukuran respons) dan menghitungnya dalam bucket yang dapat dikonfigurasi.",
- "description-native-histogram": "Histogram asli berbeda dari histogram Prometheus klasik dalam beberapa hal: Batas bucket pada histogram asli dihitung menggunakan rumus yang bergantung pada skala (resolusi) histogram, dan tidak ditentukan oleh pengguna.",
- "description-no-type": "Metrik ini tidak memiliki tipe yang ditentukan dalam metadata.",
- "description-summary": "Ringkasan mengambil sampel pengamatan (biasanya seperti durasi permintaan dan ukuran respons), dan dapat menghitung kuantil yang dapat dikonfigurasi selama rentang waktu geser.",
- "description-unknown": "Metrik ini telah diberi tipe yang tidak diketahui dalam metadata.",
- "label-counter": "Penghitung",
- "label-gauge": "Alat ukur",
- "label-histogram": "Histogram",
- "label-native-histogram": "Histogram asli",
- "label-no-type": "Tanpa tipe",
- "label-summary": "Ringkasan",
- "label-unknown": "Tidak diketahui"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Penguraian kueri mengalami masalah ketidakjelasan."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Hapus {{name}}",
- "placeholder-select-label": "Pilih label",
- "placeholder-select-value": "Pilih nilai"
- },
- "label-filters": {
- "label-filters": "Filter label",
- "label-label-filters": "Filter label",
- "tooltip-label-filters": "Opsional: digunakan untuk menyaring metrik yang dipilih untuk jenis kueri ini."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Memuat label",
- "noOptionsMessage-no-labels-found": "Tidak ada label yang ditemukan"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Buka penjelajah metrik",
- "placeholder-select-metric": "Pilih metrik",
- "tooltip-open-metrics-explorer": "Buka penjelajah metrik"
- },
- "label-metric": "Metrik",
- "tooltip-metric": "Opsional: mengembalikan daftar nilai label untuk nama label dalam metrik yang ditentukan."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Telusuri metrik",
- "currently-selected": "Sedang dipilih: {{selected}}",
- "metrics-pre-filtered": "Metrik ini telah difilter sebelumnya berdasarkan label yang dipilih di filter label.",
- "title-metrics-explorer": "Penjelajah metrik"
- },
- "nested-query": {
- "label": {
- "ignoring": "Mengabaikan",
- "on": "Aktif"
- },
- "operator": "Operator",
- "tooltip-remove-match": "Hapus kecocokan",
- "vector-matches": "Kecocokan vektor"
- },
- "operation-editor": {
- "not-found": "Operasi {{id}} tidak ditemukan",
- "title-remove": "Hapus {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Ganti dengan",
- "title-click-to-view-alternative-operations": "Klik untuk melihat operasi alternatif",
- "title-remove-operation": "Hapus operasi"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Klik untuk menampilkan deskripsi",
- "title-remove-operation": "Hapus operasi"
- },
- "operation-list": {
- "operations": "Operasi",
- "placeholder-search": "Cari",
- "title-add-operation": "Tambah operasi"
- },
- "operation-param-editor": {
- "title-add": "Tambahkan {{name}}",
- "title-remove": "Hapus {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Menghitung {{aggregationName}} berdasarkan dimensi sekaligus mempertahankan {{labelWord}} {{labels}}.",
- "label-default": "Menghitung {{aggregationName}} berdasarkan dimensi.",
- "label-without": "Menghitung {{aggregationName}} berdasarkan dimensi {{labels}}. Semua label lainnya dipertahankan."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Sakelar contoh.",
- "aria-label-format": "Format kotak kombo",
- "aria-label-lower-limit-parameter": "Kotak teks langkah minimum, tetapkan batas bawah untuk parameter langkah",
- "aria-label-select-resolution": "Pilih resolusi",
- "aria-label-type": "Ketik grup tombol radio",
- "format-options": {
- "label-heatmap": "Peta panas",
- "label-table": "Tabel",
- "label-time-series": "Deret waktu"
- },
- "label-exemplars": "Contoh",
- "label-format": "Format",
- "label-min-step": "Langkah minimum",
- "label-resolution": "Resolusi",
- "label-type": "Jenis",
- "placeholder-auto": "otomatis",
- "title-options": "Opsi",
- "tooltip-min-step": "Batas bawah tambahan untuk parameter langkah kueri Prometheus dan untuk variabel <2>{{interval}}2> dan <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Ada kesalahan sintaksis, atau struktur kueri tidak dapat divisualisasikan saat beralih ke mode pembuat. Bagian dari kueri mungkin hilang.",
- "confirmText-continue": "Lanjutkan",
- "kick-start-your-query": "Mulai kueri Anda",
- "label-explain": "Penjelasan",
- "run-queries": "Jalankan kueri",
- "title-parsing-error-switch-builder": "Terjadi kesalahan penguraian: Beralih ke mode pembuat?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Kotak kombo legenda",
- "label-legend": "Legenda",
- "placeholder-select-legend-mode": "Pilih mode legenda",
- "tooltip-legend": "Mengganti nama seri atau templat. Misalnya, {{templateExample}} akan diganti dengan nilai label untuk {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "petunjuk: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Pembangun",
- "label-code": "Kode"
- }
- },
- "query-pattern": {
- "apply-query": "Terapkan kueri",
- "aria-label-apply-query-starter-button": "tombol mulai terapkan kueri",
- "aria-label-back-button": "tombol kembali",
- "aria-label-create-new-query-button": "tombol buat kueri baru",
- "aria-label-raw-query": "Kueri {{patternName}} mentah",
- "aria-label-use-this-query-button": "tombol gunakan kueri ini",
- "back": "Kembali",
- "create-new-query": "Buat kueri baru",
- "use-this-query": "Gunakan kueri ini"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "tutup modal untuk memulai kueri Anda",
- "aria-label-kick-start-your-query-modal": "Mulai modal kueri Anda",
- "aria-label-toggle-query-starter": "buka dan tutup kartu pemula kueri {{patternType}}",
- "close": "Tutup",
- "description-kick-start-your-query": "Mulai kueri Anda dengan memilih salah satu kueri ini. Anda kemudian dapat melanjutkan untuk menyelesaikan kueri Anda.",
- "label-toggle-query-starter": "kueri awal {{patternType}}",
- "title-kick-start-your-query": "Mulai kueri Anda"
- },
- "raw-query": {
- "aria-label-selector": "selektor"
- },
- "results-table": {
- "content-descriptive-type": "Saat membuat {{descriptiveType}}, Prometheus mengekspos beberapa data seri dengan penghitung jenis. ",
- "description": "Deskripsi",
- "message-expand-label-filters": "Tidak ada metrik yang ditemukan. Coba perluas filter label Anda.",
- "message-expand-search": "Tidak ada metrik yang ditemukan. Coba perluas pencarian dan filter Anda.",
- "message-no-metrics-found": "Tidak ada metrik yang ditemukan di sumber data.",
- "name": "Nama",
- "type": "Jenis"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/it-IT/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/it-IT/grafana-prometheus.json
deleted file mode 100644
index b3e9c2ddf23..00000000000
--- a/packages/grafana-prometheus/src/locales/it-IT/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Errore di caricamento dei dati di annotazione!",
- "aria-label-lower-limit-parameter": "Imposta il limite inferiore per il parametro passaggio",
- "label-min-step": "Passaggio minimo",
- "label-series-value-as-timestamp": "Valore della serie come marca temporale",
- "label-tags": "Tag",
- "label-text": "Testo",
- "label-title": "Titolo",
- "placeholder-auto": "automatico",
- "tooltip-either-pattern-example-instance-replaced-label": "Usa il nome o un modello. Ad esempio, {{labelTemplate}} viene sostituito con il valore dell'etichetta per l'etichetta {{labelName}}.",
- "tooltip-min-step": "Un ulteriore limite inferiore per il parametro passaggio della query Prometheus e per le variabili <2>{{intervalVar}}2> e <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "L'unità di misura della marca temporale è millisecondi. Se l'unità di misura del valore della serie è secondi, moltiplica il suo vettore di intervallo per 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Esegui una query istantanea e una query di intervallo"
- },
- "label": {
- "both": "Entrambe"
- },
- "range-options": {
- "description": {
- "query-range": "Esegui query su un intervallo di tempo"
- },
- "label": {
- "instant": "Istantanea",
- "range": "Intervallo"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filtra espressione per etichetta",
- "description-select-labels": "Una volta selezionati i valori delle etichette, vengono mostrate solo le possibili combinazioni di etichette.",
- "select-labels-to-search-in": "2. Seleziona le etichette in cui cercare"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filtra espressione per metrica",
- "aria-label-limit-results-from-series-endpoint": "Limita i risultati dall'endpoint della serie",
- "description-series-limit": "Il limite si applica a tutte le metriche, etichette e valori. Lascia il campo vuoto per utilizzare il limite predefinito. Imposta su 0 per disabilitare il limite e recuperare tutto: ciò potrebbe causare problemi di prestazioni.",
- "label-select-metric": "Una volta selezionata una metrica, vengono mostrate solo le possibili etichette. Le etichette sono limitate dal limite della serie riportato di seguito.",
- "select-a-metric": "1. Seleziona una metrica",
- "series-limit": "Limite della serie"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Scheda di riferimento rapido PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Esempi",
- "tooltip-disable-query": "Disabilita query con esempi",
- "tooltip-enable-query": "Abilita query con esempi"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Campo aggiuntivo Prometheus",
- "aria-label-query-type-field": "Campo di tipo query",
- "aria-label-step-field": "Campo passaggio",
- "min-step": "Passaggio minimo",
- "query-type": "Tipo di query",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Qui è possibile utilizzare unità di tempo e variabili integrate, ad esempio: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (impostazione predefinita se non è specificata alcuna unità: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Inserisci una query PromQL…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Query classica",
- "aria-label-metric-regex": "Espressione regolare metrica",
- "aria-label-metric-selector": "Selettore metrica",
- "aria-label-prometheus-query": "Query Prometheus",
- "aria-label-query-type": "Tipo di query",
- "aria-label-series-query": "Query della serie",
- "label-classic-query": "Query classica",
- "label-label": "Etichetta",
- "label-metric-regex": "Espressione regolare metrica",
- "label-query": "Query",
- "label-query-type": "Tipo di query",
- "label-series-query": "Query della serie",
- "placeholder-classic-query": "Query classica",
- "placeholder-metric-regex": "Espressione regolare metrica",
- "placeholder-prometheus-query": "Query Prometheus",
- "placeholder-select-query-type": "Seleziona il tipo di query",
- "placeholder-series-query": "Query della serie",
- "returns-metrics-matching-specified-metric-regex": "Restituisce un elenco di metriche corrispondenti all'espressione regolare metrica specificata.",
- "tooltip-classic-query": "L'implementazione originale dell'editor di query variabile Prometheus. Inserisci una stringa con il tipo di query e i parametri corretti come descritto in questi documenti. Ad esempio, {{exampleQuery}}.",
- "tooltip-label": "Restituisce un elenco di valori di etichetta per il nome dell'etichetta in tutte le metriche, a meno che la metrica non sia specificata.",
- "tooltip-metric-regex": "Restituisce un elenco di nomi di etichette, filtrando facoltativamente in base all'espressione regolare metrica specificata.",
- "tooltip-query": "Restituisce un elenco di risultati della query Prometheus per la query. Questo può includere funzioni Prometheus, ad esempio {{exampleQuery}}.",
- "tooltip-query-type": "Il plugin dell'origine dati di Prometheus fornisce i seguenti tipi di query per le variabili del modello.",
- "tooltip-series-query": "Inserisci una metrica con etichette, solo una metrica o solo etichette, ad esempio {{example1}}, {{example2}} o {{example3}}. Restituisce un elenco di serie temporali associate ai dati inseriti."
- },
- "selector-actions": {
- "aria-label-selector": "selettore",
- "aria-label-selector-clear-button": "Pulsante Cancella selettore",
- "aria-label-use-selector-as-metrics-button": "Pulsante Usa selettore come metrica",
- "aria-label-use-selector-for-query-button": "Pulsante Usa selettore per query",
- "aria-label-validate-submit-button": "Pulsante Convalida invio",
- "clear": "Cancella",
- "resulting-selector": "4. Selettore risultante",
- "use-as-rate-query": "Usa come query di valutazione",
- "use-query": "Usa query",
- "validate-selector": "Convalida selettore"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filtra espressione per valori etichetta",
- "aria-label-values-for": "Valori per {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Utilizza il campo di ricerca per trovare i valori nelle etichette selezionate.",
- "select-multiple-values-for-your-labels": "3. Seleziona (più) valori per le tue etichette"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Consenti come destinazione delle regole di registrazione",
- "label-manage-alerts-via-alerting-ui": "Gestisci gli avvisi tramite l'interfaccia utente di avviso",
- "title-alerting": "Avvisi",
- "tooltip-allow-as-recording-rules-target": "Consenti a questa origine dati di essere selezionata come destinazione per la scrittura delle regole di registrazione.",
- "tooltip-manage-alerts-via-alerting-ui": "Gestisci le regole di avviso per questa origine dati. Per gestire altre risorse di avviso, aggiungi un'origine dati Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "La modalità di accesso al browser nell'origine dati di Prometheus non è più disponibile. Passa alla modalità di accesso al server.",
- "description-advanced-settings": "Le impostazioni aggiuntive sono opzionali e possono essere configurate per un maggiore controllo sull'origine dei dati.",
- "title-advanced-settings": "Impostazioni avanzate",
- "title-error": "Errore"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Il metodo di accesso è <1>Browser1>, quindi l'URL deve essere accessibile dal browser.",
- "tooltip-http-url": "Specifica un URL HTTP completo (ad esempio {{exampleURL}})",
- "tooltip-server-access-mode": "Il metodo di accesso è <1>Server1>, quindi l'URL deve essere accessibile dal server/back-end di Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Visita la documentazione per maggiori dettagli qui."
- },
- "exemplar-setting": {
- "label-data-source": "Origine dei dati",
- "label-internal-link": "Link interno",
- "label-label-name": "Nome etichetta",
- "label-remove-exemplar-link": "Rimuovi link di esempio",
- "label-url": "URL",
- "label-url-label": "Etichetta URL",
- "placeholder-go-to-examplecom": "Vai a example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Rimuovi link di esempio",
- "tooltip-data-source": "L'origine dati a cui l'esempio si collegherà.",
- "tooltip-internal-link": "Abilita questa opzione se disponi di un link interno. Quando è abilitata, questa opzione mostra il selettore dell'origine dati. Seleziona l'archivio dati di tracciamento di backend per i dati dell'esempio.",
- "tooltip-label-name": "Il nome del campo nell'oggetto etichette che deve essere utilizzato per ottenere il traceID.",
- "tooltip-url": "L'URL di backend della traccia a cui l'utente verrebbe indirizzato per visualizzarla",
- "tooltip-url-label": "Da utilizzare per sovrascrivere l'etichetta del pulsante sul campo traceID dell'esempio."
- },
- "exemplars-settings": {
- "add": "Aggiungi",
- "no-exemplars-configurations": "Nessuna configurazione di esempi",
- "title-exemplars": "Esemplari"
- },
- "prom-settings": {
- "aria-label-default-editor": "Editor predefinito (codice o generatore)",
- "aria-label-prom-type-type": "Tipo {{promType}}",
- "aria-label-prometheus-type": "Tipo Prometheus",
- "aria-label-select-http-method": "Seleziona il metodo HTTP",
- "editor-options": {
- "label-builder": "Builder",
- "label-code": "Codice"
- },
- "label-cache-level": "Livello cache",
- "label-custom-query-parameters": "Parametri di query personalizzati",
- "label-default-editor": "Editor predefinito",
- "label-disable-metrics-lookup": "Disabilita ricerca delle metriche",
- "label-disable-recording-rules-beta": "Disabilita regole di registrazione (beta)",
- "label-http-method": "Metodo HTTP",
- "label-incremental-querying-beta": "Query incrementale (beta)",
- "label-prom-type-version": "Versione {{promType}}",
- "label-prometheus-type": "Tipo Prometheus",
- "label-query-overlap-window": "Finestra di sovrapposizione delle query",
- "label-query-timeout": "Timeout query",
- "label-scrape-interval": "Intervallo di raccolta",
- "label-series-limit": "Limite della serie",
- "label-use-series-endpoint": "Usa endpoint della serie",
- "more-info": "Per ulteriori informazioni sulla configurazione del tipo e della versione di Prometheus nelle origini dati, consulta la <2>documentazione sul provisioning2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Esempio: {{example}}",
- "title-interval-behaviour": "Comportamento intervallo",
- "title-other": "Altro",
- "title-performance": "Performance",
- "title-query-editor": "Editor query",
- "tooltip-cache-level": "Imposta il livello di memorizzazione nella cache del browser per le query dell'editor. Si consigliano impostazioni della cache più elevate per origini dati ad alta cardinalità.",
- "tooltip-custom-query-parameters": "Aggiungi parametri personalizzati all'URL della query Prometheus. Ad esempio {{example1}}, {{example2}}, {{example3}} o {{example4}}. Più parametri devono essere concatenati insieme a {{concatenationChar}}.",
- "tooltip-default-editor": "Imposta l'opzione editor predefinita per tutti gli utenti di questa origine dati.",
- "tooltip-disable-metrics-lookup": "Selezionando questa opzione, il selettore di metriche e il supporto di metriche/etichette nel completamento automatico del campo di query verranno disabilitati. Questo è utile se hai problemi di prestazioni con istanze Prometheus più grandi. ",
- "tooltip-disable-recording-rules-beta": "Questa funzionalità disabiliterà le regole di registrazione. Attiva questa opzione per migliorare le prestazioni della dashboard",
- "tooltip-http-method": "Puoi utilizzare il metodo POST o GET HTTP per eseguire query sull'origine dati di Prometheus. POST è il metodo consigliato in quanto consente query più grandi. Usa GET se hai una versione di Prometheus precedente alla 2.1 o se le richieste POST sono limitate nella tua rete.",
- "tooltip-incremental-querying-beta": "Questa funzionalità modificherà il comportamento predefinito delle query relative per richiedere sempre dati aggiornati dall'istanza di Prometheus, mentre i risultati delle query verranno memorizzati nella cache e verranno richiesti solo i nuovi record. Attiva questa opzione per ridurre il carico del database e della rete.",
- "tooltip-prom-type-version": "Utilizza questa opzione per impostare la versione della tua istanza {{promType}} se non è configurata automaticamente.",
- "tooltip-prometheus-type": "Imposta questo valore sul tipo del tuo database Prometheus, ad esempio Prometheus, Cortex, Mimir o Thanos. La modifica di questo campo salverà le impostazioni correnti. Alcuni tipi di Prometheus supportano o meno varie API. Ad esempio, alcuni tipi supportano la corrispondenza delle espressioni regolari per le query delle etichette per migliorare le prestazioni. Alcuni tipi hanno un'API per i metadati. Se imposti questo valore in modo errato, potresti riscontrare un comportamento strano durante l'interrogazione di metriche ed etichette. Controlla la documentazione di Prometheus per assicurarti di inserire il tipo corretto.",
- "tooltip-query-overlap-window": "Imposta una durata come {{example1}} o {{example2}} o {{example3}}. Impostazione predefinita di {{default}}. Questa durata verrà aggiunta alla durata di ogni richiesta incrementale.",
- "tooltip-query-timeout": "Imposta il timeout della query Prometheus.",
- "tooltip-scrape-interval": "Questo intervallo indica la frequenza con cui Prometheus esegue la raccolta dei target. Imposta questo valore sull'intervallo di raccolta e valutazione tipico configurato nel file di configurazione di Prometheus. Se imposti questo valore su un valore maggiore dell'intervallo del file di configurazione di Prometheus, Grafana valuterà i dati in base a questo intervallo e vedrai meno punti dati. L'impostazione predefinita è {{default}}.",
- "tooltip-series-limit": "Il limite si applica a tutte le risorse (metriche, etichette e valori) per entrambi gli endpoint (serie ed etichette). Lascia il campo vuoto per utilizzare il limite predefinito (40000). Imposta su 0 per disabilitare il limite e recuperare tutto: ciò potrebbe causare problemi di prestazioni. Il limite predefinito è 40000.",
- "tooltip-use-series-endpoint": "Selezionando questa opzione, l'endpoint della serie con il parametro {{exampleParameter}} sarà preferito rispetto all'endpoint dei valori dell'etichetta con il parametro {{exampleParameter}}. Sebbene l'endpoint dei valori dell'etichetta sia considerato più performante, alcuni utenti potrebbero preferire la serie perché ha un metodo POST mentre l'endpoint dei valori dell'etichetta ha solo un metodo GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Disattivato)",
- "enabled-label": "Browser metriche"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Include solo etichette univoche",
- "description-custom": "Fornisci un modello di denominazione",
- "description-verbose": "Tutti i nomi e i valori delle etichette",
- "label-auto": "Automatico",
- "label-custom": "Personalizzazione",
- "label-verbose": "Dettagliata"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Calcola la media sulle dimensioni",
- "documentation-bottomk": "Elementi k più piccoli per valore campione",
- "documentation-count": "Conta il numero di elementi nel vettore",
- "documentation-count-values": "Conta il numero di elementi con lo stesso valore",
- "documentation-group": "Tutti i valori nel vettore risultante sono 1",
- "documentation-max": "Seleziona massimo su dimensioni",
- "documentation-min": "Seleziona minimo su dimensioni",
- "documentation-quantile": "Calcola φ-quantile (0 ≤ φ ≤ 1) su dimensioni",
- "documentation-stddev": "Calcola la deviazione standard della popolazione sulle dimensioni",
- "documentation-stdvar": "Calcola la varianza standard della popolazione sulle dimensioni",
- "documentation-sum": "Calcola la somma sulle dimensioni",
- "documentation-topk": "Elementi k più grandi per valore campione"
- },
- "getFunctions": {
- "documentation-abs": "Restituisce il vettore di input con tutti i valori di esempio convertiti nel loro valore assoluto.",
- "documentation-absent": "Restituisce un vettore vuoto se il vettore passato ad esso ha elementi e un vettore a 1 elemento con il valore 1 se il vettore passato ad esso non ha elementi. Questo è utile per avvisare quando non esistono serie temporali per un dato nome di metrica e combinazione di etichette.",
- "documentation-absent-over-time": "Restituisce un vettore vuoto se il vettore di intervallo passato ad esso ha elementi e un vettore a 1 elemento con il valore 1 se il vettore di intervallo passato ad esso non ha elementi.",
- "documentation-avg-over-time": "Il valore medio di tutti i punti nell'intervallo specificato.",
- "documentation-ceil": "Arrotonda i valori campione di tutti gli elementi in \"v\" al numero intero più vicino.",
- "documentation-changes": "Per ogni serie temporale di input, \"changes(v range-vector)\" restituisce il numero di volte in cui il suo valore è cambiato all'interno dell'intervallo di tempo fornito come vettore istantaneo.",
- "documentation-clamp": "Blocca i valori campione di tutti gli elementi in \"v\" per avere un limite inferiore di \"min\" e un limite superiore di \"max\".",
- "documentation-clamp-max": "Blocca i valori campione di tutti gli elementi in \"v\" per avere un limite superiore di \"max\".",
- "documentation-clamp-min": "Blocca i valori campione di tutti gli elementi in \"v\" per avere un limite inferiore di \"min\".",
- "documentation-count-over-time": "Il conteggio di tutti i valori nell'intervallo specificato.",
- "documentation-count-scalar": "Restituisce il numero di elementi in un vettore di serie temporali come scalare. Questo è in contrasto con l'operatore di aggregazione \"count()\", che restituisce sempre un vettore (uno vuoto se il vettore di input è vuoto) e consente il raggruppamento per etichette tramite una clausola \"by\".",
- "documentation-day-of-month": "Restituisce il giorno del mese per ciascuno degli orari specificati in UTC. I valori restituiti sono compresi tra 1 e 31.",
- "documentation-day-of-week": "Restituisce il giorno della settimana per ciascuno degli orari specificati in UTC. I valori restituiti sono compresi tra 0 e 6, dove 0 significa domenica, ecc.",
- "documentation-day-of-year": "Restituisce il giorno dell'anno per ciascuno degli orari specificati in UTC. I valori restituiti sono compresi tra 1 e 365 per gli anni non bisestili e tra 1 e 366 per gli anni bisestili.",
- "documentation-days-in-month": "Restituisce il numero di giorni del mese per ciascuno degli orari specificati in UTC. I valori restituiti sono compresi tra 28 e 31.",
- "documentation-deg": "Converte i radianti in gradi per tutti gli elementi in v",
- "documentation-delta": "Calcola la differenza tra il primo e l'ultimo valore di ciascun elemento della serie temporale in un vettore di intervallo \"v\", restituendo un vettore istantaneo con i delta dati e le etichette equivalenti. Il delta viene estrapolato per coprire l'intero intervallo di tempo come specificato nel selettore del vettore di intervallo, in modo che sia possibile ottenere un risultato non intero anche se i valori del campione sono tutti interi.",
- "documentation-deriv": "Calcola la derivata al secondo della serie temporale in un vettore di intervallo \"v\", utilizzando la regressione lineare semplice.",
- "documentation-double-exponential-smoothing": "Produce un valore livellato per le serie temporali in base all'intervallo in \"v\". Più basso è il fattore di livellamento \"sf\", maggiore è l'importanza data ai vecchi dati. Più alto è il fattore di tendenza \"tf\", più tendenze nei dati vengono considerate. Sia \"sf\" che \"tf\" devono essere compresi tra 0 e 1.",
- "documentation-drop-common-labels": "Elimina tutte le etichette che hanno lo stesso nome e valore in tutte le serie nel vettore di input.",
- "documentation-exp": "Calcola la funzione esponenziale per tutti gli elementi in \"v\".\nI casi speciali sono:\n* \"Exp(+Inf) = +Inf\" \n* \"Exp(NaN) = NaN\"",
- "documentation-floor": "Arrotonda i valori campione di tutti gli elementi in \"v\" al numero intero più vicino.",
- "documentation-histogram-avg": "Restituisce la media aritmetica dei valori osservati memorizzati in un istogramma nativo. I campioni che non sono istogrammi nativi vengono ignorati e non vengono visualizzati nel vettore restituito.",
- "documentation-histogram-count": "Restituisce il conteggio delle osservazioni memorizzate in un istogramma nativo.",
- "documentation-histogram-fraction": "Restituisce la frazione stimata di osservazioni tra i valori inferiore e superiore forniti.",
- "documentation-histogram-quantile": "Calcola il φ-quantile (0 ≤ φ ≤ 1) dai bucket \"b\" di un istogramma. I campioni in 'b' sono i conteggi delle osservazioni in ciascun bucket. Ogni campione deve avere un'etichetta \"le\" in cui il valore dell'etichetta indica il limite superiore inclusivo del bucket (i campioni senza tale etichetta vengono ignorati silenziosamente.) Il tipo di metrica dell'istogramma fornisce automaticamente le serie temporali con il suffisso \"_bucket\" e le etichette appropriate.",
- "documentation-histogram-stddev": "Restituisce la deviazione standard stimata delle osservazioni in un istogramma nativo, in base alla media geometrica dei bucket in cui si trovano le osservazioni.",
- "documentation-histogram-stdvar": "Restituisce la varianza standard stimata delle osservazioni in un istogramma nativo.",
- "documentation-histogram-sum": "Restituisce la somma delle osservazioni memorizzate in un istogramma nativo.",
- "documentation-holt-winters": "Rinominato come double_exponential_smoothing in prometheus v3.x. Per le versioni di prometheus uguali e superiori a v3.0, utilizza double_exponential_smoothing. \n\nProduce un valore livellato per le serie temporali in base all'intervallo in \"v\". Più basso è il fattore di livellamento \"sf\", maggiore è l'importanza data ai vecchi dati. Più alto è il fattore di tendenza \"tf\", più tendenze nei dati vengono considerate. Sia \"sf\" che \"tf\" devono essere compresi tra 0 e 1.",
- "documentation-hour": "Restituisce l'ora del giorno per ciascuno degli orari specificati in UTC. I valori restituiti sono compresi tra 0 e 23.",
- "documentation-idelta": "Calcola la differenza tra gli ultimi due campioni nel vettore di intervallo \"v\", restituendo un vettore istantaneo con i delta dati e le etichette equivalenti.",
- "documentation-increase": "Calcola l'incremento della serie temporale nel vettore di intervallo. Le interruzioni di monotonicità (come i reset del contatore dovuti ai riavvii del target) vengono regolate automaticamente. L'incremento viene estrapolato per coprire l'intero intervallo di tempo come specificato nel selettore del vettore di intervallo, in modo che sia possibile ottenere un risultato non intero anche se un contatore aumenta solo di incrementi interi.",
- "documentation-info": "Restituisce i dettagli e i metadati più recenti su un gruppo di metriche, come le etichette e i valori correnti, senza eseguire alcun calcolo",
- "documentation-irate": "Calcola il tasso di incremento istantaneo al secondo della serie temporale nel vettore di intervallo. Questo si basa sugli ultimi due punti dati. Le interruzioni di monotonicità (come i reset del contatore dovuti ai riavvii del target) vengono regolate automaticamente.",
- "documentation-label-join": "Per ogni serie temporale in \"v\", unisce tutti i valori di tutte le \"src_labels\" utilizzando \"separator\" e restituisce la serie temporale con l'etichetta \"dst_label\" contenente il valore unito. In questa funzione può esserci un numero qualsiasi di \"src_labels\".",
- "documentation-label-replace": "Per ogni serie temporale in \"v\", \"label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)\" corrisponde all'espressione regolare \"regex\" rispetto all'etichetta \"src_label\". Se corrisponde, la serie temporale viene restituita con l'etichetta \"dst_label\" sostituita dall'espansione di \"replacement\". \"$1\" viene sostituito con il primo sottogruppo corrispondente, \"$2\" con il secondo, ecc. Se l'espressione regolare non corrisponde, la serie temporale viene restituita invariata.",
- "documentation-last-over-time": "Il valore del punto più recente nell'intervallo specificato.",
- "documentation-ln": "Calcola il logaritmo naturale per tutti gli elementi in \"v\".\nI casi speciali sono:\n * \"ln(+Inf) = +Inf\"\n * \"ln(0) = -Inf\"\n * \"ln(x < 0) = NaN\"\n * \"ln(NaN) = NaN\"",
- "documentation-log10": "Calcola il logaritmo decimale per tutti gli elementi in \"v\". I casi speciali sono equivalenti a quelli in \"ln\".",
- "documentation-log2": "Calcola il logaritmo binario per tutti gli elementi in \"v\". I casi speciali sono equivalenti a quelli in \"ln\".",
- "documentation-max-over-time": "Il valore massimo di tutti i punti nell'intervallo specificato.",
- "documentation-min-over-time": "Il valore minimo di tutti i punti nell'intervallo specificato.",
- "documentation-minute": "Restituisce il minuto dell'ora per ciascuno degli orari specificati in UTC. I valori restituiti sono compresi tra 0 e 59.",
- "documentation-month": "Restituisce il mese dell'anno per ciascuno degli orari specificati in UTC. I valori restituiti sono compresi tra 1 e 12, dove 1 significa gennaio, ecc.",
- "documentation-pi": "Restituisce pi",
- "documentation-predict-linear": "Prevede il valore delle serie temporali \"t\" secondi da ora, in base al vettore di intervallo \"v\", utilizzando la regressione lineare semplice.",
- "documentation-present-over-time": "Il valore 1 per qualsiasi serie nell'intervallo specificato.",
- "documentation-quantile-over-time": "Il φ-quantile (0 ≤ φ ≤ 1) dei valori nell'intervallo specificato.",
- "documentation-rad": "Converte i gradi in radianti per tutti gli elementi in v",
- "documentation-rate": "Calcola il tasso medio di incremento al secondo della serie temporale nel vettore di intervallo. Le interruzioni di monotonicità (come i reset del contatore dovuti ai riavvii del target) vengono regolate automaticamente. Inoltre, il calcolo estrapola alle estremità dell'intervallo temporale, consentendo di perdere i graffi o l'allineamento imperfetto dei cicli di raschiatura con il periodo di tempo dell'intervallo.",
- "documentation-resets": "Per ogni serie temporale di input, \"resets(v range-vector)\" restituisce il numero di reset del contatore all'interno dell'intervallo di tempo fornito come vettore istantaneo. Qualsiasi diminuzione del valore tra due campioni consecutivi viene interpretata come un reset del contatore.",
- "documentation-round": "Arrotonda i valori campione di tutti gli elementi in \"v\" al numero intero più vicino. I pareggi vengono risolti arrotondando per eccesso. L'argomento facoltativo \"to_nearest\" consente di specificare il multiplo più vicino a cui devono essere arrotondati i valori campione. Questo multiplo può anche essere una frazione.",
- "documentation-scalar": "Dato un vettore di input a elemento singolo, \"scalar(v instant-vector)\" restituisce il valore campione di quel singolo elemento come scalare. Se il vettore di input non ha esattamente un elemento, \"scalar\" restituirà \"NaN\".",
- "documentation-sgn": "Restituisce un vettore con tutti i valori di esempio convertiti nel loro segno, definito come questo: 1 se v è positivo, -1 se v è negativo e 0 se v è uguale a zero.",
- "documentation-sort": "Restituisce gli elementi del vettore ordinati in base ai loro valori campione, in ordine crescente.",
- "documentation-sort-desc": "Restituisce gli elementi del vettore ordinati in base ai loro valori di esempio, in ordine decrescente.",
- "documentation-sqrt": "Calcola la radice quadrata di tutti gli elementi in \"v\".",
- "documentation-stddev-over-time": "La deviazione standard della popolazione dei valori nell'intervallo specificato.",
- "documentation-stdvar-over-time": "La varianza standard della popolazione dei valori nell'intervallo specificato.",
- "documentation-sum-over-time": "La somma di tutti i valori nell'intervallo specificato.",
- "documentation-time": "Restituisce il numero di secondi trascorsi dal 1° gennaio 1970 UTC. Si noti che questo non restituisce effettivamente l'ora corrente, ma l'ora in cui l'espressione deve essere valutata.",
- "documentation-timestamp": "Restituisce la marca temporale di ciascuno dei campioni del vettore specificato come numero di secondi dal 1° gennaio 1970 UTC.",
- "documentation-vector": "Restituisce lo scalare \"s\" come vettore senza etichette.",
- "documentation-year": "Restituisce l'anno per ciascuno degli orari specificati in UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "calcola l'arcocoseno di tutti gli elementi in {{argument}}",
- "documentation-acosh": "calcola il coseno iperbolico inverso di tutti gli elementi in {{argument}}",
- "documentation-asin": "calcola l'arcoseno di tutti gli elementi in {{argument}}",
- "documentation-asinh": "calcola il seno iperbolico inverso di tutti gli elementi in {{argument}}",
- "documentation-atan": "calcola l'arcotangente di tutti gli elementi in {{argument}}",
- "documentation-atanh": "calcola la tangente iperbolica inversa di tutti gli elementi in {{argument}}",
- "documentation-cos": "calcola il coseno di tutti gli elementi in {{argument}}",
- "documentation-cosh": "calcola il coseno iperbolico di tutti gli elementi in {{argument}}",
- "documentation-sin": "calcola il seno di tutti gli elementi in {{argument}}",
- "documentation-sinh": "calcola il seno iperbolico di tutti gli elementi in {{argument}}",
- "documentation-tan": "calcola la tangente di tutti gli elementi in {{argument}}",
- "documentation-tanh": "calcola la tangente iperbolica di tutti gli elementi in {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Lascia un feedback",
- "title-give-feedback": "L'esplora metriche è nuovo, facci sapere come possiamo migliorarlo"
- },
- "get-collapsed-info": {
- "exemplars": "Esempi: {{value}}",
- "format": "Formato: {{value}}",
- "legend": "Legenda: {{value}}",
- "step": "Incremento: {{value}}",
- "type": "Tipo: {{value}}"
- },
- "get-placeholders": {
- "browse": "Cerca metriche per nome",
- "type": "Filtra per tipo"
- },
- "get-prom-types": {
- "description-counter": "Una metrica cumulativa che rappresenta un singolo contatore monotonamente crescente il cui valore può solo aumentare o essere azzerato al riavvio.",
- "description-gauge": "Una metrica che rappresenta un singolo valore numerico che può arbitrariamente salire e scendere.",
- "description-histogram": "Un istogramma campiona le osservazioni (di solito cose come la durata delle richieste o le dimensioni delle risposte) e le conta in bucket configurabili.",
- "description-native-histogram": "Gli istogrammi nativi sono diversi dagli istogrammi classici di Prometheus in diversi modi: i limiti dei bucket degli istogrammi nativi sono calcolati da una formula che dipende dalla scala (risoluzione) dell'istogramma nativo e non sono definiti dall'utente.",
- "description-no-type": "Queste metriche non hanno un tipo definito nei metadati.",
- "description-summary": "Un riepilogo campiona le osservazioni (di solito cose come la durata delle richieste e le dimensioni delle risposte) e può calcolare quantili configurabili su una finestra temporale scorrevole.",
- "description-unknown": "A queste metriche è stato assegnato il tipo sconosciuto nei metadati.",
- "label-counter": "Contatore",
- "label-gauge": "Calibro",
- "label-histogram": "Istogramma",
- "label-native-histogram": "Istogramma nativo",
- "label-no-type": "Nessun tipo",
- "label-summary": "Riepilogo",
- "label-unknown": "Sconosciuto"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "L'analisi della query è ambigua."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Rimuovi {{name}}",
- "placeholder-select-label": "Seleziona etichetta",
- "placeholder-select-value": "Seleziona valore"
- },
- "label-filters": {
- "label-filters": "Filtri etichetta",
- "label-label-filters": "Filtri etichetta",
- "tooltip-label-filters": "Facoltativo: utilizzato per filtrare la metrica selezionata per questo tipo di query."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Caricamento delle etichette",
- "noOptionsMessage-no-labels-found": "Nessuna etichetta trovata"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Apri Esplora metriche",
- "placeholder-select-metric": "Seleziona metrica",
- "tooltip-open-metrics-explorer": "Apri Esplora metriche"
- },
- "label-metric": "Metrica",
- "tooltip-metric": "Facoltativo: restituisce un elenco di valori di etichetta per il nome dell'etichetta nella metrica specificata."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Sfoglia metriche",
- "currently-selected": "Attualmente selezionata: {{selected}}",
- "metrics-pre-filtered": "Queste metriche sono state pre-filtrate in base alle etichette scelte nei filtri delle etichette.",
- "title-metrics-explorer": "Esplora metriche"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignora",
- "on": "In data"
- },
- "operator": "Operatore",
- "tooltip-remove-match": "Rimuovi corrispondenza",
- "vector-matches": "Corrispondenze vettoriali"
- },
- "operation-editor": {
- "not-found": "{{id}} operazione non trovata",
- "title-remove": "Rimuovi {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Sostituisci con",
- "title-click-to-view-alternative-operations": "Fai clic per visualizzare operazioni alternative",
- "title-remove-operation": "Rimuovi operazione"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Fai clic per mostrare la descrizione",
- "title-remove-operation": "Rimuovi operazione"
- },
- "operation-list": {
- "operations": "Operazioni",
- "placeholder-search": "Cerca",
- "title-add-operation": "Aggiungi operazione"
- },
- "operation-param-editor": {
- "title-add": "Aggiungi {{name}}",
- "title-remove": "Rimuovi {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Calcola {{aggregationName}} sulle dimensioni preservando {{labelWord}} {{labels}}.",
- "label-default": "Calcola {{aggregationName}} sulle dimensioni.",
- "label-without": "Calcola {{aggregationName}} sulle dimensioni {{labels}}. Tutte le altre etichette vengono conservate."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Commutatori esemplari.",
- "aria-label-format": "Formatta casella combinata",
- "aria-label-lower-limit-parameter": "Casella di testo passaggio minimo, imposta il limite inferiore per il parametro passaggio",
- "aria-label-select-resolution": "Seleziona risoluzione",
- "aria-label-type": "Gruppo pulsanti di opzione di digitazione",
- "format-options": {
- "label-heatmap": "Mappa di calore",
- "label-table": "Tabella",
- "label-time-series": "Serie temporale"
- },
- "label-exemplars": "Esempi",
- "label-format": "Formato",
- "label-min-step": "Passaggio minimo",
- "label-resolution": "Risoluzione",
- "label-type": "Tipo",
- "placeholder-auto": "automatico",
- "title-options": "Opzioni",
- "tooltip-min-step": "Un ulteriore limite inferiore per il parametro passaggio della query Prometheus e per le variabili <2>{{interval}}2> e <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Si è verificato un errore di sintassi oppure la struttura della query non può essere visualizzata quando si passa alla modalità generatore. Parti della query potrebbero andare perse.",
- "confirmText-continue": "Continua",
- "kick-start-your-query": "Avvia la query",
- "label-explain": "Spiega",
- "run-queries": "Esegui query",
- "title-parsing-error-switch-builder": "Errore di analisi: passare alla modalità generatore?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Casella combinata legenda",
- "label-legend": "Legenda",
- "placeholder-select-legend-mode": "Seleziona la modalità legenda",
- "tooltip-legend": "Sovrascrittura o modello del nome della serie. Es. {{templateExample}} verrà sostituito con il valore dell'etichetta per {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "suggerimento: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Builder",
- "label-code": "Codice"
- }
- },
- "query-pattern": {
- "apply-query": "Applica query",
- "aria-label-apply-query-starter-button": "pulsante di avvio applica query",
- "aria-label-back-button": "pulsante indietro",
- "aria-label-create-new-query-button": "pulsante crea nuova query",
- "aria-label-raw-query": "query non elaborata {{patternName}}",
- "aria-label-use-this-query-button": "utilizza questo pulsante di query",
- "back": "Indietro",
- "create-new-query": "Crea nuova query",
- "use-this-query": "Utilizza questa query"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "chiudi avvia modalità query",
- "aria-label-kick-start-your-query-modal": "Avvia il modale della query",
- "aria-label-toggle-query-starter": "apri e chiudi la scheda di avvio della query {{patternType}}",
- "close": "Chiudi",
- "description-kick-start-your-query": "Avvia la query selezionando una di queste query. Ora puoi continuare a completare la query.",
- "label-toggle-query-starter": "Avvii query {{patternType}}",
- "title-kick-start-your-query": "Avvia la query"
- },
- "raw-query": {
- "aria-label-selector": "selettore"
- },
- "results-table": {
- "content-descriptive-type": "Quando si crea un {{descriptiveType}}, Prometheus mostra più serie con il contatore di tipo. ",
- "description": "Descrizione",
- "message-expand-label-filters": "Non sono state trovate metriche. Prova ad espandere i filtri delle etichette.",
- "message-expand-search": "Non sono state trovate metriche. Prova ad espandere la ricerca e i filtri.",
- "message-no-metrics-found": "Non sono state trovate metriche nell'origine dati.",
- "name": "Nome",
- "type": "Tipo"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/ja-JP/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/ja-JP/grafana-prometheus.json
deleted file mode 100644
index aacc83a18e4..00000000000
--- a/packages/grafana-prometheus/src/locales/ja-JP/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "注釈データの読み込みエラー!",
- "aria-label-lower-limit-parameter": "ステップパラメーターの下限を設定",
- "label-min-step": "最小ステップ",
- "label-series-value-as-timestamp": "タイムスタンプとしての系列値",
- "label-tags": "タグ",
- "label-text": "テキスト",
- "label-title": "タイトル",
- "placeholder-auto": "自動",
- "tooltip-either-pattern-example-instance-replaced-label": "名前またはパターンのいずれかを使用します。例えば、{{labelTemplate}}はラベル{{labelName}}のラベル値に置き換えられます。",
- "tooltip-min-step": "Prometheusクエリのステップパラメーターと<2>{{intervalVar}}2>および<4>{{rateIntervalVar}}4>変数の追加下限。",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "タイムスタンプの単位はミリ秒です。系列値の単位が秒の場合、その範囲ベクトルに1000を掛けます。"
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "インスタントクエリと範囲クエリを実行"
- },
- "label": {
- "both": "両方"
- },
- "range-options": {
- "description": {
- "query-range": "時間範囲にわたってクエリを実行"
- },
- "label": {
- "instant": "インスタント",
- "range": "範囲"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "ラベルのフィルター式",
- "description-select-labels": "ラベル値を選択すると、可能なラベルの組み合わせのみが表示されます。",
- "select-labels-to-search-in": "2. 検索するラベルを選択"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "メトリックのフィルター式",
- "aria-label-limit-results-from-series-endpoint": "系列エンドポイントからの結果を制限",
- "description-series-limit": "制限はすべてのメトリック、ラベル、値に適用されます。デフォルトの制限を使用するには、フィールドを空のままにしてください。制限を無効にしてすべてを取得するには0に設定します。これによりパフォーマンスの問題が発生する可能性があります。",
- "label-select-metric": "メトリックを選択すると、可能なラベルのみが表示されます。ラベルには以下の系列制限が適用されます。",
- "select-a-metric": "メトリックを選択",
- "series-limit": "系列制限"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQLチートシート"
- },
- "prom-exemplar-field": {
- "exemplars": "エグゼンプラー",
- "tooltip-disable-query": "エグゼンプラーを使用したクエリを無効化",
- "tooltip-enable-query": "エグゼンプラーを使用したクエリを有効化"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus追加フィールド",
- "aria-label-query-type-field": "クエリタイプフィールド",
- "aria-label-step-field": "ステップフィールド",
- "min-step": "最小ステップ",
- "query-type": "クエリタイプ",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "ここでは時間単位と組み込み変数を使用できます。例:{{example1}}、{{example2}}、{{example3}}、{{example4}}、{{example5}}、{{example6}}、{{example7}}(単位が指定されていない場合のデフォルト:{{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "PromQLクエリを入力…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "クラシッククエリ",
- "aria-label-metric-regex": "メトリック正規表現",
- "aria-label-metric-selector": "メトリックセレクター",
- "aria-label-prometheus-query": "Prometheusクエリ",
- "aria-label-query-type": "クエリタイプ",
- "aria-label-series-query": "系列クエリ",
- "label-classic-query": "クラシッククエリ",
- "label-label": "ラベル",
- "label-metric-regex": "メトリック正規表現",
- "label-query": "クエリ",
- "label-query-type": "クエリタイプ",
- "label-series-query": "系列クエリ",
- "placeholder-classic-query": "クラシッククエリ",
- "placeholder-metric-regex": "メトリック正規表現",
- "placeholder-prometheus-query": "Prometheusクエリ",
- "placeholder-select-query-type": "クエリタイプを選択",
- "placeholder-series-query": "系列クエリ",
- "returns-metrics-matching-specified-metric-regex": "指定された正規表現に一致するメトリックのリストを返します。",
- "tooltip-classic-query": "Prometheus変数クエリエディターの元の実装。これらのドキュメントに記載されているように、正しいクエリタイプとパラメーターを含む文字列を入力してください。例:{{exampleQuery}}。",
- "tooltip-label": "メトリックが指定されていない限り、すべてのメトリックのラベル名に対するラベル値のリストを返します。",
- "tooltip-metric-regex": "ラベル名のリストを返します。オプションで、指定されたメトリック正規表現でフィルタリングすることも可能です。",
- "tooltip-query": "クエリのPrometheusクエリ結果のリストを返します。これには、Prometheus関数を含めることもできます。例: {{exampleQuery}}。",
- "tooltip-query-type": "Prometheusデータソースプラグインは、テンプレート変数に以下のクエリタイプを入力します。",
- "tooltip-series-query": "ラベル付きメトリック、メトリックのみ、またはラベルのみを入力します。例: {{example1}}、{{example2}}、または{{example3}}。入力されたデータに関連する時系列のリストを返します。"
- },
- "selector-actions": {
- "aria-label-selector": "セレクター",
- "aria-label-selector-clear-button": "セレクタークリアボタン",
- "aria-label-use-selector-as-metrics-button": "メトリックボタンにセレクターを使用",
- "aria-label-use-selector-for-query-button": "クエリボタンにセレクターを使用",
- "aria-label-validate-submit-button": "送信ボタンを検証",
- "clear": "消去",
- "resulting-selector": "4. 結果セレクター",
- "use-as-rate-query": "レートクエリとして使用",
- "use-query": "このクエリを使用",
- "validate-selector": "セレクターを検証"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "ラベル値のフィルター式",
- "aria-label-values-for": "{{labelKey}}の値",
- "description-search-field-values-across-selected-labels": "検索フィールドを使用して選択したラベル全体の値を検索します。",
- "select-multiple-values-for-your-labels": "3. ラベルの値を(複数)選択"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "記録ルールのターゲットとして許可",
- "label-manage-alerts-via-alerting-ui": "アラートUIでアラートを管理",
- "title-alerting": "アラート",
- "tooltip-allow-as-recording-rules-target": "このデータソースを記録ルール書き込みのターゲットとして選択できるようにします。",
- "tooltip-manage-alerts-via-alerting-ui": "このデータソースのアラートルールを管理します。他のアラートリソースを管理するには、Alertmanagerデータソースを追加します。"
- },
- "config-editor": {
- "browser-access-mode-error": "Prometheusデータソースのブラウザアクセスモードは利用できなくなりました。サーバーアクセスモードに切り替えてください。",
- "description-advanced-settings": "追加設定は、データソースをより詳細に制御するために指定できるオプション設定です。",
- "title-advanced-settings": "詳細設定",
- "title-error": "エラー"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "アクセス方法は<1>ブラウザ1>です。つまり、URLにブラウザからアクセスできる必要があります。",
- "tooltip-http-url": "完全なHTTP URLを指定してください(例: {{exampleURL}})",
- "tooltip-server-access-mode": "アクセス方法は<1>サーバー1>です。つまり、URLにGrafanaバックエンド/サーバーからアクセスできる必要があります。"
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "詳細についてはこちらのドキュメントをご覧ください。"
- },
- "exemplar-setting": {
- "label-data-source": "データソース",
- "label-internal-link": "内部リンク",
- "label-label-name": "ラベル名",
- "label-remove-exemplar-link": "エグゼンプラーリンクを削除",
- "label-url": "URL",
- "label-url-label": "URLラベル",
- "placeholder-go-to-examplecom": "example.comに移動",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "エグゼンプラーリンクを削除",
- "tooltip-data-source": "エグゼンプラーによる移動先のデータソース。",
- "tooltip-internal-link": "内部リンクがある場合は、このオプションを有効にしてください。有効にすると、データソースセレクターが表示されます。エグゼンプラーデータのバックエンドトレーシングデータストアを選択してください。",
- "tooltip-label-name": "traceIDを取得するために使用されるラベルオブジェクト内のフィールド名。",
- "tooltip-url": "ユーザーがトレースを確認するためにアクセスするトレースバックエンドのURL",
- "tooltip-url-label": "エグゼンプラーのtraceIDフィールドのボタンラベルを上書きするために使用します。"
- },
- "exemplars-settings": {
- "add": "追加",
- "no-exemplars-configurations": "エグゼンプラー設定がありません",
- "title-exemplars": "エグゼンプラー"
- },
- "prom-settings": {
- "aria-label-default-editor": "デフォルトエディター(コードまたはビルダー)",
- "aria-label-prom-type-type": "{{promType}}タイプ",
- "aria-label-prometheus-type": "Prometheusタイプ",
- "aria-label-select-http-method": "HTTPメソッドを選択",
- "editor-options": {
- "label-builder": "ビルダー",
- "label-code": "コード"
- },
- "label-cache-level": "キャッシュレベル",
- "label-custom-query-parameters": "カスタムクエリパラメーター",
- "label-default-editor": "デフォルトエディター",
- "label-disable-metrics-lookup": "メトリック検索を無効化",
- "label-disable-recording-rules-beta": "記録ルールを無効化(ベータ版)",
- "label-http-method": "HTTPメソッド",
- "label-incremental-querying-beta": "増分クエリ(ベータ版)",
- "label-prom-type-version": "{{promType}}バージョン",
- "label-prometheus-type": "Prometheusタイプ",
- "label-query-overlap-window": "クエリ重複ウィンドウ",
- "label-query-timeout": "クエリタイムアウト",
- "label-scrape-interval": "スクレイプ間隔",
- "label-series-limit": "系列制限",
- "label-use-series-endpoint": "系列エンドポイントを使用",
- "more-info": "データソースでのPrometheusタイプとバージョンの設定の詳細については、<2>プロビジョニングドキュメント2>をご覧ください。",
- "placeholder-example-maxsourceresolutionmtimeout": "例:{{example}}",
- "title-interval-behaviour": "間隔の動作",
- "title-other": "その他",
- "title-performance": "パフォーマンス",
- "title-query-editor": "クエリエディター",
- "tooltip-cache-level": "エディタークエリのブラウザーキャッシュレベルを設定します。高カーディナリティデータソースには、より高いキャッシュ設定を推奨します。",
- "tooltip-custom-query-parameters": "PrometheusクエリURLにカスタムパラメーターを追加します。例: {{example1}}、{{example2}}、{{example3}}、または{{example4}}。複数のパラメーターは{{concatenationChar}}で連結する必要があります。",
- "tooltip-default-editor": "このデータソースのすべてのユーザーにデフォルトエディターオプションを設定します。",
- "tooltip-disable-metrics-lookup": "このオプションをオンにすると、クエリフィールドのオートコンプリートでメトリック選択とメトリック/ラベルサポートが無効になります。これは、大規模なPrometheusインスタンスをご利用でパフォーマンスの問題がある場合に役立ちます。",
- "tooltip-disable-recording-rules-beta": "この機能は記録ルールを無効にします。ダッシュボードのパフォーマンスを向上させるには、この機能をオンにしてください",
- "tooltip-http-method": "PrometheusデータソースをクエリするにはPOSTまたはGET HTTPメソッドのいずれかを使用できます。POSTメソッドだと、より大きなクエリを実行できるため、推奨される方法です。Prometheusのバージョンが2.1より古い場合、またはネットワークでPOSTリクエストが制限されている場合は、これをGETに変更してください。",
- "tooltip-incremental-querying-beta": "この機能は相対クエリのデフォルト動作が変更され、常にPrometheusインスタンスから新しいデータをリクエストする代わりに、クエリ結果をキャッシュして新しいレコードのみをリクエストするようになります。データベースとネットワークの負荷を軽減するには、これをオンにしてください。",
- "tooltip-prom-type-version": "自動設定されていない場合、これを使用して{{promType}}インスタンスのバージョンを設定してください。",
- "tooltip-prometheus-type": "Prometheus、Cortex、Mimir、Thanosなど、Prometheusデータベースのタイプに設定してください。このフィールドを変更すると、現在の設定が保存されます。一部のPrometheusのタイプでは、さまざまなAPIがサポートされているか、またはサポートされていない場合があります。例えば、一部のタイプではパフォーマンス向上のためにラベルクエリの正規表現マッチングをサポートしています。また、タイプによってはメタデータ用のAPIがあります。これを正しく設定しないと、メトリックとラベルのクエリ時に異常な動作が発生する可能性があります。正しいタイプを入力するために、Prometheusのドキュメントを確認してください。",
- "tooltip-query-overlap-window": "{{example1}}や{{example2}}または{{example3}}のような期間を設定してください。デフォルトは{{default}}です。この期間は、各増分リクエストの期間に追加されます。",
- "tooltip-query-timeout": "Prometheusクエリタイムアウトを設定します。",
- "tooltip-scrape-interval": "この間隔は、Prometheusがターゲットをスクレイプする頻度です。Prometheus設定ファイルで指定された一般的なスクレイプと評価間隔に設定してください。これをPrometheus設定ファイルの間隔より大きな値に設定すると、Grafanaはこの間隔に従ってデータを評価するため、データポイントが少なくなります。デフォルトは{{default}}です。",
- "tooltip-series-limit": "制限は両方のエンドポイント(系列とラベル)のすべてのリソース(メトリック、ラベル、値)に適用されます。デフォルトの制限(40000)を使用するには、フィールドを空のままにしてください。制限を無効にしてすべてを取得するには0に設定します。これによりパフォーマンスの問題が発生する可能性があります。デフォルトの制限は40000です。",
- "tooltip-use-series-endpoint": "このオプションをオンにすると、{{exampleParameter}}パラメーターを持つラベル値エンドポイントより、{{exampleParameter}}パラメーターを持つ系列エンドポイントが優先されます。ラベル値エンドポイントの方がパフォーマンスが高いと考えられていますが、ラベル値エンドポイントにはGETメソッドしかないのに対し、系列にはPOSTメソッドがあるため、系列を好むユーザーもいます。"
- }
- },
- "metrics-browser": {
- "disabled-label": "(無効化)",
- "enabled-label": "メトリックブラウザ"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "一意のラベルのみを含む",
- "description-custom": "命名テンプレートを提供する",
- "description-verbose": "すべてのラベル名と値",
- "label-auto": "自動",
- "label-custom": "カスタム",
- "label-verbose": "詳細"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "次元間の平均を計算",
- "documentation-bottomk": "サンプル値が最小のk個の要素",
- "documentation-count": "ベクトル内の要素数をカウント",
- "documentation-count-values": "同じ値を持つ要素の数をカウントする",
- "documentation-group": "結果のベクトルのすべての値は1です",
- "documentation-max": "次元での最大値を選択",
- "documentation-min": "次元での最小値を選択",
- "documentation-quantile": "次元間でφ分位数 (0 ≤ φ ≤ 1) を計算します",
- "documentation-stddev": "次元にわたる母集団標準偏差を計算",
- "documentation-stdvar": "次元にわたる母集団標準分散を計算",
- "documentation-sum": "次元の合計を計算",
- "documentation-topk": "サンプル値が最大のk個の要素"
- },
- "getFunctions": {
- "documentation-abs": "すべてのサンプル値が絶対値に変換された入力ベクトルを返します。",
- "documentation-absent": "渡されたベクトルに要素がある場合は空のベクトルを返し、渡されたベクトルに要素がない場合は値1の1要素ベクトルを返します。これは、指定されたメトリック名とラベルの組み合わせに時系列が存在しない場合に警告するのに役立ちます。",
- "documentation-absent-over-time": "渡された範囲ベクトルに要素がある場合は空のベクトルを返し、渡された範囲ベクトルに要素がない場合は値1の1要素ベクトルを返します。",
- "documentation-avg-over-time": "指定された間隔内のすべてのポイントの平均値。",
- "documentation-ceil": "「v」のすべての要素のサンプル値を最も近い整数に切り上げます。",
- "documentation-changes": "入力時系列ごとに、'changes(v range-vector)'は、指定された時間範囲内でその値が変更された回数をインスタントベクトルとして返します。",
- "documentation-clamp": "「v」のすべての要素のサンプル値を「min」の下限と「max」の上限に固定します。",
- "documentation-clamp-max": "「v」のすべての要素のサンプル値を「max」の上限に固定します。",
- "documentation-clamp-min": "「v」のすべての要素のサンプル値を「min」の下限に固定します。",
- "documentation-count-over-time": "指定された間隔のすべての値の個数。",
- "documentation-count-scalar": "時系列ベクトルの要素数をスカラーとして返します。これは、常にベクトル (入力ベクトルが空の場合は空のベクトル) を返し、「by」句を介してラベルでグループ化できる「count()」集計演算子とは対照的です。",
- "documentation-day-of-month": "UTCで指定された各時間の月の日を返します。返される値は1から31です。",
- "documentation-day-of-week": "UTCで指定された各時間の曜日を返します。返される値は0から6までで、0は日曜日などを意味します。",
- "documentation-day-of-year": "指定された各時刻の1年の日をUTCで返します。返される値は、非うるう年では1から365、うるう年では1から366です。",
- "documentation-days-in-month": "UTCで指定された時間ごとに、その月の日数を返します。返される値は28から31です。",
- "documentation-deg": "vのすべての要素のラジアンを度に変換します",
- "documentation-delta": "範囲ベクトル「v」の各時系列要素の最初と最後の値の差を計算し、指定されたデルタと同等のラベルを持つインスタントベクトルを返します。デルタは、範囲ベクトルセレクターで指定されたフルタイム範囲をカバーするように外挿されるため、サンプル値がすべて整数であっても、非整数の結果を得ることができます。",
- "documentation-deriv": "単純な線形回帰を使用して、範囲ベクトル「v」の時系列の秒単位の導関数を計算します。",
- "documentation-double-exponential-smoothing": "「v」の範囲に基づいて、時系列の平滑化された値を生成します。平滑化係数「sf」が小さいほど、古いデータが重要になります。トレンド係数「tf」が高いほど、データのトレンドが考慮されます。「sf」と「tf」の両方が0と1の間でなければなりません。",
- "documentation-drop-common-labels": "入力ベクトルのすべての系列にわたって、同じ名前と値を持つすべてのラベルをドロップします。",
- "documentation-exp": "「v」のすべての要素の指数関数を計算します。\n特殊なケースは次のとおりです。\n* 'Exp(+Inf) = +Inf' \n* 'Exp(NaN) = NaN'",
- "documentation-floor": "「v」のすべての要素のサンプル値を最も近い整数に切り下げます。",
- "documentation-histogram-avg": "ネイティブヒストグラムに保存されている観測値の算術平均を返します。ネイティブヒストグラムではないサンプルは無視され、返されるベクトルには表示されません。",
- "documentation-histogram-count": "ネイティブヒストグラムに保存されている観測値の数を返します。",
- "documentation-histogram-fraction": "指定された下限値と上限値の間の観測値の推定割合を返します。",
- "documentation-histogram-quantile": "ヒストグラムのバケット「b」からφ分位数 (0 ≤ φ ≤ 1) を計算します。「b」のサンプルは、各バケットの観測値の数です。各サンプルにはラベル「le」が必要です。ラベル値は、バケットの上限を含むことを示します。(そのようなラベルのないサンプルは、黙って無視されます。) ヒストグラムメトリックタイプは、自動的に「_bucket」サフィックスと適切なラベルを持つ時系列を提供します。",
- "documentation-histogram-stddev": "観測値が存在するバケットの幾何平均に基づいて、ネイティブヒストグラムの観測値の推定標準偏差を返します。",
- "documentation-histogram-stdvar": "ネイティブヒストグラムの観測値の推定標準分散を返します。",
- "documentation-histogram-sum": "ネイティブヒストグラムに保存されている観測値の数を返します。",
- "documentation-holt-winters": "Prometheus v3.xでdouble_exponential_smoothingに名前が変更されました。v3.0以降のPrometheusバージョンでは、double_exponential_smoothingを使用してください。「v」の範囲に基づいて、時系列の平滑化された値を生成します。平滑化係数「sf」が小さいほど、古いデータが重要になります。トレンド係数「tf」が高いほど、データのトレンドが考慮されます。「sf」と「tf」の両方が0と1の間でなければなりません。",
- "documentation-hour": "UTCで指定された各時刻の時間を返します。返される値は0から23です。",
- "documentation-idelta": "範囲ベクトル「v」の最後の2つのサンプルの差を計算し、指定されたデルタと同等のラベルを持つインスタントベクトルを返します。",
- "documentation-increase": "範囲ベクトルの時系列の増加を計算します。単調性の破れ (ターゲットの再起動によるカウンターのリセットなど) は自動的に調整されます。増加は、範囲ベクトルセレクターで指定された全時間範囲をカバーするように外挿されるため、カウンターが整数だけ増加する場合でも、非整数の結果を得ることができます。",
- "documentation-info": "計算を行わずに、ラベルや現在の値など、メトリックのグループに関する最新の詳細とメタデータを返します",
- "documentation-irate": "範囲ベクトル内の時系列の1秒あたりの瞬間的な増加率を計算します。これは、最後の2つのデータポイントに基づいています。単調性の破れ (ターゲットの再起動によるカウンターのリセットなど) は自動的に調整されます。",
- "documentation-label-join": "「v」の各時系列について、「separator」を使用してすべての「src_labels」のすべての値を結合し、結合された値を含むラベル「dst_label」を持つ時系列を返します。この関数には任意の数の「src_labels」を含めることができます。",
- "documentation-label-replace": "「v」の各時系列について、「label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)」は、ラベル「src_label」に対して正規表現「regex」と一致します。一致する場合、時系列はラベル「dst_label」を「replacement」の拡張に置き換えて返されます。「$1」は最初の一致するサブグループに置き換えられ、「$2」は2番目などに置き換えられます。正規表現が一致しない場合、時系列は変更されずに返されます。",
- "documentation-last-over-time": "指定された間隔の最新のポイント値。",
- "documentation-ln": "「v」のすべての要素の自然対数を計算します。\n特殊なケースは次のとおりです。\n* 'ln(+Inf) = +Inf'\n * 'ln(0) = -Inf'\n * 'ln(x < 0) = NaN'\n * 'ln(NaN) = NaN'",
- "documentation-log10": "「v」のすべての要素の10進対数を計算します。特殊なケースは「ln」のケースと同等です。",
- "documentation-log2": "「v」のすべての要素の二進対数を計算します。特殊なケースは「ln」のケースと同等です。",
- "documentation-max-over-time": "指定された間隔内のすべてのポイントの最大値。",
- "documentation-min-over-time": "指定された間隔内のすべてのポイントの最小値。",
- "documentation-minute": "UTCで指定された各時間の分を返します。返される値は0から59です。",
- "documentation-month": "UTCで指定された各時間の年の月を返します。返される値は1から12までで、1は1月などを意味します。",
- "documentation-pi": "π (パイ) を返します",
- "documentation-predict-linear": "単純な線形回帰を使用して、範囲ベクトル「v」に基づいて、今から「t」秒後の時系列の値を予測します。",
- "documentation-present-over-time": "指定された間隔内の任意の系列の値1。",
- "documentation-quantile-over-time": "指定された間隔の値のφ分位数 (0 ≤ φ ≤ 1)。",
- "documentation-rad": "vのすべての要素の度数をラジアンに変換します",
- "documentation-rate": "範囲ベクトル内の時系列について、秒あたりの平均増加率を計算します。単調性の破れ (ターゲットの再起動によるカウンターのリセットなど) は自動的に調整されます。また、計算では時間範囲の端まで外挿を行い、スクレイプの見逃しや、スクレイプサイクルと範囲の期間との不完全なアライメントに対応します。",
- "documentation-resets": "入力時系列ごとに、'resets(v range-vector)'は、指定された時間範囲内のカウンターリセットの数をインスタントベクトルとして返します。2つの連続するサンプル間の値の減少は、カウンターリセットとして解釈されます。",
- "documentation-round": "「v」のすべての要素のサンプル値を最も近い整数に丸めます。端数は切り上げられます。オプションの「to_nearest」引数を使用すると、サンプル値を丸める最も近い倍数を指定できます。この倍数は分数でもかまいません。",
- "documentation-scalar": "単一要素の入力ベクトルを指定すると、'scalar(v instant-vector)'はその単一要素のサンプル値をスカラーとして返します。要素がちょうど1つでない場合、'scalar'は'NaN'を返します。",
- "documentation-sgn": "すべてのサンプル値が符号に変換されたベクトルを返します。これは次のように定義されます。vが正の場合は1、vが負の場合は-1、vがゼロの場合は0。",
- "documentation-sort": "サンプル値でソートされたベクトル要素を昇順で返します。",
- "documentation-sort-desc": "サンプル値で並べ替えたベクトル要素を降順で返します。",
- "documentation-sqrt": "「v」のすべての要素の平方根を計算します。",
- "documentation-stddev-over-time": "指定された間隔の値の母集団標準分散。",
- "documentation-stdvar-over-time": "指定された間隔の値の母集団標準分散。",
- "documentation-sum-over-time": "指定された間隔のすべての値の合計。",
- "documentation-time": "1970年1月1日 (UTC) 以降の秒数を返します。これは実際には現在の時刻を返すのではなく、式が評価される時刻を返すことに注意してください。",
- "documentation-timestamp": "指定されたベクトルの各サンプルのタイムスタンプを、1970年1月1日 (UTC) からの秒数として返します。",
- "documentation-vector": "スカラー値sをラベルのないベクトルとして返します。",
- "documentation-year": "UTCで指定された各時間の年を返します。"
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "{{argument}}のすべての要素のアークコサインを計算します",
- "documentation-acosh": "{{argument}}のすべての要素の逆双曲線コサインを計算します",
- "documentation-asin": "{{argument}}のすべての要素のアークサインを計算します",
- "documentation-asinh": "{{argument}}のすべての要素の逆双曲線サインを計算します",
- "documentation-atan": "{{argument}}のすべての要素のアークタンジェントを計算します",
- "documentation-atanh": "{{argument}}のすべての要素の逆双曲線タンジェントを計算します",
- "documentation-cos": "{{argument}}のすべての要素のコサインを計算します",
- "documentation-cosh": "{{argument}}のすべての要素の双曲線コサインを計算します",
- "documentation-sin": "{{argument}}のすべての要素のサインを計算します",
- "documentation-sinh": "{{argument}}のすべての要素の双曲線サインを計算します",
- "documentation-tan": "{{argument}}のすべての要素のタンジェントを計算します",
- "documentation-tanh": "{{argument}}のすべての要素の双曲線タンジェントを計算します"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "フィードバックを送信",
- "title-give-feedback": "メトリックエクスプローラーは新機能です。改善点についてお聞かせください"
- },
- "get-collapsed-info": {
- "exemplars": "例示データ:{{value}}",
- "format": "フォーマット:{{value}}",
- "legend": "凡例:{{value}}",
- "step": "ステップ値:{{value}}",
- "type": "タイプ:{{value}}"
- },
- "get-placeholders": {
- "browse": "名前でメトリックを検索",
- "type": "タイプで絞り込む"
- },
- "get-prom-types": {
- "description-counter": "単一の単調増加カウンターを表す累積メトリックです。その値は増加するか、再起動時にゼロにリセットされるかのみです。",
- "description-gauge": "任意に増減する単一の数値を表すメトリック。",
- "description-histogram": "ヒストグラムは、観測値 (通常はリクエスト期間や応答サイズなど) をサンプリングし、設定可能なバケットでカウントします。",
- "description-native-histogram": "ネイティブヒストグラムは、従来のPrometheusヒストグラムとは多くの点で異なります。ネイティブヒストグラムのバケット境界は、ネイティブヒストグラムのスケール (分解能) に依存する式によって計算され、ユーザー定義ではありません。",
- "description-no-type": "これらのメトリックには、メタデータで定義されたタイプがありません。",
- "description-summary": "要約は観測値 (通常はリクエスト期間や応答サイズなど) をサンプリングし、スライディング時間ウィンドウにわたって構成可能な分位数を計算できます。",
- "description-unknown": "これらのメトリックには、メタデータでunknownタイプが指定されています。",
- "label-counter": "カウンター",
- "label-gauge": "ゲージ",
- "label-histogram": "ヒストグラム",
- "label-native-histogram": "ネイティブヒストグラム",
- "label-no-type": "型なし",
- "label-summary": "概要",
- "label-unknown": "不明"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "クエリ解析が曖昧です。"
- }
- },
- "label-filter-item": {
- "aria-label-remove": "{{name}}を削除",
- "placeholder-select-label": "ラベルを選択",
- "placeholder-select-value": "値を選択"
- },
- "label-filters": {
- "label-filters": "ラベルフィルター",
- "label-label-filters": "ラベルフィルター",
- "tooltip-label-filters": "オプション:このクエリタイプのメトリック選択をフィルタリングするために使用します。"
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "ラベルを読み込み中",
- "noOptionsMessage-no-labels-found": "ラベルが見つかりません"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "メトリックエクスプローラーを開く",
- "placeholder-select-metric": "メトリックを選択",
- "tooltip-open-metrics-explorer": "メトリックエクスプローラーを開く"
- },
- "label-metric": "メトリック",
- "tooltip-metric": "オプション:指定されたメトリクスのラベル名に対するラベル値のリストを返します。"
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "メトリックを参照",
- "currently-selected": "現在選択中:{{selected}}",
- "metrics-pre-filtered": "これらのメトリックは、ラベルフィルターで選択されたラベルによって事前にフィルタリングされています。",
- "title-metrics-explorer": "メトリックエクスプローラー"
- },
- "nested-query": {
- "label": {
- "ignoring": "無視",
- "on": "オン"
- },
- "operator": "オペレーター",
- "tooltip-remove-match": "一致を削除",
- "vector-matches": "ベクトル一致"
- },
- "operation-editor": {
- "not-found": "操作{{id}}が見つかりません",
- "title-remove": "{{name}}を削除"
- },
- "operation-header": {
- "placeholder-replace-with": "次で置き換え",
- "title-click-to-view-alternative-operations": "クリックして代わりの操作を表示",
- "title-remove-operation": "操作を削除"
- },
- "operation-info-button": {
- "title-click-to-show-description": "クリックして説明を表示",
- "title-remove-operation": "操作を削除"
- },
- "operation-list": {
- "operations": "操作",
- "placeholder-search": "検索",
- "title-add-operation": "操作を追加"
- },
- "operation-param-editor": {
- "title-add": "{{name}}を追加",
- "title-remove": "{{name}}を削除"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "{{labelWord}}{{labels}}を保持しながら、次元間で{{aggregationName}}を計算します。",
- "label-default": "次元間で{{aggregationName}}を計算します。",
- "label-without": "{{labels}}次元間で{{aggregationName}}を計算します。他のすべてのラベルは保持されます。"
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "エグゼンプラーの切り替え。",
- "aria-label-format": "形式コンボボックス",
- "aria-label-lower-limit-parameter": "最小ステップテキストボックス、ステップパラメーターの下限を設定",
- "aria-label-select-resolution": "解像度を選択",
- "aria-label-type": "タイプラジオボタングループ",
- "format-options": {
- "label-heatmap": "ヒートマップ",
- "label-table": "テーブル",
- "label-time-series": "時系列"
- },
- "label-exemplars": "エグゼンプラー",
- "label-format": "形式",
- "label-min-step": "最小ステップ",
- "label-resolution": "解像度",
- "label-type": "種類",
- "placeholder-auto": "自動",
- "title-options": "オプション",
- "tooltip-min-step": "Prometheusクエリのステップパラメーターと<2>{{interval}}2>および<4>{{rateInterval}}4>変数の追加下限。"
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "構文エラーが発生しているか、ビルダーモードに切り替えたときにクエリ構造を視覚化できません。クエリの一部が失われる可能性があります。",
- "confirmText-continue": "続行",
- "kick-start-your-query": "クエリを開始",
- "label-explain": "説明",
- "run-queries": "クエリを実行",
- "title-parsing-error-switch-builder": "解析エラー:ビルダーモードに切り替えますか?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "凡例コンボボックス",
- "label-legend": "凡例",
- "placeholder-select-legend-mode": "凡例モードを選択",
- "tooltip-legend": "系列名の上書きまたはテンプレート。例:{{templateExample}}は{{labelName}}のラベル値に置き換えられます。"
- },
- "query-builder-hints": {
- "hint-details": "ヒント:{{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "ビルダー",
- "label-code": "コード"
- }
- },
- "query-pattern": {
- "apply-query": "クエリを適用",
- "aria-label-apply-query-starter-button": "クエリ適用開始ボタン",
- "aria-label-back-button": "戻るボタン",
- "aria-label-create-new-query-button": "新しいクエリ作成ボタン",
- "aria-label-raw-query": "{{patternName}}の生クエリ",
- "aria-label-use-this-query-button": "このクエリボタンを使用",
- "back": "戻る",
- "create-new-query": "新しいクエリを作成",
- "use-this-query": "このクエリを使用"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "クエリを開始モーダルを閉じる",
- "aria-label-kick-start-your-query-modal": "クエリモーダルを開始",
- "aria-label-toggle-query-starter": "{{patternType}}クエリ開始カードを開いて閉じる",
- "close": "閉じる",
- "description-kick-start-your-query": "これらのクエリの1つを選択してクエリを開始してください。その後、クエリを完了できます。",
- "label-toggle-query-starter": "{{patternType}}クエリスターター",
- "title-kick-start-your-query": "クエリを開始"
- },
- "raw-query": {
- "aria-label-selector": "セレクター"
- },
- "results-table": {
- "content-descriptive-type": "{{descriptiveType}}を作成する際、Prometheusはタイプカウンターで複数の系列を公開します。",
- "description": "説明",
- "message-expand-label-filters": "メトリックが見つかりません。ラベルフィルターを拡張してみてください。",
- "message-expand-search": "メトリックが見つかりません。検索とフィルターを拡張してみてください。",
- "message-no-metrics-found": "データソース内にメトリックが見つかりません。",
- "name": "名前",
- "type": "種類"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/ko-KR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/ko-KR/grafana-prometheus.json
deleted file mode 100644
index 8206408363e..00000000000
--- a/packages/grafana-prometheus/src/locales/ko-KR/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "주석 데이터 로드 오류!",
- "aria-label-lower-limit-parameter": "단계 매개변수에 대한 하한 설정",
- "label-min-step": "최소 단계",
- "label-series-value-as-timestamp": "타임스탬프로 표시된 계열 값",
- "label-tags": "태그",
- "label-text": "텍스트",
- "label-title": "제목",
- "placeholder-auto": "자동",
- "tooltip-either-pattern-example-instance-replaced-label": "이름 또는 패턴을 사용하세요. 예를 들어, {{labelTemplate}}은(는) {{labelName}} 라벨에 대한 라벨 값으로 대체됩니다.",
- "tooltip-min-step": "Prometheus 쿼리의 단계 매개변수와 <2>{{intervalVar}}2> 및 <4>{{rateIntervalVar}}4> 변수에 대한 추가적인 하한입니다.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "타임스탬프 단위는 밀리초입니다. 계열 값의 단위가 초인 경우, 범위 벡터에 1,000을 곱합니다."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "인스턴트 쿼리 및 범위 쿼리 실행"
- },
- "label": {
- "both": "둘 다"
- },
- "range-options": {
- "description": {
- "query-range": "특정 시간 범위에 대해 쿼리 실행"
- },
- "label": {
- "instant": "즉시",
- "range": "범위"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "라벨에 대한 표현식 필터링",
- "description-select-labels": "라벨 값을 선택하면, 가능한 라벨 조합만 표시됩니다.",
- "select-labels-to-search-in": "2. 검색할 라벨을 선택합니다."
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "메트릭에 대한 표현식 필터링",
- "aria-label-limit-results-from-series-endpoint": "시리즈 엔드포인트의 결과 제한",
- "description-series-limit": "제한은 모든 메트릭, 라벨, 값에 적용됩니다. 기본 한도를 사용하려면 필드를 비워 두세요. 한도를 비활성화하고 모든 것을 가져오려면 0으로 설정하세요. 이렇게 하면 성능 문제가 발생할 수 있습니다.",
- "label-select-metric": "메트릭을 선택하면, 가능한 라벨만 표시됩니다. 라벨은 아래의 시리즈 한도에 의해 제한됩니다.",
- "select-a-metric": "1. 메트릭을 선택합니다.",
- "series-limit": "시리즈 한도"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL 치트 시트"
- },
- "prom-exemplar-field": {
- "exemplars": "예제",
- "tooltip-disable-query": "예제를 사용한 쿼리 비활성화",
- "tooltip-enable-query": "예제를 사용한 쿼리 활성화"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus 추가 필드",
- "aria-label-query-type-field": "쿼리 유형 필드",
- "aria-label-step-field": "단계 필드",
- "min-step": "최소 단계",
- "query-type": "쿼리 유형",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "여기에서 시간 단위 및 기본 제공 변수를 사용할 수 있습니다. 예: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}}(단위가 지정되지 않은 경우 기본값: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "PromQL 쿼리를 입력하세요..."
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "클래식 쿼리",
- "aria-label-metric-regex": "메트릭 정규식",
- "aria-label-metric-selector": "메트릭 선택기",
- "aria-label-prometheus-query": "Prometheus 쿼리",
- "aria-label-query-type": "쿼리 유형",
- "aria-label-series-query": "시리즈 쿼리",
- "label-classic-query": "클래식 쿼리",
- "label-label": "라벨",
- "label-metric-regex": "메트릭 정규식",
- "label-query": "쿼리",
- "label-query-type": "쿼리 유형",
- "label-series-query": "시리즈 쿼리",
- "placeholder-classic-query": "클래식 쿼리",
- "placeholder-metric-regex": "메트릭 정규식",
- "placeholder-prometheus-query": "Prometheus 쿼리",
- "placeholder-select-query-type": "쿼리 유형 선택",
- "placeholder-series-query": "시리즈 쿼리",
- "returns-metrics-matching-specified-metric-regex": "지정된 메트릭 정규식과 매칭하는 메트릭 목록을 반환합니다.",
- "tooltip-classic-query": "Prometheus 변수 쿼리 편집기의 원래 구현입니다. 이 문서에 설명된 대로 올바른 쿼리 유형 및 매개변수가 있는 문자열을 입력합니다. 예: {{exampleQuery}}.",
- "tooltip-label": "메트릭이 지정되지 않은 한, 모든 메트릭에서 라벨 이름에 대한 라벨 값 목록을 반환합니다.",
- "tooltip-metric-regex": "필요에 따라 지정된 메트릭 정규식을 기준으로 필터링하여, 라벨 이름 목록을 반환합니다.",
- "tooltip-query": "쿼리에 대한 Prometheus 쿼리 결과 목록을 반환합니다. 여기에는 Prometheus 기능이 포함될 수 있습니다. 예: {{exampleQuery}}.",
- "tooltip-query-type": "Prometheus 데이터 소스 플러그인은 템플릿 변수에 대해 다음과 같은 쿼리 유형을 제공합니다.",
- "tooltip-series-query": "레이블이 있는 메트릭 또는 메트릭만 단독으로 또는 레이블만 단독으로 입력하세요. 예: {{example1}}, {{example2}}, {{example3}}. 입력된 데이터와 관련된 시계열 목록을 반환합니다."
- },
- "selector-actions": {
- "aria-label-selector": "선택기",
- "aria-label-selector-clear-button": "선택기 지우기 버튼",
- "aria-label-use-selector-as-metrics-button": "메트릭 버튼으로 선택기 사용",
- "aria-label-use-selector-for-query-button": "쿼리 버튼에 선택기 사용",
- "aria-label-validate-submit-button": "제출 버튼 유효성 검사",
- "clear": "초기화",
- "resulting-selector": "4. 결과로 나타난 선택기",
- "use-as-rate-query": "요율 쿼리로 사용",
- "use-query": "쿼리 사용",
- "validate-selector": "선택기 검증"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "라벨 값에 대한 필터 표현식",
- "aria-label-values-for": "{{labelKey}} 값",
- "description-search-field-values-across-selected-labels": "검색 필드를 사용하여 선택한 라벨 전체에서 값을 찾습니다.",
- "select-multiple-values-for-your-labels": "3. 라벨에 대한 (여러) 값을 선택합니다."
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "기록 규칙 대상으로 허용",
- "label-manage-alerts-via-alerting-ui": "경고 UI를 통해 경고를 관리합니다.",
- "title-alerting": "경고",
- "tooltip-allow-as-recording-rules-target": "이 데이터 소스를 기록 규칙 작성 대상으로 선택하도록 허용합니다.",
- "tooltip-manage-alerts-via-alerting-ui": "이 데이터 소스에 대한 경고 규칙을 관리합니다. 다른 Alerting 리소스를 관리하려면 Alertmanager 데이터 소스를 추가하세요."
- },
- "config-editor": {
- "browser-access-mode-error": "Prometheus 데이터 소스에서 브라우저 액세스 모드를 더 이상 사용할 수 없습니다. 서버 액세스 모드로 전환합니다.",
- "description-advanced-settings": "추가 설정은 데이터 소스를 보다 세부적으로 제어하기 위해 구성할 수 있는 선택적 설정입니다. ",
- "title-advanced-settings": "고급 설정",
- "title-error": "오류"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "액세스 방법이 <1>브라우저1>이므로 브라우저에서 URL에 액세스할 수 있어야 합니다.",
- "tooltip-http-url": "전체 HTTP URL을 지정(예: {{exampleURL}})합니다.",
- "tooltip-server-access-mode": "액세스 방법이 <1>서버1>이므로 Grafana 백엔드 또는 서버에서 URL에 액세스할 수 있어야 합니다."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "자세한 내용은 여기에서 문서를 참조하세요."
- },
- "exemplar-setting": {
- "label-data-source": "데이터 소스",
- "label-internal-link": "내부 링크",
- "label-label-name": "라벨 이름",
- "label-remove-exemplar-link": "예시 링크 제거",
- "label-url": "URL",
- "label-url-label": "URL 라벨",
- "placeholder-go-to-examplecom": "example.com으로 이동",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "추적 ID",
- "title-remove-exemplar-link": "예시 링크 제거",
- "tooltip-data-source": "예제에서 탐색할 데이터 소스입니다.",
- "tooltip-internal-link": "내부 링크가 있는 경우 이 옵션을 활성화합니다. 활성화하면, 데이터 소스 선택기가 표시됩니다. 예시 데이터에 대한 백엔드 추적 데이터 저장소를 선택합니다.",
- "tooltip-label-name": "추적 ID를 가져오는 데 사용해야 하는 라벨 개체 내 필드 이름입니다.",
- "tooltip-url": "사용자가 추적을 확인하기 위해 이동할 추적 백엔드의 URL입니다. ",
- "tooltip-url-label": "예제 추적 ID 필드의 버튼 라벨을 재정의하는 데 사용합니다."
- },
- "exemplars-settings": {
- "add": "추가",
- "no-exemplars-configurations": "예시 구성 없음",
- "title-exemplars": "예제"
- },
- "prom-settings": {
- "aria-label-default-editor": "기본 편집기(코드 또는 빌더)",
- "aria-label-prom-type-type": "{{promType}} 유형",
- "aria-label-prometheus-type": "Prometheus 유형",
- "aria-label-select-http-method": "HTTP 메소드 선택",
- "editor-options": {
- "label-builder": "빌더",
- "label-code": "코드"
- },
- "label-cache-level": "캐시 수준",
- "label-custom-query-parameters": "사용자 지정 쿼리 파라미터",
- "label-default-editor": "기본 편집기",
- "label-disable-metrics-lookup": "메트릭 조회 비활성화",
- "label-disable-recording-rules-beta": "기록 규칙 비활성화(베타)",
- "label-http-method": "HTTP 메소드",
- "label-incremental-querying-beta": "증분 쿼리(베타)",
- "label-prom-type-version": "{{promType}} 버전",
- "label-prometheus-type": "Prometheus 유형",
- "label-query-overlap-window": "쿼리 중복 창",
- "label-query-timeout": "쿼리 시간 초과",
- "label-scrape-interval": "스크레이핑 간격",
- "label-series-limit": "계열 한도",
- "label-use-series-endpoint": "계열 엔드포인트 사용",
- "more-info": "데이터 소스에서 prometheus 유형 및 버전을 구성하는 방법에 대한 자세한 내용은 <2>프로비저닝 문서2>를 참조하시기 바랍니다.",
- "placeholder-example-maxsourceresolutionmtimeout": "예: {{example}} ",
- "title-interval-behaviour": "간격 동작",
- "title-other": "기타",
- "title-performance": "성능",
- "title-query-editor": "쿼리 편집기",
- "tooltip-cache-level": "편집기 쿼리에 대한 브라우저 캐싱 수준을 설정합니다. 카디널리티(cardinality)가 높은 데이터 소스에는 더 높은 캐시 설정을 권장합니다.",
- "tooltip-custom-query-parameters": "Prometheus 쿼리 URL에 사용자 지정 매개변수를 추가합니다. 예: {{example1}}, {{example2}}, {{example3}}, {{example4}}. 여러 파라미터는 {{concatenationChar}}와(과) 함께 연결해야 합니다.",
- "tooltip-default-editor": "이 데이터 소스의 모든 사용자에 대한 기본 편집기 옵션을 설정합니다.",
- "tooltip-disable-metrics-lookup": "이 옵션을 선택하면, 쿼리 필드의 자동 완성에서 메트릭 선택기 및 메트릭/레이블 지원이 비활성화됩니다. 이는 대규모 Prometheus 인스턴스에서 성능 문제가 발생하는 경우에 유용합니다. ",
- "tooltip-disable-recording-rules-beta": "이 기능을 사용하면 기록 규칙이 비활성화됩니다. 대시보드 성능을 향상시키려면 이 기능을 켜세요.",
- "tooltip-http-method": "POST 또는 GET HTTP 메소드를 사용하여 Prometheus 데이터 소스를 쿼리할 수 있습니다. POST는 더 큰 쿼리를 허용하기 때문에 권장되는 메소드입니다. Prometheus 버전이 2.1보다 이전 버전이거나 네트워크에서 POST 요청이 제한되어 있는 경우 이를 GET으로 변경하세요.",
- "tooltip-incremental-querying-beta": "이 기능은 상대적 쿼리의 기본 동작을 항상 Prometheus 인스턴스에서 최신 데이터를 요청하도록 변경합니다. 대신 쿼리 결과가 캐시되고 새 레코드만 요청됩니다. 데이터베이스 및 네트워크 부하를 줄이려면 이 기능을 켜세요.",
- "tooltip-prom-type-version": "{{promType}} 인스턴스의 버전이 자동으로 구성되지 않은 경우 이를 사용하여 버전을 설정합니다.",
- "tooltip-prometheus-type": "이를 Prometheus 데이터베이스의 유형(예: Prometheus, Cortex, Mimir, Thanos)으로 설정합니다. 이 필드를 변경하면 현재 설정이 저장됩니다. Prometheus는 유형에 따라 다양한 API를 지원할 수도, 지원하지 않을 수도 있습니다. 예를 들어, 일부 유형은 성능을 개선하기 위해 라벨 쿼리에 대한 정규식 매칭을 지원합니다. 일부 유형에는 메타데이터용 API가 있습니다. 이를 잘못 설정하면, 메트릭 및 라벨을 쿼리할 때 이상 작동이 발생할 수 있습니다. Prometheus 설명서를 살펴보고 올바른 유형을 입력했는지 확인하세요.",
- "tooltip-query-overlap-window": "{{example1}}, {{example2}}, 또는 {{example3}} 등의 지속 시간을 설정합니다. 기본값은 {{default}}입니다. 이 기간은 각 증분 요청의 기간에 추가됩니다.",
- "tooltip-query-timeout": "Prometheus 쿼리 타임아웃을 설정합니다.",
- "tooltip-scrape-interval": "이 간격은 Prometheus가 대상을 스크레이핑하는 빈도입니다. 이를 Prometheus 구성 파일에서 구성된 일반적인 스크레이핑 및 평가 간격으로 설정합니다. 이 값을 Prometheus 구성 파일 간격보다 큰 값으로 설정하면, Grafana는 이 간격에 맞춰 데이터를 평가하며 데이터 포인트가 더 적게 표시됩니다. 기본값은 {{default}}입니다.",
- "tooltip-series-limit": "이 제한은 두 엔드포인트(계열 및 라벨)의 모든 리소스(메트릭, 라벨 및 값)에 적용됩니다. 기본 한도(40,000)를 사용하려면 필드를 비워 두세요. 한도를 비활성화하고 모든 것을 가져오려면 0으로 설정하세요. 이렇게 하면 성능 문제가 발생할 수 있습니다. 기본 한도는 40,000입니다.",
- "tooltip-use-series-endpoint": "이 옵션을 선택하면 {{exampleParameter}} 파라미터가 있는 라벨 값 엔드포인트보다 {{exampleParameter}} 파라미터가 있는 계열 엔드포인트가 선호됩니다. 라벨 값 엔드포인트가 성능이 더 우수한 것으로 간주되지만, 라벨 값 엔드포인트에는 GET 메서드만 있는 반면 계열 엔드포인트에는 POST 메소드가 있기 때문에 일부 사용자는 계열을 선호할 수 있습니다."
- }
- },
- "metrics-browser": {
- "disabled-label": "(비활성화됨)",
- "enabled-label": "메트릭 브라우저"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "고유 라벨만 포함",
- "description-custom": "이름 지정 템플릿 제공",
- "description-verbose": "모든 라벨 이름 및 값",
- "label-auto": "자동",
- "label-custom": "사용자 지정",
- "label-verbose": "자세히"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "차원에 대한 평균을 계산합니다",
- "documentation-bottomk": "샘플 값 기준으로 가장 작은 k개 요소",
- "documentation-count": "벡터 요소의 개수를 셉니다",
- "documentation-count-values": "동일한 값을 가진 요소의 개수를 셉니다",
- "documentation-group": "결과 벡터의 값은 모두 1입니다",
- "documentation-max": "차원에 대한 최대값을 선택합니다",
- "documentation-min": "차원에 대한 최소값을 선택합니다",
- "documentation-quantile": "차원에 대한 φ-분위수(0 ≤ φ ≤ 1)를 계산합니다",
- "documentation-stddev": "차원에 대한 모집단 표준 편차를 계산합니다",
- "documentation-stdvar": "차원에 대한 모집단 표준 분산을 계산합니다",
- "documentation-sum": "차원에 대한 합계를 계산합니다",
- "documentation-topk": "샘플 값 기준으로 가장 큰 k개 요소"
- },
- "getFunctions": {
- "documentation-abs": "모든 샘플 값이 절대값으로 변환된 입력 벡터를 반환합니다.",
- "documentation-absent": "전달된 벡터에 요소가 있으면 빈 벡터를 반환하고, 전달된 벡터에 요소가 없으면 값이 1인 요소 1개를 가진 벡터를 반환합니다. 이는 지정된 메트릭 이름 및 라벨 조합에 대한 시계열이 없을 경우 경고를 생성하는 데 유용합니다.",
- "documentation-absent-over-time": "전달된 범위 벡터에 요소가 있으면 빈 벡터를 반환하고, 전달된 범위 벡터에 요소가 없으면 값이 1인 요소 1개를 가진 벡터를 반환합니다.",
- "documentation-avg-over-time": "지정된 간격의 모든 포인트를 평균한 값입니다.",
- "documentation-ceil": "`v`에 속한 모든 요소의 샘플 값을 가장 가까운 정수로 반올림합니다.",
- "documentation-changes": "각 입력 시계열에 대해 `changes(v range-vector)`는 제공된 시간 범위 내에서 값이 변경된 횟수를 인스턴트 벡터로 반환합니다.",
- "documentation-clamp": "`v`에 속한 모든 요소의 샘플 값을 `min`의 하한과 `max`의 상한을 갖도록 고정합니다.",
- "documentation-clamp-max": "`v`에 속한 모든 요소의 샘플 값을 `max`의 상한을 갖도록 고정합니다.",
- "documentation-clamp-min": "`v`에 속한 모든 요소의 샘플 값을 `min`의 하한을 갖도록 고정합니다.",
- "documentation-count-over-time": "지정된 간격에 속한 모든 값을 계수한 값입니다.",
- "documentation-count-scalar": "시계열 벡터의 요소 수를 스칼라로 반환합니다. 이는 항상 벡터를 반환(입력 벡터가 비어 있는 경우 빈 벡터)하고 `by` 절을 통해 라벨별로 그룹화할 수 있는 `count()` 집계 연산자와는 다릅니다.",
- "documentation-day-of-month": "UTC로 지정된 각 시간에 대해 해당 월의 날을 반환합니다. 반환된 값은 1부터 31까지입니다.",
- "documentation-day-of-week": "UTC로 지정된 각 시간에 대한 요일을 반환합니다. 반환된 값은 0부터 6까지이며, 여기서 0은 일요일 등을 의미합니다.",
- "documentation-day-of-year": "UTC로 지정된 각 시간에 대해 해당 연도의 날을 반환합니다. 반환되는 값은 윤년이 아닌 경우 1부터 365까지, 윤년인 경우 1부터 366까지입니다.",
- "documentation-days-in-month": "UTC로 지정된 각 시간에 대해 해당 월의 일수를 반환합니다. 반환되는 값은 28부터 31까지입니다.",
- "documentation-deg": "v의 모든 요소에 대해 라디안을 도(degree)로 변환합니다",
- "documentation-delta": "범위 벡터 `v`의 각 시계열 요소의 첫 번째 값과 마지막 값의 차이를 계산하여 지정된 델타 및 동일한 라벨을 가진 인스턴트 벡터를 반환합니다. 델타는 범위 벡터 선택기에서 지정된 전체 시간 범위를 커버하도록 외삽되므로 샘플 값이 모두 정수인 경우에도 정수가 아닌 결과를 얻을 수 있습니다.",
- "documentation-deriv": "단순 선형 회귀를 사용하여 범위 벡터 `v`에서 시계열의 초당 도함수를 계산합니다.",
- "documentation-double-exponential-smoothing": "`v`의 범위를 토대로 시계열의 평활화 값을 생성합니다. 평활화 계수 `sf`가 낮을수록 이전 데이터의 중요성이 커집니다. 추세 계수 `tf`가 높을수록 데이터의 추세가 더 많이 고려됩니다. `sf`와 `tf` 모두 0과 1 사이여야 합니다.",
- "documentation-drop-common-labels": "입력 벡터의 모든 시리즈에서 이름과 값이 동일한 라벨을 모두 제거합니다.",
- "documentation-exp": "`v`의 모든 요소에 대한 지수 함수를 계산합니다.\n특수한 경우는 다음과 같습니다.\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`",
- "documentation-floor": "`v`에 속한 모든 요소의 샘플 값을 가장 가까운 정수로 내림합니다.",
- "documentation-histogram-avg": "기본 히스토그램에 저장된 관찰 값의 산술 평균을 반환합니다. 기본 히스토그램이 아닌 샘플은 무시되며 반환된 벡터에 표시되지 않습니다.",
- "documentation-histogram-count": "기본 히스토그램에 저장된 관찰값의 개수를 반환합니다.",
- "documentation-histogram-fraction": "제공된 하한값과 상한값 사이에 속한 관찰값의 추정 비율을 소수로 반환합니다.",
- "documentation-histogram-quantile": "히스토그램의 구간 `b`에서 φ-분위수(0 ≤ φ ≤ 1)를 계산합니다. `b`의 샘플은 각 구간의 관찰값의 개수입니다. 각 샘플에는 라벨 `le`가 있어야 하며 라벨 값은 버킷의 상한을 나타냅니다. (이러한 라벨이 없는 샘플은 자동으로 무시됩니다.) 히스토그램 메트릭 유형은 자동으로 `_bucket` 접미사와 적절한 라벨이 있는 시계열을 제공합니다.",
- "documentation-histogram-stddev": "관찰값이 있는 구간의 기하 평균을 토대로 기본 히스토그램에서 관찰값의 추정 표준 편차를 반환합니다.",
- "documentation-histogram-stdvar": "기본 히스토그램에서 관찰값의 추정 표준 분산을 반환합니다.",
- "documentation-histogram-sum": "기본 히스토그램에 저장된 관찰값의 합계를 반환합니다.",
- "documentation-holt-winters": "Prometheus v3.x에서 double_exponential_smoothing으로 이름이 변경되었습니다. Prometheus 버전이 v3.0 이상인 경우 double_exponential_smoothing을 사용하세요. \n\n`v`의 범위를 토대로 시계열의 평활화 값을 생성합니다. 평활화 계수 `sf`가 낮을수록 이전 데이터의 중요성이 커집니다. 추세 계수 `tf`가 높을수록 데이터의 추세가 더 많이 고려됩니다. `sf`와 `tf` 모두 0과 1 사이여야 합니다.",
- "documentation-hour": "UTC로 지정된 각 시간에 대해 해당 날의 시간을 반환합니다. 반환되는 값은 0부터 23까지입니다.",
- "documentation-idelta": "범위 벡터 `v`의 마지막 두 샘플 간의 차이를 계산하여 지정된 델타 및 동일한 라벨을 가진 인스턴트 벡터를 반환합니다.",
- "documentation-increase": "범위 벡터의 시계열 증가분을 계산합니다. 단조성 중단(예: 대상이 재시작되면서 카운터가 초기화되는 경우)은 자동으로 조정됩니다. 증가분은 범위 벡터 선택기에서 지정된 시간 범위 전체를 커버하도록 외삽되므로 카운터가 정수 단위로만 증가하는 경우에도 정수가 아닌 결과를 얻을 수 있습니다.",
- "documentation-info": "계산 없이 라벨 및 현재 값과 같은 메트릭 그룹에 대한 최신 세부 정보 및 메타데이터를 반환합니다",
- "documentation-irate": "마지막 두 데이터 포인트를 토대로 범위 벡터의 시계열 증가분의 초당 순간 속도를 계산합니다. 단조성 중단(예: 대상이 재시작되면서 카운터가 초기화되는 경우)은 자동으로 조정됩니다.",
- "documentation-label-join": "`v`의 각 시계열에 대해 `separator`를 사용하여 모든 `src_labels`의 모든 값을 결합하고 결합된 값이 포함된 라벨 `dst_label`을 가진 시계열을 반환합니다. 이 함수에는 `src_labels`를 제한 없이 여러 개 사용할 수 있습니다.",
- "documentation-label-replace": "`v`의 각 시계열에 대해 `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)`는 라벨 `src_label`에 대해 정규 표현식 `regex`를 매칭합니다. 정규식이 일치하면 라벨 `dst_label`이 `replacement`의 확장으로 대체되어 시계열이 반환됩니다. `$1`은 첫 번째 일치하는 하위 그룹으로, `$2`는 두 번째 하위 그룹으로 대체됩니다. 정규 표현식이 일치하지 않으면 시계열이 변경되지 않고 반환됩니다.",
- "documentation-last-over-time": "지정된 간격의 가장 최근 포인트 값입니다.",
- "documentation-ln": "`v`의 모든 요소에 대해 자연 로그를 계산합니다.\n특수한 경우는 다음과 같습니다.\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`",
- "documentation-log10": "`v`의 모든 요소에 대한 상용로그를 계산합니다. 특수한 경우는 `ln`의 경우와 동일합니다.",
- "documentation-log2": "`v`의 모든 요소에 대한 이진로그를 계산합니다. 특수한 경우는 `ln`의 경우와 동일합니다.",
- "documentation-max-over-time": "지정된 간격의 모든 포인트의 최대값입니다.",
- "documentation-min-over-time": "지정된 간격의 모든 포인트의 최소값입니다.",
- "documentation-minute": "UTC로 지정된 각 시간에 대해 해당 시간의 분을 반환합니다. 반환되는 값은 0부터 59까지입니다.",
- "documentation-month": "UTC로 지정된 각 시간에 대해 해당 연도의 월을 반환합니다. 반환되는 값은 1부터 12까지이며, 여기서 1은 1월 등을 의미합니다.",
- "documentation-pi": "파이(pi)를 반환합니다",
- "documentation-predict-linear": "단순 선형 회귀를 사용하여 범위 벡터 `v`를 토대로 현재부터 `t`초 후의 시계열 값을 예측합니다.",
- "documentation-present-over-time": "지정된 간격에 속한 모든 시리즈에 대한 값 1을 반환합니다.",
- "documentation-quantile-over-time": "지정된 간격에 속한 값의 φ-분위수(0 ≤ φ ≤ 1)입니다.",
- "documentation-rad": "v의 모든 요소에 대해 도(degree)를 라디안으로 변환합니다",
- "documentation-rate": "범위 벡터의 시계열 증가분의 초당 평균 속도를 계산합니다. 단조성 중단(예: 대상이 재시작되면서 카운터가 초기화되는 경우)은 자동으로 조정됩니다. 또한, 시간 범위의 끝까지 외삽하여 계산하기 때문에 스크레이프가 누락되거나 범위의 기간과 스크레이프 주기가 완전하게 일치하지 않더라도 문제없이 처리됩니다.",
- "documentation-resets": "각 입력 시계열에 대해 `resets(v range-vector)`는 제공된 시간 범위 내에서 카운터가 재설정된 횟수를 인스턴트 벡터로 반환합니다. 두 연속 샘플 사이의 값이 감소하면 카운터가 재설정된 것으로 해석합니다.",
- "documentation-round": "`v`의 모든 요소의 샘플 값을 가장 가까운 정수로 반올림합니다. 값이 정확히 중간인 경우에는 반올림하여 해결합니다. 선택 사항인 `to_nearest` 인수를 사용하면 샘플 값을 반올림할 가장 가까운 배수를 지정할 수 있습니다. 이 배수는 소수로도 지정할 수 있습니다.",
- "documentation-scalar": "단일 요소로 구성된 입력 벡터가 주어지면 `scalar(v instant-vector)`는 해당 단일 요소의 샘플 값을 스칼라로 반환합니다. 입력 벡터의 요소가 정확히 한 개가 아닌 경우 `scalar`는 `NaN`을 반환합니다.",
- "documentation-sgn": "모든 샘플 값이 부호로 변환된 벡터를 반환하며 다음과 같이 정의됩니다. v가 양수이면 1, v가 음수이면 -1, v가 0이면 0입니다.",
- "documentation-sort": "샘플 값에 따라 오름차순으로 정렬된 벡터 요소를 반환합니다.",
- "documentation-sort-desc": "샘플 값에 따라 내림차순으로 정렬된 벡터 요소를 반환합니다.",
- "documentation-sqrt": "`v`의 모든 요소의 제곱근을 계산합니다.",
- "documentation-stddev-over-time": "지정된 간격에 속한 값의 모집단 표준 편차입니다.",
- "documentation-stdvar-over-time": "지정된 간격에 속한 값의 모집단 표준 분산입니다.",
- "documentation-sum-over-time": "지정된 간격에 속한 모든 값의 합계입니다.",
- "documentation-time": "UTC 기준으로 1970년 1월 1일 이후의 초(seconds) 수를 반환합니다. 반환된 값은 실제 현재 시간이 아닌 표현식이 평가되는 시간을 기준으로 합니다.",
- "documentation-timestamp": "지정된 벡터의 각 샘플의 타임스탬프를 UTC 기준 1970년 1월 1일 이후의 초 수로 반환합니다.",
- "documentation-vector": "스칼라 `s`를 라벨이 없는 벡터로 반환합니다.",
- "documentation-year": "UTC로 지정된 각 시간에 대한 연도를 반환합니다."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "{{argument}}의 모든 요소의 아크코사인을 계산합니다",
- "documentation-acosh": "{{argument}}의 모든 요소의 역쌍곡 코사인을 계산합니다",
- "documentation-asin": "{{argument}}의 모든 요소의 아크사인을 계산합니다",
- "documentation-asinh": "{{argument}}의 모든 요소의 역쌍곡 사인을 계산합니다",
- "documentation-atan": "{{argument}}의 모든 요소의 아크탄젠트를 계산합니다",
- "documentation-atanh": "{{argument}}의 모든 요소의 역쌍곡 탄젠트를 계산합니다",
- "documentation-cos": "{{argument}}의 모든 요소의 코사인을 계산합니다",
- "documentation-cosh": "{{argument}}의 모든 요소의 쌍곡 코사인을 계산합니다",
- "documentation-sin": "{{argument}}의 모든 요소의 사인을 계산합니다",
- "documentation-sinh": "{{argument}}의 모든 요소의 쌍곡 사인을 계산합니다",
- "documentation-tan": "{{argument}}의 모든 요소의 탄젠트를 계산합니다",
- "documentation-tanh": "{{argument}}의 모든 요소의 쌍곡 탄젠트를 계산합니다"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "피드백 제출하기",
- "title-give-feedback": "메트릭 탐색기는 새로운 기능이니, 개선할 사항이 있다면, 저희 측에 알려주세요. "
- },
- "get-collapsed-info": {
- "exemplars": "예시: {{value}}",
- "format": "형식: {{value}}",
- "legend": "범례: {{value}}",
- "step": "단계: {{value}}",
- "type": "유형: {{value}}"
- },
- "get-placeholders": {
- "browse": "이름으로 메트릭 검색",
- "type": "유형으로 필터링"
- },
- "get-prom-types": {
- "description-counter": "단조 증가하는 단일 카운터를 나타내는 누적 메트릭으로, 값은 증가만 가능하거나 다시 시작할 때 0으로 재설정될 수 있습니다.",
- "description-gauge": "임의로 오르내릴 수 있는 단일 숫자 값을 나타내는 메트릭입니다.",
- "description-histogram": "히스토그램은 관찰값(일반적으로 요청 기간 또는 응답 크기와 같은 것)을 샘플링하여 구성 가능한 구간별로 항목 수를 계수합니다.",
- "description-native-histogram": "기본 히스토그램은 여러 가지 면에서 기존 Prometheus 히스토그램과 다릅니다. 기본 히스토그램 구간의 경계는 사용자가 정의할 수 없으며, 히스토그램의 스케일(해상도)에 따라 달라지는 공식을 사용하여 계산됩니다.",
- "description-no-type": "이러한 메트릭은 메타데이터에 정의된 유형이 없습니다.",
- "description-summary": "요약은 관찰값(일반적으로 요청 기간 및 응답 크기와 같은 것)을 샘플링하며 슬라이딩 시간 창에서 구성 가능한 분위수를 계산할 수 있습니다.",
- "description-unknown": "이러한 메트릭은 메타데이터에서 알 수 없는 유형으로 지정되었습니다.",
- "label-counter": "카운터",
- "label-gauge": "게이지",
- "label-histogram": "히스토그램",
- "label-native-histogram": "기본 히스토그램",
- "label-no-type": "유형 없음",
- "label-summary": "요약",
- "label-unknown": "알 수 없음"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "쿼리 구문 분석이 모호합니다."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "{{name}} 삭제",
- "placeholder-select-label": "라벨 선택",
- "placeholder-select-value": "값 선택"
- },
- "label-filters": {
- "label-filters": "라벨 필터",
- "label-label-filters": "라벨 필터",
- "tooltip-label-filters": "선택 사항: 이 쿼리 유형에 대한 메트릭 선택을 필터링하는 데 사용됩니다."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "라벨 로딩 중",
- "noOptionsMessage-no-labels-found": "라벨을 찾을 수 없습니다"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "메트릭 탐색기 열기",
- "placeholder-select-metric": "메트릭 선택",
- "tooltip-open-metrics-explorer": "메트릭 탐색기 열기"
- },
- "label-metric": "메트릭",
- "tooltip-metric": "선택 사항: 지정된 메트릭에서 라벨 이름에 대한 라벨 값 목록을 반환합니다."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "메트릭 찾아보기",
- "currently-selected": "현재 선택 사항: {{selected}} ",
- "metrics-pre-filtered": "이러한 메트릭은 라벨 필터에서 선택한 라벨로 사전 필터링되었습니다.",
- "title-metrics-explorer": "메트릭 탐색기"
- },
- "nested-query": {
- "label": {
- "ignoring": "무시 중",
- "on": "켜기"
- },
- "operator": "작업 수행자",
- "tooltip-remove-match": "매칭 항목 제거",
- "vector-matches": "벡터 매칭"
- },
- "operation-editor": {
- "not-found": "{{id}} 연산을 찾을 수 없습니다.",
- "title-remove": "{{name}} 삭제"
- },
- "operation-header": {
- "placeholder-replace-with": "다음으로 교체",
- "title-click-to-view-alternative-operations": "대체 연산을 보려면 클릭하세요.",
- "title-remove-operation": "연산 제거"
- },
- "operation-info-button": {
- "title-click-to-show-description": "설명을 보려면 클릭하세요.",
- "title-remove-operation": "연산 제거"
- },
- "operation-list": {
- "operations": "연산",
- "placeholder-search": "검색",
- "title-add-operation": "연산 추가"
- },
- "operation-param-editor": {
- "title-add": "{{name}} 추가",
- "title-remove": "{{name}} 삭제"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "{{labelWord}} {{labels}}을(를) 유지하면서 차원에 대해 {{aggregationName}}을(를) 계산합니다.",
- "label-default": "차원에 대해 {{aggregationName}}을(를) 계산합니다.",
- "label-without": "차원 {{labels}}에 대해 {{aggregationName}}을(를) 계산합니다. 다른 모든 라벨은 그대로 유지합니다."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "예제 스위치.",
- "aria-label-format": "형식 지정 콤보 박스",
- "aria-label-lower-limit-parameter": "최소 단계 텍스트 상자, 단계 매개변수의 하한값을 설정합니다",
- "aria-label-select-resolution": "해상도 선택",
- "aria-label-type": "유형 라디오 버튼 그룹",
- "format-options": {
- "label-heatmap": "히트맵",
- "label-table": "테이블",
- "label-time-series": "시계열"
- },
- "label-exemplars": "예제",
- "label-format": "형식",
- "label-min-step": "최소 단계",
- "label-resolution": "해상도",
- "label-type": "유형",
- "placeholder-auto": "자동",
- "title-options": "옵션",
- "tooltip-min-step": "Prometheus 쿼리의 단계 매개변수와 <2>{{interval}}2> 및 <4>{{rateInterval}} 4> 변수에 대한 추가적인 하한."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "구문 오류가 있거나 빌더 모드로 전환할 때 쿼리 구조를 시각화할 수 없습니다. 쿼리의 일부가 손실될 수 있습니다.",
- "confirmText-continue": "계속",
- "kick-start-your-query": "쿼리 시작하기",
- "label-explain": "설명",
- "run-queries": "쿼리 실행",
- "title-parsing-error-switch-builder": "구문 분석 오류: 빌더 모드로 전환하시겠어요?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "범례 콤보 박스",
- "label-legend": "범례",
- "placeholder-select-legend-mode": "범례 모드 선택",
- "tooltip-legend": "계열 이름 재정의 또는 템플릿. 예: {{templateExample}} 은(는) {{labelName}}에 대한 라벨 값으로 대체됩니다."
- },
- "query-builder-hints": {
- "hint-details": "힌트: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "빌더",
- "label-code": "코드"
- }
- },
- "query-pattern": {
- "apply-query": "쿼리 적용",
- "aria-label-apply-query-starter-button": "쿼리 스타터 버튼 적용",
- "aria-label-back-button": "뒤로 가기 버튼",
- "aria-label-create-new-query-button": "새 쿼리 버튼 생성",
- "aria-label-raw-query": "{{patternName}} 원시 쿼리",
- "aria-label-use-this-query-button": "이 쿼리 사용 버튼",
- "back": "뒤로",
- "create-new-query": "새 쿼리 생성",
- "use-this-query": "이 쿼리 사용"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "쿼리 모달 시작 닫기",
- "aria-label-kick-start-your-query-modal": "쿼리 모달 시작하기",
- "aria-label-toggle-query-starter": "{{patternType}} 쿼리 스타터 카드 열기 및 닫기",
- "close": "닫기",
- "description-kick-start-your-query": "다음 쿼리 중 하나를 선택하여 쿼리를 시작합니다. 그런 다음 쿼리를 계속 완료할 수 있습니다.",
- "label-toggle-query-starter": "{{patternType}} 쿼리 스타터",
- "title-kick-start-your-query": "쿼리 시작하기"
- },
- "raw-query": {
- "aria-label-selector": "선택기"
- },
- "results-table": {
- "content-descriptive-type": "{{descriptiveType}}을 생성할 때 Prometheus는 유형 카운터와 함께 여러 계열을 노출합니다. ",
- "description": "설명",
- "message-expand-label-filters": "메트릭을 찾을 수 없습니다. 라벨 필터를 확장해 보세요.",
- "message-expand-search": "메트릭을 찾을 수 없습니다. 검색 및 필터를 확장해 보세요.",
- "message-no-metrics-found": "데이터 소스에서 메트릭을 찾을 수 없습니다.",
- "name": "이름",
- "type": "유형"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/nl-NL/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/nl-NL/grafana-prometheus.json
deleted file mode 100644
index f9870461aad..00000000000
--- a/packages/grafana-prometheus/src/locales/nl-NL/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Fout bij laden van annotatiegegevens!",
- "aria-label-lower-limit-parameter": "Ondergrens instellen voor de stapparameter",
- "label-min-step": "Min. stap",
- "label-series-value-as-timestamp": "Reekswaarde als tijdstempel",
- "label-tags": "Labels",
- "label-text": "Tekst",
- "label-title": "Titel",
- "placeholder-auto": "automatisch",
- "tooltip-either-pattern-example-instance-replaced-label": "Gebruik de naam of een patroon. Bijvoorbeeld, {{labelTemplate}} wordt vervangen door labelwaarde voor het label {{labelName}}.",
- "tooltip-min-step": "Een extra ondergrens voor de stapparameter van de Prometheus-query en voor de variabelen <2>{{intervalVar}}2> en <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "De eenheid van tijdstempel is milliseconden. Als de eenheid van de reekswaarde seconden is, vermenigvuldig dan de bereikvector met 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Een Instant-query en een Range-query uitvoeren"
- },
- "label": {
- "both": "Allebei"
- },
- "range-options": {
- "description": {
- "query-range": "Een query uitvoeren over een tijdsbereik"
- },
- "label": {
- "instant": "Direct",
- "range": "Bereik"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filterexpressie voor label",
- "description-select-labels": "Zodra labelwaarden zijn geselecteerd, worden alleen mogelijke labelcombinaties weergegeven.",
- "select-labels-to-search-in": "2. Selecteer labels om te doorzoeken"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filterexpressie voor metriek",
- "aria-label-limit-results-from-series-endpoint": "Resultaten beperken van serie-eindpunt",
- "description-series-limit": "De limiet is van toepassing op alle metriek, labels en waarden. Laat het veld leeg om de standaardlimiet te gebruiken. Stel in op 0 om de limiet uit te schakelen en alles op te halen — dit kan prestatieproblemen veroorzaken.",
- "label-select-metric": "Zodra een metriek is geselecteerd, worden alleen mogelijke labels weergegeven. Labels worden beperkt door de onderstaande reekslimiet.",
- "select-a-metric": "1. Selecteer een metriek",
- "series-limit": "Reekslimiet"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL-spiekbriefje"
- },
- "prom-exemplar-field": {
- "exemplars": "Voorbeelden",
- "tooltip-disable-query": "Query met exemplaren uitschakelen",
- "tooltip-enable-query": "Query met exemplaren inschakelen"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus extra veld",
- "aria-label-query-type-field": "Veld voor querytype",
- "aria-label-step-field": "Stapveld",
- "min-step": "Min. stap",
- "query-type": "Query-type",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Tijdseenheden en ingebouwde variabelen kunnen hier worden gebruikt, bijvoorbeeld: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Standaard als er geen unit gespecifieerd is: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Voer een PromQL-query in..."
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Klassieke query",
- "aria-label-metric-regex": "Metrische regex",
- "aria-label-metric-selector": "Metriekkiezer",
- "aria-label-prometheus-query": "Prometheus-query",
- "aria-label-query-type": "Query-type",
- "aria-label-series-query": "Reeksquery",
- "label-classic-query": "Klassieke query",
- "label-label": "Label",
- "label-metric-regex": "Metrische regex",
- "label-query": "Query",
- "label-query-type": "Query-type",
- "label-series-query": "Reeksquery",
- "placeholder-classic-query": "Klassieke query",
- "placeholder-metric-regex": "Metrische regex",
- "placeholder-prometheus-query": "Prometheus-query",
- "placeholder-select-query-type": "Selecteer query",
- "placeholder-series-query": "Reeksquery",
- "returns-metrics-matching-specified-metric-regex": "Retourneert een lijst met metriek die overeenkomt met de opgegeven metriekregex.",
- "tooltip-classic-query": "De oorspronkelijke implementatie van de Prometheus-variabele queryeditor. Voer een tekenreeks in met het juiste querytype en de juiste parameters zoals beschreven in deze documenten. Bijvoorbeeld, {{exampleQuery}}.",
- "tooltip-label": "Retourneert een lijst met labelwaarden voor de labelnaam in alle metriek, tenzij de metriek is opgegeven.",
- "tooltip-metric-regex": "Retourneert een lijst met labelnamen, optioneel gefilterd op opgegeven metriekregex.",
- "tooltip-query": "Retourneert een lijst met Prometheus-zoekresultaten voor de zoekopdracht. Dit kan Prometheus-functies omvatten, bijv. {{exampleQuery}}.",
- "tooltip-query-type": "De Prometheus-gegevensbronplugin biedt de volgende querytypes voor sjabloonvariabelen.",
- "tooltip-series-query": "Voer een metriek in met labels, alleen een metriek of alleen labels, bijv. {{example1}}, {{example2}} of {{example3}}. Retourneert een lijst met tijdreeksen die zijn gekoppeld aan de ingevoerde gegevens."
- },
- "selector-actions": {
- "aria-label-selector": "kiezer",
- "aria-label-selector-clear-button": "Knop Kiezer wissen",
- "aria-label-use-selector-as-metrics-button": "Kiezer gebruiken als metriekknop",
- "aria-label-use-selector-for-query-button": "Kiezer gebruiken als query-knop",
- "aria-label-validate-submit-button": "Knop Verzenden valideren",
- "clear": "Wissen",
- "resulting-selector": "4. Resulterende kiezer",
- "use-as-rate-query": "Gebruiken als tarief-query",
- "use-query": "Query gebruiken",
- "validate-selector": "Validatiekiezer"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filterexpressie voor labelwaarden",
- "aria-label-values-for": "Waarden voor {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Gebruik het zoekveld om waarden te vinden in geselecteerde labels.",
- "select-multiple-values-for-your-labels": "3. Selecteer (meerdere) waarden voor je labels"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Toestaan als doel van opnameregels",
- "label-manage-alerts-via-alerting-ui": "Waarschuwingen beheren via waarschuwingsinterface",
- "title-alerting": "Alerting",
- "tooltip-allow-as-recording-rules-target": "Sta toe dat deze gegevensbron wordt geselecteerd als doel voor het schrijven van opnameregels.",
- "tooltip-manage-alerts-via-alerting-ui": "Waarschuwingsregels voor deze gegevensbron beheren. Om andere waarschuwingsbronnen te beheren, voeg je een Alertmanager-gegevensbron toe."
- },
- "config-editor": {
- "browser-access-mode-error": "Browsertoegangsmodus in de Prometheus-gegevensbron is niet langer beschikbaar. Schakel over naar de servertoegangsmodus.",
- "description-advanced-settings": "Aanvullende instellingen zijn optionele instellingen die kunnen worden geconfigureerd voor meer controle over je gegevensbron. ",
- "title-advanced-settings": "Geavanceerde instellingen",
- "title-error": "Fout"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Je toegangsmethode is <1>Browser1>, dit betekent dat de URL toegankelijk moet zijn vanuit de browser.",
- "tooltip-http-url": "Geef een volledige HTTP-URL op (bijvoorbeeld {{exampleURL}})",
- "tooltip-server-access-mode": "Je toegangsmethode is <1>Server1>, dit betekent dat de URL toegankelijk moet zijn vanuit de Grafana-backend/server."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Bezoek hier de documenten voor meer informatie."
- },
- "exemplar-setting": {
- "label-data-source": "Gegevensbron",
- "label-internal-link": "Interne link",
- "label-label-name": "Labelnaam",
- "label-remove-exemplar-link": "Voorbeeldlink verwijderen",
- "label-url": "URL",
- "label-url-label": "Label-URL",
- "placeholder-go-to-examplecom": "Ga naar voorbeeld.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Voorbeeldlink verwijderen",
- "tooltip-data-source": "De gegevensbron waarnaar het voorbeeld gaat navigeren.",
- "tooltip-internal-link": "Schakel deze optie in als je een interne link hebt. Wanneer ingeschakeld, wordt de gegevensbronselector weergegeven. Selecteer de backend-tracing-gegevensopslag voor je voorbeeldgegevens.",
- "tooltip-label-name": "De naam van het veld in het labelobject dat moet worden gebruikt om de traceID op te halen.",
- "tooltip-url": "De URL van de trace-backend die de gebruiker zou gebruiken om zijn trace te zien",
- "tooltip-url-label": "Gebruik om het knoplabel op het voorbeeld traceID-veld te overschrijven."
- },
- "exemplars-settings": {
- "add": "Toevoegen",
- "no-exemplars-configurations": "Geen voorbeeldconfiguraties",
- "title-exemplars": "Voorbeelden"
- },
- "prom-settings": {
- "aria-label-default-editor": "Standaard editor (code of bouwer)",
- "aria-label-prom-type-type": "{{promType}}-type",
- "aria-label-prometheus-type": "Prometheus-type",
- "aria-label-select-http-method": "HTTP-methode selecteren",
- "editor-options": {
- "label-builder": "Bouwer",
- "label-code": "Code"
- },
- "label-cache-level": "Cacheniveau",
- "label-custom-query-parameters": "Aangepaste query-parameters",
- "label-default-editor": "Standaard-editor",
- "label-disable-metrics-lookup": "Metriek opzoeken uitschakelen",
- "label-disable-recording-rules-beta": "Opnameregels uitschakelen (bèta)",
- "label-http-method": "HTTP-methode",
- "label-incremental-querying-beta": "Incrementeel zoeken (bèta)",
- "label-prom-type-version": "{{promType}}-versie",
- "label-prometheus-type": "Prometheus-type",
- "label-query-overlap-window": "Venster voor overlap van query",
- "label-query-timeout": "Query-timeout",
- "label-scrape-interval": "Scrape-interval",
- "label-series-limit": "Reekslimiet",
- "label-use-series-endpoint": "Serie-eindpunt gebruiken",
- "more-info": "Zie de <2>provisioning-documentatie2> voor meer informatie over het configureren van het Prometheus-type en de versie in gegevensbronnen.",
- "placeholder-example-maxsourceresolutionmtimeout": "Voorbeeld: {{example}}",
- "title-interval-behaviour": "Intervalgedrag",
- "title-other": "Overige",
- "title-performance": "Prestaties",
- "title-query-editor": "Query-editor",
- "tooltip-cache-level": "Stelt het cacheniveau van de browser in voor editor-query's. Hogere cache-instellingen worden aanbevolen voor gegevensbronnen met een hoge kardinaliteit.",
- "tooltip-custom-query-parameters": "Voeg aangepaste parameters toe aan de Prometheus-query-URL. Bijvoorbeeld {{example1}}, {{example2}}, {{example3}}, of{{example4}}. Meerdere parameters moeten worden samengevoegd met {{concatenationChar}}.",
- "tooltip-default-editor": "Stel de standaard editoroptie in voor alle gebruikers van deze gegevensbron.",
- "tooltip-disable-metrics-lookup": "Als je deze optie aanvinkt, worden de metriekkiezer en de metriek/label-ondersteuning in de auto-aanvulling van het query-veld uitgeschakeld. Dit helpt als je prestatieproblemen hebt met grotere Prometheus-instanties. ",
- "tooltip-disable-recording-rules-beta": "Deze functie schakelt opnameregels uit. Schakel dit in om de prestaties van het dashboard te verbeteren",
- "tooltip-http-method": "Je kunt de HTTP-methode POST of GET gebruiken om je Prometheus-gegevensbron op te vragen. POST is de aanbevolen methode omdat het grotere query's toestaat. Wijzig dit in GET als je een Prometheus-versie ouder dan 2.1 hebt of als POST-verzoeken in je netwerk zijn beperkt.",
- "tooltip-incremental-querying-beta": "Deze functie zal het standaardgedrag van relatieve query's veranderen om altijd nieuwe gegevens van de Prometheus-instantie op te vragen, in plaats daarvan worden query-resultaten in de cache opgeslagen en worden alleen nieuwe records opgevraagd. Schakel dit in om de database- en netwerkbelasting te verminderen.",
- "tooltip-prom-type-version": "Gebruik dit om de versie van je {{promType}}-instantie in te stellen als deze niet automatisch is geconfigureerd.",
- "tooltip-prometheus-type": "Stel dit in op het type van je Prometheus-database, bijvoorbeeld Prometheus, Cortex, Mimir of Thanos. Als je dit veld wijzigt, worden je huidige instellingen opgeslagen. Bepaalde soorten Prometheus ondersteunen of ondersteunen geen verschillende API's. Sommige typen ondersteunen bijvoorbeeld regex-matching voor label-query's om de prestaties te verbeteren. Sommige typen hebben een API voor metadata. Als je dit verkeerd instelt, kun je afwijkend gedrag ervaren bij het opvragen van metriek en labels. Controleer je Prometheus-documentatie om er zeker van te zijn dat je het juiste type invoert.",
- "tooltip-query-overlap-window": "Stel een duur in zoals {{example1}} of {{example2}} of {{example3}}. Standaard van {{default}}. Deze duur wordt toegevoegd aan de duur van elk incrementeel verzoek.",
- "tooltip-query-timeout": "Stel de Prometheus-query-time-out in.",
- "tooltip-scrape-interval": "Dit interval is hoe vaak Prometheus doelen scrapet. Stel dit in op het typische scrape- en evaluatie-interval dat is geconfigureerd in je Prometheus-configuratiebestand. Als je dit instelt op een grotere waarde dan je Prometheus-configuratiebestandsinterval, zal Grafana de gegevens evalueren volgens dit interval en zul je minder gegevenspunten zien. Standaard ingesteld op {{default}}.",
- "tooltip-series-limit": "De limiet is van toepassing op alle bronnen (metriek, labels en waarden) voor beide eindpunten (reeksen en labels). Laat het veld leeg om de standaardlimiet te gebruiken (40000). Stel in op 0 om de limiet uit te schakelen en alles op te halen. Dit kan prestatieproblemen veroorzaken. Standaardlimiet is 40000.",
- "tooltip-use-series-endpoint": "Als je deze optie aanvinkt, wordt het serie-eindpunt met parameter {{exampleParameter}} de voorkeur gegeven boven het labelwaarden-eindpunt met parameter {{exampleParameter}}. Hoewel het eindpunt van de labelwaarden als beter presterend wordt beschouwd, geven sommige gebruikers de voorkeur aan de serie omdat deze een POST-methode heeft, terwijl het eindpunt van de labelwaarden alleen een GET-methode heeft."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Uitgeschakeld)",
- "enabled-label": "Metriekenbrowser"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Bevat alleen unieke labels",
- "description-custom": "Geef een naamgevingssjabloon op",
- "description-verbose": "Alle labelnamen en -waarden",
- "label-auto": "Automatisch",
- "label-custom": "Aangepast",
- "label-verbose": "Gedetailleerd"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Bereken het gemiddelde over dimensies",
- "documentation-bottomk": "Kleinste k-elementen per steekproefwaarde",
- "documentation-count": "Aantal elementen in de vector tellen",
- "documentation-count-values": "Aantal elementen met dezelfde waarde tellen",
- "documentation-group": "Alle waarden in de resulterende vector zijn 1",
- "documentation-max": "Selecteer maximum over dimensies",
- "documentation-min": "Selecteer minimum over dimensies",
- "documentation-quantile": "Bereken φ-kwantiel (0 ≤ φ ≤ 1) over dimensies",
- "documentation-stddev": "Bereken de standaardafwijking van de populatie over dimensies",
- "documentation-stdvar": "Bereken de standaardvariantie van de populatie over dimensies",
- "documentation-sum": "Bereken de som over dimensies",
- "documentation-topk": "Grootste k-elementen per steekproefwaarde"
- },
- "getFunctions": {
- "documentation-abs": "Retourneert de invoervector met alle steekproefwaarden omgezet naar hun absolute waarde.",
- "documentation-absent": "Retourneert een lege vector terug als de doorgegeven vector elementen heeft en een 1-elementvector met de waarde 1 als de doorgegeven vector geen elementen heeft. Dit is handig om te waarschuwen wanneer er geen tijdreeksen bestaan voor een bepaalde metrische naam en labelcombinatie.",
- "documentation-absent-over-time": "Retourneert een lege vector terug als de doorgegeven bereikvector elementen heeft en een 1-elementvector met de waarde 1 als de doorgegeven bereikvector geen elementen heeft.",
- "documentation-avg-over-time": "De gemiddelde waarde van alle punten in het opgegeven interval.",
- "documentation-ceil": "Rondt de steekproefwaarden van alle elementen in 'v' naar boven af op het dichtstbijzijnde gehele getal.",
- "documentation-changes": "Voor elke invoertijdreeks retourneert 'changes(v range-vector)' het aantal keren dat de waarde is gewijzigd binnen het opgegeven tijdsbereik als een instantvector.",
- "documentation-clamp": "Klemt de steekproefwaarden van alle elementen in 'v' vast om een ondergrens van 'min' en een bovengrens van 'max' te hebben.",
- "documentation-clamp-max": "Klemt de steekproefwaarden van alle elementen in 'v' vast om een bovengrens van 'max' te hebben.",
- "documentation-clamp-min": "Klemt de steekproefwaarden van alle elementen in 'v' vast om een ondergrens van 'min' te hebben.",
- "documentation-count-over-time": "Het aantal van alle waarden in het opgegeven interval.",
- "documentation-count-scalar": "Retourneert het aantal elementen in een tijdreeksvector als een scalaire waarde. Dit staat in contrast met de aggregatieoperator 'count()', die altijd een vector retourneert (een lege als de invoervector leeg is) en groepering op labels mogelijk maakt via een 'by'-clausule.",
- "documentation-day-of-month": "Retourneert de dag van de maand voor elk van de opgegeven tijden in UTC. Geretourneerde waarden zijn van 1 tot 31.",
- "documentation-day-of-week": "Retourneert de dag van de week voor elk van de opgegeven tijden in UTC. Geretourneerde waarden zijn van 0 tot 6, waarbij 0 zondag betekent, enz.",
- "documentation-day-of-year": "Retourneert de dag van het jaar voor elk van de opgegeven tijden in UTC. Geretourneerde waarden zijn van 1 tot 365 voor niet-schrikkeljaren en 1 tot 366 in schrikkeljaren.",
- "documentation-days-in-month": "Retourneert het aantal dagen in de maand voor elk van de opgegeven tijden in UTC. Geretourneerde waarden zijn van 28 tot 31.",
- "documentation-deg": "Converteert radialen naar graden voor alle elementen in v",
- "documentation-delta": "Berekent het verschil tussen de eerste en laatste waarde van elk tijdreeks-element in een bereikvector 'v' en geeft een instantvector terug met de gegeven delta's en equivalente labels. De delta wordt geëxtrapoleerd om het volledige tijdsbereik te dekken zoals gespecificeerd in de bereikvectorselector, zodat het mogelijk is om een niet-geheel getal te krijgen, zelfs als de steekproefwaarden allemaal gehele getallen zijn.",
- "documentation-deriv": "Berekent de afgeleide per seconde van de tijdreeks in een bereikvector 'v', met behulp van eenvoudige lineaire regressie.",
- "documentation-double-exponential-smoothing": "Produceert een gladde waarde voor tijdreeksen op basis van het bereik in 'v'. Hoe lager de gladmakingsfactor 'sf', hoe meer belang wordt gehecht aan oude gegevens. Hoe hoger de trendfactor 'tf', hoe meer trends in de gegevens worden overwogen. Zowel 'sf' als 'tf' moeten tussen 0 en 1 liggen.",
- "documentation-drop-common-labels": "Verwijdert alle labels met dezelfde naam en waarde in alle reeksen in de invoervector.",
- "documentation-exp": "Berekent de exponentiële functie voor alle elementen in 'v'.\nSpeciale gevallen zijn:\n* 'Exp(+Inf) = +Inf' \n* 'Exp(NaN) = NaN'",
- "documentation-floor": "Rondt de steekproefwaarden van alle elementen in 'v' naar boven af op het dichtstbijzijnde gehele getal.",
- "documentation-histogram-avg": "Retourneert het rekenkundige gemiddelde van de waargenomen waarden opgeslagen in een native histogram. Monsters die geen native histogrammen zijn, worden genegeerd en verschijnen niet in de geretourneerde vector.",
- "documentation-histogram-count": "Retourneert het aantal waarnemingen dat is opgeslagen in een native histogram.",
- "documentation-histogram-fraction": "Retourneert de geschatte fractie van observaties tussen de opgegeven lagere en hogere waarden.",
- "documentation-histogram-quantile": "Berekent het φ-kwantiel (0 ≤ φ ≤ 1) uit de buckets 'b' van een histogram. De steekproeven in 'b' zijn de tellingen van observaties in elke bucket. Elke steekproef moet een label 'le' hebben waarbij de labelwaarde de inclusieve bovengrens van de bucket aangeeft. (Steekproeven zonder een dergelijk label worden stilzwijgend genegeerd.) Het metrische type histogram biedt automatisch tijdreeksen met het achtervoegsel '_bucket' en de juiste labels.",
- "documentation-histogram-stddev": "Retourneert de geschatte standaardafwijking van waarnemingen in een native histogram, gebaseerd op het geometrische gemiddelde van de buckets waar de waarnemingen liggen.",
- "documentation-histogram-stdvar": "Retourneert de geschatte standaardvariantie van waarnemingen in een native histogram.",
- "documentation-histogram-sum": "Retourneert het aantal waarnemingen dat is opgeslagen in een native histogram.",
- "documentation-holt-winters": "Hernoemd als double_exponential_smoothing in prometheus v3.x. Gebruik voor prometheus-versies gelijk aan en groter dan v3.0 double_exponential_smoothing. \n\nProduceert een gladde waarde voor tijdreeksen op basis van het bereik in 'v'. Hoe lager de gladmakingsfactor 'sf', hoe meer belang wordt gehecht aan oude gegevens. Hoe hoger de trendfactor 'tf', hoe meer trends in de gegevens worden overwogen. Zowel 'sf' als 'tf' moeten tussen 0 en 1 liggen.",
- "documentation-hour": "Retourneert het uur van de dag voor elk van de opgegeven tijden in UTC. Geretourneerde waarden zijn van 0 tot 23.",
- "documentation-idelta": "Berekent het verschil tussen de laatste twee steekproeven in de bereikvector 'v' en geeft een instantvector terug met de gegeven delta's en equivalente labels.",
- "documentation-increase": "Berekent de toename in de tijdreeks in de bereikvector. Breuken in monotoniciteit (zoals teller-resets als gevolg van doelherstarten) worden automatisch aangepast. De toename wordt geëxtrapoleerd om het volledige tijdsbereik te dekken zoals gespecificeerd in de bereikvectorselector, zodat het mogelijk is om een niet-geheel getal te krijgen, zelfs als een teller alleen met gehele stappen toeneemt.",
- "documentation-info": "Retourneert de nieuwste details en metadata over een groep statistieken, zoals hun labels en huidige waarden, zonder berekeningen uit te voeren",
- "documentation-irate": "Berekent de momentane snelheid per seconde van de toename van de tijdreeks in de bereikvector. Dit is gebaseerd op de laatste twee datapunten. Breuken in monotoniciteit (zoals teller-resets als gevolg van doelherstarten) worden automatisch aangepast.",
- "documentation-label-join": "Voor elke tijdreeks in 'v' worden alle waarden van alle 'src_labels' samengevoegd met behulp van 'separator' en wordt de tijdreeks geretourneerd met het label 'dst_label' dat de samengevoegde waarde bevat. Er kan een willekeurig aantal 'src_labels' in deze functie zijn.",
- "documentation-label-replace": "Voor elke tijdreeks in 'v', 'label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)' komt de reguliere expressie 'regex' overeen met het label 'src_label'. Als het overeenkomt, wordt de tijdreeks geretourneerd met het label 'dst_label' vervangen door de uitbreiding van 'replacement'. '$1' wordt vervangen door de eerste overeenkomende subgroep, '$2' met de tweede enz. Als de reguliere expressie niet overeenkomt, wordt de tijdreeks ongewijzigd geretourneerd.",
- "documentation-last-over-time": "De meest recente puntwaarde in het opgegeven interval.",
- "documentation-ln": "Berekent het natuurlijke logaritme voor alle elementen in 'v'.\nSpeciale gevallen zijn:\n * 'ln(+Inf) = +Inf'\n * 'ln(0) = -Inf'\n * 'ln(x < 0) = NaN'\n * 'ln(NaN) = NaN'",
- "documentation-log10": "Berekent het decimale logaritme voor alle elementen in 'v'. De speciale gevallen zijn gelijk aan die in 'ln'.",
- "documentation-log2": "Berekent het binaire logaritme voor alle elementen in 'v'. De speciale gevallen zijn gelijk aan die in 'ln'.",
- "documentation-max-over-time": "De maximale waarde van alle punten in het opgegeven interval.",
- "documentation-min-over-time": "De minimale waarde van alle punten in het opgegeven interval.",
- "documentation-minute": "Retourneert de minuut van het uur voor elk van de opgegeven tijden in UTC. Geretourneerde waarden zijn van 0 tot 59.",
- "documentation-month": "Retourneert de maand van het jaar voor elk van de opgegeven tijden in UTC. Geretourneerde waarden zijn van 1 tot 12, waarbij 1 januari betekent, enz.",
- "documentation-pi": "Retourneert pi",
- "documentation-predict-linear": "Voorspelt de waarde van tijdreeksen 't' seconden vanaf nu, op basis van de bereikvector 'v', met behulp van eenvoudige lineaire regressie.",
- "documentation-present-over-time": "De waarde 1 voor elke reeks in het opgegeven interval.",
- "documentation-quantile-over-time": "Het φ-kwantiel (0 ≤ φ ≤ 1) van de waarden in het opgegeven interval.",
- "documentation-rad": "Converteert graden naar radialen voor alle elementen in v",
- "documentation-rate": "Berekent de gemiddelde snelheid per seconde van de toename van de tijdreeks in de bereikvector. Breuken in monotoniciteit (zoals teller-resets als gevolg van doelherstarten) worden automatisch aangepast. Ook extrapoleert de berekening naar de uiteinden van het tijdsbereik, waardoor gemiste scrapes of imperfecte uitlijning van scrapecycli met de tijdsperiode van het bereik mogelijk zijn.",
- "documentation-resets": "Voor elke invoertijdreeks retourneert 'resets(v range-vector)' het aantal teller-resets binnen het opgegeven tijdsbereik als een instantvector. Elke afname van de waarde tussen twee opeenvolgende monsters wordt geïnterpreteerd als een teller-reset.",
- "documentation-round": "Rondt de steekproefwaarden van alle elementen in 'v' af op het dichtstbijzijnde gehele getal. Gelijken wordt opgelost door naar boven af te ronden. Met het optionele argument 'to_nearest' kan het dichtstbijzijnde veelvoud worden opgegeven waarop de steekproefwaarden moeten worden afgerond. Dit veelvoud kan ook een breuk zijn.",
- "documentation-scalar": "Gegeven een invoervector met één element, retourneert 'scalar(v instant-vector)' de steekproefwaarde van dat enkele element als een scalaire waarde. Als de invoervector niet precies één element heeft, retourneert 'scalar' 'NaN'.",
- "documentation-sgn": "Retourneert een vector met alle steekproefwaarden omgezet naar hun teken, gedefinieerd als volgt: 1 als v positief is, -1 als v negatief is en 0 als v gelijk is aan nul.",
- "documentation-sort": "Retourneert vectorelementen gesorteerd op hun steekproefwaarden, in oplopende volgorde.",
- "documentation-sort-desc": "Retourneert vectorelementen gesorteerd op hun steekproefwaarden, in aflopende volgorde.",
- "documentation-sqrt": "Berekent de vierkantswortel van alle elementen in 'v'.",
- "documentation-stddev-over-time": "De standaardafwijking van de populatie van de waarden in het opgegeven interval.",
- "documentation-stdvar-over-time": "De standaardvariantie van de populatie van de waarden in het opgegeven interval.",
- "documentation-sum-over-time": "Het aantal van alle waarden in het opgegeven interval.",
- "documentation-time": "Retourneert het aantal seconden sinds 1 januari 1970 UTC. Merk op dat dit niet de huidige tijd retourneert, maar de tijd waarop de expressie moet worden geëvalueerd.",
- "documentation-timestamp": "Retourneert het tijdstempel van elk van de steekproeven van de gegeven vector als het aantal seconden sinds 1 januari 1970 UTC.",
- "documentation-vector": "Retourneert de scalaire 's' als een vector zonder labels.",
- "documentation-year": "Retourneert het jaar voor elk van de opgegeven tijden in UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "berekent de boogcosinus van alle elementen in {{argument}}",
- "documentation-acosh": "berekent de inverse hyperbolische cosinus van alle elementen in {{argument}}",
- "documentation-asin": "berekent de boogsinus van alle elementen in {{argument}}",
- "documentation-asinh": "berekent de inverse hyperbolische cosinus van alle elementen in {{argument}} ",
- "documentation-atan": "berekent de boogtangens van alle elementen in {{argument}}",
- "documentation-atanh": "berekent de inverse hyperbolische cosinus van alle elementen in {{argument}}",
- "documentation-cos": "berekent de cosinus van alle elementen in {{argument}}",
- "documentation-cosh": "berekent de inverse hyperbolische cosinus van alle elementen in {{argument}} ",
- "documentation-sin": "berekent de cosinus van alle elementen in {{argument}} ",
- "documentation-sinh": "berekent de inverse hyperbolische cosinus van alle elementen in {{argument}}",
- "documentation-tan": "berekent de cosinus van alle elementen in {{argument}}",
- "documentation-tanh": "berekent de inverse hyperbolische cosinus van alle elementen in {{argument}} "
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Feedback geven",
- "title-give-feedback": "De metriekverkenner is nieuw, laat ons weten hoe we deze kunnen verbeteren"
- },
- "get-collapsed-info": {
- "exemplars": "Voorbeelden: {{value}}",
- "format": "Formaat: {{value}}",
- "legend": "Legenda: {{value}}",
- "step": "Stap: {{value}}",
- "type": "Type: {{value}}"
- },
- "get-placeholders": {
- "browse": "Metriek zoeken op naam",
- "type": "Filteren op type"
- },
- "get-prom-types": {
- "description-counter": "Een cumulatieve statistiek die een enkele monotoon toenemende teller vertegenwoordigt waarvan de waarde alleen kan toenemen of kan worden gereset naar nul bij het opnieuw opstarten.",
- "description-gauge": "Een statistiek die een enkele numerieke waarde vertegenwoordigt die willekeurig op en neer kan gaan.",
- "description-histogram": "Een histogram neemt steekproeven van observaties (meestal dingen zoals verzoekduur of responsgrootte) en telt ze in configureerbare buckets.",
- "description-native-histogram": "Native histogrammen verschillen op een aantal manieren van klassieke Prometheus-histogrammen: native histogrambucketgrenzen worden berekend met een formule die afhankelijk is van de schaal (resolutie) van het native histogram en zijn niet door de gebruiker gedefinieerd.",
- "description-no-type": "Deze statistieken hebben geen gedefinieerd type in de metagegevens.",
- "description-summary": "Een samenvatting neemt steekproeven van observaties (meestal dingen zoals verzoekduur en responsgrootte) en kan configureerbare kwantielen berekenen over een glijdend tijdsvenster.",
- "description-unknown": "Deze statistieken hebben het type onbekend gekregen in de metagegevens.",
- "label-counter": "Teller",
- "label-gauge": "Meter",
- "label-histogram": "Histogram",
- "label-native-histogram": "Native histogram",
- "label-no-type": "Geen type",
- "label-summary": "Samenvatting",
- "label-unknown": "Onbekend"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Queryparsing is dubbelzinnig."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "{{name}} verwijderen",
- "placeholder-select-label": "Selecteer etiket",
- "placeholder-select-value": "Waarde selecteren"
- },
- "label-filters": {
- "label-filters": "Labelfilters",
- "label-label-filters": "Labelfilters",
- "tooltip-label-filters": "Optioneel: wordt gebruikt om de metrische selectie voor dit query-type te filteren."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Labels laden",
- "noOptionsMessage-no-labels-found": "Geen labels gevonden"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Metriekverkenner openen",
- "placeholder-select-metric": "Selecteer een metriek",
- "tooltip-open-metrics-explorer": "Metriekverkenner openen"
- },
- "label-metric": "Metrisch",
- "tooltip-metric": "Optioneel: retourneert een lijst met labelwaarden voor de labelnaam in de opgegeven metriek."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Metriek bekijken",
- "currently-selected": "Momenteel geselecteerd: {{selected}}",
- "metrics-pre-filtered": "Deze metriek is vooraf gefilterd op labels die zijn gekozen in de labelfilters.",
- "title-metrics-explorer": "Metriekverkenner"
- },
- "nested-query": {
- "label": {
- "ignoring": "Negeren",
- "on": "Aan"
- },
- "operator": "Operator",
- "tooltip-remove-match": "Overeenkomst verwijderen",
- "vector-matches": "Vectorovereenkomsten"
- },
- "operation-editor": {
- "not-found": "Bewerking {{id}} niet gevonden",
- "title-remove": "{{name}} verwijderen"
- },
- "operation-header": {
- "placeholder-replace-with": "Vervangen door",
- "title-click-to-view-alternative-operations": "Klik om alternatieve bewerkingen te bekijken",
- "title-remove-operation": "Uitvoering verwijderen"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Klik om beschrijving weer te geven",
- "title-remove-operation": "Uitvoering verwijderen"
- },
- "operation-list": {
- "operations": "Bedrijfsvoering",
- "placeholder-search": "Zoeken",
- "title-add-operation": "Uitvoering toevoegen"
- },
- "operation-param-editor": {
- "title-add": "{{name}} toevoegen",
- "title-remove": "{{name}} verwijderen"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Berekent {{aggregationName}} over dimensies met behoud van {{labelWord}} {{labels}}.",
- "label-default": "Berekent {{aggregationName}} over de dimensies.",
- "label-without": "Berekent {{aggregationName}} over de dimensies {{labels}}. Alle andere labels blijven behouden."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Exemplars-schakelaar.",
- "aria-label-format": "Opmaakformaat kiezen",
- "aria-label-lower-limit-parameter": "Tekstvak voor minimale stap om de ondergrens voor de stapparameter in te stellen",
- "aria-label-select-resolution": "Resolutie selecteren",
- "aria-label-type": "Type radiobuttonsgroep",
- "format-options": {
- "label-heatmap": "Diagram",
- "label-table": "Tabel",
- "label-time-series": "Tijdreeks"
- },
- "label-exemplars": "Voorbeelden",
- "label-format": "Formaat",
- "label-min-step": "Min. stap",
- "label-resolution": "Resolutie",
- "label-type": "Type",
- "placeholder-auto": "automatisch",
- "title-options": "Opties",
- "tooltip-min-step": "Een extra ondergrens voor de stapparameter van de Prometheus-query en voor de variabelen <2>{{interval}}2> en <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Er is een syntaxisfout of de querystructuur kan niet worden gevisualiseerd bij het overschakelen naar de bouwmodus. Delen van de query kunnen verloren gaan.",
- "confirmText-continue": "Doorgaan",
- "kick-start-your-query": "Start je query",
- "label-explain": "Leg uit",
- "run-queries": "Query's uitvoeren",
- "title-parsing-error-switch-builder": "Parsingfout: overschakelen naar de bouwmodus?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Legenda-combobox",
- "label-legend": "Legenda",
- "placeholder-select-legend-mode": "Legenda-modus selecteren",
- "tooltip-legend": "Reeksnaam overschrijven of sjabloon. Bijv. {{templateExample}} wordt vervangen door labelwaarde voor {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "hint: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Bouwer",
- "label-code": "Code"
- }
- },
- "query-pattern": {
- "apply-query": "Query toepassen",
- "aria-label-apply-query-starter-button": "knop Query starten toepassen",
- "aria-label-back-button": "knop Terug",
- "aria-label-create-new-query-button": "knop Nieuwe query aanmaken",
- "aria-label-raw-query": "{{patternName}} onbewerkte query",
- "aria-label-use-this-query-button": "knop Gebruik deze query",
- "back": "Terug",
- "create-new-query": "Nieuwe query aanmaken",
- "use-this-query": "Gebruik deze query"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "modus Je query snelstarten afsluiten",
- "aria-label-kick-start-your-query-modal": "Start je querymodus",
- "aria-label-toggle-query-starter": "{{patternType}} query-startkaart openen en sluiten",
- "close": "Sluiten",
- "description-kick-start-your-query": "Snelstart je query door een van deze query's te selecteren. Je kunt dan doorgaan met het voltooien van je query.",
- "label-toggle-query-starter": "{{patternType}} query-starters",
- "title-kick-start-your-query": "Start je query"
- },
- "raw-query": {
- "aria-label-selector": "kiezer"
- },
- "results-table": {
- "content-descriptive-type": "Bij het maken van een {{descriptiveType}} stelt Prometheus meerdere series bloot met de typeteller. ",
- "description": "Beschrijving",
- "message-expand-label-filters": "Er zijn geen statistieken gevonden. Probeer je labelfilters uit te breiden.",
- "message-expand-search": "Er zijn geen statistieken gevonden. Probeer je zoekopdracht en filters uit te breiden.",
- "message-no-metrics-found": "Er zijn geen statistieken gevonden in de gegevensbron.",
- "name": "Naam",
- "type": "Type"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/pl-PL/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/pl-PL/grafana-prometheus.json
deleted file mode 100644
index 343ac4a20ba..00000000000
--- a/packages/grafana-prometheus/src/locales/pl-PL/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Błąd ładowania danych adnotacji!",
- "aria-label-lower-limit-parameter": "Ustaw dolną granicę dla parametru kroku",
- "label-min-step": "Min. krok",
- "label-series-value-as-timestamp": "Wartość szeregu jako znacznik czasu",
- "label-tags": "Znaczniki",
- "label-text": "Tekst",
- "label-title": "Tytuł",
- "placeholder-auto": "automatycznie",
- "tooltip-either-pattern-example-instance-replaced-label": "Użyj nazwy lub wzorca. Na przykład wzorzec {{labelTemplate}} jest zastępowany wartością etykiety {{labelName}}.",
- "tooltip-min-step": "Dodatkowa dolna granica dla parametru kroku zapytania Prometheus oraz dla zmiennych <2>{{intervalVar}}2> i <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Jednostką znacznika czasu są milisekundy. Jeśli jednostką wartości szeregu są sekundy, należy pomnożyć wektor zakresu przez 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Uruchom zapytanie natychmiastowe i zapytanie dotyczące zakresu"
- },
- "label": {
- "both": "Oba"
- },
- "range-options": {
- "description": {
- "query-range": "Uruchom zapytanie obejmujące określony przedział czasu"
- },
- "label": {
- "instant": "Natychmiastowe",
- "range": "Zakres"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Wyrażenie filtrujące dla etykiety",
- "description-select-labels": "Po wybraniu wartości etykiet wyświetlane są tylko możliwe kombinacje etykiet.",
- "select-labels-to-search-in": "2. Wybierz etykiety do wyszukania"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Wyrażenie filtrujące dla wskaźnika",
- "aria-label-limit-results-from-series-endpoint": "Ogranicz wyniki z punktu końcowego szeregu",
- "description-series-limit": "Limit dotyczy wszystkich wskaźników, etykiet i wartości. Pozostaw pole puste, aby użyć domyślnego limitu. Ustaw wartość 0, aby wyłączyć limit i pobrać wszystko. Może to spowodować problemy z wydajnością.",
- "label-select-metric": "Po wybraniu wskaźnika wyświetlane są tylko możliwe etykiety. Etykiety są ograniczone przez poniższy limit szeregu.",
- "select-a-metric": "1. Wybierz wskaźnik",
- "series-limit": "Limit szeregu"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL – ściągawka"
- },
- "prom-exemplar-field": {
- "exemplars": "Przykłady",
- "tooltip-disable-query": "Wyłącz zapytanie ze wzorami",
- "tooltip-enable-query": "Włącz zapytanie ze wzorami"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Dodatkowe pole Prometheus",
- "aria-label-query-type-field": "Pole typu zapytania",
- "aria-label-step-field": "Pole kroku",
- "min-step": "Min. krok",
- "query-type": "Typ zapytania",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Można użyć jednostek czasu i wbudowanych zmiennych, na przykład: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (jeśli nie określono jednostki, domyślnie {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Wpisz zapytanie PromQL…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Zapytanie klasyczne",
- "aria-label-metric-regex": "Wyrażenie regularne wskaźnika",
- "aria-label-metric-selector": "Selektor wskaźnika",
- "aria-label-prometheus-query": "Zapytanie Prometheus",
- "aria-label-query-type": "Typ zapytania",
- "aria-label-series-query": "Zapytanie szeregowe",
- "label-classic-query": "Zapytanie klasyczne",
- "label-label": "Etykieta",
- "label-metric-regex": "Wyrażenie regularne wskaźnika",
- "label-query": "Zapytanie",
- "label-query-type": "Typ zapytania",
- "label-series-query": "Zapytanie szeregowe",
- "placeholder-classic-query": "Zapytanie klasyczne",
- "placeholder-metric-regex": "Wyrażenie regularne wskaźnika",
- "placeholder-prometheus-query": "Zapytanie Prometheus",
- "placeholder-select-query-type": "Wybierz typ zapytania",
- "placeholder-series-query": "Zapytanie szeregowe",
- "returns-metrics-matching-specified-metric-regex": "Zwraca listę wskaźników pasujących do określonego wyrażenia regularnego wskaźnika.",
- "tooltip-classic-query": "Oryginalna implementacja edytora zapytań zmiennych w systemie Prometheus. Wpisz ciąg z prawidłowym typem zapytania i parametrami zgodnie z opisem w tych dokumentach. Przykład: {{exampleQuery}}.",
- "tooltip-label": "Zwraca listę wartości etykiet dla nazwy etykiety we wszystkich wskaźnikach, chyba że wskaźnik został określony.",
- "tooltip-metric-regex": "Zwraca listę nazw etykiet, opcjonalnie filtrując ją według określonego wyrażenia regularnego wskaźnika.",
- "tooltip-query": "Zwraca listę wyników zapytania Prometheus dla zapytania. Może to obejmować funkcje systemu Prometheus, czyli {{exampleQuery}}.",
- "tooltip-query-type": "Wtyczka źródła danych Prometheus zapewnia następujące typy zapytań dla zmiennych szablonu.",
- "tooltip-series-query": "Wprowadź wskaźnik z etykietami, sam wskaźnik lub same etykiety, czyli {{example1}}, {{example2}} lub {{example3}}. Zwraca listę szeregów czasowych powiązanych z wprowadzonymi danymi."
- },
- "selector-actions": {
- "aria-label-selector": "selektor",
- "aria-label-selector-clear-button": "Przycisk czyszczenia selektora",
- "aria-label-use-selector-as-metrics-button": "Użyj selektora jako przycisku wskaźnika",
- "aria-label-use-selector-for-query-button": "Użyj selektora dla przycisku zapytania",
- "aria-label-validate-submit-button": "Zatwierdź przycisk przesyłania",
- "clear": "Wyczyść",
- "resulting-selector": "4. Wynikowy selektor",
- "use-as-rate-query": "Użyj jako zapytania o częstotliwość",
- "use-query": "Użyj zapytania",
- "validate-selector": "Zatwierdź selektor"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Wyrażenie filtrujące dla wartości etykiety",
- "aria-label-values-for": "Wartości dla: {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Użyj pola wyszukiwania, aby znaleźć wartości w wybranych etykietach.",
- "select-multiple-values-for-your-labels": "3. Wybierz (wiele) wartości dla etykiet"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Zezwalaj na wybór jako cel reguł rejestracji",
- "label-manage-alerts-via-alerting-ui": "Zarządzaj alertami za pośrednictwem interfejsu alertów",
- "title-alerting": "Alerty",
- "tooltip-allow-as-recording-rules-target": "Zezwalaj na wybór tego źródła danych jako celu do zapisywania reguł rejestrowania.",
- "tooltip-manage-alerts-via-alerting-ui": "Zarządzaj regułami alertów dla tego źródła danych. Aby zarządzać innymi zasobami alertów, dodaj źródło danych Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "Tryb dostępu do przeglądarki w źródle danych Prometheus nie jest już dostępny. Przełącz się na tryb dostępu do serwera.",
- "description-advanced-settings": "Dodatkowe ustawienia to opcje, które można skonfigurować, aby uzyskać większą kontrolę nad źródłem danych.",
- "title-advanced-settings": "Ustawienia zaawansowane",
- "title-error": "Błąd"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Twoja metoda dostępu to <1>Przeglądarka1>, co oznacza, że adres URL musi być dostępny z przeglądarki.",
- "tooltip-http-url": "Podaj pełny adres URL HTTP (na przykład {{exampleURL}})",
- "tooltip-server-access-mode": "Twoja metoda dostępu to <1>Serwer1>, co oznacza, że adres URL musi być dostępny z backendu/serwera usługi Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Więcej informacji znajdziesz w dokumentacji tutaj."
- },
- "exemplar-setting": {
- "label-data-source": "Źródło danych",
- "label-internal-link": "Link wewnętrzny",
- "label-label-name": "Nazwa etykiety",
- "label-remove-exemplar-link": "Usuń przykładowy link",
- "label-url": "URL",
- "label-url-label": "Etykieta adresu URL",
- "placeholder-go-to-examplecom": "Przejdź do strony example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "Identyfikator śledzenia",
- "title-remove-exemplar-link": "Usuń przykładowy link",
- "tooltip-data-source": "Źródło danych, do którego będzie prowadzić przykład.",
- "tooltip-internal-link": "Włącz tę opcję, jeśli masz link wewnętrzny. Po włączeniu tej opcji wyświetlany jest selektor źródła danych. Wybierz magazyn danych śledzenia w środowisku zaplecza dla przykładowych danych.",
- "tooltip-label-name": "Nazwa pola w obiekcie etykiet, które powinno być użyte do uzyskania identyfikatora śledzenia.",
- "tooltip-url": "Adres URL zaplecza śledzenia, do którego użytkownik może przejść, aby zobaczyć dane śledzenia",
- "tooltip-url-label": "Użyj, aby zastąpić etykietę przycisku w przykładowym polu identyfikatora śledzenia."
- },
- "exemplars-settings": {
- "add": "Dodaj",
- "no-exemplars-configurations": "Brak konfiguracji przykładów",
- "title-exemplars": "Przykłady"
- },
- "prom-settings": {
- "aria-label-default-editor": "Domyślny edytor (kod lub konstruktor)",
- "aria-label-prom-type-type": "Typ: {{promType}}",
- "aria-label-prometheus-type": "Typ Prometheus",
- "aria-label-select-http-method": "Wybierz metodę HTTP",
- "editor-options": {
- "label-builder": "Konstruktor",
- "label-code": "Kod"
- },
- "label-cache-level": "Poziom pamięci podręcznej",
- "label-custom-query-parameters": "Niestandardowe parametry zapytania",
- "label-default-editor": "Edytor domyślny",
- "label-disable-metrics-lookup": "Wyłącz wyszukiwanie wskaźników",
- "label-disable-recording-rules-beta": "Wyłącz reguły rejestrowania (beta)",
- "label-http-method": "Metoda HTTP",
- "label-incremental-querying-beta": "Zapytania przyrostowe (beta)",
- "label-prom-type-version": "Wersja: {{promType}}",
- "label-prometheus-type": "Typ Prometheus",
- "label-query-overlap-window": "Okno nakładania się zapytań",
- "label-query-timeout": "Limit czasu zapytania",
- "label-scrape-interval": "Odstęp czasowy pobierania danych",
- "label-series-limit": "Limit szeregu",
- "label-use-series-endpoint": "Użyj punktu końcowego szeregu",
- "more-info": "Więcej informacji na temat konfigurowania typu i wersji systemu Prometheus w źródłach danych można znaleźć w <2>dokumentach dotyczących aprowizacji2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Przykład: {{example}}",
- "title-interval-behaviour": "Sposób działania odstępu czasu",
- "title-other": "Inne",
- "title-performance": "Wydajność",
- "title-query-editor": "Edytor zapytań",
- "tooltip-cache-level": "Ustawia poziom buforowania przeglądarki dla zapytań edytora. W przypadku źródeł danych o wysokiej kardynalności zaleca się ustawienie pamięci podręcznej na wyższym poziomie.",
- "tooltip-custom-query-parameters": "Dodaj niestandardowe parametry do adresu URL zapytania Prometheus. Na przykład {{example1}}, {{example2}}, {{example3}} lub {{example4}}. Wiele parametrów należy połączyć razem za pomocą znaków {{concatenationChar}}.",
- "tooltip-default-editor": "Ustaw domyślną opcję edytora dla wszystkich użytkowników tego źródła danych.",
- "tooltip-disable-metrics-lookup": "Zaznaczenie tej opcji spowoduje wyłączenie selektora wskaźników i obsługi wskaźników/etykiet w autouzupełnianiu pola zapytania. Pomaga to w przypadku problemów z wydajnością większych instancji systemu Prometheus. ",
- "tooltip-disable-recording-rules-beta": "Ta funkcja wyłącza reguły rejestrowania. Włącz tę opcję, aby poprawić wydajność pulpitu",
- "tooltip-http-method": "Możesz użyć metody HTTP POST lub GET, aby wysłać zapytanie do źródła danych Prometheus. POST jest zalecaną metodą, ponieważ obsługuje większe zapytania. Wybierz metodę GET, jeśli wersja systemu Prometheus jest starsza niż 2.1 lub jeśli żądania POST są objęte ograniczeniami w Twojej sieci.",
- "tooltip-incremental-querying-beta": "Ta funkcja zmienia domyślny sposób działania zapytań względnych, aby zawsze żądały świeżych danych z instancji Prometheus. Zamiast tego wyniki zapytań będą buforowane, a wysyłane żądania będą uwzględniać tylko nowe rekordy. Włącz tę opcję, aby zmniejszyć obciążenie bazy danych i sieci.",
- "tooltip-prom-type-version": "Użyj tej opcji, aby ustawić wersję {{promType}} instancji, jeśli nie jest ona automatycznie skonfigurowana.",
- "tooltip-prometheus-type": "Ustaw w tym polu typ bazy danych systemu Prometheus, np. Prometheus, Cortex, Mimir lub Thanos. Zmiana tego pola spowoduje zapisanie bieżących ustawień. Obsługa interfejsów API zależy od konkretnego typu bazy danych Prometheus. Na przykład niektóre typy obsługują dopasowywanie wyrażeń regularnych do zapytań o etykiety w celu poprawy wydajności. Niektóre typy mają interfejs API metadanych. Jeśli ustawisz tę opcję nieprawidłowo, może to spowodować nietypowe działanie podczas wysyłania zapytań dotyczących wskaźników i etykiet. Sprawdź dokumentację systemu Prometheus, aby upewnić się, że wpisujesz prawidłowy typ.",
- "tooltip-query-overlap-window": "Ustaw czas trwania, np. {{example1}}, {{example2}} lub {{example3}}. Domyślnie {{default}}. Ten czas trwania zostanie dodany do czasu trwania każdego zapytania przyrostowego.",
- "tooltip-query-timeout": "Ustaw limit czasu zapytania Prometheus.",
- "tooltip-scrape-interval": "Ten odstęp czasu określa, jak często Prometheus pobiera dane z obiektów docelowych. Ustaw tę wartość na typowy odstęp czasu pobierania i oceny określony w pliku konfiguracyjnym systemu Prometheus. Jeśli ustawisz tę wartość na większą niż odstęp czasu w tym pliku konfiguracyjnym, Grafana będzie analizować dane zgodnie z tym odstępem czasowym i zobaczysz mniej punktów danych. Wartość domyślna to {{default}}.",
- "tooltip-series-limit": "Limit dotyczy wszystkich zasobów (wskaźników, etykiet i wartości) dla obu punktów końcowych (serii i etykiet). Pozostaw pole puste, aby użyć domyślnego limitu (40 000). Ustaw wartość 0, aby wyłączyć limit i pobrać wszystko. Może to spowodować problemy z wydajnością. Domyślny limit wynosi 40 000.",
- "tooltip-use-series-endpoint": "Zaznaczenie tej opcji spowoduje preferowanie punktu końcowego szeregu z parametrem {{exampleParameter}}, a nie punktu końcowego wartości etykiet z parametrem {{exampleParameter}}. Chociaż punkt końcowy wartości etykiet jest uważany za bardziej wydajny, niektórzy użytkownicy mogą preferować szeregi, ponieważ obsługują one metodę POST, podczas gdy punkt końcowy wartości etykiet uwzględnia tylko metodę GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(wyłączone)",
- "enabled-label": "Przeglądarka metryk"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Zawiera tylko unikalne etykiety",
- "description-custom": "Podaj szablon nazewnictwa",
- "description-verbose": "Wszystkie nazwy i wartości etykiet",
- "label-auto": "Automatycznie",
- "label-custom": "Niestandardowy",
- "label-verbose": "Szczegółowy"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Oblicz średnią wymiarów",
- "documentation-bottomk": "Najmniejsza liczba k elementów według wartości próbki",
- "documentation-count": "Policz liczbę elementów w wektorze",
- "documentation-count-values": "Policz liczbę elementów o tej samej wartości",
- "documentation-group": "Wszystkie wartości w wektorze wynikowym wynoszą 1",
- "documentation-max": "Wybierz wartość maksymalną z wymiarów",
- "documentation-min": "Wybierz wartość minimalną z wymiarów",
- "documentation-quantile": "Oblicz φ-kwantyl (0 ≤ φ ≤ 1) z wymiarów",
- "documentation-stddev": "Oblicz odchylenie standardowe populacji z wymiarów",
- "documentation-stdvar": "Oblicz wariancję standardową populacji z wymiarów",
- "documentation-sum": "Oblicz sumę z wymiarów",
- "documentation-topk": "Największa liczba k elementów według wartości próbki"
- },
- "getFunctions": {
- "documentation-abs": "Zwraca wektor wejściowy ze wszystkimi wartościami próbki przekonwertowanymi na ich wartość bezwzględną.",
- "documentation-absent": "Zwraca pusty wektor, jeśli przekazany wektor ma jakiekolwiek elementy, i jednoelementowy wektor o wartości 1, jeśli przekazany wektor nie ma żadnych elementów. Jest to przydatne do ostrzegania, gdy nie istnieją szeregi czasowe dla danej kombinacji nazwy metryki i etykiety.",
- "documentation-absent-over-time": "Zwraca pusty wektor, jeśli przekazany wektor zakresu ma jakiekolwiek elementy, i jednoelementowy wektor o wartości 1, jeśli przekazany wektor zakresu nie ma żadnych elementów.",
- "documentation-avg-over-time": "Średnia wartość wszystkich punktów w określonym odstępie czasu.",
- "documentation-ceil": "Zaokrągla wartości próbek wszystkich elementów w „v” w górę do najbliższej liczby całkowitej.",
- "documentation-changes": "Dla każdego wejściowego szeregu czasowego „changes(v range-vector)” zwraca liczbę zmian jego wartości w podanym zakresie czasu jako wektor chwilowy.",
- "documentation-clamp": "Ogranicza próbkowane wartości wszystkich elementów w „v”, aby określić dolną granicę „min” i górną granicę „max”.",
- "documentation-clamp-max": "Ogranicza próbkowane wartości wszystkich elementów w „v”, aby określić górną granicę „max”.",
- "documentation-clamp-min": "Ogranicza próbkowane wartości wszystkich elementów w „v”, aby określić dolną granicę „min”.",
- "documentation-count-over-time": "Liczba wszystkich wartości w określonym przedziale.",
- "documentation-count-scalar": "Zwraca liczbę elementów w wektorze szeregu czasowego jako wartość skalarną. Jest to przeciwieństwo operatora agregacji „count()”, który zawsze zwraca wektor (pusty, jeśli wektor wejściowy jest pusty) i pozwala na grupowanie według etykiet za pomocą klauzuli „by”.",
- "documentation-day-of-month": "Zwraca dzień miesiąca dla każdego z podanych czasów w czasie UTC. Zwracane wartości wynoszą od 1 do 31.",
- "documentation-day-of-week": "Zwraca dzień tygodnia dla każdego z podanych czasów w czasie UTC. Zwracane wartości wynoszą od 0 do 6, gdzie 0 oznacza niedzielę itd.",
- "documentation-day-of-year": "Zwraca dzień roku dla każdego z podanych czasów w czasie UTC. Zwracane wartości wynoszą od 1 do 365 dla lat nieprzestępnych i od 1 do 366 dla lat przestępnych.",
- "documentation-days-in-month": "Zwraca liczbę dni w miesiącu dla każdego z podanych czasów w czasie UTC. Zwracane wartości wynoszą od 28 do 31.",
- "documentation-deg": "Konwertuje radiany na stopnie dla wszystkich elementów w „v”",
- "documentation-delta": "Oblicza różnicę między pierwszą i ostatnią wartością każdego elementu szeregu czasowego w wektorze zakresu „v”, zwracając wektor chwilowy z podanymi deltami i równoważnymi etykietami. Delta jest ekstrapolowana w celu pokrycia pełnego zakresu czasu określonego w selektorze wektora zakresu, tak aby możliwe było uzyskanie wyniku niebędącego liczbą całkowitą, nawet jeśli wszystkie wartości próbek są liczbami całkowitymi.",
- "documentation-deriv": "Oblicza pochodną na sekundę szeregu czasowego w wektorze zakresu „v”, stosując prostą regresję liniową.",
- "documentation-double-exponential-smoothing": "Tworzy wygładzoną wartość dla szeregów czasowych na podstawie zakresu w „v”. Im niższy współczynnik wygładzania „sf”, tym większą wagę mają stare dane. Im wyższy współczynnik trendu „tf”, tym więcej trendów w danych jest brane pod uwagę. Zarówno „sf”, jak i „tf” muszą mieścić się w przedziale od 0 do 1.",
- "documentation-drop-common-labels": "Usuwa wszystkie etykiety, które mają tę samą nazwę i wartość we wszystkich seriach w wektorze wejściowym.",
- "documentation-exp": "Oblicza funkcję wykładniczą dla wszystkich elementów w „v”.\nPrzypadki szczególne:\n* „Exp(+Inf) = +Inf” \n* „Exp(NaN) = NaN”",
- "documentation-floor": "Zaokrągla wartości próbek wszystkich elementów w „v” w dół do najbliższej liczby całkowitej.",
- "documentation-histogram-avg": "Zwraca średnią arytmetyczną zaobserwowanych wartości przechowywanych w histogramie natywnym. Próbki, które nie są histogramami natywnymi, są ignorowane i nie pojawiają się w zwracanym wektorze.",
- "documentation-histogram-count": "Zwraca liczbę obserwacji przechowywanych w histogramie natywnym.",
- "documentation-histogram-fraction": "Zwraca szacunkowy ułamek obserwacji między podanymi wartościami dolną i górną.",
- "documentation-histogram-quantile": "Oblicza φ-kwantyl (0 ≤ φ ≤ 1) z przedziałów „b” histogramu. Próbki w „b” to liczby obserwacji w każdym przedziale. Każda próbka musi mieć etykietę „le”, gdzie wartość etykiety oznacza górną granicę przedziału włącznie. (Próbki bez takiej etykiety są ignorowane bez komunikatu). Typ metryki histogramu automatycznie zapewnia szeregi czasowe z przyrostkiem „_bucket” i odpowiednimi etykietami.",
- "documentation-histogram-stddev": "Zwraca szacowane odchylenie standardowe obserwacji w histogramie natywnym, na podstawie średniej geometrycznej przedziałów, w których znajdują się obserwacje.",
- "documentation-histogram-stdvar": "Zwraca oszacowaną wariancję standardową obserwacji w histogramie natywnym.",
- "documentation-histogram-sum": "Zwraca sumę obserwacji przechowywanych w histogramie natywnym.",
- "documentation-holt-winters": "W Prometheus 3.x nazwa zmieniła się na double_exponential_smoothing. W przypadku Prometheus w wersji 3.0 lub nowszej należy używać double_exponential_smoothing. \n\nTworzy wygładzoną wartość dla szeregów czasowych na podstawie zakresu w „v”. Im niższy współczynnik wygładzania „sf”, tym większą wagę mają stare dane. Im wyższy współczynnik trendu „tf”, tym więcej trendów w danych jest brane pod uwagę. Zarówno „sf”, jak i „tf” muszą mieścić się w przedziale od 0 do 1.",
- "documentation-hour": "Zwraca godzinę dla każdego z podanych czasów w UTC. Zwracane wartości wynoszą od 0 do 23.",
- "documentation-idelta": "Oblicza różnicę między dwiema ostatnimi próbkami w wektorze zakresu „v”, zwracając wektor chwilowy z podanymi deltami i równoważnymi etykietami.",
- "documentation-increase": "Oblicza przyrost szeregu czasowego w wektorze zakresu. Przerwy w monotoniczności (takie jak resetowanie licznika z powodu ponownego uruchomienia celu) są automatycznie korygowane. Przyrost jest ekstrapolowany w celu pokrycia pełnego zakresu czasu określonego w selektorze wektora zakresu, tak aby możliwe było uzyskanie wyniku niebędącego liczbą całkowitą, nawet jeśli licznik zwiększa się tylko o liczby całkowite.",
- "documentation-info": "Zwraca najnowsze szczegóły i metadane dotyczące grupy metryk, takie jak ich etykiety i bieżące wartości, bez wykonywania jakichkolwiek obliczeń",
- "documentation-irate": "Oblicza chwilową szybkość przyrostu szeregu czasowego na sekundę w wektorze zakresu. Jest to oparte na ostatnich dwóch punktach danych. Przerwy w monotoniczności (takie jak zresetowanie licznika z powodu ponownego uruchomienia celu) są automatycznie korygowane.",
- "documentation-label-join": "Dla każdego szeregu czasowego w „v” łączy wszystkie wartości wszystkich „src_labels” za pomocą elementu „separator” i zwraca szereg czasowy z etykietą „dst_label” zawierającą połączoną wartość. Ta funkcja może zawierać dowolną liczbę „src_labels”.",
- "documentation-label-replace": "Dla każdego szeregu czasowego w „v” „label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)” dopasowuje wyrażenie regularne „regex” do etykiety „src_label”. Jeśli dane się zgadzają, szereg czasowy jest zwracany z etykietą „dst_label” zastąpioną rozszerzeniem „replacement”. Element „$1” jest zastępowany pierwszą pasującą podgrupą, „$2” drugą itd. Jeśli wyrażenie regularne nie pasuje, to szereg czasowy jest zwracany bez zmian.",
- "documentation-last-over-time": "Najnowsza wartość punktowa w określonym przedziale.",
- "documentation-ln": "Oblicza logarytm naturalny dla wszystkich elementów w „v”.\nPrzypadki szczególne:\n * „ln(+Inf) = +Inf”\n * „ln(0) = -Inf”\n * „ln(x < 0) = NaN”\n * „ln(NaN) = NaN”",
- "documentation-log10": "Oblicza logarytm dziesiętny dla wszystkich elementów w „v”. Przypadki szczególne są równoważne z przypadkami w „ln”.",
- "documentation-log2": "Oblicza logarytm binarny dla wszystkich elementów w „v”. Przypadki szczególne są równoważne z przypadkami w „ln”.",
- "documentation-max-over-time": "Maksymalna wartość wszystkich punktów w określonym odstępie czasu.",
- "documentation-min-over-time": "Minimalna wartość wszystkich punktów w określonym odstępie czasu.",
- "documentation-minute": "Zwraca minutę dla każdego z podanych czasów w UTC. Zwracane wartości wynoszą od 0 do 59.",
- "documentation-month": "Zwraca miesiąc dla każdego z podanych czasów w UTC. Zwracane wartości wynoszą od 1 do 12, gdzie 1 oznacza styczeń itd.",
- "documentation-pi": "Zwraca pi",
- "documentation-predict-linear": "Przewiduje wartość szeregu czasowego „t” sekund od teraz, na podstawie wektora zakresu „v”, stosując prostą regresję liniową.",
- "documentation-present-over-time": "Wartość 1 dla dowolnej serii w określonym odstępie czasu.",
- "documentation-quantile-over-time": "φ-kwantyl (0 ≤ φ ≤ 1) wartości w określonym odstępie czasu.",
- "documentation-rad": "Konwertuje stopnie na radiany dla wszystkich elementów w „v”",
- "documentation-rate": "Oblicza średnią szybkość przyrostu szeregu czasowego na sekundę w wektorze zakresu. Przerwy w monotoniczności (takie jak resetowanie licznika z powodu ponownego uruchomienia celu) są automatycznie korygowane. Ponadto obliczenia są ekstrapolowane do końców zakresu czasu, co pozwala na pominięcie pobierania lub niedoskonałe dopasowanie cykli pobierania do przedziału zakresu czasu.",
- "documentation-resets": "Dla każdego wejściowego szeregu czasowego „resets(v range-vector)” zwraca liczbę resetów licznika w podanym zakresie czasu jako wektor chwilowy. Każdy spadek wartości między dwiema kolejnymi próbkami jest interpretowany jako zresetowanie licznika.",
- "documentation-round": "Zaokrągla wartości próbek wszystkich elementów w „v” do najbliższej liczby całkowitej. Remisy są rozwiązywane przez zaokrąglenie w górę. Opcjonalny argument „to_nearest” pozwala określić najbliższą wielokrotność, do której należy zaokrąglić wartości próbek. Wielokrotność ta może być również ułamkiem.",
- "documentation-scalar": "Dla jednoelementowego wektora wejściowego „scalar(v instant-vector)” zwraca wartość próbki tego pojedynczego elementu jako wartość skalarną. Jeśli wektor wejściowy nie ma dokładnie jednego elementu, „scalar” zwróci „NaN”.",
- "documentation-sgn": "Zwraca wektor ze wszystkimi wartościami próbek przekonwertowanymi na ich znak, zdefiniowany jako: 1, jeśli v jest dodatnie, -1, jeśli v jest ujemne, i 0, jeśli v jest równe zero.",
- "documentation-sort": "Zwraca elementy wektora posortowane według ich próbkowanych wartości w kolejności rosnącej.",
- "documentation-sort-desc": "Zwraca elementy wektora posortowane według ich próbkowanych wartości w kolejności malejącej.",
- "documentation-sqrt": "Oblicza pierwiastek kwadratowy wszystkich elementów w „v”.",
- "documentation-stddev-over-time": "Odchylenie standardowe populacji wartości w określonym przedziale.",
- "documentation-stdvar-over-time": "Wariancja standardowa populacji wartości w określonym przedziale.",
- "documentation-sum-over-time": "Suma wszystkich wartości w określonym przedziale.",
- "documentation-time": "Zwraca liczbę sekund od 1 stycznia 1970 r. UTC. Zwróć uwagę, że nie zwraca to bieżącego czasu, ale czas, w którym wyrażenie ma zostać ocenione.",
- "documentation-timestamp": "Zwraca sygnaturę czasową każdej z próbek danego wektora jako liczbę sekund od 1 stycznia 1970 r. UTC.",
- "documentation-vector": "Zwraca wartość skalarną „s” jako wektor bez etykiet.",
- "documentation-year": "Zwraca rok dla każdego z podanych czasów w UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "oblicza arcus cosinus wszystkich elementów w {{argument}}",
- "documentation-acosh": "oblicza odwrotny cosinus hiperboliczny wszystkich elementów w {{argument}}",
- "documentation-asin": "oblicza arcus sinus wszystkich elementów w {{argument}}",
- "documentation-asinh": "oblicza odwrotny sinus hiperboliczny wszystkich elementów w {{argument}}",
- "documentation-atan": "oblicza arcus tangens wszystkich elementów w {{argument}}",
- "documentation-atanh": "oblicza odwrotny tangens hiperboliczny wszystkich elementów w {{argument}}",
- "documentation-cos": "oblicza cosinus wszystkich elementów w {{argument}}",
- "documentation-cosh": "oblicza cosinus hiperboliczny wszystkich elementów w {{argument}}",
- "documentation-sin": "oblicza sinus wszystkich elementów w {{argument}}",
- "documentation-sinh": "oblicza sinus hiperboliczny wszystkich elementów w {{argument}}",
- "documentation-tan": "oblicza tangens wszystkich elementów w {{argument}}",
- "documentation-tanh": "oblicza tangens hiperboliczny wszystkich elementów w {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Przekaż opinię",
- "title-give-feedback": "Eksplorator wskaźników to nowa funkcja – daj nam znać, jak możemy go ulepszyć"
- },
- "get-collapsed-info": {
- "exemplars": "Przykłady: {{value}}",
- "format": "Format: {{value}}",
- "legend": "Legenda: {{value}}",
- "step": "Krok: {{value}}",
- "type": "Typ: {{value}}"
- },
- "get-placeholders": {
- "browse": "Wyszukaj metryki według nazwy",
- "type": "Filtruj wg typu"
- },
- "get-prom-types": {
- "description-counter": "Metryka skumulowana reprezentująca pojedynczy monotonicznie rosnący licznik, którego wartość może tylko wzrosnąć lub zostać zresetowana do zera po ponownym uruchomieniu.",
- "description-gauge": "Metryka reprezentująca pojedynczą wartość liczbową, która może dowolnie wzrastać i spadać.",
- "description-histogram": "Histogram pobiera próbki obserwacji (zwykle takie jak czasy trwania żądań lub rozmiary odpowiedzi) i zlicza je w konfigurowalnych przedziałach.",
- "description-native-histogram": "Histogramy natywne różnią się od klasycznych histogramów Prometheus na wiele sposobów: granice przedziału histogramu natywnego są obliczane za pomocą wzoru, który zależy od skali (rozdzielczości) histogramu natywnego i nie są definiowane przez użytkownika.",
- "description-no-type": "Te metryki nie mają zdefiniowanego typu w metadanych.",
- "description-summary": "Podsumowanie pobiera próbki obserwacji (zwykle takie jak czasy trwania żądań i rozmiary odpowiedzi) i może obliczać konfigurowalne kwantyle w przesuwnym oknie czasowym.",
- "description-unknown": "Te metryki mają przypisany typ nieznany w metadanych.",
- "label-counter": "Licznik",
- "label-gauge": "Wskaźnik",
- "label-histogram": "Histogram",
- "label-native-histogram": "Histogram natywny",
- "label-no-type": "Bez typu",
- "label-summary": "Podsumowanie",
- "label-unknown": "Nieznany"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Wynik analizy zapytania jest niejednoznaczny."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Usuń: {{name}}",
- "placeholder-select-label": "Wybierz etykietę",
- "placeholder-select-value": "Wybierz wartość"
- },
- "label-filters": {
- "label-filters": "Filtry etykiet",
- "label-label-filters": "Filtry etykiet",
- "tooltip-label-filters": "Opcjonalnie: służy do filtrowania wskaźników wybranych dla tego typu zapytania."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Ładowanie etykiet",
- "noOptionsMessage-no-labels-found": "Nie znaleziono etykiet"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Otwórz eksplorator wskaźników",
- "placeholder-select-metric": "Wybierz wskaźnik",
- "tooltip-open-metrics-explorer": "Otwórz eksplorator wskaźników"
- },
- "label-metric": "Metryka",
- "tooltip-metric": "Opcjonalnie: zwraca listę wartości etykiet dla nazwy etykiety w określonym wskaźniku."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Przeglądaj wskaźniki",
- "currently-selected": "Obecnie wybrane: {{selected}}",
- "metrics-pre-filtered": "Te wskaźniki zostały wstępnie przefiltrowane według etykiet wybranych w filtrze etykiet.",
- "title-metrics-explorer": "Eksplorator wskaźników"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorowanie",
- "on": "Wł."
- },
- "operator": "Operator",
- "tooltip-remove-match": "Usuń dopasowanie",
- "vector-matches": "Dopasowania wektorów"
- },
- "operation-editor": {
- "not-found": "Nie znaleziono operacji {{id}}",
- "title-remove": "Usuń: {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Zastąp",
- "title-click-to-view-alternative-operations": "Kliknij, aby wyświetlić alternatywne operacje",
- "title-remove-operation": "Usuń operację"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Kliknij, aby wyświetlić opis",
- "title-remove-operation": "Usuń operację"
- },
- "operation-list": {
- "operations": "Operacje",
- "placeholder-search": "Szukaj",
- "title-add-operation": "Dodaj operację"
- },
- "operation-param-editor": {
- "title-add": "Dodaj: {{name}}",
- "title-remove": "Usuń: {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Oblicza {{aggregationName}} z wymiarów, zachowując {{labelWord}} {{labels}}.",
- "label-default": "Oblicza {{aggregationName}} z wymiarów.",
- "label-without": "Oblicza {{aggregationName}} z {{labels}} wymiarów. Wszystkie inne etykiety są zachowywane."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Przełącznik przykładów.",
- "aria-label-format": "Formatuj pole kombi",
- "aria-label-lower-limit-parameter": "Pole tekstowe minimalnego kroku, ustaw dolną granicę dla parametru kroku",
- "aria-label-select-resolution": "Wybierz rozwiązanie",
- "aria-label-type": "Grupa przycisków opcji typu",
- "format-options": {
- "label-heatmap": "Mapa intensywności",
- "label-table": "Tabela",
- "label-time-series": "Szereg czasowy"
- },
- "label-exemplars": "Przykłady",
- "label-format": "Format",
- "label-min-step": "Min. krok",
- "label-resolution": "Rozwiązanie",
- "label-type": "Typ",
- "placeholder-auto": "automatycznie",
- "title-options": "Opcje",
- "tooltip-min-step": "Dodatkowa dolna granica dla parametru kroku zapytania Prometheus oraz dla zmiennych <2>{{interval}}2> i <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Wystąpił błąd składni lub struktura zapytania nie może zostać zwizualizowana podczas przełączania na tryb konstruktora. Części zapytania mogą zostać utracone.",
- "confirmText-continue": "Kontynuuj",
- "kick-start-your-query": "Uruchom zapytanie",
- "label-explain": "Wyjaśnij",
- "run-queries": "Uruchom zapytania",
- "title-parsing-error-switch-builder": "Błąd analizy: przełączyć na tryb konstruktora?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Pole kombi legendy",
- "label-legend": "Legenda",
- "placeholder-select-legend-mode": "Wybierz tryb legendy",
- "tooltip-legend": "Zastąpienie nazwy szeregu lub szablon. Na przykład wzorzec {{templateExample}} zostanie zastąpiony wartością etykiety {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "wskazówka: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Konstruktor",
- "label-code": "Kod"
- }
- },
- "query-pattern": {
- "apply-query": "Zastosuj zapytanie",
- "aria-label-apply-query-starter-button": "przycisk Zastosuj starter zapytania",
- "aria-label-back-button": "przycisk Wstecz",
- "aria-label-create-new-query-button": "przycisk Utwórz nowe zapytanie",
- "aria-label-raw-query": "Nieprzetworzone zapytanie {{patternName}}",
- "aria-label-use-this-query-button": "użyj tego przycisku zapytania",
- "back": "Wstecz",
- "create-new-query": "Utwórz nowe zapytanie",
- "use-this-query": "Użyj tego zapytania"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "zamknij okno modalne rozpoczęcia zapytania",
- "aria-label-kick-start-your-query-modal": "Uruchom okno modalne zapytania",
- "aria-label-toggle-query-starter": "otwórz i zamknij kartę początkową zapytania {{patternType}}",
- "close": "Zamknij",
- "description-kick-start-your-query": "Rozpocznij zapytanie, wybierając jedno z tych zapytań. Następnie możesz kontynuować tworzenie zapytania.",
- "label-toggle-query-starter": "Startery zapytań {{patternType}}",
- "title-kick-start-your-query": "Uruchom zapytanie"
- },
- "raw-query": {
- "aria-label-selector": "selektor"
- },
- "results-table": {
- "content-descriptive-type": "Podczas tworzenia zapytania {{descriptiveType}} system Prometheus udostępnia wiele szeregów z licznikiem typu. ",
- "description": "Opis",
- "message-expand-label-filters": "Nie znaleziono żadnych metryk. Spróbuj rozszerzyć filtry etykiet.",
- "message-expand-search": "Nie znaleziono żadnych metryk. Spróbuj rozszerzyć wyszukiwanie i filtry.",
- "message-no-metrics-found": "W źródle danych nie znaleziono żadnych metryk.",
- "name": "Imię",
- "type": "Typ"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/pt-BR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/pt-BR/grafana-prometheus.json
deleted file mode 100644
index d82d78ef278..00000000000
--- a/packages/grafana-prometheus/src/locales/pt-BR/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Erro ao carregar os dados da anotação!",
- "aria-label-lower-limit-parameter": "Definir limite inferior para o parâmetro de etapa",
- "label-min-step": "Etapa mínima",
- "label-series-value-as-timestamp": "Valor da série como registro de data e hora",
- "label-tags": "Tags",
- "label-text": "Texto",
- "label-title": "Título",
- "placeholder-auto": "automático",
- "tooltip-either-pattern-example-instance-replaced-label": "Use o nome ou um padrão. Por exemplo, {{labelTemplate}} é substituído pelo valor do rótulo {{labelName}}.",
- "tooltip-min-step": "Um limite inferior adicional para o parâmetro de etapa da consulta do Prometheus e para as variáveis <2>{{intervalVar}}2> e <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "A unidade do registro de data e hora é milissegundos. Se a unidade do valor da série for segundos, multiplique seu vetor de intervalo por 1.000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Executar uma consulta instantânea e uma consulta de intervalo"
- },
- "label": {
- "both": "Ambos"
- },
- "range-options": {
- "description": {
- "query-range": "Executar consulta em um intervalo de tempo"
- },
- "label": {
- "instant": "Instantâneo",
- "range": "Intervalo"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filtrar expressão para o rótulo",
- "description-select-labels": "Depois que os valores de rótulo são selecionados, apenas as combinações de rótulo possíveis são exibidas.",
- "select-labels-to-search-in": "2. Selecione rótulos para busca"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filtrar expressão para a métrica",
- "aria-label-limit-results-from-series-endpoint": "Limitar resultados do endpoint da série",
- "description-series-limit": "O limite se aplica a todas as métricas, rótulos e valores. Deixe o campo vazio para usar o limite padrão. Defina como 0 para desativar o limite e buscar tudo, o que pode afetar o desempenho.",
- "label-select-metric": "Depois que uma métrica é selecionada, apenas os rótulos possíveis são exibidos. Os rótulos são limitados pelo limite de série abaixo.",
- "select-a-metric": "1. Selecione uma métrica",
- "series-limit": "Limite de série"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Ficha de referências do PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Exemplares",
- "tooltip-disable-query": "Desativar consulta com exemplares",
- "tooltip-enable-query": "Ativar consulta com exemplares"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Campo extra do Prometheus",
- "aria-label-query-type-field": "Campo de tipo de consulta",
- "aria-label-step-field": "Campo de etapa",
- "min-step": "Etapa mínima",
- "query-type": "Tipo de consulta",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "É possível usar unidades de tempo e variáveis integradas aqui. Por exemplo: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (valor padrão se nenhuma unidade for especificada: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Insira uma consulta PromQL…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Consulta clássica",
- "aria-label-metric-regex": "Regex da métrica",
- "aria-label-metric-selector": "Seletor de métrica",
- "aria-label-prometheus-query": "Consulta do Prometheus",
- "aria-label-query-type": "Tipo de consulta",
- "aria-label-series-query": "Consulta de série",
- "label-classic-query": "Consulta clássica",
- "label-label": "Etiqueta",
- "label-metric-regex": "Regex da métrica",
- "label-query": "Consulta",
- "label-query-type": "Tipo de consulta",
- "label-series-query": "Consulta de série",
- "placeholder-classic-query": "Consulta clássica",
- "placeholder-metric-regex": "Regex da métrica",
- "placeholder-prometheus-query": "Consulta do Prometheus",
- "placeholder-select-query-type": "Selecionar tipo de consulta",
- "placeholder-series-query": "Consulta de série",
- "returns-metrics-matching-specified-metric-regex": "Retorna uma lista de métricas que correspondem à métrica regex especificada.",
- "tooltip-classic-query": "A implementação original do editor de consultas variáveis do Prometheus. Insira uma string com o tipo de consulta e os parâmetros corretos, conforme descrito nesta documentação. Por exemplo, {{exampleQuery}}.",
- "tooltip-label": "Retorna uma lista de valores de rótulo para o nome do rótulo em todas as métricas, a menos que a métrica seja especificada.",
- "tooltip-metric-regex": "Retorna uma lista de nomes de rótulos, havendo a opção de filtrar por métrica regex especificada.",
- "tooltip-query": "Retorna uma lista de resultados de consulta do Prometheus para a consulta. Isso pode incluir funções do Prometheus, como {{exampleQuery}}.",
- "tooltip-query-type": "O plug-in de fonte de dados do Prometheus fornece os seguintes tipos de consulta para variáveis de modelo.",
- "tooltip-series-query": "Insira uma métrica com rótulos, apenas uma métrica ou apenas rótulos, como {{example1}}, {{example2}} ou {{example3}}. Retorna uma lista de séries temporais associadas aos dados inseridos."
- },
- "selector-actions": {
- "aria-label-selector": "seletor",
- "aria-label-selector-clear-button": "Botão de redefinição do seletor",
- "aria-label-use-selector-as-metrics-button": "Botão para usar o seletor como métrica",
- "aria-label-use-selector-for-query-button": "Botão para usar o seletor para consulta",
- "aria-label-validate-submit-button": "Botão para validar envio",
- "clear": "Limpar",
- "resulting-selector": "4. Seletor resultante",
- "use-as-rate-query": "Usar como consulta de taxa",
- "use-query": "Usar consulta",
- "validate-selector": "Validar seletor"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filtrar expressão para valores do rótulo",
- "aria-label-values-for": "Valores para {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Use o campo de busca para encontrar valores nos rótulos selecionados.",
- "select-multiple-values-for-your-labels": "3. Selecione (vários) valores para seus rótulos"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Permitir como destino de regras de registro",
- "label-manage-alerts-via-alerting-ui": "Gerenciar alertas por meio da interface de alertas",
- "title-alerting": "Alertas",
- "tooltip-allow-as-recording-rules-target": "Permita que esta fonte de dados seja selecionada como destino para armazenar regras de gravação.",
- "tooltip-manage-alerts-via-alerting-ui": "Gerenciar regras de alerta para esta fonte de dados. Para gerenciar outros recursos do alerting, adicione uma fonte de dados do Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "O modo de acesso via navegador na fonte de dados do Prometheus não está mais disponível. Troque para o modo de acesso via servidor.",
- "description-advanced-settings": "As configurações adicionais são opcionais, e você pode defini-las para ter mais controle sobre sua fonte de dados.",
- "title-advanced-settings": "Configurações avançadas",
- "title-error": "Erro"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Seu método de acesso é <1>Navegador1>, isso significa que deve ser possível acessar a URL a partir do navegador.",
- "tooltip-http-url": "Especifique uma URL HTTP completa (por exemplo, {{exampleURL}})",
- "tooltip-server-access-mode": "Seu método de acesso é <1>Servidor1>, isso significa que deve ser possível acessar a URL a partir do back-end/servidor da Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Acesse a documentação para mais informações aqui."
- },
- "exemplar-setting": {
- "label-data-source": "Fonte de dados",
- "label-internal-link": "Link interno",
- "label-label-name": "Nome do rótulo",
- "label-remove-exemplar-link": "Remover link do exemplar",
- "label-url": "URL",
- "label-url-label": "Rótulo de URL",
- "placeholder-go-to-examplecom": "Ir para exemplo.com",
- "placeholder-httpsexamplecomvalueraw": "https://exemplo.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Remover link do exemplar",
- "tooltip-data-source": "A fonte de dados que será acessada pelo exemplar.",
- "tooltip-internal-link": "Ative esta opção se você tiver um link interno. Quando ativada, essa opção revela o seletor de fonte de dados. Selecione o armazenamento de dados de traços de back-end para seus dados exemplares.",
- "tooltip-label-name": "O nome do campo no objeto de rótulos que deve ser usado para obter o traceID.",
- "tooltip-url": "A URL do back-end de traço que o usuário acessaria para ver seu traço",
- "tooltip-url-label": "Use para substituir o rótulo do botão no campo traceID do exemplar."
- },
- "exemplars-settings": {
- "add": "Adicionar",
- "no-exemplars-configurations": "Sem configurações de exemplares",
- "title-exemplars": "Exemplares"
- },
- "prom-settings": {
- "aria-label-default-editor": "Editor padrão (código ou construtor)",
- "aria-label-prom-type-type": "Tipo {{promType}}",
- "aria-label-prometheus-type": "Tipo do Prometheus",
- "aria-label-select-http-method": "Selecionar método HTTP",
- "editor-options": {
- "label-builder": "Construtor",
- "label-code": "Código"
- },
- "label-cache-level": "Nível de cache",
- "label-custom-query-parameters": "Parâmetros de consulta personalizados",
- "label-default-editor": "Editor padrão",
- "label-disable-metrics-lookup": "Desativar busca de métricas",
- "label-disable-recording-rules-beta": "Desativar regras de registro (beta)",
- "label-http-method": "Método HTTP",
- "label-incremental-querying-beta": "Consulta incremental (beta)",
- "label-prom-type-version": "Versão {{promType}}",
- "label-prometheus-type": "Tipo do Prometheus",
- "label-query-overlap-window": "Janela de sobreposição de consulta",
- "label-query-timeout": "Tempo limite da consulta",
- "label-scrape-interval": "Intervalo de coleta",
- "label-series-limit": "Limite de série",
- "label-use-series-endpoint": "Usar endpoint da série",
- "more-info": "Para mais informações sobre como configurar o tipo e a versão do Prometheus em fontes de dados, consulte a <2>documentação de provisionamento2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Exemplo: {{example}}",
- "title-interval-behaviour": "Comportamento de intervalo",
- "title-other": "Outro",
- "title-performance": "Desempenho",
- "title-query-editor": "Editor de consultas",
- "tooltip-cache-level": "Define o nível de cache do navegador para consultas do editor. Recomenda-se usar configurações de cache mais elevadas para fontes de dados de alta cardinalidade.",
- "tooltip-custom-query-parameters": "Adicione parâmetros personalizados ao URL de consulta do Prometheus. Por exemplo, {{example1}}, {{example2}}, {{example3}} ou{{example4}}. Vários parâmetros devem ser concatenados com {{concatenationChar}}.",
- "tooltip-default-editor": "Defina a opção de editor padrão para todos os usuários desta fonte de dados.",
- "tooltip-disable-metrics-lookup": "Marcar esta opção desativará o seletor de métricas e a compatibilidade com métricas/rótulos no preenchimento automático do campo de consulta. Isso é útil se você tiver problemas de desempenho com instâncias maiores do Prometheus. ",
- "tooltip-disable-recording-rules-beta": "Este recurso desativará as regras de registro. Ative o recurso para aprimorar o desempenho do painel",
- "tooltip-http-method": "Você pode usar o método HTTP POST ou GET para consultar sua fonte de dados do Prometheus. POST é o método recomendado por permitir consultas maiores. Altere para GET se sua versão do Prometheus for anterior à versão 2.1 ou se as solicitações POST estiverem restritas na sua rede.",
- "tooltip-incremental-querying-beta": "Este recurso alterará o comportamento padrão das consultas relativas: os dados recentes deixam de ser sempre solicitados da instância do Prometheus e passam a utilizar dados em cache e a solicitar apenas novos registros. Ative o recurso para diminuir a carga do banco de dados e da rede.",
- "tooltip-prom-type-version": "Use essa opção para definir a versão da sua instância {{promType}} se ela não for configurada automaticamente.",
- "tooltip-prometheus-type": "Defina essa opção para o tipo do seu banco de dados do Prometheus. Por exemplo: Prometheus, Cortex, Mimir ou Thanos. Ao alterar este campo, suas configurações atuais serão salvas. Certos tipos de Prometheus são compatíveis ou não com diversas APIs. Por exemplo, alguns tipos são compatíveis com correspondência de regex para consultas de rótulo, visando a melhoria do desempenho. Alguns tipos têm uma API para metadados. Se essa opção por definida incorretamente, a consulta de métricas e rótulos poderá apresentar um comportamento incomum. Verifique a documentação do Prometheus para garantir que você inseriu o tipo correto.",
- "tooltip-query-overlap-window": "Defina uma duração como {{example1}}, {{example2}} ou {{example3}}. O valor padrão é {{default}}. Esta duração será adicionada à duração de cada solicitação subsequente.",
- "tooltip-query-timeout": "Defina o tempo limite de consulta do Prometheus.",
- "tooltip-scrape-interval": "Este intervalo é a frequência com que o Prometheus coleta dados dos alvos. Defina essa opção para o intervalo comum de coleta e avaliação configurado no seu arquivo de configuração do Prometheus. Se você definir um valor maior do que o intervalo do seu arquivo de configuração do Prometheus, a Grafana avaliará os dados de acordo com esse intervalo e você verá menos pontos de dados. O valor padrão é {{default}}.",
- "tooltip-series-limit": "O limite se aplica a todos os recursos (métricas, rótulos e valores) para ambos os endpoints (séries e rótulos). Deixe o campo vazio para usar o limite padrão (40.000). Defina como 0 para desativar o limite e buscar tudo, o que pode afetar o desempenho. O limite padrão é 40.000.",
- "tooltip-use-series-endpoint": "Ao marcar esta opção, o endpoint da série com o parâmetro {{exampleParameter}} terá preferência sobre o endpoint de valores de rótulo com o parâmetro {{exampleParameter}}. Ainda que o endpoint de valores de rótulo seja considerado mais eficiente, alguns usuários podem preferir a série por ela ter um método POST, enquanto o endpoint de valores de rótulo tem apenas um método GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(desativado)",
- "enabled-label": "Navegador de métricas"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Inclui apenas rótulos exclusivos",
- "description-custom": "Forneça um modelo de nomenclatura",
- "description-verbose": "Todos os nomes e valores de rótulos",
- "label-auto": "Automático",
- "label-custom": "Personalizado",
- "label-verbose": "Descritivo"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Calcular a média sobre as dimensões",
- "documentation-bottomk": "Menores elementos k por valor de amostra",
- "documentation-count": "Contar o número de elementos no vetor",
- "documentation-count-values": "Contar o número de elementos com o mesmo valor",
- "documentation-group": "Todos os valores no vetor resultante são 1",
- "documentation-max": "Selecionar o máximo sobre as dimensões",
- "documentation-min": "Selecionar o mínimo sobre as dimensões",
- "documentation-quantile": "Calcular φ-quantil (0 ≤ φ ≤ 1) sobre as dimensões",
- "documentation-stddev": "Calcular o desvio padrão da população sobre as dimensões",
- "documentation-stdvar": "Calcular a variância padrão da população sobre as dimensões",
- "documentation-sum": "Calcular a soma sobre as dimensões",
- "documentation-topk": "Maiores elementos k por valor de amostra"
- },
- "getFunctions": {
- "documentation-abs": "Retorna o vetor de entrada com todos os valores de amostra convertidos para o seu valor absoluto.",
- "documentation-absent": "Retorna um vetor vazio se o vetor passado para ele tiver algum elemento e um vetor de 1 elemento com o valor 1 se o vetor passado para ele não tiver elementos. Isso é útil para alertar quando não existe nenhuma série temporal para um determinado nome de métrica e combinação de rótulo.",
- "documentation-absent-over-time": "Retorna um vetor vazio se o vetor de intervalo passado para ele tiver quaisquer elementos e um vetor de 1 elemento com o valor 1 se o vetor de intervalo passado para ele não tiver elementos.",
- "documentation-avg-over-time": "O valor médio de todos os pontos no intervalo especificado.",
- "documentation-ceil": "Arredonda os valores de amostra de todos os elementos em \"v\" para cima, para o número inteiro mais próximo.",
- "documentation-changes": "Para cada série temporal de entrada, \"changes(v range-vector)\" retorna o número de vezes que seu valor mudou dentro do intervalo de tempo fornecido como um vetor instantâneo.",
- "documentation-clamp": "Fixa os valores de amostra de todos os elementos em \"v\" para ter um limite inferior de \"mín.\" e um limite superior de \"máx.\".",
- "documentation-clamp-max": "Fixa os valores de amostra de todos os elementos em \"v\" para ter um limite superior de \"máx.\".",
- "documentation-clamp-min": "Fixa os valores de amostra de todos os elementos em \"v\" para ter um limite inferior de \"mín.\".",
- "documentation-count-over-time": "A contagem de todos os valores no intervalo especificado.",
- "documentation-count-scalar": "Retorna o número de elementos em um vetor de série temporal como um escalar. Isso contrasta com o operador de agregação \"count()\", que sempre retorna um vetor (um vazio se o vetor de entrada estiver vazio) e permite o agrupamento por rótulos por meio de uma cláusula \"by\".",
- "documentation-day-of-month": "Retorna o dia do mês para cada um dos horários fornecidos em UTC. Os valores retornados são de 1 a 31.",
- "documentation-day-of-week": "Retorna o dia da semana para cada um dos horários fornecidos em UTC. Os valores retornados são de 0 a 6, onde 0 significa domingo etc.",
- "documentation-day-of-year": "Retorna o dia do ano para cada um dos horários fornecidos em UTC. Os valores retornados são de 1 a 365 para anos não bissextos e de 1 a 366 em anos bissextos.",
- "documentation-days-in-month": "Retorna o número de dias no mês para cada um dos horários fornecidos em UTC. Os valores retornados são de 28 a 31.",
- "documentation-deg": "Converte radianos em graus para todos os elementos em v",
- "documentation-delta": "Calcula a diferença entre o primeiro e o último valor de cada elemento da série temporal em um vetor de intervalo \"v\", retornando um vetor instantâneo com os deltas fornecidos e rótulos equivalentes. O delta é extrapolado para cobrir o intervalo de tempo total, conforme especificado no seletor de vetor de intervalo, de modo que seja possível obter um resultado não inteiro, mesmo que os valores da amostra sejam todos inteiros.",
- "documentation-deriv": "Calcula a derivada por segundo da série temporal em um vetor de intervalo \"v\", usando regressão linear simples.",
- "documentation-double-exponential-smoothing": "Produz um valor suavizado para séries temporais com base no intervalo em \"v\". Quanto menor o fator de suavização \"sf\", mais importância é dada aos dados antigos. Quanto maior o fator de tendência \"tf\", mais tendências nos dados são consideradas. Tanto \"sf\" quanto \"tf\" devem estar entre 0 e 1.",
- "documentation-drop-common-labels": "Elimina todos os rótulos que têm o mesmo nome e valor em todas as séries no vetor de entrada.",
- "documentation-exp": "Calcula a função exponencial para todos os elementos em \"v\".\nCasos especiais são:\n* \"Exp(+Inf) = +Inf\" \n* \"Exp(NaN) = NaN\"",
- "documentation-floor": "Arredonda os valores de amostra de todos os elementos em \"v\" para o número inteiro mais próximo.",
- "documentation-histogram-avg": "Retorna a média aritmética dos valores observados armazenados em um histograma nativo. Amostras que não são histogramas nativos são ignoradas e não aparecem no vetor retornado.",
- "documentation-histogram-count": "Retorna a contagem de observações armazenadas em um histograma nativo.",
- "documentation-histogram-fraction": "Retorna a fração estimada de observações entre os valores inferior e superior fornecidos.",
- "documentation-histogram-quantile": "Calcula o φ-quantil (0 ≤ φ ≤ 1) a partir dos buckets \"b\" de um histograma. As amostras em \"b\" são as contagens de observações em cada bucket. Cada amostra deve ter um rótulo \"le\" onde o valor do rótulo denota o limite superior inclusivo do bucket. (Amostras sem tal rótulo são silenciosamente ignoradas.) O tipo de métrica de histograma fornece automaticamente séries temporais com o sufixo \"_bucket\" e os rótulos apropriados.",
- "documentation-histogram-stddev": "Retorna o desvio padrão estimado das observações em um histograma nativo, com base na média geométrica dos buckets onde as observações se encontram.",
- "documentation-histogram-stdvar": "Retorna a variância padrão estimada das observações em um histograma nativo.",
- "documentation-histogram-sum": "Retorna a soma de observações armazenadas em um histograma nativo.",
- "documentation-holt-winters": "Renomeado como double_exponential_smoothing no Prometheus v3.x. Para versões do Prometheus iguais e superiores a v3.0, use double_exponential_smoothing. \n\nProduz um valor suavizado para séries temporais com base no intervalo em \"v\". Quanto menor o fator de suavização \"sf\", mais importância é dada aos dados antigos. Quanto maior o fator de tendência \"tf\", mais tendências nos dados são consideradas. Tanto \"sf\" quanto \"tf\" devem estar entre 0 e 1.",
- "documentation-hour": "Retorna a hora do dia para cada um dos horários fornecidos em UTC. Os valores retornados são de 0 a 23.",
- "documentation-idelta": "Calcula a diferença entre as duas últimas amostras no vetor de intervalo \"v\", retornando um vetor instantâneo com os deltas fornecidos e rótulos equivalentes.",
- "documentation-increase": "Calcula o aumento na série temporal no vetor de intervalo. As quebras na monotonicidade (como redefinições de contador devido a reinicializações de destino) são ajustadas automaticamente. O aumento é extrapolado para cobrir o intervalo de tempo total, conforme especificado no seletor de vetor de intervalo, de modo que seja possível obter um resultado não inteiro, mesmo que um contador aumente apenas por incrementos inteiros.",
- "documentation-info": "Retorna os detalhes e metadados mais recentes sobre um grupo de métricas, como seus rótulos e valores atuais, sem fazer nenhum cálculo",
- "documentation-irate": "Calcula a taxa instantânea por segundo de aumento da série temporal no vetor de intervalo. Isso é baseado nos dois últimos pontos de dados. As quebras na monotonicidade (como redefinições de contador devido a reinicializações de destino) são ajustadas automaticamente.",
- "documentation-label-join": "Para cada série temporal em \"v\", une todos os valores de todos os \"src_labels\" usando \"separator\" e retorna a série temporal com o rótulo \"dst_label\" contendo o valor unido. Pode haver qualquer número de \"src_labels\" nesta função.",
- "documentation-label-replace": "Para cada série temporal em \"v\", \"label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)\" corresponde à expressão regular \"regex\" em relação ao rótulo \"src_label\". Se corresponder, a série temporal é retornada com o rótulo \"dst_label\" substituído pela expansão de \"replacement\". \"$1\" é substituído pelo primeiro subgrupo correspondente, \"$2\" pelo segundo etc. Se a expressão regular não corresponder, a série temporal é retornada inalterada.",
- "documentation-last-over-time": "O valor do ponto mais recente no intervalo especificado.",
- "documentation-ln": "Calcula o logaritmo natural para todos os elementos em \"v\".\nCasos especiais são:\n * \"ln(+Inf) = +Inf\"\n * \"ln(0) = -Inf\"\n * \"ln(x < 0) = NaN\"\n * \"ln(NaN) = NaN\"",
- "documentation-log10": "Calcula o logaritmo decimal para todos os elementos em \"v\". Os casos especiais são equivalentes aos de \"ln\".",
- "documentation-log2": "Calcula o logaritmo binário para todos os elementos em \"v\". Os casos especiais são equivalentes aos de \"ln\".",
- "documentation-max-over-time": "O valor máximo de todos os pontos no intervalo especificado.",
- "documentation-min-over-time": "O valor mínimo de todos os pontos no intervalo especificado.",
- "documentation-minute": "Retorna o minuto da hora para cada um dos horários fornecidos em UTC. Os valores retornados são de 0 a 59.",
- "documentation-month": "Retorna o mês do ano para cada um dos horários fornecidos em UTC. Os valores retornados são de 1 a 12, onde 1 significa janeiro etc.",
- "documentation-pi": "Retorna pi",
- "documentation-predict-linear": "Prevê o valor da série temporal \"t\" segundos a partir de agora, com base no vetor de intervalo \"v\", usando regressão linear simples.",
- "documentation-present-over-time": "O valor 1 para qualquer série no intervalo especificado.",
- "documentation-quantile-over-time": "O φ-quantil (0 ≤ φ ≤ 1) dos valores no intervalo especificado.",
- "documentation-rad": "Converte graus em radianos para todos os elementos em v",
- "documentation-rate": "Calcula a taxa média por segundo de aumento da série temporal no vetor de intervalo. As quebras na monotonicidade (como redefinições de contador devido a reinicializações de destino) são ajustadas automaticamente. Além disso, o cálculo extrapola para as extremidades do intervalo de tempo, permitindo raspagens perdidas ou alinhamento imperfeito dos ciclos de raspagem com o período de tempo do intervalo.",
- "documentation-resets": "Para cada série temporal de entrada, \"resets(v range-vector)\" retorna o número de redefinições de contador dentro do intervalo de tempo fornecido como um vetor instantâneo. Qualquer diminuição no valor entre duas amostras consecutivas é interpretada como uma redefinição de contador.",
- "documentation-round": "Arredonda os valores de amostra de todos os elementos em \"v\" para o número inteiro mais próximo. Os empates são resolvidos arredondando para cima. O argumento opcional \"to_nearest\" permite especificar o múltiplo mais próximo para o qual os valores de amostra devem ser arredondados. Este múltiplo também pode ser uma fração.",
- "documentation-scalar": "Dado um vetor de entrada de elemento único, \"scalar(v instant-vector)\" retorna o valor de amostra desse elemento único como um escalar. Se o vetor de entrada não tiver exatamente um elemento, \"scalar\" retornará \"NaN\".",
- "documentation-sgn": "Retorna um vetor com todos os valores de amostra convertidos para o seu sinal, definido como: 1 se v for positivo, -1 se v for negativo e 0 se v for igual a zero.",
- "documentation-sort": "Retorna elementos vetoriais classificados por seus valores de amostra, em ordem crescente.",
- "documentation-sort-desc": "Retorna elementos vetoriais classificados por seus valores de amostra, em ordem decrescente.",
- "documentation-sqrt": "Calcula a raiz quadrada de todos os elementos em \"v\".",
- "documentation-stddev-over-time": "O desvio padrão da população dos valores no intervalo especificado.",
- "documentation-stdvar-over-time": "A variância padrão da população dos valores no intervalo especificado.",
- "documentation-sum-over-time": "A soma de todos os valores no intervalo especificado.",
- "documentation-time": "Retorna o número de segundos desde o dia 1 de janeiro de 1970 UTC. Observe que isso não retorna a hora atual, mas a hora em que a expressão deve ser avaliada.",
- "documentation-timestamp": "Retorna o carimbo de data/hora de cada uma das amostras do vetor fornecido como o número de segundos desde o dia 1 de janeiro de 1970 UTC.",
- "documentation-vector": "Retorna o escalar \"s\" como um vetor sem rótulos.",
- "documentation-year": "Retorna o ano para cada um dos horários fornecidos em UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "calcula o arco cosseno de todos os elementos em {{argument}}",
- "documentation-acosh": "calcula o cosseno hiperbólico inverso de todos os elementos em {{argument}}",
- "documentation-asin": "calcula o arco seno de todos os elementos em {{argument}}",
- "documentation-asinh": "calcula o seno hiperbólico inverso de todos os elementos em {{argument}}",
- "documentation-atan": "calcula o arco tangente de todos os elementos em {{argument}}",
- "documentation-atanh": "calcula a tangente hiperbólica inversa de todos os elementos em {{argument}}",
- "documentation-cos": "calcula o cosseno de todos os elementos em {{argument}}",
- "documentation-cosh": "calcula o cosseno hiperbólico de todos os elementos em {{argument}}",
- "documentation-sin": "calcula o seno de todos os elementos em {{argument}}",
- "documentation-sinh": "calcula o seno hiperbólico de todos os elementos em {{argument}}",
- "documentation-tan": "calcula a tangente de todos os elementos em {{argument}}",
- "documentation-tanh": "calcula a tangente hiperbólica de todos os elementos em {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Dar feedback",
- "title-give-feedback": "O explorador de métricas é um recurso novo. Compartilhe conosco o que podemos fazer para torná-lo ainda melhor."
- },
- "get-collapsed-info": {
- "exemplars": "Exemplares: {{value}}",
- "format": "Formato: {{value}}",
- "legend": "Legenda: {{value}}",
- "step": "Etapa: {{value}}",
- "type": "Tipo: {{value}}"
- },
- "get-placeholders": {
- "browse": "Buscar métricas por nome",
- "type": "Filtrar por tipo"
- },
- "get-prom-types": {
- "description-counter": "Uma métrica cumulativa que representa um único contador monotonicamente crescente cujo valor só pode aumentar ou ser redefinido para zero ao reiniciar.",
- "description-gauge": "Uma métrica que representa um único valor numérico que pode subir e descer arbitrariamente.",
- "description-histogram": "Um histograma coleta amostras de observações (geralmente coisas como durações de solicitação ou tamanhos de resposta) e as conta em buckets configuráveis.",
- "description-native-histogram": "Os histogramas nativos são diferentes dos histogramas clássicos do Prometheus de várias maneiras: os limites do bucket do histograma nativo são calculados por uma fórmula que depende da escala (resolução) do histograma nativo e não são definidos pelo usuário.",
- "description-no-type": "Essas métricas não têm tipo definido nos metadados.",
- "description-summary": "Um resumo coleta amostras de observações (geralmente coisas como durações de solicitação e tamanhos de resposta) e pode calcular quantis configuráveis em uma janela de tempo deslizante.",
- "description-unknown": "Essas métricas receberam o tipo desconhecido nos metadados.",
- "label-counter": "Contador",
- "label-gauge": "Medidor",
- "label-histogram": "Histograma",
- "label-native-histogram": "Histograma nativo",
- "label-no-type": "Sem tipo",
- "label-summary": "Resumo",
- "label-unknown": "Desconhecido"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "A análise da consulta é ambígua."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Remover {{name}}",
- "placeholder-select-label": "Selecionar rótulo",
- "placeholder-select-value": "Selecionar valor"
- },
- "label-filters": {
- "label-filters": "Filtros de rótulo",
- "label-label-filters": "Filtros de rótulo",
- "tooltip-label-filters": "Opcional: usado para filtrar a métrica selecionada para este tipo de consulta."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Carregando rótulos",
- "noOptionsMessage-no-labels-found": "Nenhum rótulo foi encontrado"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Abrir explorador de métricas",
- "placeholder-select-metric": "Selecionar métrica",
- "tooltip-open-metrics-explorer": "Abrir explorador de métricas"
- },
- "label-metric": "Métrica",
- "tooltip-metric": "Opcional: retorna uma lista de valores de rótulo para o nome do rótulo na métrica especificada."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Navegar por métricas",
- "currently-selected": "Selecionado agora: {{selected}}",
- "metrics-pre-filtered": "Essas métricas foram pré-filtradas por rótulos escolhidos nos filtros de rótulo.",
- "title-metrics-explorer": "Explorador de métricas"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorando",
- "on": "Ativado"
- },
- "operator": "Operador",
- "tooltip-remove-match": "Remover correspondência",
- "vector-matches": "Correspondências de vetor"
- },
- "operation-editor": {
- "not-found": "Operação {{id}} não encontrada",
- "title-remove": "Remover {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Substituir por",
- "title-click-to-view-alternative-operations": "Clique para conferir outras opções de operação",
- "title-remove-operation": "Remover operação"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Clique para exibir a descrição",
- "title-remove-operation": "Remover operação"
- },
- "operation-list": {
- "operations": "Operações",
- "placeholder-search": "Pesquisar",
- "title-add-operation": "Adicionar operação"
- },
- "operation-param-editor": {
- "title-add": "Adicionar {{name}}",
- "title-remove": "Remover {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Calcula {{aggregationName}} sobre as dimensões, preservando {{labelWord}} {{labels}}.",
- "label-default": "Calcula {{aggregationName}} sobre as dimensões.",
- "label-without": "Calcula {{aggregationName}} sobre as dimensões {{labels}}. Todos os outros rótulos são preservados."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Alternância de exemplares.",
- "aria-label-format": "Caixa de combinação de formato",
- "aria-label-lower-limit-parameter": "Caixa de texto de etapa mínima, definir limite inferior para o parâmetro de etapa",
- "aria-label-select-resolution": "Selecionar resolução",
- "aria-label-type": "Grupo de botões de opção de tipo",
- "format-options": {
- "label-heatmap": "Mapa de calor",
- "label-table": "Tabela",
- "label-time-series": "Séries temporais"
- },
- "label-exemplars": "Exemplares",
- "label-format": "Formato",
- "label-min-step": "Etapa mínima",
- "label-resolution": "Resolução",
- "label-type": "Tipo",
- "placeholder-auto": "automático",
- "title-options": "Opções",
- "tooltip-min-step": "Um limite inferior adicional para o parâmetro de etapa da consulta do Prometheus e para as variáveis <2>{{interval}}2> e <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Há um erro de sintaxe ou a estrutura da consulta não pode ser visualizada ao alternar para o modo de construção. Partes da consulta podem ser perdidas.",
- "confirmText-continue": "Continuar",
- "kick-start-your-query": "Iniciar sua consulta",
- "label-explain": "Explicar",
- "run-queries": "Executar consultas",
- "title-parsing-error-switch-builder": "Erro de análise: deseja trocar para o modo de construção?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Caixa de seleção de legenda",
- "label-legend": "Legenda",
- "placeholder-select-legend-mode": "Selecionar modo legenda",
- "tooltip-legend": "Substituição ou modelo de nome de série. Exemplo: {{templateExample}} será substituído pelo valor do rótulo para {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "dica: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Construtor",
- "label-code": "Código"
- }
- },
- "query-pattern": {
- "apply-query": "Aplicar consulta",
- "aria-label-apply-query-starter-button": "botão de aplicação de inicializador de consulta",
- "aria-label-back-button": "botão voltar",
- "aria-label-create-new-query-button": "botão criar nova consulta",
- "aria-label-raw-query": "consulta bruta de {{patternName}}",
- "aria-label-use-this-query-button": "botão usar esta consulta",
- "back": "Voltar",
- "create-new-query": "Criar nova consulta",
- "use-this-query": "Usar esta consulta"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "modal para fechar início rápido de consulta",
- "aria-label-kick-start-your-query-modal": "Iniciar seu modal de consulta",
- "aria-label-toggle-query-starter": "cartão de inicializador de consulta para abrir e fechar {{patternType}}",
- "close": "Fechar",
- "description-kick-start-your-query": "Inicie sua consulta rapidamente selecionando uma dessas consultas. Em seguida, você poderá prosseguir para concluir sua consulta.",
- "label-toggle-query-starter": "Inicializadores de consulta {{patternType}}",
- "title-kick-start-your-query": "Iniciar sua consulta"
- },
- "raw-query": {
- "aria-label-selector": "seletor"
- },
- "results-table": {
- "content-descriptive-type": "Ao criar um {{descriptiveType}}, o Prometheus expõe várias séries com o contador de tipos. ",
- "description": "Descrição",
- "message-expand-label-filters": "Não há métricas encontradas. Tente expandir seus filtros de rótulo.",
- "message-expand-search": "Não há métricas encontradas. Tente expandir sua busca e filtros.",
- "message-no-metrics-found": "Não há métricas encontradas na fonte de dados.",
- "name": "Nome",
- "type": "Tipo"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/pt-PT/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/pt-PT/grafana-prometheus.json
deleted file mode 100644
index 585e7bccef6..00000000000
--- a/packages/grafana-prometheus/src/locales/pt-PT/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Erro de carregamento de dados de anotação!",
- "aria-label-lower-limit-parameter": "Definir limite inferior para o parâmetro de passos",
- "label-min-step": "Passo mín.",
- "label-series-value-as-timestamp": "Valor da série como registo de data e hora",
- "label-tags": "Etiquetas",
- "label-text": "Texto",
- "label-title": "Título",
- "placeholder-auto": "auto",
- "tooltip-either-pattern-example-instance-replaced-label": "Utilize o nome ou um padrão. Por exemplo, {{labelTemplate}} é substituído pelo valor da etiqueta para a etiqueta {{labelName}}.",
- "tooltip-min-step": "Um limite inferior adicional para o parâmetro de etapa da consulta Prometheus e para as variáveis <2>{{intervalVar}}2> e <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "A unidade do registo de data e hora é milissegundos. Se a unidade do valor da série for segundos, multiplique o seu vetor de intervalo por 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Executar uma consulta instantânea e uma consulta de intervalo"
- },
- "label": {
- "both": "Ambas"
- },
- "range-options": {
- "description": {
- "query-range": "Executar consulta durante um intervalo de tempo"
- },
- "label": {
- "instant": "Instantânea ",
- "range": "Alcance"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Expressão de filtro para etiqueta",
- "description-select-labels": "Depois de selecionados os valores de etiqueta, apenas são mostradas as combinações de etiquetas possíveis.",
- "select-labels-to-search-in": "2. Selecionar etiquetas para pesquisar em"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Expressão de filtro para métrica",
- "aria-label-limit-results-from-series-endpoint": "Limitar resultados do ponto final da série",
- "description-series-limit": "O limite aplica-se a todas as métricas, etiquetas e valores. Deixar o campo vazio para utilizar o limite predefinido. Definir para 0 para desativar o limite e obter tudo — isso pode causar problemas de desempenho.",
- "label-select-metric": "Depois de selecionada uma métrica, apenas são mostradas as etiquetas possíveis. As etiquetas são limitadas pelo limite de série abaixo.",
- "select-a-metric": "1. Selecionar uma métrica",
- "series-limit": "Limite de série"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Folha de consulta PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Exemplares",
- "tooltip-disable-query": "Desativar consulta com exemplares",
- "tooltip-enable-query": "Ativar consulta com exemplares"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Campo extra do Prometheus",
- "aria-label-query-type-field": "Campo de tipo de consulta",
- "aria-label-step-field": "Campo de etapa",
- "min-step": "Passo mín.",
- "query-type": "Tipo de consulta",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Unidades de tempo e variáveis integradas podem ser utilizadas aqui, por exemplo: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Predefinição se nenhuma unidade for especificada: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Introduza uma consulta PromQL..."
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Consulta clássica",
- "aria-label-metric-regex": "Regex métrico",
- "aria-label-metric-selector": "Seletor métrico",
- "aria-label-prometheus-query": "Consulta Prometheus",
- "aria-label-query-type": "Tipo de consulta",
- "aria-label-series-query": "Consulta de série",
- "label-classic-query": "Consulta clássica",
- "label-label": "Etiqueta",
- "label-metric-regex": "Regex métrico",
- "label-query": "Consulta",
- "label-query-type": "Tipo de consulta",
- "label-series-query": "Consulta de série",
- "placeholder-classic-query": "Consulta clássica",
- "placeholder-metric-regex": "Regex métrico",
- "placeholder-prometheus-query": "Consulta Prometheus",
- "placeholder-select-query-type": "Selecionar o tipo de consulta",
- "placeholder-series-query": "Consulta de série",
- "returns-metrics-matching-specified-metric-regex": "Devolve uma lista de métricas que correspondem ao regex métrico especificado.",
- "tooltip-classic-query": "A implementação original do editor de consultas de variáveis Prometheus. Introduzir uma cadeia de carateres com o tipo de consulta e parâmetros corretos, conforme descrito nestes documentos. Por exemplo, {{exampleQuery}}.",
- "tooltip-label": "Devolve uma lista de valores de etiqueta para o nome da etiqueta em todas as métricas, a menos que a métrica seja especificada.",
- "tooltip-metric-regex": "Devolve uma lista de nomes de etiquetas, filtrando opcionalmente por regex métrico especificado.",
- "tooltip-query": "Devolve uma lista de resultados de consulta Prometheus para a consulta. Isto pode incluir funções Prometheus, ou seja,{{exampleQuery}}.",
- "tooltip-query-type": "O plugin de origem de dados do Prometheus fornece os seguintes tipos de consulta para variáveis de modelo.",
- "tooltip-series-query": "Introduza uma métrica com etiquetas, apenas uma métrica ou apenas etiquetas, ou seja, {{example1}}, {{example2}}, ou {{example3}}. Devolve uma lista de séries temporais associadas aos dados inseridos."
- },
- "selector-actions": {
- "aria-label-selector": "seletor",
- "aria-label-selector-clear-button": "Botão de limpeza do seletor",
- "aria-label-use-selector-as-metrics-button": "Utilizar o seletor como botão de métricas",
- "aria-label-use-selector-for-query-button": "Utilizar o seletor para o botão de consulta",
- "aria-label-validate-submit-button": "Validar botão de envio",
- "clear": "Limpar",
- "resulting-selector": "4. Seletor resultante",
- "use-as-rate-query": "Utilizar como consulta de taxa",
- "use-query": "Utilizar consulta",
- "validate-selector": "Validar seletor"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Expressão de filtro para valores de etiqueta",
- "aria-label-values-for": "Valores para {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Utilizar o campo de pesquisa para encontrar valores nas etiquetas selecionadas.",
- "select-multiple-values-for-your-labels": "3. Selecionar (vários) valores para as suas etiquetas"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Permitir como destino de regras de gravação",
- "label-manage-alerts-via-alerting-ui": "Gerir alertas através da interface do utilizador Alerting",
- "title-alerting": "Alerta",
- "tooltip-allow-as-recording-rules-target": "Permitir que esta origem de dados seja selecionada como destino para escrever regras de gravação.",
- "tooltip-manage-alerts-via-alerting-ui": "Gerir regras de alerta para esta origem de dados. Para gerir outros recursos do Alerting, adicione uma origem de dados do Alertmanager."
- },
- "config-editor": {
- "browser-access-mode-error": "O modo de acesso do navegador na origem de dados do Prometheus já não está disponível. Mude para o modo de acesso ao servidor.",
- "description-advanced-settings": "As definições adicionais são definições opcionais que podem ser configuradas para obter mais controlo sobre a sua origem de dados.",
- "title-advanced-settings": "Definições avançadas",
- "title-error": "Erro"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "O seu método de acesso é <1>Navegador1>, isto significa que o URL tem de estar acessível a partir do navegador.",
- "tooltip-http-url": "Especifique um URL HTTP completo (por exemplo, {{exampleURL}})",
- "tooltip-server-access-mode": "O seu método de acesso é <1>Servidor1>, isto significa que o URL tem de estar acessível a partir do backend/servidor da Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Visite os documentos para obter mais detalhes aqui."
- },
- "exemplar-setting": {
- "label-data-source": "Origem dos dados",
- "label-internal-link": "Link interno",
- "label-label-name": "Nome da etiqueta",
- "label-remove-exemplar-link": "Remover link exemplar",
- "label-url": "URL",
- "label-url-label": "Etiqueta de URL",
- "placeholder-go-to-examplecom": "Ir para example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "ID de rastreamento",
- "title-remove-exemplar-link": "Remover link exemplar",
- "tooltip-data-source": "A origem de dados para a qual o exemplar vai navegar.",
- "tooltip-internal-link": "Ative esta opção se tiver um link interno. Quando ativado, isto revela o seletor de origem de dados. Selecionar o armazenamento de dados de rastreamento de backend para os seus dados exemplares.",
- "tooltip-label-name": "O nome do campo no objeto de etiquetas que deve ser utilizado para obter a ID de rastreamento.",
- "tooltip-url": "O URL do backend de rastreio que o utilizador iria utilizar para ver o seu rastreio",
- "tooltip-url-label": "Utilizar para substituir a etiqueta do botão no campo de ID de rastreamento exemplar."
- },
- "exemplars-settings": {
- "add": "Adicionar",
- "no-exemplars-configurations": "Sem configurações de exemplares",
- "title-exemplars": "Exemplares"
- },
- "prom-settings": {
- "aria-label-default-editor": "Editor predefinido (código ou construtor)",
- "aria-label-prom-type-type": "Tipo {{promType}}",
- "aria-label-prometheus-type": "Tipo Prometheus",
- "aria-label-select-http-method": "Selecionar método HTTP",
- "editor-options": {
- "label-builder": "Construtor",
- "label-code": "Cód."
- },
- "label-cache-level": "Nível de cache",
- "label-custom-query-parameters": "Parâmetros de consulta personalizados",
- "label-default-editor": "Editor padrão",
- "label-disable-metrics-lookup": "Desativar pesquisa de métricas",
- "label-disable-recording-rules-beta": "Desativar regras de gravação (beta)",
- "label-http-method": "Método HTTP",
- "label-incremental-querying-beta": "Consulta incremental (beta)",
- "label-prom-type-version": "Versão {{promType}}",
- "label-prometheus-type": "Tipo Prometheus",
- "label-query-overlap-window": "Janela de sobreposição de consulta",
- "label-query-timeout": "Tempo limite da consulta",
- "label-scrape-interval": "Intervalo de raspagem",
- "label-series-limit": "Limite de série",
- "label-use-series-endpoint": "Utilizar ponto final da série",
- "more-info": "Para obter mais informações sobre como configurar o tipo e a versão do Prometheus em origens de dados, consulte a <2>documentação de aprovisionamento2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Exemplo: {{example}}",
- "title-interval-behaviour": "Comportamento de intervalo",
- "title-other": "Outro",
- "title-performance": "Desempenho",
- "title-query-editor": "Editor de consultas",
- "tooltip-cache-level": "Definir o nível de cache do navegador para consultas do editor. São recomendadas definições de cache mais elevadas para origens de dados de elevada cardinalidade.",
- "tooltip-custom-query-parameters": "Adicionar parâmetros personalizados ao URL de consulta do Prometheus. Por exemplo, {{example1}}, {{example2}}, {{example3}} ou {{example4}}. Os parâmetros múltiplos devem ser concatenados com {{concatenationChar}}.",
- "tooltip-default-editor": "Definir a opção de editor predefinida para todos os utilizadores desta origem de dados.",
- "tooltip-disable-metrics-lookup": "Ao selecionar esta opção desativará o seletor de métricas e o suporte de métrica/etiqueta no preenchimento automático do campo de consulta. Isto ajuda se tiver problemas de desempenho com instâncias maiores do Prometheus. ",
- "tooltip-disable-recording-rules-beta": "Esta funcionalidade desativará as regras de gravação. Ative isto para melhorar o desempenho do painel de controlo",
- "tooltip-http-method": "Pode utilizar o método HTTP POST ou GET para consultar a sua origem de dados Prometheus. POST é o método recomendado, pois permite consultas maiores. Altere esta opção para GET se tiver uma versão do Prometheus anterior à 2.1 ou se os pedidos POST forem restritos na sua rede.",
- "tooltip-incremental-querying-beta": "Esta funcionalidade irá alterar o comportamento predefinido das consultas relativas para solicitar sempre dados novos da instância do Prometheus. Em vez disso, os resultados da consulta serão armazenados em cache e apenas serão solicitados novos registos. Ativar isto para diminuir a carga da base de dados e da rede.",
- "tooltip-prom-type-version": "Utilizar isto para definir a versão da sua instância {{promType}} se não estiver configurada automaticamente.",
- "tooltip-prometheus-type": "Definir isto para o tipo da sua base de dados prometheus, por exemplo, Prometheus, Cortex, Mimir ou Thanos. Alterar este campo irá guardar as suas definições atuais. Certos tipos de Prometheus suportam ou não suportam várias APIs. Por exemplo, alguns tipos suportam correspondência de regex para consultas de etiqueta para melhorar o desempenho. Alguns tipos têm uma API para metadados. Se definir isto incorretamente, poderá experimentar um comportamento estranho ao consultar métricas e etiquetas. Verifique a sua documentação do Prometheus para garantir que introduz o tipo correto.",
- "tooltip-query-overlap-window": "Definir uma duração como {{example1}} ou {{example2}} ou {{example3}}. Predefinição de {{default}}. Esta duração será adicionada à duração de cada pedido incremental.",
- "tooltip-query-timeout": "Definir o tempo limite de consulta do Prometheus.",
- "tooltip-scrape-interval": "Este intervalo é a frequência com que o Prometheus raspa os alvos. Definir isto para o intervalo típico de raspagem e avaliação configurado no seu ficheiro de configuração do Prometheus. Se definir isto para um valor maior do que o intervalo do seu ficheiro de configuração do Prometheus, a Grafana irá avaliar os dados de acordo com este intervalo e verá menos pontos de dados. Predefinições para {{default}}.",
- "tooltip-series-limit": "O limite aplica-se a todos os recursos (métricas, etiquetas e valores) para ambos os pontos finais (séries e etiquetas). Deixar o campo vazio para utilizar o limite predefinido (40000). Definir para 0 para desativar o limite e obter tudo — isso pode causar problemas de desempenho. O limite predefinido é de 40000.",
- "tooltip-use-series-endpoint": "A seleção desta opção, favorecerá o ponto final da série com o parâmetro {{exampleParameter}} em relação ao ponto final dos valores da etiqueta com o parâmetro {{exampleParameter}}. Embora o ponto final dos valores de etiqueta seja considerado mais eficiente, alguns utilizadores podem preferir a série, porque tem um método POST, enquanto o ponto final dos valores de etiqueta apenas tem um método GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Desativado)",
- "enabled-label": "Navegador de métricas"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Inclui apenas etiquetas únicas",
- "description-custom": "Forneça um modelo de nomenclatura",
- "description-verbose": "Todos os nomes e valores de etiquetas",
- "label-auto": "Automático",
- "label-custom": "Personalizar",
- "label-verbose": "Verboso"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Calcular a média sobre as dimensões",
- "documentation-bottomk": "Menores elementos k por valor de amostra",
- "documentation-count": "Contar o número de elementos no vetor",
- "documentation-count-values": "Contar o número de elementos com o mesmo valor",
- "documentation-group": "Todos os valores no vetor resultante são 1",
- "documentation-max": "Selecionar o máximo sobre as dimensões",
- "documentation-min": "Selecionar o mínimo sobre as dimensões",
- "documentation-quantile": "Calcular o quantil φ (0 ≤ φ ≤ 1) sobre as dimensões",
- "documentation-stddev": "Calcular o desvio-padrão da população sobre as dimensões",
- "documentation-stdvar": "Calcular a variância padrão da população sobre as dimensões",
- "documentation-sum": "Calcular a soma sobre as dimensões",
- "documentation-topk": "Maiores elementos k por valor de amostra"
- },
- "getFunctions": {
- "documentation-abs": "Devolve o vetor de entrada com todos os valores de amostra convertidos para o seu valor absoluto.",
- "documentation-absent": "Devolve um vetor vazio se o vetor passado para o mesmo tiver quaisquer elementos e um vetor de 1 elemento com o valor 1 se o vetor passado para o mesmo não tiver elementos. Isto é útil para alertar quando não existem séries temporais para um determinado nome de métrica e combinação de rótulo.",
- "documentation-absent-over-time": "Devolve um vetor vazio se o vetor de intervalo passado para o mesmo tiver quaisquer elementos e um vetor de 1 elemento com o valor 1 se o vetor de intervalo passado para o mesmo não tiver elementos.",
- "documentation-avg-over-time": "O valor médio de todos os pontos no intervalo especificado.",
- "documentation-ceil": "Arredonda os valores de amostra de todos os elementos em \"v\" para cima até ao número inteiro mais próximo.",
- "documentation-changes": "Para cada série temporal de entrada, \"changes(v range-vector)\" devolve o número de vezes que o seu valor mudou dentro do intervalo de tempo fornecido como um vetor instantâneo.",
- "documentation-clamp": "Fixa os valores de amostra de todos os elementos em \"v\" para ter um limite inferior de \"min\" e um limite superior de \"máx\".",
- "documentation-clamp-max": "Fixa os valores de amostra de todos os elementos em \"v\" para ter um limite superior de \"máx\".",
- "documentation-clamp-min": "Fixa os valores de amostra de todos os elementos em \"v\" para ter um limite inferior de \"min\".",
- "documentation-count-over-time": "A contagem de todos os valores no intervalo especificado.",
- "documentation-count-scalar": "Devolve o número de elementos num vetor de série temporal como um escalar. Isto contrasta com o operador de agregação 'count()', que devolve sempre um vetor (um vetor vazio se o vetor de entrada estiver vazio) e permite o agrupamento por etiquetas através de uma cláusula 'by'.",
- "documentation-day-of-month": "Devolve o dia do mês para cada uma das horas fornecidas em UTC. Os valores devolvidos são de 1 a 31.",
- "documentation-day-of-week": "Devolve o dia da semana para cada uma das horas fornecidas em UTC. Os valores devolvidos são de 0 a 6, onde 0 significa domingo, etc.",
- "documentation-day-of-year": "Devolve o dia do ano para cada uma das horas fornecidas em UTC. Os valores devolvidos são de 1 a 365 para anos não bissextos e de 1 a 366 para anos bissextos.",
- "documentation-days-in-month": "Devolve o número de dias do mês para cada uma das horas fornecidas em UTC. Os valores devolvidos são de 28 a 31.",
- "documentation-deg": "Converte radianos em graus para todos os elementos em v",
- "documentation-delta": "Calcula a diferença entre o primeiro e o último valor de cada elemento da série temporal num vetor de intervalo \"v\", devolvendo um vetor instantâneo com os deltas dados e etiquetas equivalentes. O delta é extrapolado para abranger o intervalo de tempo completo, conforme especificado no seletor de vetor de intervalo, de modo que seja possível obter um resultado não inteiro, mesmo que os valores de amostra sejam todos inteiros.",
- "documentation-deriv": "Calcula a derivada por segundo da série temporal num vetor de intervalo \"v\", utilizando regressão linear simples.",
- "documentation-double-exponential-smoothing": "Produz um valor suavizado para séries temporais com base no intervalo em \"v\". Quanto menor o fator de suavização \"sf\", mais importância é dada aos dados antigos. Quanto maior o fator de tendência \"tf\", mais tendências nos dados são consideradas. Tanto \"sf\" quanto \"tf\" devem estar entre 0 e 1.",
- "documentation-drop-common-labels": "Elimina todas as etiquetas com o mesmo nome e valor em todas as séries no vetor de entrada.",
- "documentation-exp": "Calcula a função exponencial para todos os elementos em \"v\".\nOs casos especiais são:\n* \"Exp(+Inf) = +Inf\" \n* \"Exp(NaN) = NaN\"",
- "documentation-floor": "Arredonda os valores de amostra de todos os elementos em \"v\" para cima até ao número inteiro mais próximo.",
- "documentation-histogram-avg": "Devolve a média aritmética dos valores observados armazenados num histograma nativo. As amostras que não são histogramas nativos são ignoradas e não aparecem no vetor devolvido.",
- "documentation-histogram-count": "Devolve a contagem de observações armazenadas num histograma nativo.",
- "documentation-histogram-fraction": "Devolve a fração estimada de observações entre os valores inferior e superior fornecidos.",
- "documentation-histogram-quantile": "Calcula o quantil φ (0 ≤ φ ≤ 1) a partir dos buckets 'b' de um histograma. As amostras em 'b' são as contagens de observações em cada bucket. Cada amostra deve ter uma etiqueta 'le' onde o valor da etiqueta denota o limite superior inclusivo do bucket. (Amostras sem esta etiqueta são ignoradas silenciosamente.) O tipo de métrica de histograma fornece automaticamente séries temporais com o sufixo '_bucket' e as etiquetas apropriadas.",
- "documentation-histogram-stddev": "Devolve o desvio-padrão estimado das observações num histograma nativo, com base na média geométrica dos buckets onde as observações se encontram.",
- "documentation-histogram-stdvar": "Devolve a variância padrão estimada das observações num histograma nativo.",
- "documentation-histogram-sum": "Devolve a soma de observações armazenadas num histograma nativo.",
- "documentation-holt-winters": "Renomeado como double_exponential_smoothing no prometheus v3.x. Para versões do prometheus iguais e superiores a v3.0, usar double_exponential_smoothing. \n\nProduz um valor suavizado para séries temporais com base no intervalo em \"v\". Quanto menor o fator de suavização \"sf\", mais importância é dada aos dados antigos. Quanto maior o fator de tendência \"tf\", mais tendências são consideradas nos dados. Tanto \"sf\" quanto \"tf\" devem estar entre 0 e 1.",
- "documentation-hour": "Devolve a hora do dia para cada uma das horas fornecidas em UTC. Os valores devolvidos são de 0 a 23.",
- "documentation-idelta": "Calcula a diferença entre as duas últimas amostras no vetor de intervalo \"v\", devolvendo um vetor instantâneo com os deltas dados e etiquetas equivalentes.",
- "documentation-increase": "Calcula o aumento na série temporal no vetor de intervalo. As quebras na monotonicidade (como redefinições de contador devido a reinícios de alvo) são ajustadas automaticamente. O aumento é extrapolado para abranger o intervalo de tempo completo, conforme especificado no seletor de vetor de intervalo, de modo que seja possível obter um resultado não inteiro, mesmo que um contador aumente apenas por incrementos inteiros.",
- "documentation-info": "Devolve os detalhes e metadados mais recentes sobre um grupo de métricas, como as respetivas etiquetas e valores atuais, sem fazer quaisquer cálculos.",
- "documentation-irate": "Calcula a taxa instantânea por segundo de aumento da série temporal no vetor de intervalo. Isto baseia-se nos dois últimos pontos de dados. As quebras na monotonicidade (como redefinições de contador devido a reinícios de alvo) são ajustadas automaticamente.",
- "documentation-label-join": "Para cada série temporal em \"v\", une todos os valores de todos os \"src_labels\" usando \"separator\" e devolve a série temporal com a etiqueta \"dst_label\" contendo o valor unido. Pode haver qualquer número de \"src_labels\" nesta função.",
- "documentation-label-replace": "Para cada série temporal em \"v\", \"label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)\" corresponde à expressão regular \"regex\" contra a etiqueta \"src_label\". Se corresponder, a série temporal é devolvida com a etiqueta \"dst_label\" substituída pela expansão de \"replacement\". \"$1\" é substituído pelo primeiro subgrupo correspondente, \"$2\" pelo segundo, etc. Se a expressão regular não corresponder, a série temporal é devolvida inalterada.",
- "documentation-last-over-time": "O valor do ponto mais recente no intervalo especificado.",
- "documentation-ln": "Calcula o logaritmo natural para todos os elementos em \"v\".\nOs casos especiais são:\n * \"ln(+Inf) = +Inf\"\n * \"ln(0) = -Inf\"\n * \"ln(x < 0) = NaN\"\n * \"ln(NaN) = NaN\"",
- "documentation-log10": "Calcula o logaritmo decimal para todos os elementos em \"v\". Os casos especiais são equivalentes aos de \"ln\".",
- "documentation-log2": "Calcula o logaritmo binário para todos os elementos em \"v\". Os casos especiais são equivalentes aos de \"ln\".",
- "documentation-max-over-time": "O valor máximo de todos os pontos no intervalo especificado.",
- "documentation-min-over-time": "O valor mínimo de todos os pontos no intervalo especificado.",
- "documentation-minute": "Devolve o minuto da hora para cada uma das horas fornecidas em UTC. Os valores devolvidos são de 0 a 59.",
- "documentation-month": "Devolve o mês do ano para cada uma das data/horas fornecidas em UTC. Os valores devolvidos são de 1 a 12, onde 1 significa janeiro, etc.",
- "documentation-pi": "Devolve pi",
- "documentation-predict-linear": "Prevê o valor da série temporal \"t\" segundos a partir de agora, com base no vetor de intervalo \"v\", utilizando regressão linear simples.",
- "documentation-present-over-time": "O valor 1 para qualquer série no intervalo especificado.",
- "documentation-quantile-over-time": "O quantil φ (0 ≤ φ ≤ 1) dos valores no intervalo especificado.",
- "documentation-rad": "Converte graus em radianos para todos os elementos em v",
- "documentation-rate": "Calcula a taxa média por segundo de aumento da série temporal no vetor de intervalo. As quebras na monotonicidade (como redefinições de contador devido a reinícios de alvo) são ajustadas automaticamente. Além disso, o cálculo extrapola para as extremidades do intervalo de tempo, tendo em conta recolhas perdidas ou alinhamento imperfeito dos ciclos de recolha com o período de tempo do intervalo.",
- "documentation-resets": "Para cada série temporal de entrada, \"resets(v range-vector)\" devolve o número de redefinições do contador dentro do intervalo de tempo fornecido como um vetor instantâneo. Qualquer diminuição no valor entre duas amostras consecutivas é interpretada como uma redefinição do contador.",
- "documentation-round": "Arredonda os valores de amostra de todos os elementos em \"v\" para o número inteiro mais próximo. Os empates são resolvidos arredondando para cima. O argumento opcional \"to_nearest\" permite especificar o múltiplo mais próximo para o qual os valores de amostra devem ser arredondados. Este múltiplo também pode ser uma fração.",
- "documentation-scalar": "Dado um vetor de entrada de elemento único, \"scalar(v instant-vector)\" devolve o valor de amostra desse elemento único como um escalar. Se o vetor de entrada não tiver exatamente um elemento, \"scalar\" devolverá \"NaN\".",
- "documentation-sgn": "Devolve um vetor com todos os valores de amostra convertidos para o seu sinal, definido como este: 1 se v for positivo, -1 se v for negativo e 0 se v for igual a zero.",
- "documentation-sort": "Devolve elementos vetoriais ordenados pelos seus valores de amostra, por ordem ascendente.",
- "documentation-sort-desc": "Devolve elementos vetoriais ordenados pelos seus valores de amostra, por ordem descendente.",
- "documentation-sqrt": "Calcula a raiz quadrada de todos os elementos em \"v\".",
- "documentation-stddev-over-time": "O desvio-padrão da população dos valores no intervalo especificado.",
- "documentation-stdvar-over-time": "A variância padrão da população dos valores no intervalo especificado.",
- "documentation-sum-over-time": "A soma de todos os valores no intervalo especificado.",
- "documentation-time": "Devolve o número de segundos desde 1 de janeiro de 1970 UTC. Tenha em atenção que isto não devolve realmente a hora atual, mas a hora em que a expressão deve ser avaliada.",
- "documentation-timestamp": "Devolve o carimbo de data/hora de cada uma das amostras do vetor fornecido como o número de segundos desde 1 de janeiro de 1970 UTC.",
- "documentation-vector": "Devolve o escalar \"s\" como um vetor sem etiquetas.",
- "documentation-year": "Devolve o ano para cada uma das horas fornecidas em UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "calcula o arco cosseno de todos os elementos em {{argument}}",
- "documentation-acosh": "calcula o cosseno hiperbólico inverso de todos os elementos em {{argument}}",
- "documentation-asin": "calcula o arco seno de todos os elementos em {{argument}}",
- "documentation-asinh": "calcula o seno hiperbólico inverso de todos os elementos em {{argument}}",
- "documentation-atan": "calcula o arco tangente de todos os elementos em {{argument}}",
- "documentation-atanh": "calcula a tangente hiperbólica inversa de todos os elementos em {{argument}}",
- "documentation-cos": "calcula o cosseno de todos os elementos em {{argument}}",
- "documentation-cosh": "calcula o cosseno hiperbólico de todos os elementos em {{argument}}",
- "documentation-sin": "calcula o seno de todos os elementos em {{argument}}",
- "documentation-sinh": "calcula o seno hiperbólico inverso de todos os elementos em {{argument}}",
- "documentation-tan": "calcula a tangente de todos os elementos em {{argument}}",
- "documentation-tanh": "calcula a tangente hiperbólica de todos os elementos em {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Dar feedback",
- "title-give-feedback": "O explorador de métricas é novo, diga-nos como podemos melhorá-lo"
- },
- "get-collapsed-info": {
- "exemplars": "Exemplares: {{value}}",
- "format": "Formato: {{value}}",
- "legend": "Legenda: {{value}}",
- "step": "Passo: {{value}}",
- "type": "Tipo: {{value}}"
- },
- "get-placeholders": {
- "browse": "Pesquisar métricas por nome",
- "type": "Filtrar por tipo"
- },
- "get-prom-types": {
- "description-counter": "Uma métrica cumulativa que representa um único contador monotonicamente crescente cujo valor só pode aumentar ou ser redefinido para zero ao reiniciar.",
- "description-gauge": "Uma métrica que representa um único valor numérico que pode subir e descer arbitrariamente.",
- "description-histogram": "Um histograma recolhe amostras de observações (geralmente aspetos como durações de solicitações ou tamanhos de resposta) e conta-as em buckets configuráveis.",
- "description-native-histogram": "Os histogramas nativos são diferentes dos histogramas clássicos do Prometheus de várias maneiras: os limites do bucket do histograma nativo são calculados por uma fórmula que depende da escala (resolução) do histograma nativo e não são definidos pelo utilizador.",
- "description-no-type": "Estas métricas não têm tipo definido nos metadados.",
- "description-summary": "Um resumo recolhe amostras de observações (geralmente aspetos como durações de solicitações e tamanhos de resposta) e pode calcular quantis configuráveis ao longo de uma janela de tempo deslizante.",
- "description-unknown": "Estas métricas receberam o tipo desconhecido nos metadados.",
- "label-counter": "Contador",
- "label-gauge": "Medidor",
- "label-histogram": "Histograma",
- "label-native-histogram": "Histograma nativo",
- "label-no-type": "Sem tipo",
- "label-summary": "Resumo",
- "label-unknown": "Desconhecido"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "A análise da consulta é ambígua."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Remover {{name}}",
- "placeholder-select-label": "Selecione etiqueta",
- "placeholder-select-value": "Selecionar valor"
- },
- "label-filters": {
- "label-filters": "Filtros de etiquetas",
- "label-label-filters": "Filtros de etiquetas",
- "tooltip-label-filters": "Opcional: utilizado para filtrar a métrica selecionada para este tipo de consulta."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "A carregar etiquetas",
- "noOptionsMessage-no-labels-found": "Nenhuma etiqueta encontrada"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Abrir explorador de métricas",
- "placeholder-select-metric": "Selecionar métrica",
- "tooltip-open-metrics-explorer": "Abrir explorador de métricas"
- },
- "label-metric": "Métrica",
- "tooltip-metric": "Opcional: devolve uma lista de valores de etiqueta para o nome da etiqueta na métrica especificada."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Procurar métricas",
- "currently-selected": "Atualmente selecionado: {{selected}}",
- "metrics-pre-filtered": "Estas métricas foram pré-filtradas por etiquetas escolhidas nos filtros de etiquetas.",
- "title-metrics-explorer": "Explorador de métricas"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorando",
- "on": "Em "
- },
- "operator": "Operador",
- "tooltip-remove-match": "Remover correspondência",
- "vector-matches": "Correspondências de vetores"
- },
- "operation-editor": {
- "not-found": "Operação {{id}} não encontrada",
- "title-remove": "Remover {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Substituir por",
- "title-click-to-view-alternative-operations": "Clicar para ver operações alternativas",
- "title-remove-operation": "Remover operação"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Clicar para mostrar a descrição",
- "title-remove-operation": "Remover operação"
- },
- "operation-list": {
- "operations": "Operações",
- "placeholder-search": "Pesquisar",
- "title-add-operation": "Adicionar operação"
- },
- "operation-param-editor": {
- "title-add": "Adicionar {{name}}",
- "title-remove": "Remover {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Calcula {{aggregationName}} sobre as dimensões enquanto preserva {{labelWord}} {{labels}}.",
- "label-default": "Calcula {{aggregationName}} sobre as dimensões.",
- "label-without": "Calcula {{aggregationName}} sobre as dimensões {{labels}}. Todas as outras etiquetas são preservadas."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Interruptor de exemplares.",
- "aria-label-format": "Caixa de combinação de formato",
- "aria-label-lower-limit-parameter": "Caixa de texto de passo mínimo, definir limite inferior para o parâmetro de passo",
- "aria-label-select-resolution": "Selecionar resolução",
- "aria-label-type": "Grupo de botões de opção de tipo",
- "format-options": {
- "label-heatmap": "Mapa de calor",
- "label-table": "Tabela",
- "label-time-series": "Série temporal"
- },
- "label-exemplars": "Exemplares",
- "label-format": "Formato",
- "label-min-step": "Passo mín.",
- "label-resolution": "Resolução",
- "label-type": "Tipo",
- "placeholder-auto": "auto",
- "title-options": "Opções",
- "tooltip-min-step": "Um limite inferior adicional para o parâmetro de etapa da consulta Prometheus e para as variáveis <2>{{interval}}2> e <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Há um erro de sintaxe ou a estrutura da consulta não pode ser visualizada ao mudar para o modo de construtor. Partes da consulta podem ser perdidas.",
- "confirmText-continue": "Continuar",
- "kick-start-your-query": "Dê início à sua consulta",
- "label-explain": "Explicar",
- "run-queries": "Executar consultas",
- "title-parsing-error-switch-builder": "Erro de análise: mudar para o modo de construtor?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Caixa de combinação de legenda",
- "label-legend": "Legenda",
- "placeholder-select-legend-mode": "Selecionar modo de legenda",
- "tooltip-legend": "Substituição ou modelo do nome da série. Ex. {{templateExample}} será substituído pelo valor da etiqueta para{{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "dica: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Construtor",
- "label-code": "Cód."
- }
- },
- "query-pattern": {
- "apply-query": "Aplicar consulta",
- "aria-label-apply-query-starter-button": "botão de início de aplicação de consulta",
- "aria-label-back-button": "botão voltar",
- "aria-label-create-new-query-button": "botão criar nova consulta",
- "aria-label-raw-query": "Consulta bruta {{patternName}}",
- "aria-label-use-this-query-button": "utilizar este botão de consulta",
- "back": "Voltar",
- "create-new-query": "Criar uma nova consulta",
- "use-this-query": "Utilizar esta consulta"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "fechar Iniciar o seu modal de consulta",
- "aria-label-kick-start-your-query-modal": "Dê início ao seu modal de consulta",
- "aria-label-toggle-query-starter": "abrir e fechar cartão de início de consulta {{patternType}}",
- "close": "Fechar",
- "description-kick-start-your-query": "Dê início à sua consulta selecionando uma destas consultas. Pode então continuar a completar a sua consulta.",
- "label-toggle-query-starter": "Iniciadores de consulta {{patternType}}",
- "title-kick-start-your-query": "Dê início à sua consulta"
- },
- "raw-query": {
- "aria-label-selector": "seletor"
- },
- "results-table": {
- "content-descriptive-type": "Ao criar um {{descriptiveType}}, o Prometheus expõe várias séries com o contador de tipos. ",
- "description": "Descrição",
- "message-expand-label-filters": "Não foram encontradas métricas. Tente expandir os seus filtros de etiquetas.",
- "message-expand-search": "Não foram encontradas métricas. Tente expandir a sua pesquisa e filtros.",
- "message-no-metrics-found": "Não foram encontradas métricas na origem de dados.",
- "name": "Nome",
- "type": "Tipo"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/ru-RU/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/ru-RU/grafana-prometheus.json
deleted file mode 100644
index ebdf7cd781d..00000000000
--- a/packages/grafana-prometheus/src/locales/ru-RU/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Ошибка загрузки данных аннотации.",
- "aria-label-lower-limit-parameter": "Установить нижний предел для параметра шага",
- "label-min-step": "Мин. шаг",
- "label-series-value-as-timestamp": "Значение ряда как метка времени",
- "label-tags": "Теги",
- "label-text": "Текст",
- "label-title": "Заголовок",
- "placeholder-auto": "авто",
- "tooltip-either-pattern-example-instance-replaced-label": "Используйте название или шаблон. Например, {{labelTemplate}} заменяется на значение метки {{labelName}}.",
- "tooltip-min-step": "Дополнительный нижний предел для параметра шага запроса Prometheus и для переменных <2>{{intervalVar}}2> и <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Единица метки времени — миллисекунды. Если единицей для значения ряда являются секунды, умножьте вектор диапазона на 1000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Выполните мгновенный запрос и запрос диапазона"
- },
- "label": {
- "both": "Оба"
- },
- "range-options": {
- "description": {
- "query-range": "Выполните запрос, относящийся к определенному диапазону времени"
- },
- "label": {
- "instant": "Мгновенный",
- "range": "Диапазон"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Выражение фильтра для метки",
- "description-select-labels": "После выбора значений меток отображаются только возможные комбинации меток.",
- "select-labels-to-search-in": "2. Выберите метки для выполнения поиска"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Выражение фильтра для метрики",
- "aria-label-limit-results-from-series-endpoint": "Ограничить результаты от конечной точки ряда",
- "description-series-limit": "Лимит распространяется на все метрики, метки и значения. Оставьте поле пустым, чтобы использовался лимит по умолчанию. Установите значение 0, чтобы отключить ограничение и получать все данные. Это может привести к проблемам с производительностью.",
- "label-select-metric": "После выбора метрики отображаются только возможные метки. Метки ограничены лимитом рядов, указанным ниже.",
- "select-a-metric": "1. Выберите метрику",
- "series-limit": "Лимит рядов"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "Памятка PromQL"
- },
- "prom-exemplar-field": {
- "exemplars": "Образцы",
- "tooltip-disable-query": "Отключить запросы с образцами",
- "tooltip-enable-query": "Включить запросы с образцами"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Дополнительное поле Prometheus",
- "aria-label-query-type-field": "Поле типа запроса",
- "aria-label-step-field": "Поле шага",
- "min-step": "Мин. шаг",
- "query-type": "Тип запроса",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Здесь можно использовать единицы времени и встроенные переменные: например, {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (по умолчанию, если не указана единица: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Введите запрос PromQL…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Классический запрос",
- "aria-label-metric-regex": "Регулярное выражение метрики",
- "aria-label-metric-selector": "Селектор метрик",
- "aria-label-prometheus-query": "Запрос Prometheus",
- "aria-label-query-type": "Тип запроса",
- "aria-label-series-query": "Запрос рядов",
- "label-classic-query": "Классический запрос",
- "label-label": "Метка",
- "label-metric-regex": "Регулярное выражение метрики",
- "label-query": "Запрос",
- "label-query-type": "Тип запроса",
- "label-series-query": "Запрос рядов",
- "placeholder-classic-query": "Классический запрос",
- "placeholder-metric-regex": "Регулярное выражение метрики",
- "placeholder-prometheus-query": "Запрос Prometheus",
- "placeholder-select-query-type": "Выбрать тип запроса",
- "placeholder-series-query": "Запрос рядов",
- "returns-metrics-matching-specified-metric-regex": "Возвращает список метрик, соответствующих указанному регулярному выражению.",
- "tooltip-classic-query": "Оригинальная реализация редактора запросов переменных Prometheus. Введите строку с правильным типом запроса и параметрами, указанными в документации. Например, {{exampleQuery}}.",
- "tooltip-label": "Возвращает список значений для метки с соответствующим названием во всех метриках, если не указана конкретная метрика.",
- "tooltip-metric-regex": "Возвращает список названий меток, при необходимости фильтруя их по указанному регулярному выражению метрики.",
- "tooltip-query": "Возвращает список результатов запросов Prometheus для текущего запроса. Сюда могут входить функции Prometheus, например {{exampleQuery}}.",
- "tooltip-query-type": "Плагин источника данных Prometheus предоставляет следующие типы запросов для переменных шаблона.",
- "tooltip-series-query": "Укажите метрику с метками, только метрику или только метки, например {{example1}}, {{example2}} или {{example3}}. Возвращает список временных рядов, связанных с введенными данными."
- },
- "selector-actions": {
- "aria-label-selector": "селектор",
- "aria-label-selector-clear-button": "Кнопка очистки селектора",
- "aria-label-use-selector-as-metrics-button": "Использовать селектор как кнопку метрик",
- "aria-label-use-selector-for-query-button": "Использовать селектор для кнопки запроса",
- "aria-label-validate-submit-button": "Проверить кнопку отправки",
- "clear": "Очистить",
- "resulting-selector": "4. Полученный селектор",
- "use-as-rate-query": "Использовать как запрос скорости изменения",
- "use-query": "Использовать запрос",
- "validate-selector": "Проверить селектор"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Выражение фильтра для значений меток",
- "aria-label-values-for": "Значения для {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Используйте поле поиска, чтобы найти значения в выбранных метках.",
- "select-multiple-values-for-your-labels": "3. Выберите значения для меток"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Разрешить в качестве цели для правил записи",
- "label-manage-alerts-via-alerting-ui": "Управление оповещениями через пользовательский интерфейс Alerting",
- "title-alerting": "Оповещение",
- "tooltip-allow-as-recording-rules-target": "Разрешить выбор этого источника данных в качестве цели для правил записи.",
- "tooltip-manage-alerts-via-alerting-ui": "Управление правилами оповещения для этого источника данных. Чтобы управлять другими ресурсами Alerting, добавьте обработчик оповещений Alertmanager в качестве источника данных."
- },
- "config-editor": {
- "browser-access-mode-error": "Режим доступа через браузер в источнике данных Prometheus больше не доступен. Переключитесь в режим доступа к серверу.",
- "description-advanced-settings": "Дополнительные параметры — это необязательные параметры, которые можно настроить для получения большего контроля над источником данных.",
- "title-advanced-settings": "Дополнительные параметры",
- "title-error": "Ошибка"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Вашим методом доступа является <1>Браузер1>, то есть URL-адрес должен быть доступен из браузера.",
- "tooltip-http-url": "Укажите полный URL-адрес HTTP (например, {{exampleURL}})",
- "tooltip-server-access-mode": "Вашим методом доступа является <1>Сервер1>, то есть URL-адрес должен быть доступен из серверной части/сервера Grafana."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Более подробную информацию см. в документации."
- },
- "exemplar-setting": {
- "label-data-source": "Источник данных",
- "label-internal-link": "Внутренняя ссылка",
- "label-label-name": "Название метки",
- "label-remove-exemplar-link": "Удалить образец ссылки",
- "label-url": "URL",
- "label-url-label": "Метка URL-адреса",
- "placeholder-go-to-examplecom": "Перейти на example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Удалить образец ссылки",
- "tooltip-data-source": "Источник данных, на который перейдет образец.",
- "tooltip-internal-link": "Включите этот параметр, если у вас есть внутренняя ссылка. Если этот параметр включен, отображается селектор источников данных. Выберите серверное хранилище данных трассировки для вашего образца данных.",
- "tooltip-label-name": "Имя поля в объекте меток, которое следует использовать для получения идентификатора traceID.",
- "tooltip-url": "URL-адрес сервера трассировки, на который необходимо перейти пользователю для просмотра своей трассировки",
- "tooltip-url-label": "Используйте для переопределения метки кнопки в поле traceID образца."
- },
- "exemplars-settings": {
- "add": "Добавить",
- "no-exemplars-configurations": "Нет конфигураций образцов",
- "title-exemplars": "Образцы"
- },
- "prom-settings": {
- "aria-label-default-editor": "Редактор по умолчанию (редактор кода или конструктор)",
- "aria-label-prom-type-type": "Тип {{promType}}",
- "aria-label-prometheus-type": "Тип Prometheus",
- "aria-label-select-http-method": "Выбрать HTTP-метод",
- "editor-options": {
- "label-builder": "Конструктор",
- "label-code": "Код"
- },
- "label-cache-level": "Уровень кэша",
- "label-custom-query-parameters": "Пользовательские параметры запроса",
- "label-default-editor": "Редактор по умолчанию",
- "label-disable-metrics-lookup": "Отключить поиск метрик",
- "label-disable-recording-rules-beta": "Отключить правила записи (бета)",
- "label-http-method": "HTTP-метод",
- "label-incremental-querying-beta": "Инкрементальные запросы (бета)",
- "label-prom-type-version": "Версия {{promType}}",
- "label-prometheus-type": "Тип Prometheus",
- "label-query-overlap-window": "Окно перекрытия запросов",
- "label-query-timeout": "Превышение времени ожидания запроса",
- "label-scrape-interval": "Интервал опроса",
- "label-series-limit": "Лимит рядов",
- "label-use-series-endpoint": "Использовать конечную точку ряда",
- "more-info": "Более подробную информацию о настройке типа и версии Prometheus в источниках данных см. в <2>документации по подготовке2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Пример: {{example}}",
- "title-interval-behaviour": "Поведение интервалов",
- "title-other": "Прочее",
- "title-performance": "Производительность",
- "title-query-editor": "Редактор запросов",
- "tooltip-cache-level": "Устанавливает уровень кэширования в браузере для запросов редактора. Для источников данных с высокой кардинальностью рекомендуются более высокие настройки кэша.",
- "tooltip-custom-query-parameters": "Добавьте пользовательские параметры в URL-адрес запроса Prometheus. Например, {{example1}}, {{example2}}, {{example3}}, или {{example4}}. Несколько параметров следует объединить с {{concatenationChar}}.",
- "tooltip-default-editor": "Установите параметр редактора по умолчанию для всех пользователей этого источника данных.",
- "tooltip-disable-metrics-lookup": "При включении этого параметра будут отключены выбор метрик и поддержка метрик/меток при автозаполнении поля запроса. Функция полезна, если вы испытываете проблемы с производительностью при использовании более крупных экземляров Prometheus. ",
- "tooltip-disable-recording-rules-beta": "Функция отключит правила записи. Включите, чтобы улучшить производительность дашборда",
- "tooltip-http-method": "Для отправки запросов в источник данных Prometheus можно использовать HTTP-методы POST или GET. POST является рекомендуемым методом, поскольку позволяет выполнять более крупные запросы. Измените метод на GET, если вы используете версию Prometheus старше 2.1 или в вашей сети запрещены запросы POST.",
- "tooltip-incremental-querying-beta": "Функция изменит поведение относительных запросов по умолчанию. Вместо запроса свежих данных из экземпляра Prometheus, результаты запросов будут кэшироваться, и запрашиваться будут только новые записи. Включите, чтобы уменьшить нагрузку на базу данных и сеть.",
- "tooltip-prom-type-version": "Используйте эту функцию, чтобы установить версию вашего экземпляра {{promType}}, если она не установлена автоматически.",
- "tooltip-prometheus-type": "Установите тип вашей базы данных Prometheus, например Prometheus, Cortex, Mimir или Thanos. При изменении этого поля текущие настройки будут сохранены. Разные типы Prometheus могут поддерживать или не поддерживать различные API. Например, некоторые типы поддерживают сопоставление регулярных выражений для запросов меток в целях повышения производительности. Некоторые типы имеют API для метаданных. В случае неправильной настройки типа вы можете столкнуться со странным поведением источника данных при запросе метрик и меток. Проверьте документацию Prometheus и убедитесь, что указали правильный тип.",
- "tooltip-query-overlap-window": "Задайте продолжительность, например {{example1}} или {{example2}}, или {{example3}}. По умолчанию: {{default}}. Эта продолжительность будет добавлена к продолжительности каждого инкрементального запроса.",
- "tooltip-query-timeout": "Задайте время ожидания запроса Prometheus.",
- "tooltip-scrape-interval": "Этот интервал определяет, как часто Prometheus будет опрашивать целевые объекты. Задайте стандартный интервал опроса и оценки, установленный в файле конфигурации Prometheus. Если вы установите значение больше, чем интервал в файле конфигурации Prometheus, Grafana будет оценивать данные в соответствии с этим интервалом и вы будете получать меньше точек данных. По умолчанию: {{default}}.",
- "tooltip-series-limit": "Лимит распространяется на все ресурсы (метрики, метки и значения) для обеих конечных точек (серий и меток). Оставьте поле пустым, чтобы использовался лимит по умолчанию (40000). Установите значение 0, чтобы отключить ограничение и получать все данные. Это может привести к проблемам с производительностью. Лимит по умолчанию: 40000.",
- "tooltip-use-series-endpoint": "При включении этого параметра конечная точка ряда с параметром {{exampleParameter}} будет иметь приоритет над конечной точкой значений меток с параметром {{exampleParameter}}. Хотя конечная точка значений меток считается более эффективной, некоторые пользователи предпочитают конечную точку ряда, поскольку она использует метод POST в отличие от конечной точки значений меток, которая использует метод GET."
- }
- },
- "metrics-browser": {
- "disabled-label": "(отключено)",
- "enabled-label": "Браузер метрик"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Включает только уникальные метки",
- "description-custom": "Предоставьте шаблон именования",
- "description-verbose": "Все имена и значения меток",
- "label-auto": "Авто",
- "label-custom": "Пользовательская",
- "label-verbose": "Подробная"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Вычисляет среднее значение по измерениям",
- "documentation-bottomk": "Наименьшее значение k элементов по значению выборки",
- "documentation-count": "Считает количество элементов в векторе",
- "documentation-count-values": "Считает количество элементов с одинаковым значением",
- "documentation-group": "Все значения в итоговом векторе равны 1",
- "documentation-max": "Выбирает максимальное значение по измерениям",
- "documentation-min": "Выбирает минимальное значение по измерениям",
- "documentation-quantile": "Вычисляет φ-квантиль (0 ≤ φ ≤ 1) по измерениям",
- "documentation-stddev": "Вычисляет среднеквадратическое отклонение по измерениям",
- "documentation-stdvar": "Вычисляет стандартную дисперсию по измерениям",
- "documentation-sum": "Вычисляет сумму по измерениям",
- "documentation-topk": "Наибольшее значение k элементов по значению выборки"
- },
- "getFunctions": {
- "documentation-abs": "Возвращает входной вектор, в котором все значения выборки преобразованы в их абсолютные значения.",
- "documentation-absent": "Возвращает пустой вектор, если переданный вектор имеет какие-либо элементы, и одноэлементный вектор со значением 1, если переданный вектор не имеет элементов. Функция полезна для оповещения, когда для данного имени метрики и комбинации меток не существует временных рядов.",
- "documentation-absent-over-time": "Возвращает пустой вектор, если переданный вектор диапазона имеет какие-либо элементы, и одноэлементный вектор со значением 1, если переданный вектор диапазона не имеет элементов.",
- "documentation-avg-over-time": "Среднее значение всех точек в указанном интервале.",
- "documentation-ceil": "Округляет выборочные значения всех элементов в v в большую сторону до ближайшего целого числа.",
- "documentation-changes": "Для каждого входного временного ряда функция changes(v range-vector) возвращает количество изменений его значения в пределах заданного временного диапазона в виде мгновенного вектора.",
- "documentation-clamp": "Ограничивает выборочные значения всех элементов в v до нижнего предела min и верхнего предела max.",
- "documentation-clamp-max": "Ограничивает выборочные значения всех элементов в v до верхнего предела max.",
- "documentation-clamp-min": "Ограничивает выборочные значения всех элементов в v до нижнего предела min.",
- "documentation-count-over-time": "Количество всех значений в указанном интервале.",
- "documentation-count-scalar": "Возвращает количество элементов в векторе временных рядов в виде скаляра. Этим она отличается от оператора агрегации count(), который всегда возвращает вектор (пустой, если входной вектор пуст) и допускает группировку по меткам с помощью оператора by.",
- "documentation-day-of-month": "Возвращает день месяца для каждого из указанных значений времени в формате UTC. Возвращаемые значения находятся в диапазоне от 1 до 31.",
- "documentation-day-of-week": "Возвращает день недели для каждого из указанных значений времени в формате UTC. Возвращаемые значения находятся в диапазоне от 0 до 6, где 0 означает воскресенье и т. д.",
- "documentation-day-of-year": "Возвращает день года для каждого из указанных значений времени в формате UTC. Возвращаемые значения находятся в диапазоне от 1 до 365 для невисокосных лет и от 1 до 366 для високосных лет.",
- "documentation-days-in-month": "Возвращает количество дней в месяце для каждого из указанных значений времени в формате UTC. Возвращаемые значения находятся в диапазоне от 28 до 31.",
- "documentation-deg": "Преобразует радианы в градусы для всех элементов в v.",
- "documentation-delta": "Вычисляет разницу между первым и последним значением каждого элемента временного ряда в векторе диапазона v, возвращая мгновенный вектор с заданными дельтами и эквивалентными метками. Дельта экстраполируется для охвата всего временного диапазона, указанного в селекторе вектора диапазона, что позволяет получить нецелочисленный результат, даже если все значения выборки являются целыми числами.",
- "documentation-deriv": "Вычисляет посекундную производную временного ряда в векторе диапазона v, используя простую линейную регрессию.",
- "documentation-double-exponential-smoothing": "Возвращает сглаженное значение для временного ряда на основе диапазона в v. Чем ниже коэффициент сглаживания sf, тем большее значение придается старым данным. Чем выше коэффициент тренда tf, тем больше трендов в данных учитывается. Оба значения sf и tf должны находиться в диапазоне от 0 до 1.",
- "documentation-drop-common-labels": "Удаляет все метки, имеющие одинаковое имя и значение во всех рядах входного вектора.",
- "documentation-exp": "Вычисляет экспоненциальную функцию для всех элементов в v.\nОсобые случаи:\n* Exp(+Inf) = +Inf \n* Exp(NaN) = NaN",
- "documentation-floor": "Округляет выборочные значения всех элементов в v в меньшую сторону до ближайшего целого числа.",
- "documentation-histogram-avg": "Возвращает среднее арифметическое наблюдаемых значений, хранящихся во встроенной гистограмме. Выборки, не являющиеся встроенными гистограммами, игнорируются и не отображаются в возвращаемом векторе.",
- "documentation-histogram-count": "Возвращает количество наблюдений, хранящихся во встроенной гистограмме.",
- "documentation-histogram-fraction": "Возвращает вычисленную долю наблюдений между заданными нижним и верхним значениями.",
- "documentation-histogram-quantile": "Вычисляет φ-квантиль (0 ≤ φ ≤ 1) из интервалов b гистограммы. Выборки в b представляют собой количество наблюдений в каждом интервале. Каждая выборка должна иметь метку le, где значение метки обозначает верхнюю границу интервала включительно. (Выборки без такой метки игнорируются.) Тип метрик гистограммы автоматически обеспечивает временные ряды с суффиксом _bucket и соответствующими метками.",
- "documentation-histogram-stddev": "Возвращает вычисленное стандартное отклонение наблюдений во встроенной гистограмме на основе геометрического среднего значения интервалов, в которых находятся наблюдения.",
- "documentation-histogram-stdvar": "Возвращает вычисленную стандартную дисперсию наблюдений во встроенной гистограмме.",
- "documentation-histogram-sum": "Возвращает суммарное количество наблюдений, хранящихся во встроенной гистограмме.",
- "documentation-holt-winters": "Переименована в double_exponential_smoothing в Prometheus v3.x. Используйте double_exponential_smoothing для версий Prometheus v3.0 и выше. \n\nВозвращает сглаженное значение для временного ряда на основе диапазона в v. Чем ниже коэффициент сглаживания sf, тем большее значение придается старым данным. Чем выше коэффициент тренда tf, тем больше трендов в данных учитывается. Оба значения sf и tf должны находиться в диапазоне от 0 до 1.",
- "documentation-hour": "Возвращает час для каждого из указанных значений времени в формате UTC. Возвращаемые значения находятся в диапазоне от 0 до 23.",
- "documentation-idelta": "Вычисляет разницу между двумя последними выборками в векторе диапазона v, возвращая мгновенный вектор с заданными дельтами и эквивалентными метками.",
- "documentation-increase": "Вычисляет прирост временного ряда в векторе диапазона. Нарушения монотонности (например, сброс счетчика из-за перезапуска цели) автоматически корректируются. Прирост экстраполируется на весь временной диапазон, указанный в селекторе вектора диапазона, что позволяет получить нецелочисленный результат, даже если счетчик увеличивается только на целые числа.",
- "documentation-info": "Возвращает последние сведения и метаданные о группе метрик, такие как их метки и текущие значения, без выполнения каких-либо вычислений.",
- "documentation-irate": "Вычисляет мгновенную скорость прироста временного ряда в секунду в векторе диапазона. Вычисление основано на последних двух точках данных. Нарушения монотонности (например, сброс счетчика из-за перезапуска цели) автоматически корректируются.",
- "documentation-label-join": "Для каждого временного ряда в v объединяет все значения всех меток src_labels с помощью функции separator и возвращает временной ряд с меткой dst_label, содержащий объединенное значение. В этой функции может быть любое количество меток src_labels.",
- "documentation-label-replace": "Для каждого временного ряда в v функция label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string) сопоставляет регулярное выражение regex с меткой src_label. Если оно соответствует, то временной ряд возвращается с меткой dst_label, замененной на расширение replacement. $1 заменяется первой соответствующей подгруппой, $2 — второй и т. д. Если регулярное выражение не соответствует, то временной ряд возвращается без изменений.",
- "documentation-last-over-time": "Самое последнее значение точки в указанном интервале.",
- "documentation-ln": "Вычисляет натуральный логарифм для всех элементов в v.\nОсобые случаи:\n * ln(+Inf) = +Inf\n * ln(0) = -Inf\n * ln(x < 0) = NaN\n * ln(NaN) = NaN",
- "documentation-log10": "Вычисляет десятичный логарифм для всех элементов в v. Особые случаи эквивалентны случаям в ln.",
- "documentation-log2": "Вычисляет двоичный логарифм для всех элементов в v. Особые случаи эквивалентны случаям в ln.",
- "documentation-max-over-time": "Максимальное значение всех точек в указанном интервале.",
- "documentation-min-over-time": "Минимальное значение всех точек в указанном интервале.",
- "documentation-minute": "Возвращает минуту для каждого из указанных значений времени в формате UTC. Возвращаемые значения находятся в диапазоне от 0 до 59.",
- "documentation-month": "Возвращает месяц года для каждого из указанных значений времени в формате UTC. Возвращаемые значения находятся в диапазоне от 1 до 12, где 1 означает январь и т. д.",
- "documentation-pi": "Возвращает число пи",
- "documentation-predict-linear": "Прогнозирует значение временного ряда через t сек. с настоящего момента на основании вектора диапазона v, используя простую линейную регрессию.",
- "documentation-present-over-time": "Значение 1 для любого ряда в указанном интервале.",
- "documentation-quantile-over-time": "φ-квантиль (0 ≤ φ ≤ 1) значений в указанном интервале.",
- "documentation-rad": "Преобразует градусы в радианы для всех элементов в v.",
- "documentation-rate": "Вычисляет среднюю скорость прироста временного ряда в секунду в векторе диапазона. Нарушения монотонности (например, сброс счетчика из-за перезапуска цели) автоматически корректируются. Кроме того, вычисление экстраполируется на концы временного диапазона, что позволяет учитывать пропуски циклов извлечения данных или их несоответствие временному периоду диапазона.",
- "documentation-resets": "Для каждого входного временного ряда функция resets(v range-vector) возвращает количество сбросов счетчика в пределах заданного временного диапазона в виде мгновенного вектора. Любое уменьшение значения между двумя последовательными выборками интерпретируется как сброс счетчика.",
- "documentation-round": "Округляет выборочные значения всех элементов в v до ближайшего целого числа. В спорных случаях значения округляются в большую сторону. Необязательный аргумент to_nearest позволяет указать ближайшее кратное число, до которого следует округлить значения выборки. Кратное число также может быть дробью.",
- "documentation-scalar": "Если задан одноэлементный входной вектор, функция scalar(v instant-vector) возвращает выборочное значение единственного элемента в виде скаляра. Если входной вектор содержит не один элемент, функция scalar вернет NaN.",
- "documentation-sgn": "Возвращает вектор, в котором все выборочные значения преобразованы в соответствующие знаки, определяемые следующим образом: 1, если v является положительным, -1, если v является отрицательным, и 0, если v равно нулю.",
- "documentation-sort": "Возвращает элементы вектора, отсортированные по значениям выборки, в порядке возрастания.",
- "documentation-sort-desc": "Возвращает элементы вектора, отсортированные по значениям выборки, в порядке убывания.",
- "documentation-sqrt": "Вычисляет квадратный корень всех элементов в v.",
- "documentation-stddev-over-time": "Среднеквадратическое отклонение значений в указанном интервале.",
- "documentation-stdvar-over-time": "Стандартная дисперсия значений в указанном интервале.",
- "documentation-sum-over-time": "Сумма всех значений в указанном интервале.",
- "documentation-time": "Возвращает количество секунд, прошедших с 1 января 1970 года по UTC. Обратите внимание, что возвращается не текущее время, а время, в которое должно быть получено выражение.",
- "documentation-timestamp": "Возвращает временную метку каждого из образцов заданного вектора в виде количества секунд, прошедших с 1 января 1970 года по UTC.",
- "documentation-vector": "Возвращает скаляр s в виде вектора без меток.",
- "documentation-year": "Возвращает год для каждого из указанных значений времени в формате UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "вычисляет арккосинус всех элементов в {{argument}}",
- "documentation-acosh": "вычисляет обратный гиперболический косинус всех элементов в {{argument}}",
- "documentation-asin": "вычисляет арксинус всех элементов в {{argument}}",
- "documentation-asinh": "вычисляет обратный гиперболический синус всех элементов в {{argument}}",
- "documentation-atan": "вычисляет арктангенс всех элементов в {{argument}}",
- "documentation-atanh": "вычисляет обратный гиперболический тангенс всех элементов в {{argument}}",
- "documentation-cos": "вычисляет косинус всех элементов в {{argument}}",
- "documentation-cosh": "вычисляет гиперболический косинус всех элементов в {{argument}}",
- "documentation-sin": "вычисляет синус всех элементов в {{argument}}",
- "documentation-sinh": "вычисляет гиперболический синус всех элементов в {{argument}}",
- "documentation-tan": "вычисляет тангенс всех элементов в {{argument}}",
- "documentation-tanh": "вычисляет гиперболический тангенс всех элементов в {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Отправить отзыв",
- "title-give-feedback": "Обозреватель метрик — это новая функция. Сообщите нам, как мы можем ее улучшить"
- },
- "get-collapsed-info": {
- "exemplars": "Образцы: {{value}}",
- "format": "Формат: {{value}}",
- "legend": "Условные обозначения: {{value}}",
- "step": "Шаг: {{value}}",
- "type": "Тип: {{value}}"
- },
- "get-placeholders": {
- "browse": "Поиск метрик по имени",
- "type": "Фильтр по типу"
- },
- "get-prom-types": {
- "description-counter": "Кумулятивная метрика, представляющая собой один монотонно увеличивающийся счетчик, значение которого может только увеличиваться или сбрасываться до нуля при перезапуске.",
- "description-gauge": "Метрика, представляющая собой одно числовое значение, которое может произвольно увеличиваться и уменьшаться.",
- "description-histogram": "Гистограмма содержит выборку наблюдений (обычно таких, как продолжительность запроса или размер ответа) и подсчитывает их в настраиваемых интервалах.",
- "description-native-histogram": "Встроенные гистограммы отличаются от классических гистограмм Prometheus по ряду параметров: границы интервалов встроенной гистограммы вычисляются по формуле, которая зависит от ее масштаба (разрешения), и не определяются пользователем.",
- "description-no-type": "Эти метрики не имеют определенного типа в метаданных.",
- "description-summary": "Сводка содержит выборку наблюдений (обычно таких, как продолжительность запроса и размер ответа) и может вычислять настраиваемые квантили в скользящем временном окне.",
- "description-unknown": "В метаданных этим метрикам присвоен тип «неизвестный».",
- "label-counter": "Счетчик",
- "label-gauge": "Индикатор",
- "label-histogram": "Гистограмма",
- "label-native-histogram": "Встроенная гистограмма",
- "label-no-type": "Нет типа",
- "label-summary": "Сводка",
- "label-unknown": "Неизвестный"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Неоднозначные результаты анализа запроса."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Удалить {{name}}",
- "placeholder-select-label": "Выбрать метку",
- "placeholder-select-value": "Выбрать значение"
- },
- "label-filters": {
- "label-filters": "Фильтры меток",
- "label-label-filters": "Фильтры меток",
- "tooltip-label-filters": "(Необязательно.) Используется в качестве фильтра выбора метрик для этого типа запроса."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Загрузка меток",
- "noOptionsMessage-no-labels-found": "Метки не найдены"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Открыть обозреватель метрик",
- "placeholder-select-metric": "Выбрать метрику",
- "tooltip-open-metrics-explorer": "Открыть обозреватель метрик"
- },
- "label-metric": "Метрика",
- "tooltip-metric": "(Необязательно.) Возвращает список значений для метки с соответствующим названием в указанной метрике."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Поиск метрик",
- "currently-selected": "Выбранные в данный момент: {{selected}}",
- "metrics-pre-filtered": "Метрики были предварительно отфильтрованы по меткам, выбранным в соответствующих фильтрах.",
- "title-metrics-explorer": "Обозреватель метрик"
- },
- "nested-query": {
- "label": {
- "ignoring": "Игнорирование",
- "on": "Вкл."
- },
- "operator": "Оператор",
- "tooltip-remove-match": "Удалить совпадение",
- "vector-matches": "Совпадения векторов"
- },
- "operation-editor": {
- "not-found": "Операция {{id}} не найдена",
- "title-remove": "Удалить {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Заменить на",
- "title-click-to-view-alternative-operations": "Нажмите для просмотра альтернативных операций",
- "title-remove-operation": "Удалить операцию"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Нажмите для отображения описания",
- "title-remove-operation": "Удалить операцию"
- },
- "operation-list": {
- "operations": "Операции",
- "placeholder-search": "Поиск",
- "title-add-operation": "Добавить операцию"
- },
- "operation-param-editor": {
- "title-add": "Добавить {{name}}",
- "title-remove": "Удалить {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Вычисляет {{aggregationName}} по измерениям, сохраняя {{labels}} {{labelWord}}.",
- "label-default": "Вычисляет {{aggregationName}} по измерениям.",
- "label-without": "Вычисляет {{aggregationName}} по измерениям {{labels}}. Все остальные метки сохраняются."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Переключатель образцов.",
- "aria-label-format": "Форматировать комбинированный список",
- "aria-label-lower-limit-parameter": "Текстовое поле минимального шага, установить нижний предел для параметра шага",
- "aria-label-select-resolution": "Выбрать разрешение",
- "aria-label-type": "Группа радиокнопок",
- "format-options": {
- "label-heatmap": "Тепловая карта",
- "label-table": "Таблица",
- "label-time-series": "Временные ряды"
- },
- "label-exemplars": "Образцы",
- "label-format": "Формат",
- "label-min-step": "Мин. шаг",
- "label-resolution": "Разрешение",
- "label-type": "Тип",
- "placeholder-auto": "авто",
- "title-options": "Параметры",
- "tooltip-min-step": "Дополнительный нижний предел для параметра шага запроса Prometheus и переменных <2>{{interval}}2> и <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "При переключении в режим конструктора произошла синтаксическая ошибка или структура запроса не может быть визуализирована. Части запроса могут быть потеряны.",
- "confirmText-continue": "Продолжить",
- "kick-start-your-query": "Запустить запрос",
- "label-explain": "Объяснение",
- "run-queries": "Выполнить запросы",
- "title-parsing-error-switch-builder": "Ошибка анализа. Переключиться в режим конструктора?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Комбинированный список с подписью",
- "label-legend": "Условные обозначения",
- "placeholder-select-legend-mode": "Выберите режим условных обозначений",
- "tooltip-legend": "Переопределение или шаблон имени ряда. Например, вместо {{templateExample}} будет использоваться значение метки для {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "рекомендация: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Конструктор",
- "label-code": "Код"
- }
- },
- "query-pattern": {
- "apply-query": "Применить запрос",
- "aria-label-apply-query-starter-button": "кнопка применения запроса",
- "aria-label-back-button": "кнопка назад",
- "aria-label-create-new-query-button": "кнопка создания нового запроса",
- "aria-label-raw-query": "Необработанный запрос {{patternName}}",
- "aria-label-use-this-query-button": "использовать кнопку запроса",
- "back": "Назад",
- "create-new-query": "Создать новый запрос",
- "use-this-query": "Использовать запрос"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "закрыть модальное окно запуска запроса",
- "aria-label-kick-start-your-query-modal": "Модальное окно запуска запроса",
- "aria-label-toggle-query-starter": "открыть и закрыть карту запуска запроса {{patternType}}",
- "close": "Закрыть",
- "description-kick-start-your-query": "Запустите запрос, выбрав один из этих вариантов. Затем можно продолжить выполнение запроса.",
- "label-toggle-query-starter": "Элементы запуска запроса {{patternType}}",
- "title-kick-start-your-query": "Запустить запрос"
- },
- "raw-query": {
- "aria-label-selector": "селектор"
- },
- "results-table": {
- "content-descriptive-type": "При создании {{descriptiveType}} Prometheus отображает несколько рядов со счетчиком типов. ",
- "description": "Описание",
- "message-expand-label-filters": "Метрики не найдены. Попробуйте расширить фильтры меток.",
- "message-expand-search": "Метрики не найдены. Попробуйте расширить поиск и фильтры.",
- "message-no-metrics-found": "В источнике данных нет метрик.",
- "name": "Имя",
- "type": "Тип"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/sv-SE/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/sv-SE/grafana-prometheus.json
deleted file mode 100644
index 21fe658ed10..00000000000
--- a/packages/grafana-prometheus/src/locales/sv-SE/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Fel vid laddning av kommentarsdata!",
- "aria-label-lower-limit-parameter": "Ställ in nedre gräns för stegparametern",
- "label-min-step": "Minsta steg",
- "label-series-value-as-timestamp": "Serievärde som tidsstämpel",
- "label-tags": "Taggar",
- "label-text": "Text",
- "label-title": "Titel",
- "placeholder-auto": "auto",
- "tooltip-either-pattern-example-instance-replaced-label": "Använd antingen namnet eller ett mönster. Till exempel ersätts {{labelTemplate}} med etikettvärdet för etiketten {{labelName}}.",
- "tooltip-min-step": "En ytterligare nedre gräns för stegparametern för Prometheus-frågan och för variablerna <2>{{intervalVar}}2> och <4>{{rateIntervalVar}}4>.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Tidsstämpelns enhet är millisekunder. Om enheten för serievärdet är sekunder, multiplicera dess intervallvektor med 1 000."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Kör en direktfråga och en intervallfråga"
- },
- "label": {
- "both": "Båda"
- },
- "range-options": {
- "description": {
- "query-range": "Kör fråga över ett tidsintervall"
- },
- "label": {
- "instant": "Direkt",
- "range": "Räckvidd"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Filtrera uttryck för etikett",
- "description-select-labels": "När etikettvärden väljs visas endast möjliga etikettkombinationer.",
- "select-labels-to-search-in": "2. Välj etiketter att söka i"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Filtrera uttryck för mätvärde",
- "aria-label-limit-results-from-series-endpoint": "Begränsa resultat från serieändpunkt",
- "description-series-limit": "Gränsen gäller för alla mätvärden, etiketter och värden. Lämna fältet tomt för att använda standardgränsen. Ställ in på 0 för att inaktivera gränsen och hämta allt – detta kan orsaka prestandaproblem.",
- "label-select-metric": "När ett mätvärde väljs visas endast möjliga etiketter. Etiketter begränsas av seriegränsen nedan.",
- "select-a-metric": "1. Välj ett mått",
- "series-limit": "Seriegräns"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL-fusklapp"
- },
- "prom-exemplar-field": {
- "exemplars": "Exemplar",
- "tooltip-disable-query": "Inaktivera fråga med exempel",
- "tooltip-enable-query": "Aktivera fråga med exempel"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus extrafält",
- "aria-label-query-type-field": "Fält för typ av fråga",
- "aria-label-step-field": "Stegfält",
- "min-step": "Minsta steg",
- "query-type": "Typ av fråga",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Tidsenheter och inbyggda variabler kan användas här, till exempel: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Standard om ingen enhet anges: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Ange en PromQL-fråga …"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Klassisk fråga",
- "aria-label-metric-regex": "Måttregex",
- "aria-label-metric-selector": "Måttväljare",
- "aria-label-prometheus-query": "Prometheus-fråga",
- "aria-label-query-type": "Typ av fråga",
- "aria-label-series-query": "Seriefråga",
- "label-classic-query": "Klassisk fråga",
- "label-label": "Etikett",
- "label-metric-regex": "Måttregex",
- "label-query": "Fråga",
- "label-query-type": "Typ av fråga",
- "label-series-query": "Seriefråga",
- "placeholder-classic-query": "Klassisk fråga",
- "placeholder-metric-regex": "Måttregex",
- "placeholder-prometheus-query": "Prometheus-fråga",
- "placeholder-select-query-type": "Välj typ av fråga",
- "placeholder-series-query": "Seriefråga",
- "returns-metrics-matching-specified-metric-regex": "Returnerar en lista över mätvärden som matchar angiven måttregex.",
- "tooltip-classic-query": "Den ursprungliga implementeringen av Prometheus variabla frågeredigerare. Ange en sträng med rätt frågetyp och parametrar enligt beskrivningen i dessa dokument. Till exempel, {{exampleQuery}}.",
- "tooltip-label": "Returnerar en lista över etikettvärden för etikettnamnet för alla mätvärden om inte mätvärdet är angivet.",
- "tooltip-metric-regex": "Returnerar en lista över etikettnamn, eventuellt filtrering efter angiven måttregex.",
- "tooltip-query": "Returnerar en lista över Prometheus frågeresultat för frågan. Detta kan inkludera Prometheus-funktioner, d.v.s. {{exampleQuery}}.",
- "tooltip-query-type": "Prometheus-datakällans tillägg tillhandahåller följande frågetyper för mallvariabler.",
- "tooltip-series-query": "Ange ett mätvärde med etiketter, endast ett mätvärde eller endast etiketter d.v.s. {{example1}}, {{example2}} eller {{example3}}. Returnerar en lista över tidsserier som är associerade med angivna data."
- },
- "selector-actions": {
- "aria-label-selector": "väljare",
- "aria-label-selector-clear-button": "Knapp för att rensa väljare",
- "aria-label-use-selector-as-metrics-button": "Knapp för att använda väljare som mätvärde",
- "aria-label-use-selector-for-query-button": "Använd väljare för frågeknapp",
- "aria-label-validate-submit-button": "Validera skicka-knappen",
- "clear": "Rensa",
- "resulting-selector": "4. Resulterande väljare",
- "use-as-rate-query": "Använd som ”rate”-fråga",
- "use-query": "Använd fråga",
- "validate-selector": "Validera väljare"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Filtrera uttryck för etikettvärden",
- "aria-label-values-for": "Värden för {{labelKey}}",
- "description-search-field-values-across-selected-labels": "Använd sökfältet för att hitta värden över valda etiketter.",
- "select-multiple-values-for-your-labels": "3. Välj (flera) värden för dina etiketter"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Tillåt som mål för inspelningsregler",
- "label-manage-alerts-via-alerting-ui": "Hantera varningar via larmgränssnittet",
- "title-alerting": "Varnar",
- "tooltip-allow-as-recording-rules-target": "Tillåt att denna datakälla väljs som mål för att skriva inspelningsregler.",
- "tooltip-manage-alerts-via-alerting-ui": "Hantera varningsregler för den här datakällan. Om du vill hantera andra varningsresurser ska du lägga till en Alertmanager-datakälla."
- },
- "config-editor": {
- "browser-access-mode-error": "Webbläsaråtkomstläge i Prometheus-datakällan är inte längre tillgängligt. Byt till serveråtkomstläge.",
- "description-advanced-settings": "Ytterligare inställningar är valfria inställningar som kan konfigureras för ökad kontroll över din datakälla.",
- "title-advanced-settings": "Avancerade inställningar",
- "title-error": "Fel"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Din åtkomstmetod är <1>Webbläsare1>, vilket innebär att webbadressen måste vara tillgänglig från webbläsaren.",
- "tooltip-http-url": "Ange en fullständig HTTP-URL (till exempel {{exampleURL}})",
- "tooltip-server-access-mode": "Din åtkomstmetod är <1>Server1>, vilket innebär att webbadressen måste vara tillgänglig från Grafana-gränssnittet/servern."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Besök dokumentationen för mer information här."
- },
- "exemplar-setting": {
- "label-data-source": "Datakälla",
- "label-internal-link": "Intern länk",
- "label-label-name": "Etikettnamn",
- "label-remove-exemplar-link": "Ta bort exempel på länk",
- "label-url": "URL",
- "label-url-label": "URL-etikett",
- "placeholder-go-to-examplecom": "Gå till example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "Ta bort exempel på länk",
- "tooltip-data-source": "Datakällan som exemplet kommer att navigera till.",
- "tooltip-internal-link": "Aktivera det här alternativet om du har en intern länk. När det är aktiverat visar detta datakällans väljare. Välj backend-spårningsdatalagret för dina exempeldata.",
- "tooltip-label-name": "Namnet på fältet i etikettobjektet som ska användas för att hämta spårnings-ID.",
- "tooltip-url": "URL till spårningssystemet som användaren går till för att se sin spårning",
- "tooltip-url-label": "Används för att åsidosätta knappetiketten för fältet för exemplartrace-ID."
- },
- "exemplars-settings": {
- "add": "Lägg till",
- "no-exemplars-configurations": "Inga exemplar-konfigurationer",
- "title-exemplars": "Exemplar"
- },
- "prom-settings": {
- "aria-label-default-editor": "Standardredigerare (kod eller byggare)",
- "aria-label-prom-type-type": "{{promType}} typ",
- "aria-label-prometheus-type": "Prometheus-typ",
- "aria-label-select-http-method": "Välj HTTP-metod",
- "editor-options": {
- "label-builder": "Builder",
- "label-code": "Kod"
- },
- "label-cache-level": "Cache-nivå",
- "label-custom-query-parameters": "Anpassade frågeparametrar",
- "label-default-editor": "Standardredigerare",
- "label-disable-metrics-lookup": "Inaktivera sökning av mätvärden",
- "label-disable-recording-rules-beta": "Inaktivera inspelningsregler (beta)",
- "label-http-method": "HTTP-metod",
- "label-incremental-querying-beta": "Inkrementell fråga (beta)",
- "label-prom-type-version": "{{promType}} version",
- "label-prometheus-type": "Prometheus-typ",
- "label-query-overlap-window": "Fönster för frågeöverlappning",
- "label-query-timeout": "Timeout för fråga",
- "label-scrape-interval": "Skrapningsintervall",
- "label-series-limit": "Seriegräns",
- "label-use-series-endpoint": "Använd serieändpunkt",
- "more-info": "För mer information om hur du konfigurerar prometheustyp och -version i datakällor, se <2>provisioneringsdokumentationen2>.",
- "placeholder-example-maxsourceresolutionmtimeout": "Exempel: {{example}}",
- "title-interval-behaviour": "Intervallbeteende",
- "title-other": "Annat",
- "title-performance": "Performance",
- "title-query-editor": "Frågeredigerare",
- "tooltip-cache-level": "Anger webbläsarens cachelagringsnivå för redigeringsfrågor. Högre cacheinställningar rekommenderas för datakällor med hög kardinalitet.",
- "tooltip-custom-query-parameters": "Lägg till anpassade parametrar i Prometheus fråge-URL. Till exempel {{example1}}, {{example2}}, {{example3}} eller {{example4}}. Flera parametrar ska sammanfogas med {{concatenationChar}}.",
- "tooltip-default-editor": "Ange standardalternativ för redigerare för alla användare av den här datakällan.",
- "tooltip-disable-metrics-lookup": "Om du markerar det här alternativet inaktiveras metrikväljaren och stödet för automatisk komplettering av metrik/etikett i sökfältet. Detta hjälper om du har prestandaproblem med större Prometheus-instanser. ",
- "tooltip-disable-recording-rules-beta": "Denna funktion kommer att inaktivera inspelningsregler. Aktivera detta för att förbättra instrumentpanelens prestanda",
- "tooltip-http-method": "Du kan använda antingen HTTP-metoden POST eller GET för att fråga din Prometheus-datakälla. POST är den rekommenderade metoden eftersom den tillåter större frågor. Ändra detta till GET om du har en Prometheus-version som är äldre än 2.1 eller om POST-förfrågningar är begränsade i ditt nätverk.",
- "tooltip-incremental-querying-beta": "Denna funktion kommer att ändra standardbeteendet för relativa frågor till att alltid begära nya data från prometheus-instansen, istället kommer frågeresultat att cachelagras och endast nya poster begärs. Aktivera detta för att minska databas- och nätverksbelastningen.",
- "tooltip-prom-type-version": "Använd detta för att ställa in versionen av din {{promType}}-instans om den inte konfigureras automatiskt.",
- "tooltip-prometheus-type": "Ställ in detta till typen av din prometheus-databas, t.ex. Prometheus, Cortex, Mimir eller Thanos. Om du ändrar det här fältet sparas dina nuvarande inställningar. Vissa typer av Prometheus stöder eller stöder inte olika API:er. Till exempel stöder vissa typer regex-matchning för etikettfrågor för att förbättra prestandan. Vissa typer har ett API för metadata. Om du ställer in detta felaktigt kan du uppleva konstigt beteende när du frågar efter mätvärden och etiketter. Kontrollera din Prometheus-dokumentation för att säkerställa att du anger rätt typ.",
- "tooltip-query-overlap-window": "Ange en varaktighet som {{example1}} eller {{example2}} eller {{example3}}. Standard för {{default}}. Denna varaktighet kommer att läggas till varaktigheten för varje inkrementell begäran.",
- "tooltip-query-timeout": "Ställ in timeout för Prometheus-fråga.",
- "tooltip-scrape-interval": "Detta intervall anger hur ofta Prometheus skrapar målen. Ställ in detta till det typiska skrapnings- och utvärderingsintervallet som konfigurerats i din Prometheus-konfigurationsfil. Om du anger ett värde som är större än Prometheus-konfigurationsfilens intervall, kommer Grafana att bearbeta datan utifrån detta nya intervall, vilket resulterar i färre datapunkter. Standardvärdet är {{default}}.",
- "tooltip-series-limit": "Gränsen gäller för alla resurser (mätvärden, etiketter och värden) för båda slutpunkterna (serier och etiketter). Lämna fältet tomt för att använda standardgränsen (40 000). Ställ in på 0 för att inaktivera gränsen och hämta allt – detta kan orsaka prestandaproblem. Standardgränsen är 40 000.",
- "tooltip-use-series-endpoint": "Om du markerar det här alternativet kommer serieslutpunkten med parametern {{exampleParameter}} att prioriteras framför etikettvärdeslutpunkten med parametern {{exampleParameter}}. Även om slutpunkten för etikettvärden anses ha bättre prestanda, kan vissa användare föredra series-slutpunkten eftersom den stöder POST-metoden, medan slutpunkten för etikettvärden endast stöder GET-metoden."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Inaktiverad)",
- "enabled-label": "Mätvärdesbläddrare"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Inkluderar endast unika etiketter",
- "description-custom": "Tillhandahåll en namnmall",
- "description-verbose": "Alla etikettnamn och värden",
- "label-auto": "Auto",
- "label-custom": "Anpassad",
- "label-verbose": "Detaljerad"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Beräkna genomsnittet över dimensioner",
- "documentation-bottomk": "Minsta k-element baserat på provvärde",
- "documentation-count": "Räkna antalet element i vektorn",
- "documentation-count-values": "Räkna antalet element med samma värde",
- "documentation-group": "Alla värden i den resulterande vektorn är 1",
- "documentation-max": "Välj maximalt över dimensioner",
- "documentation-min": "Välj minimum över dimensioner",
- "documentation-quantile": "Beräkna φ-kvantil (0 ≤ φ ≤ 1) över dimensioner",
- "documentation-stddev": "Beräkna populationsstandardavvikelse över dimensioner",
- "documentation-stdvar": "Beräkna populationsstandardvarians över dimensioner",
- "documentation-sum": "Beräkna summan över dimensioner",
- "documentation-topk": "Största k-element baserat på provvärde"
- },
- "getFunctions": {
- "documentation-abs": "Returnerar indata-vektorn med alla provvärden konverterade till deras absoluta värde.",
- "documentation-absent": "Returnerar en tom vektor om den vektor som skickas till den har några element och en 1-element vektor med värdet 1 om den vektor som skickas till den inte har några element. Det är användbart för att kunna varna när det inte finns några tidsserier för en given kombination av måttnamn och etikett.",
- "documentation-absent-over-time": "Returnerar en tom vektor om intervallvektorn som skickas till den har några element och en 1-elementvektor med värdet 1 om intervallvektorn som skickas till den inte har några element.",
- "documentation-avg-over-time": "Medelvärdet av alla punkter i det angivna intervallet.",
- "documentation-ceil": "Avrundar provvärdena för alla element i ”v” uppåt till närmaste heltal.",
- "documentation-changes": "För varje indatatidsserie returnerar ”changes(v range-vector)” antalet gånger dess värde har ändrats inom det angivna tidsintervallet, som en ögonblicksvektor.",
- "documentation-clamp": "Begränsar provvärdena för alla element i ”v” till att ha en undre gräns på min och en övre gräns på max.",
- "documentation-clamp-max": "Begränsar provvärdena för alla element i ”v” till att ha en övre gräns på ”max”.",
- "documentation-clamp-min": "Begränsar provvärdena för alla element i ”v” till att ha en undre gräns på min.",
- "documentation-count-over-time": "Antalet av alla värden i det angivna intervallet.",
- "documentation-count-scalar": "Returnerar antalet element i en tidsserie-vektor som en skalär. Detta står i kontrast till aggregeringsoperatorn ”count()”, som alltid returnerar en vektor (en tom sådan om indatavektorn är tom) och tillåter gruppering efter etiketter via en by-sats.",
- "documentation-day-of-month": "Returnerar dagen i månaden för var och en av de angivna tiderna i UTC. Returnerade värden är från 1 till 31.",
- "documentation-day-of-week": "Returnerar veckodagen för var och en av de angivna tiderna i UTC. Returnerade värden är från 0 till 6, där 0 betyder söndag etc.",
- "documentation-day-of-year": "Returnerar dagen på året för varje given tid i UTC. Värdena som returneras är från 1 till 365 för icke-skottår och från 1 till 366 för skottår.",
- "documentation-days-in-month": "Returnerar antalet dagar i månaden för var och en av de angivna tiderna i UTC. Returnerade värden är från 28 till 31.",
- "documentation-deg": "Konverterar radianer till grader för alla element i v",
- "documentation-delta": "Beräknar skillnaden mellan det första och sista värdet för varje tidsserieelement i en intervallvektor ”v” och returnerar en omedelbar vektor med givna deltor och motsvarande etiketter. Deltan extrapoleras för att omfatta hela tidsintervallet som anges i intervallvektorväljaren så att det går att få ett icke-heltalresultat även om alla provvärden är heltal.",
- "documentation-deriv": "Beräknar derivatan per sekund av tidsserien i en intervallvektor ”v” med hjälp av enkel linjär regression.",
- "documentation-double-exponential-smoothing": "Skapar ett utjämnat värde för tidsserier baserat på intervallet i ”v”. Ju lägre utjämningsfaktorn ”sf” är, desto mer vikt ges till äldre data. Ju högre trendfaktorn ”tf” är, desto mer beaktas trender inom data. Både sf och tf måste vara mellan 0 och 1.",
- "documentation-drop-common-labels": "Släpper alla etiketter som har samma namn och värde över alla serier i indata-vektorn.",
- "documentation-exp": "Beräknar den exponentiella funktionen för alla element i ”v”.\nSpecialfall är:\n* ”Exp(+Inf) = +Inf” \n* ”Exp(NaN) = NaN”",
- "documentation-floor": "Avrundar provvärdena för alla element i ”v” nedåt till närmaste heltal.",
- "documentation-histogram-avg": "Returnerar det aritmetiska medelvärdet av observerade värden lagrade i ett internt histogram. Värden som inte är interna histogram ignoreras och visas inte i den returnerade vektorn.",
- "documentation-histogram-count": "Returnerar antalet observationer som lagras i ett internt histogram.",
- "documentation-histogram-fraction": "Returnerar den uppskattade andelen observationer mellan de angivna undre och övre värdena.",
- "documentation-histogram-quantile": "Beräknar φ-kvantilen (0 ≤ φ ≤ 1) från ett histograms behållare ”b”. Värdena i ”b” är antalet observationer i varje behållare. Varje värde måste ha en etikett ”le”, där etikettvärdet anger behållarens inkluderande övre gräns. (Värden utan sådan etikett ignoreras utan att generera något felmeddelande.) Metriktypen histogram tillhandahåller automatiskt tidsserier med suffixet ”_bucket” och lämpliga etiketter.",
- "documentation-histogram-stddev": "Returnerar den uppskattade standardavvikelsen för observationer i ett internt histogram, baserat på det geometriska medelvärdet av de behållare där observationerna finns.",
- "documentation-histogram-stdvar": "Returnerar den uppskattade standardvariansen för observationer i ett internt histogram.",
- "documentation-histogram-sum": "Returnerar summan för observationer som lagras i ett internt histogram.",
- "documentation-holt-winters": "Omdöpt till double_exponential_smoothing i Prometheus v3.x. För Prometheus-versioner lika med eller större än v3.0 ska double_exponential_smoothing användas. \n\nFunktionen producerar ett utjämnat värde för tidsserier baserat på intervallet i ”v”. Ju lägre utjämningsfaktor ”sf” är, desto större vikt ges åt äldre data. Ju högre trendfaktor ”tf” är, desto mer beaktas trender i datan. Både sf och tf måste ligga mellan 0 och 1.",
- "documentation-hour": "Returnerar timmen på dygnet i UTC för var och en av de angivna tidpunkterna. Värdena som returneras är mellan 0 och 23.",
- "documentation-idelta": "Beräknar skillnaden mellan de två senaste värdena i intervallvektorn ”v” och returnerar en ögonblicksvektor med de givna deltavärdena och motsvarande etiketter.",
- "documentation-increase": "Beräknar ökningen i tidsserien inom intervallvektorn. Brott i monotonin (som exempelvis räknaråterställningar på grund av målomstarter) justeras automatiskt. Ökningen extrapoleras för att täcka hela tidsintervallet som specificerats i intervallvektorsväljaren så att det är möjligt att få ett icke-heltalsresultat även om en räknare endast ökar med heltalsteg.",
- "documentation-info": "Returnerar senaste detaljer och metadata om en grupp mätvärden, som till exempel deras etiketter och aktuella värden, utan att utföra några beräkningar",
- "documentation-irate": "Beräknar den momentana ökningstakten per sekund för tidsserien i intervallvektorn. Denna beräkning baseras på de två senaste datapunkterna. Brott i monotonin (som exempelvis räknaråterställningar på grund av målomstarter) justeras automatiskt.",
- "documentation-label-join": "För varje tidsserie i ”v” sammanfogas alla värden från samtliga ”src_labels” med hjälp av separator, och tidsserien returneras med etiketten ”dst_label” som innehåller det sammanfogade värdet. Denna funktion kan hantera valfritt antal ”src_labels”.",
- "documentation-label-replace": "För varje tidsserie i ”v” matchar ”label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)” det reguljära uttrycket ”regex” mot etiketten ”src_label”. Om det finns en matchning, returneras tidsserien med etiketten ”dst_label” ersatt av expansionen av ”replacement”. ”$1” ersätts med den första matchande undergruppen, ”$2” med den andra och så vidare. Om det reguljära uttrycket inte matchar returneras tidsserien oförändrad.",
- "documentation-last-over-time": "Det senaste punktvärdet i angivet intervall.",
- "documentation-ln": "Beräknar den naturliga logaritmen för alla element i ”v”.\nSpecialfall är:\n * ”ln(+Inf) = +Inf”\n * ”ln(0) = -Inf”\n * ”ln(x < 0) = NaN”\n * ”ln(NaN) = NaN”",
- "documentation-log10": "Beräknar den decimala logaritmen för alla element i ”v”. Specialfallen är ekvivalenta med dem i ”ln”.",
- "documentation-log2": "Beräknar den binära logaritmen för alla element i ”v”. Specialfallen är ekvivalenta med dem i ”ln”.",
- "documentation-max-over-time": "Maximivärdet av alla punkter i det angivna intervallet.",
- "documentation-min-over-time": "Minimivärdet av alla punkter i det angivna intervallet.",
- "documentation-minute": "Returnerar minuten i timmen för var och en av de angivna tiderna i UTC. Värdena som returneras är från 0 till 59.",
- "documentation-month": "Returnerar månaden på året för var och en av de angivna tiderna i UTC. Värdena som returneras är från 1 till 12, där 1 betyder januari etc.",
- "documentation-pi": "Returnerar pi",
- "documentation-predict-linear": "Förutspår värdet på tidsserien ”t” sekunder från och med nu, baserat på intervallvektorn ”v”, med hjälp av enkel linjär regression.",
- "documentation-present-over-time": "Värdet 1 för alla serier i det angivna intervallet.",
- "documentation-quantile-over-time": "φ-kvantilen (0 ≤ φ ≤ 1) av värdena i det angivna intervallet.",
- "documentation-rad": "Konverterar grader till radianer för alla element i v",
- "documentation-rate": "Beräknar den genomsnittliga ökningstakten per sekund för tidsserien i intervallvektorn. Brott i monotonin (som exempelvis räknaråterställningar på grund av målomstarter) justeras automatiskt. Dessutom extrapolerar beräkningen till tidsintervallets ändar, vilket kompenserar för missade insamlingar eller bristfällig synkronisering mellan insamlingscykler och intervallets tidsperiod.",
- "documentation-resets": "För varje inmatad tidsserie returnerar ”resets(v range-vector)” antalet räknaråterställningar inom det angivna tidsintervallet som en ögonblicksvektor. Varje minskning av värdet mellan två på varandra följande mätvärden tolkas som en räknaråterställning.",
- "documentation-round": "Rundar av mätvärdena för alla element i ”v” till närmaste heltal. Lika avstånd rundas uppåt. Det valfria argumentet ”to_nearest” låter dig ange närmaste multipel som mätvärdena ska rundas till. Denna multipel kan även vara en fraktion.",
- "documentation-scalar": "Om en indatavektor endast innehåller ett element, returnerar ”scalar(v instant-vector)” elementets värde som en skalär. Om indatavektorn inte har exakt ett element, returnerar ”scalar” värdet ”NaN”.",
- "documentation-sgn": "Returnerar en vektor där alla mätvärden har konverterats till deras tecken, definierat på följande vis: 1 om ”v” är positivt, -1 om ”v” är negativt och 0 om ”v” är noll.",
- "documentation-sort": "Returnerar vektorelement sorterade efter deras mätvärden, i stigande ordning.",
- "documentation-sort-desc": "Returnerar vektorelement sorterade efter deras mätvärden, i fallande ordning.",
- "documentation-sqrt": "Beräknar kvadratroten av alla element i ”v”.",
- "documentation-stddev-over-time": "Populationens standardavvikelse för värdena inom det angivna intervallet.",
- "documentation-stdvar-over-time": "Populationens standardvarians för värdena inom det angivna intervallet.",
- "documentation-sum-over-time": "Summan av alla värden inom det angivna intervallet.",
- "documentation-time": "Returnerar antalet sekunder sedan den 1 januari 1970 UTC. Observera att detta faktiskt inte returnerar aktuell tid, utan motsvarar den tidpunkt i förhållande till vilken uttrycket ska utvärderas.",
- "documentation-timestamp": "Returnerar tidsstämpeln för varje mätvärde i den angivna vektorn som antalet sekunder sedan den 1 januari 1970 UTC.",
- "documentation-vector": "Returnerar skalaren ”s” som en vektor utan etiketter.",
- "documentation-year": "Returnerar året för var och en av de angivna tiderna i UTC."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "beräknar arccos för alla element i {{argument}}",
- "documentation-acosh": "beräknar inversa hyperboliska cosinus för alla element i {{argument}}",
- "documentation-asin": "beräknar arcsin för alla element i {{argument}}",
- "documentation-asinh": "beräknar inversa hyperboliska sinus för alla element i {{argument}}",
- "documentation-atan": "beräknar arctan för alla element i {{argument}}",
- "documentation-atanh": "beräknar inversa hyperboliska tangens för alla element i {{argument}}",
- "documentation-cos": "beräknar cos för alla element i {{argument}}",
- "documentation-cosh": "beräknar hyperboliska cosinus för alla element i {{argument}}",
- "documentation-sin": "beräknar sin för alla element i {{argument}}",
- "documentation-sinh": "beräknar hyperboliska sinus för alla element i {{argument}}",
- "documentation-tan": "beräknar tan för alla element i {{argument}}",
- "documentation-tanh": "beräknar hyperboliska tangens för alla element i {{argument}}"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Ge feedback",
- "title-give-feedback": "Metrics Explorer är ny – berätta gärna hur vi kan förbättra den"
- },
- "get-collapsed-info": {
- "exemplars": "Exempel: {{value}}",
- "format": "Format: {{value}}",
- "legend": "Förklaring: {{value}}",
- "step": "Steg: {{value}}",
- "type": "Typ: {{value}}"
- },
- "get-placeholders": {
- "browse": "Sök mätvärden efter namn",
- "type": "Filtrera efter typ"
- },
- "get-prom-types": {
- "description-counter": "Ett kumulativt mätvärde som representerar ett enda monotont ökande räknare vars värde endast kan ökas eller återställas till noll vid omstart.",
- "description-gauge": "Ett mätvärde som representerar ett enda numeriskt värde som godtyckligt kan gå upp och ner.",
- "description-histogram": "Ett histogram samplar observationer (vanligtvis sådant som förfrågningstider eller svarstorlekar) och räknar dem i konfigurerbara fack.",
- "description-native-histogram": "Inbyggda histogram skiljer sig från klassiska Prometheus-histogram på flera sätt: Gränserna för inbyggda histogramfack beräknas med en formel som beror på det inbyggda histogrammets skala (upplösning) och är inte användardefinierade.",
- "description-no-type": "Dessa mätvärden har ingen definierad typ i metadata.",
- "description-summary": "En sammanställning samplar observationer (vanligtvis sådant som förfrågningstider och svarstorlekar) och kan beräkna konfigurerbara kvantiler över ett glidande tidsfönster.",
- "description-unknown": "Dessa mätvärden har fått typen okänd i metadata.",
- "label-counter": "Räknare",
- "label-gauge": "Mätare",
- "label-histogram": "Histogram",
- "label-native-histogram": "Inbyggt histogram",
- "label-no-type": "Ingen typ",
- "label-summary": "Sammanfattning",
- "label-unknown": "Okänt"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Tolkningen av frågan är tvetydig."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "Ta bort {{name}}",
- "placeholder-select-label": "Välj etikett",
- "placeholder-select-value": "Välj värde"
- },
- "label-filters": {
- "label-filters": "Etikettfilter",
- "label-label-filters": "Etikettfilter",
- "tooltip-label-filters": "Valfritt: används för att filtrera det metriska valet för denna frågetyp."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Läser in etiketter",
- "noOptionsMessage-no-labels-found": "Inga etiketter hittades"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Öppna Metrics Explorer",
- "placeholder-select-metric": "Välj mätvärde",
- "tooltip-open-metrics-explorer": "Öppna Metrics Explorer"
- },
- "label-metric": "Mått",
- "tooltip-metric": "Valfritt: returnerar en lista över etikettvärden för etikettnamnet i det angivna mätvärdet."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Bläddra bland mätvärden",
- "currently-selected": "För närvarande valt: {{selected}}",
- "metrics-pre-filtered": "Mätvärdena har filtrerats i förväg med hjälp av de etiketter som valts i etikettfiltren.",
- "title-metrics-explorer": "Metrics Explorer"
- },
- "nested-query": {
- "label": {
- "ignoring": "Ignorerar",
- "on": "På"
- },
- "operator": "Operatör",
- "tooltip-remove-match": "Ta bort matchning",
- "vector-matches": "Vektormatchningar"
- },
- "operation-editor": {
- "not-found": "Operationen {{id}} hittades inte",
- "title-remove": "Ta bort {{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "Ersätt med",
- "title-click-to-view-alternative-operations": "Klicka för att visa alternativa åtgärder",
- "title-remove-operation": "Ta bort operation"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Klicka för att visa beskrivning",
- "title-remove-operation": "Ta bort operation"
- },
- "operation-list": {
- "operations": "Operationer",
- "placeholder-search": "Sök",
- "title-add-operation": "Lägg till operation"
- },
- "operation-param-editor": {
- "title-add": "Lägg till {{name}}",
- "title-remove": "Ta bort {{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "Beräknar {{aggregationName}} över dimensioner och bevarar samtidigt {{labelWord}} {{labels}}.",
- "label-default": "Beräknar {{aggregationName}} över dimensionerna.",
- "label-without": "Beräknar {{aggregationName}} över dimensionerna {{labels}}. Alla andra etiketter bevaras."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Exemplars-brytare.",
- "aria-label-format": "Formatera kombinationsruta",
- "aria-label-lower-limit-parameter": "Textruta för minsta steg, ställ in nedre gräns för stegparametern",
- "aria-label-select-resolution": "Välj upplösning",
- "aria-label-type": "Typ av radioknappsgrupp",
- "format-options": {
- "label-heatmap": "Värmekarta",
- "label-table": "Tabell",
- "label-time-series": "Tidsserier"
- },
- "label-exemplars": "Exemplar",
- "label-format": "Format",
- "label-min-step": "Minsta steg",
- "label-resolution": "Lösning",
- "label-type": "Typ",
- "placeholder-auto": "auto",
- "title-options": "Alternativ",
- "tooltip-min-step": "En ytterligare nedre gräns för stegparametern för Prometheus-frågan och för variablerna <2>{{interval}}2> och <4>{{rateInterval}}4>."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Det finns ett syntaxfel, eller så kan frågestrukturen inte visualiseras när du byter till byggläget. Delar av frågan kan gå förlorade.",
- "confirmText-continue": "Fortsätt",
- "kick-start-your-query": "Kickstarta din fråga",
- "label-explain": "Förklara",
- "run-queries": "Kör frågor",
- "title-parsing-error-switch-builder": "Tolkningsfel: Vill du byta till byggläget?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Kombinationsruta för förklaring",
- "label-legend": "Förklaringar",
- "placeholder-select-legend-mode": "Välj förklaringsläge",
- "tooltip-legend": "Åsidosätt serienamn eller mall. Ex. {{templateExample}} kommer att ersättas med etikettvärdet för {{labelName}}."
- },
- "query-builder-hints": {
- "hint-details": "tips: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Builder",
- "label-code": "Kod"
- }
- },
- "query-pattern": {
- "apply-query": "Tillämpa fråga",
- "aria-label-apply-query-starter-button": "knapp för att tillämpa förvald fråga",
- "aria-label-back-button": "bakåtknapp",
- "aria-label-create-new-query-button": "knapp för att skapa ny fråga",
- "aria-label-raw-query": "{{patternName}} rå fråga",
- "aria-label-use-this-query-button": "använd denna frågeknapp",
- "back": "Tillbaka",
- "create-new-query": "Skapa ny fråga",
- "use-this-query": "Använd denna fråga"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "stäng dialogrutan för snabbstart för frågor",
- "aria-label-kick-start-your-query-modal": "Kickstarta din frågemodal",
- "aria-label-toggle-query-starter": "öppna och stäng {{patternType}}-frågestartarkortet",
- "close": "Stäng",
- "description-kick-start-your-query": "Snabbstarta din fråga genom att välja en av dessa frågor. Du kan sedan fortsätta att färdigställa din fråga.",
- "label-toggle-query-starter": "{{patternType}}-frågestartare",
- "title-kick-start-your-query": "Kickstarta din fråga"
- },
- "raw-query": {
- "aria-label-selector": "väljare"
- },
- "results-table": {
- "content-descriptive-type": "När du skapar en {{descriptiveType}} visar Prometheus flera dataserier av typen räknare. ",
- "description": "Beskrivning",
- "message-expand-label-filters": "Inga mätvärden hittades. Försök att utöka dina etikettfilter.",
- "message-expand-search": "Inga mätvärden hittades. Försök att utöka din sökning och dina filter.",
- "message-no-metrics-found": "Inga mätvärden hittades i datakällan.",
- "name": "Namn",
- "type": "Typ"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/tr-TR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/tr-TR/grafana-prometheus.json
deleted file mode 100644
index 45dce785d8e..00000000000
--- a/packages/grafana-prometheus/src/locales/tr-TR/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "Ek açıklama verisi yükleme hatası!",
- "aria-label-lower-limit-parameter": "Adım parametresi için alt sınırı ayarlayın",
- "label-min-step": "Min. adım",
- "label-series-value-as-timestamp": "Zaman damgası olarak seri değeri",
- "label-tags": "Etiketler",
- "label-text": "Metin",
- "label-title": "Başlık",
- "placeholder-auto": "otomatik",
- "tooltip-either-pattern-example-instance-replaced-label": "Adı ya da bir deseni kullanın. Örneğin {{labelTemplate}}, {{labelName}} etiketinin değeriyle değiştirilir.",
- "tooltip-min-step": "Prometheus sorgusunun step (adım) parametresi ve <2>{{intervalVar}}2> ile <4>{{rateIntervalVar}}4> değişkenleri için ek bir alt sınırdır.",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Zaman damgasının birimi milisaniyedir. Seri değeri saniye cinsindense aralık vektörünü 1000 ile çarpın."
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "Anlık (Instant) ve Aralık (Range) sorgusu çalıştırın"
- },
- "label": {
- "both": "Her ikisi de"
- },
- "range-options": {
- "description": {
- "query-range": "Sorguyu belirli bir zaman aralığında çalıştırın"
- },
- "label": {
- "instant": "Anlık",
- "range": "Aralık"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "Etiket için ifadeyi filtrele",
- "description-select-labels": "Etiket değerleri seçildikten sonra yalnızca olası etiket kombinasyonları gösterilir.",
- "select-labels-to-search-in": "2. Arama yapılacak etiketleri seçin"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "Metrik için ifadeyi filtrele",
- "aria-label-limit-results-from-series-endpoint": "Seri uç noktasından gelen sonuçları sınırla",
- "description-series-limit": "Sınır, tüm metrikler, etiketler ve değerlere uygulanır. Varsayılan sınırı kullanmak için alanı boş bırakın. Sınırı devre dışı bırakmak ve tüm verileri getirmek için 0 olarak ayarlayın, bu ayar performans sorunlarına yol açabilir.",
- "label-select-metric": "Bir metrik seçildiğinde yalnızca olası etiketler gösterilir. Etiketler, aşağıdaki seri sınırıyla sınırlıdır.",
- "select-a-metric": "1. Bir metrik seçin",
- "series-limit": "Seri sınırı"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL Hızlı Referans"
- },
- "prom-exemplar-field": {
- "exemplars": "Örnekler",
- "tooltip-disable-query": "Örnek içeren sorguyu devre dışı bırak",
- "tooltip-enable-query": "Örnek içeren sorguyu etkinleştir"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus ekstra alanı",
- "aria-label-query-type-field": "Sorgu türü alanı",
- "aria-label-step-field": "Adım alanı",
- "min-step": "Min. adım",
- "query-type": "Sorgu türü",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "Burada zaman birimleri ve yerleşik değişkenler kullanılabilir. Örneğin: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Bir birim belirtilmezse varsayılan: {{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "Bir PromQL sorgusu girin…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "Klasik Sorgu",
- "aria-label-metric-regex": "Metrik düzenli ifadesi",
- "aria-label-metric-selector": "Metrik seçici",
- "aria-label-prometheus-query": "Prometheus Sorgusu",
- "aria-label-query-type": "Sorgu türü",
- "aria-label-series-query": "Seri Sorgusu",
- "label-classic-query": "Klasik Sorgu",
- "label-label": "Etiket",
- "label-metric-regex": "Metrik düzenli ifadesi",
- "label-query": "Sorgu",
- "label-query-type": "Sorgu türü",
- "label-series-query": "Seri Sorgusu",
- "placeholder-classic-query": "Klasik Sorgu",
- "placeholder-metric-regex": "Metrik düzenli ifadesi",
- "placeholder-prometheus-query": "Prometheus Sorgusu",
- "placeholder-select-query-type": "Sorgu türünü seçin",
- "placeholder-series-query": "Seri Sorgusu",
- "returns-metrics-matching-specified-metric-regex": "Belirtilen metrik düzenli ifadesiyle eşleşen metriklerin listesi.",
- "tooltip-classic-query": "Prometheus değişken sorgu düzenleyicisinin orijinal uygulaması. Bu belgelerde açıklanan doğru sorgu türü ve parametrelerle bir dize girin. Örneğin {{exampleQuery}}.",
- "tooltip-label": "Bir metrik belirtilmedikçe tüm metriklerdeki etiket adı için etiket değerlerinin bir listesini döndürür.",
- "tooltip-metric-regex": "Belirtilen metrik düzenli ifadesine göre isteğe bağlı filtreleme yaparak etiket adlarının bir listesini döndürür.",
- "tooltip-query": "Sorgu için Prometheus sorgu sonuçlarının bir listesini döndürür. Bu sorgular Prometheus işlevlerini içerebilir, örneğin {{exampleQuery}}.",
- "tooltip-query-type": "Prometheus veri kaynağı eklentisi, şablon değişkenleri için aşağıdaki sorgu türlerini sağlar.",
- "tooltip-series-query": "Bir metrik ve etiketlerle, yalnızca metrik ya da yalnızca etiketlerle birlikte bir değer girin. Örneğin {{example1}}, {{example2}} veya {{example3}}. Girilen verilerle ilişkili zaman serilerinin bir listesini döndürür."
- },
- "selector-actions": {
- "aria-label-selector": "seçici",
- "aria-label-selector-clear-button": "Seçici temizleme düğmesi",
- "aria-label-use-selector-as-metrics-button": "Seçiciyi metrik olarak kullan düğmesi",
- "aria-label-use-selector-for-query-button": "Sorgu için seçiciyi kullan düğmesi",
- "aria-label-validate-submit-button": "Gönder düğmesini doğrula",
- "clear": "Temizle",
- "resulting-selector": "4. Oluşan seçici",
- "use-as-rate-query": "Oran (rate) sorgusu olarak kullan",
- "use-query": "Sorguyu kullan",
- "validate-selector": "Seçiciyi doğrula"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "Etiket değerleri için ifadeyi filtreleyin",
- "aria-label-values-for": "{{labelKey}} değerleri",
- "description-search-field-values-across-selected-labels": "Seçilen etiketler arasında değer bulmak için arama alanını kullanın.",
- "select-multiple-values-for-your-labels": "3. Etiketleriniz için (birden fazla) değer seçin"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "Kayıt kuralları hedefi olarak seçilmesine izin ver",
- "label-manage-alerts-via-alerting-ui": "Uyarıları, Uyarı Sistemi Arayüzü üzerinden yönetin",
- "title-alerting": "Uyarı sistemi",
- "tooltip-allow-as-recording-rules-target": "Kayıt kuralları yazmak için bu veri kaynağının hedef olarak seçilmesine izin verin.",
- "tooltip-manage-alerts-via-alerting-ui": "Bu veri kaynağı için uyarı kurallarını yönetin. Diğer Alerting kaynaklarını yönetmek için bir Alertmanager veri kaynağı ekleyin."
- },
- "config-editor": {
- "browser-access-mode-error": "Prometheus veri kaynağında tarayıcı erişim modu artık kullanılamamaktadır. Sunucu erişim moduna geçin.",
- "description-advanced-settings": "Ek ayarlar, veri kaynağınız üzerinde daha fazla kontrol sağlamak için yapılandırılabilen isteğe bağlı ayarlardır.",
- "title-advanced-settings": "Gelişmiş ayarlar",
- "title-error": "Hata"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "Erişim yönteminizin <1>Browser1> olması, URL'nin tarayıcıdan erişilebilir olması gerektiği anlamına gelir.",
- "tooltip-http-url": "Tam bir HTTP URL'si belirtin (örneğin {{exampleURL}})",
- "tooltip-server-access-mode": "Erişim yönteminizin <1>Server1> olması URL'nin Grafana arka uç/sunucusundan erişilebilir olması gerektiği anlamına gelir."
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "Daha fazla ayrıntı için belgelere göz atın."
- },
- "exemplar-setting": {
- "label-data-source": "Veri kaynağı",
- "label-internal-link": "Dâhilî bağlantı",
- "label-label-name": "Etiket adı",
- "label-remove-exemplar-link": "Örnek bağlantıyı kaldır",
- "label-url": "URL",
- "label-url-label": "URL Etiketi",
- "placeholder-go-to-examplecom": "example.com adresine gidin",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "izleme kimliği",
- "title-remove-exemplar-link": "Örnek bağlantıyı kaldır",
- "tooltip-data-source": "Örneğin yönlendireceği veri kaynağı.",
- "tooltip-internal-link": "Dâhilî bir bağlantınız varsa bu seçeneği etkinleştirin. Etkinleştirildiğinde veri kaynağı seçici görünür hâle gelir. Örnek veriniz için arka uç izleme veri deposunu seçin.",
- "tooltip-label-name": "İzleme kimliğimi almak için kullanılacak etiketler nesnesindeki alanın adı.",
- "tooltip-url": "Kullanıcının izlemeyi görebileceği izleme arka ucunun URL'si",
- "tooltip-url-label": "Örnek izleme kimliği alanındaki düğme etiketini geçersiz kılmak için kullanılır."
- },
- "exemplars-settings": {
- "add": "Ekle",
- "no-exemplars-configurations": "Örnek yapılandırma yok",
- "title-exemplars": "Örnekler"
- },
- "prom-settings": {
- "aria-label-default-editor": "Varsayılan Düzenleyici (Kod veya Oluşturucu)",
- "aria-label-prom-type-type": "{{promType}} tür",
- "aria-label-prometheus-type": "Prometheus türü",
- "aria-label-select-http-method": "HTTP yöntemini seçin",
- "editor-options": {
- "label-builder": "Oluşturucu",
- "label-code": "Kod"
- },
- "label-cache-level": "Önbellek seviyesi",
- "label-custom-query-parameters": "Özel sorgu parametreleri",
- "label-default-editor": "Varsayılan düzenleyici",
- "label-disable-metrics-lookup": "Metrik aramayı devre dışı bırak",
- "label-disable-recording-rules-beta": "Kayıt kurallarını devre dışı bırak (beta)",
- "label-http-method": "HTTP yöntemi",
- "label-incremental-querying-beta": "Artımlı sorgulama (beta)",
- "label-prom-type-version": "{{promType}} sürümü",
- "label-prometheus-type": "Prometheus türü",
- "label-query-overlap-window": "Sorgu çakışma penceresi",
- "label-query-timeout": "Sorgu zaman aşımı",
- "label-scrape-interval": "Kazıma aralığı",
- "label-series-limit": "Seri sınırı",
- "label-use-series-endpoint": "Seri uç noktasını kullan",
- "more-info": "Prometheus türü ve sürümünü veri kaynaklarında yapılandırma hakkında daha fazla bilgi için <2>sağlama belgelerine2> bakın.",
- "placeholder-example-maxsourceresolutionmtimeout": "Örnek: {{example}}",
- "title-interval-behaviour": "Aralık davranışı",
- "title-other": "Diğer",
- "title-performance": "Performans",
- "title-query-editor": "Sorgu düzenleyicisi",
- "tooltip-cache-level": "Düzenleyici sorguları için tarayıcı önbelleğe alma düzeyini ayarlar. Yüksek ayırt ediciliğe sahip veri kaynakları için daha yüksek önbellek ayarları önerilir.",
- "tooltip-custom-query-parameters": "Prometheus sorgu URL'sine özel parametreler ekleyin. Örneğin {{example1}}, {{example2}}, {{example3}} veya {{example4}}. Birden fazla parametre, {{concatenationChar}} karakteri ile birleştirilmelidir.",
- "tooltip-default-editor": "Bu veri kaynağının tüm kullanıcıları için varsayılan düzenleyici seçeneğini ayarlayın.",
- "tooltip-disable-metrics-lookup": "Bu seçeneği işaretlemek, metrik seçicisini ve sorgu alanındaki metrik/etiket desteğini otomatik tamamlama özelliğinde devre dışı bırakır. Bu, büyük Prometheus örneklerinde yaşanan performans sorunlarına yardımcı olabilir. ",
- "tooltip-disable-recording-rules-beta": "Bu özellik, kayıt kurallarını devre dışı bırakacaktır. Pano performansını artırmak için bu seçeneği etkinleştirin",
- "tooltip-http-method": "Prometheus veri kaynağınızı sorgulamak için POST veya GET HTTP yöntemini kullanabilirsiniz. POST, daha büyük sorgulara izin verdiği için önerilen yöntemdir. Prometheus sürümünüz 2.1'den eskiyse ya da ağınızda POST istekleri kısıtlıysa bunu GET olarak değiştirin.",
- "tooltip-incremental-querying-beta": "Bu özellik, göreli sorguların varsayılan davranışını değiştirerek Prometheus örneğinden her zaman güncel veri istenmesini sağlar. Bunun yerine, sorgu sonuçları önbelleğe alınır ve yalnızca yeni kayıtlar istenir. Veri tabanı ve ağ yükünü azaltmak için bu özelliği etkinleştirin.",
- "tooltip-prom-type-version": "{{promType}} örneğinizin sürümü otomatik olarak yapılandırılmamışsa bunu burada ayarlayın.",
- "tooltip-prometheus-type": "Veri tabanınızın türünü burada belirtin, örneğin: Prometheus, Cortex, Mimir veya Thanos. Bu alanı değiştirdiğinizde mevcut ayarlarınız kaydedilecektir. Bazı Prometheus türleri çeşitli API'leri destekler veya desteklemez. Örneğin bazı türler, etiket sorgularında performansı artırmak için düzenli ifade eşlemesini destekler. Bazı türlerin meta veriler için bir API'si vardır. Bu ayarı yanlış yaparsanız metrik ve etiket sorgularında beklenmedik davranışlarla karşılaşabilirsiniz. Lütfen doğru türü girdiğinizden emin olmak için Prometheus belgelerinizi kontrol edin.",
- "tooltip-query-overlap-window": "Süreyi {{example1}}, {{example2}} veya {{example3}} biçiminde ayarlayın. Varsayılan ayar {{default}}. Bu süre, her artımlı isteğin süresine eklenecektir.",
- "tooltip-query-timeout": "Prometheus sorgu zaman aşımını ayarlayın.",
- "tooltip-scrape-interval": "Bu aralık, Prometheus'un hedefleri ne sıklıkla sorguladığını belirtir. Bunu, Prometheus yapılandırma dosyanızda tanımlanan tipik sorgulama ve değerlendirme aralığına göre ayarlayın. Bu değeri Prometheus yapılandırma dosyasındaki aralıktan daha büyük ayarlarsanız Grafana verileri bu aralığa göre değerlendirir ve daha az veri noktası görürsünüz. Varsayılan ayar {{default}}.",
- "tooltip-series-limit": "Sınır, her iki uç nokta (seri ve etiketler) için tüm kaynaklara (metrikler, etiketler ve değerler) uygulanır. Bu alanı boş bırakırsanız varsayılan sınır olan 40000 kullanılır. Sınırı devre dışı bırakmak ve tüm verileri getirmek için 0 olarak ayarlayın; bu ayar performans sorunlarına yol açabilir. Varsayılan sınır 40000'dir.",
- "tooltip-use-series-endpoint": "Bu seçeneği işaretlemek, {{exampleParameter}} parametresine sahip seri uç noktasını, {{exampleParameter}} parametresine sahip etiket değerleri uç noktası yerine tercih eder. Etiket değerleri uç noktası genellikle daha yüksek performanslı kabul edilirken, bazı kullanıcılar seri uç noktasını tercih edebilir çünkü bu uç nokta POST yöntemini desteklerken etiket değerleri yalnızca GET yöntemini destekler."
- }
- },
- "metrics-browser": {
- "disabled-label": "(Devre dışı)",
- "enabled-label": "Metrik tarayıcı"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "Yalnızca benzersiz etiketleri içerir",
- "description-custom": "Bir adlandırma şablonu sağlayın",
- "description-verbose": "Tüm etiket adları ve değerleri",
- "label-auto": "Otomatik",
- "label-custom": "Özel",
- "label-verbose": "Ayrıntılı"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "Boyutlar üzerinden ortalamayı hesaplayın",
- "documentation-bottomk": "Örnek değere göre en küçük k ögeleri",
- "documentation-count": "Vektördeki öge sayısını say",
- "documentation-count-values": "Aynı değere sahip ögelerin sayısını say",
- "documentation-group": "Ortaya çıkan vektördeki tüm değerler 1'dir",
- "documentation-max": "Boyutlar üzerinden maksimumu seçin",
- "documentation-min": "Boyutlar üzerinden minimumu seçin",
- "documentation-quantile": "Boyutlar üzerinden φ-kuantili (0 ≤ φ ≤ 1) hesaplayın",
- "documentation-stddev": "Boyutlar üzerinden popülasyon standart sapmasını hesaplayın",
- "documentation-stdvar": "Boyutlar üzerinden popülasyon standart varyansını hesaplayın",
- "documentation-sum": "Boyutlar üzerinden toplamı hesaplayın",
- "documentation-topk": "Örnek değere göre en büyük k ögeleri"
- },
- "getFunctions": {
- "documentation-abs": "Tüm örnek değerleri mutlak değerlerine dönüştürülmüş girdi vektörünü verir.",
- "documentation-absent": "Kendisine geçirilen vektörün herhangi bir ögesi varsa boş bir vektör ve kendisine geçirilen vektörün hiçbir ögesi yoksa değeri 1 olan 1 ögeli bir vektör verir. Bu, belirli bir metrik adı ve etiket kombinasyonu için zaman serisi olmadığında uyarı vermek için kullanışlıdır.",
- "documentation-absent-over-time": "Kendisine geçirilen aralık vektörünün herhangi bir ögesi varsa boş bir vektör ve kendisine geçirilen aralık vektörünün hiçbir ögesi yoksa değeri 1 olan 1 ögeli bir vektör verir.",
- "documentation-avg-over-time": "Belirtilen aralıktaki tüm noktaların ortalama değeri.",
- "documentation-ceil": "`v` içindeki tüm ögelerin örnek değerlerini bir üst tam sayıya yuvarlar.",
- "documentation-changes": "Her bir girdi zaman serisi için `changes(v range-vector)`, değerinin belirtilen zaman aralığında anlık bir vektör olarak kaç kez değiştiğini verir.",
- "documentation-clamp": "`v` içindeki tüm ögelerin örnek değerlerini `min` alt sınırına ve `max` üst sınırına sahip olacak şekilde sabitler.",
- "documentation-clamp-max": "`v` içindeki tüm ögelerin örnek değerlerini `max` üst sınırına sahip olacak şekilde sabitler.",
- "documentation-clamp-min": "`v` içindeki tüm ögelerin örnek değerlerini `min` alt sınırına sahip olacak şekilde sabitler.",
- "documentation-count-over-time": "Belirtilen aralıktaki tüm değerlerin sayısı.",
- "documentation-count-scalar": "Bir zaman serisi vektöründeki ögelerin sayısını bir skaler olarak verir. Bu, her zaman bir vektör (giriş vektörü boşsa boş bir vektör) döndüren ve bir `by` maddesi aracılığıyla etiketlere göre gruplandırmaya izin veren `count()` toplama operatörünün tersidir.",
- "documentation-day-of-month": "UTC'de verilen saatlerin her biri için ayın gününü verir. Döndürülen değerler 1 ile 31 arasındadır.",
- "documentation-day-of-week": "UTC'de verilen saatlerin her biri için haftanın gününü verir. Döndürülen değerler 0 ile 6 arasındadır, burada 0 Pazar vb. anlamına gelir.",
- "documentation-day-of-year": "UTC'de verilen saatlerin her biri için yılın gününü verir. Döndürülen değerler, artık olmayan yıllar için 1 ile 365, artık yıllarda 1 ile 366 arasındadır.",
- "documentation-days-in-month": "UTC'de verilen saatlerin her biri için ay içindeki gün sayısını verir. Döndürülen değerler 28 ile 31 arasındadır.",
- "documentation-deg": "v içindeki tüm ögeler için radyanları dereceye dönüştürür",
- "documentation-delta": "Bir `v` aralık vektöründeki her bir zaman serisi ögesinin ilk ve son değeri arasındaki farkı hesaplar ve verilen deltalar ve eşdeğer etiketlerle bir anlık vektör verir. Delta, aralık vektör seçicisinde belirtildiği gibi tam zaman aralığını kapsayacak şekilde tahmin edilir, böylece örnek değerlerin tümü tam sayı olsa bile tam sayı olmayan bir sonuç elde etmek mümkün olur.",
- "documentation-deriv": "Basit doğrusal regresyon kullanarak bir `v` aralık vektöründeki zaman serisinin saniye başına türevini hesaplar.",
- "documentation-double-exponential-smoothing": "`v` içindeki aralığa dayalı olarak zaman serileri için düzeltilmiş bir değer üretir. Düzeltme faktörü `sf` ne kadar düşükse eski verilere o kadar fazla önem verilir. Eğilim faktörü `tf` ne kadar yüksekse verilerdeki eğilimler o kadar fazla dikkate alınır. Hem `sf` hem de `tf` 0 ile 1 arasında olmalıdır.",
- "documentation-drop-common-labels": "Girdi vektöründeki tüm serilerde aynı ada ve değere sahip tüm etiketleri bırakır.",
- "documentation-exp": "`v` içindeki tüm ögeler için üstel fonksiyonu hesaplar.\nÖzel durumlar şunlardır:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`",
- "documentation-floor": "`v` içindeki tüm ögelerin örnek değerlerini bir üst tam sayıya yuvarlar.",
- "documentation-histogram-avg": "Yerel bir histogramda saklanan gözlemlenen değerlerin aritmetik ortalamasını verir. Yerel histogram olmayan örnekler yok sayılır ve döndürülen vektörde görünmez.",
- "documentation-histogram-count": "Yerel bir histogramda saklanan gözlemlerin sayısını verir.",
- "documentation-histogram-fraction": "Sağlanan alt ve üst değerler arasındaki gözlemlerin tahminî kısmını verir.",
- "documentation-histogram-quantile": "Bir histogramın `b` demetlerinden φ-kuantili (0 ≤ φ ≤ 1) hesaplar. `b` içindeki örnekler, her demetteki gözlemlerin sayısıdır. Her örnek, etiket değerinin demetin kapsayıcı üst sınırını belirttiği bir `le` etiketine sahip olmalıdır. (Böyle bir etiketi olmayan örnekler sessizce göz ardı edilir.) Histogram metrik türü, otomatik olarak zaman serilerine `_bucket` son eki ve uygun etiketler sağlar.",
- "documentation-histogram-stddev": "Gözlemlerin bulunduğu demetlerin geometrik ortalamasına dayalı olarak yerel bir histogramdaki gözlemlerin tahminî standart sapmasını verir.",
- "documentation-histogram-stdvar": "Yerel bir histogramdaki gözlemlerin tahminî standart varyansını verir.",
- "documentation-histogram-sum": "Yerel bir histogramda saklanan gözlemlerin toplamını verir.",
- "documentation-holt-winters": "Prometheus v3.x'te double_exponential_smoothing olarak yeniden adlandırıldı. v3.0'a eşit ve daha büyük prometheus sürümleri için lütfen double_exponential_smoothing kullanın.\n\n`v` içindeki aralığa dayalı olarak zaman serileri için düzeltilmiş bir değer üretir. Düzeltme faktörü `sf` ne kadar düşükse eski verilere o kadar fazla önem verilir. Eğilim faktörü `tf` ne kadar yüksekse verilerdeki eğilimler o kadar fazla dikkate alınır. Hem `sf` hem de `tf` 0 ile 1 arasında olmalıdır.",
- "documentation-hour": "UTC'de verilen saatlerin her biri için günün saatini verir. Verilen değerler 0 ile 23 arasındadır.",
- "documentation-idelta": "`v` aralık vektöründeki son iki örnek arasındaki farkı hesaplar ve verilen deltalar ve eşdeğer etiketlerle bir anlık vektör verir.",
- "documentation-increase": "Aralık vektöründeki zaman serilerindeki artışı hesaplar. Tekdüzelikteki kesintiler (hedef yeniden başlatmalar nedeniyle sayaç sıfırlamaları gibi) için otomatik olarak ayarlanır. Artış, aralık vektör seçicisinde belirtildiği gibi tam zaman aralığını kapsayacak şekilde tahmin edilir, böylece bir sayaç yalnızca tam sayı artışlarıyla artsa bile tam sayı olmayan bir sonuç elde etmek mümkün olur.",
- "documentation-info": "Herhangi bir hesaplama yapmadan, bir metrik grubu hakkında etiketleri ve mevcut değerleri gibi en son ayrıntıları ve meta verileri döndürür",
- "documentation-irate": "Aralık vektöründeki zaman serisinin saniye başına anlık artış oranını hesaplar. Bu, son iki veri noktasına dayanır. Tekdüzelikteki kesintiler (hedef yeniden başlatmalar nedeniyle sayaç sıfırlamaları gibi) için otomatik olarak ayarlanır.",
- "documentation-label-join": "`v` içindeki her bir zaman serisi için, `separator`kullanarak tüm `src_labels` değerlerini birleştirir ve birleştirilen değeri içeren `dst_label` etiketine sahip zaman serisini döndürür. Bu fonksiyonda herhangi bir sayıda `src_labels` olabilir.",
- "documentation-label-replace": "`v` içindeki her zaman serisi için, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)` `regex` düzenli ifadesini `src_label` etiketine karşı eşleştirir. Zaman serisi eşleşirse, `replacement` genişlemesi ile değiştirilen `dst_label` etiketiyle döndürülür. `$1`, eşleşen ilk alt grup ile, `$2` ikinci alt grup ile değiştirilir. Düzenli ifade eşleşmezse zaman serisi değişmeden döndürülür.",
- "documentation-last-over-time": "Belirtilen aralıktaki en son nokta değeri.",
- "documentation-ln": "`v`içindeki tüm ögeler için doğal logaritmayı hesaplar.\nÖzel durumlar şunlardır:\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`",
- "documentation-log10": "`v` içindeki tüm ögeler için ondalık logaritmayı hesaplar. Özel durumlar `ln` içindeki durumlara eşdeğerdir.",
- "documentation-log2": "`v` içindeki tüm ögeler için ikili logaritmayı hesaplar. Özel durumlar `ln` içindeki durumlara eşdeğerdir.",
- "documentation-max-over-time": "Belirtilen aralıktaki tüm noktaların maksimum değeri.",
- "documentation-min-over-time": "Belirtilen aralıktaki tüm noktaların minimum değeri.",
- "documentation-minute": "UTC'de verilen saatlerin her biri için saatin dakikasını verir. Verilen değerler 0 ile 59 arasındadır.",
- "documentation-month": "UTC'de verilen saatlerin her biri için yılın ayını verir. Verilen değerler 1 ile 12 arasındadır, burada 1 rakamı Ocak vb. anlamına gelir.",
- "documentation-pi": "Pi değerini verir",
- "documentation-predict-linear": "Basit doğrusal regresyon kullanarak, `v` aralık vektörüne dayalı olarak şu andan itibaren `t` saniyelik zaman serisinin değerini tahmin eder.",
- "documentation-present-over-time": "Belirtilen aralıktaki herhangi bir seri için 1 değeri.",
- "documentation-quantile-over-time": "Belirtilen aralıktaki değerlerin φ-kuantili (0 ≤ φ ≤ 1).",
- "documentation-rad": "v içindeki tüm ögeler için dereceleri radyana dönüştürür",
- "documentation-rate": "Aralık vektöründeki zaman serisinin saniye başına ortalama artış oranını hesaplar. Tekdüzelikteki kesintiler (hedef yeniden başlatmalar nedeniyle sayaç sıfırlamaları gibi) için otomatik olarak ayarlanır. Ayrıca hesaplama, zaman aralığının uçlarına dış değerleme yaparak kaçırılan kazımalar veya kazıma döngülerinin aralığın zaman periyodu ile kusurlu hizalanmasına izin verir.",
- "documentation-resets": "Her bir girdi zaman serisi için `resets(v range-vector)`, belirtilen zaman aralığındaki sayaç sıfırlama sayısını anlık bir vektör olarak verir. Ardışık iki örnek arasındaki değerdeki herhangi bir düşüş, sayaç sıfırlaması olarak yorumlanır.",
- "documentation-round": "`v` içindeki tüm ögelerin örnek değerlerini en yakın tam sayıya yuvarlar. Eşitlikler yukarı yönde yuvarlanarak çözülür. İsteğe bağlı `to_nearest` bağımsız değişkeni, örnek değerlerin yuvarlanması gereken en yakın katın belirlenmesini sağlar. Bu kat bir kesir de olabilir.",
- "documentation-scalar": "Tek ögeli bir girdi vektörü verildiğinde, `scalar(v instant-vector)` bu tek ögenin örnek değerini bir skaler olarak verir. Girdi vektörünün tam olarak bir ögesi yoksa `scalar`, `NaN` verir.",
- "documentation-sgn": "Tüm örnek değerleri işaretlerine dönüştürülmüş bir vektör verir, şu şekilde tanımlanır: v pozitifse 1, v negatifse -1 ve v sıfıra eşitse 0.",
- "documentation-sort": "Örnek değerlerine göre artan sırada sıralanmış vektör ögelerini verir.",
- "documentation-sort-desc": "Örnek değerlerine göre azalan sırada sıralanmış vektör ögelerini verir.",
- "documentation-sqrt": "`v` içindeki tüm ögelerin karekökünü hesaplar.",
- "documentation-stddev-over-time": "Belirtilen aralıktaki değerlerin popülasyon standart sapması.",
- "documentation-stdvar-over-time": "Belirtilen aralıktaki değerlerin popülasyon standart varyansı.",
- "documentation-sum-over-time": "Belirtilen aralıktaki tüm değerlerin toplamı.",
- "documentation-time": "1 Ocak 1970 UTC'den bu yana geçen saniye sayısını verir. Bunun aslında geçerli zamanı değil, ifadenin değerlendirileceği zamanı verdiğini unutmayın.",
- "documentation-timestamp": "Verilen vektörün her bir örneğinin zaman damgasını 1 Ocak 1970 UTC'den bu yana geçen saniye sayısı olarak verir.",
- "documentation-vector": "Skalerleri etiketsiz bir vektör olarak verir.",
- "documentation-year": "UTC'de verilen saatlerin her biri için yılı verir."
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "{{argument}} içindeki tüm ögelerin ark kosinüsünü hesaplar",
- "documentation-acosh": "{{argument}} içindeki tüm ögelerin ters hiperbolik kosinüsünü hesaplar",
- "documentation-asin": "{{argument}} içindeki tüm ögelerin ark sinüsünü hesaplar",
- "documentation-asinh": "{{argument}} içindeki tüm ögelerin ters hiperbolik sinüsünü hesaplar",
- "documentation-atan": "{{argument}} içindeki tüm ögelerin ark tanjantını hesaplar",
- "documentation-atanh": "{{argument}} içindeki tüm ögelerin ters hiperbolik tanjantını hesaplar",
- "documentation-cos": "{{argument}} içindeki tüm ögelerin kosinüsünü hesaplar",
- "documentation-cosh": "{{argument}} içindeki tüm ögelerin hiperbolik kosinüsünü hesaplar",
- "documentation-sin": "{{argument}} içindeki tüm ögelerin sinüsünü hesaplar",
- "documentation-sinh": "{{argument}} içindeki tüm ögelerin hiperbolik sinüsünü hesaplar",
- "documentation-tan": "{{argument}} içindeki tüm ögelerin tanjantını hesaplar",
- "documentation-tanh": "{{argument}} içindeki tüm ögelerin hiperbolik tanjantını hesaplar"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "Geri bildirim gönder",
- "title-give-feedback": "Metrik gezgini yeni olduğundan lütfen gelişime açık alanlarını bize bildirin"
- },
- "get-collapsed-info": {
- "exemplars": "Örnekler: {{value}}",
- "format": "Biçim: {{value}}",
- "legend": "Gösterge: {{value}}",
- "step": "Adım: {{value}}",
- "type": "Tür: {{value}}"
- },
- "get-placeholders": {
- "browse": "Metrikleri ada göre ara",
- "type": "Türe göre filtrele"
- },
- "get-prom-types": {
- "description-counter": "Değeri yalnızca yeniden başlatıldığında artabilen veya sıfırlanabilen tek bir monoton artan sayacı temsil eden kümülatif bir metrik.",
- "description-gauge": "İsteğe bağlı olarak yukarı ve aşağı gidebilen tek bir sayısal değeri temsil eden bir metrik.",
- "description-histogram": "Bir histogram, gözlemleri örnekler (genellikle istek süreleri veya yanıt boyutları gibi) ve bunları yapılandırılabilir demetlerde sayar.",
- "description-native-histogram": "Yerel histogramlar, klasik Prometheus histogramlarından çeşitli şekillerde farklıdır: Yerel histogram küme sınırları, yerel histogramın ölçeğine (çözünürlüğüne) bağlı olan ve kullanıcı tarafından tanımlanmayan bir formülle hesaplanır.",
- "description-no-type": "Bu metriklerin meta verilerde tanımlanmış bir türü yoktur.",
- "description-summary": "Bir özet, gözlemleri örnekler (genellikle istek süreleri ve yanıt boyutları gibi) ve kayan bir zaman aralığında yapılandırılabilir nicelikleri hesaplayabilir.",
- "description-unknown": "Bu metrikler, meta verilerde bilinmeyen tür olarak verilmiştir.",
- "label-counter": "Sayaç",
- "label-gauge": "Gösterge",
- "label-histogram": "Histogram",
- "label-native-histogram": "Yerel histogram",
- "label-no-type": "Tür yok",
- "label-summary": "Özet",
- "label-unknown": "Bilinmeyen"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "Sorgu ayrıştırma belirsiz."
- }
- },
- "label-filter-item": {
- "aria-label-remove": "{{name}} ögesini kaldır",
- "placeholder-select-label": "Etiket seçin",
- "placeholder-select-value": "Değer seçin"
- },
- "label-filters": {
- "label-filters": "Etiket filtreleri",
- "label-label-filters": "Etiket filtreleri",
- "tooltip-label-filters": "İsteğe bağlı: Bu sorgu türü için metrik seçimini filtrelemek amacıyla kullanılır."
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "Etiketler yükleniyor",
- "noOptionsMessage-no-labels-found": "Etiket bulunamadı"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "Metrik gezginini aç",
- "placeholder-select-metric": "Metrik seçin",
- "tooltip-open-metrics-explorer": "Metrik gezginini aç"
- },
- "label-metric": "Metrik",
- "tooltip-metric": "İsteğe bağlı: Belirtilen metrikteki etiket adı için etiket değerlerinin bir listesini döndürür."
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "Metrikleri gözden geçir",
- "currently-selected": "Şu anda seçili olan: {{selected}}",
- "metrics-pre-filtered": "Bu metrikler, etiket filtrelerinde seçilen etiketlere göre önceden filtrelenmiştir.",
- "title-metrics-explorer": "Metrik gezgini"
- },
- "nested-query": {
- "label": {
- "ignoring": "Yok sayılıyor",
- "on": "Açık"
- },
- "operator": "İşleç",
- "tooltip-remove-match": "Eşleşmeyi kaldır",
- "vector-matches": "Vektör eşleşmeleri"
- },
- "operation-editor": {
- "not-found": "{{id}} işlemi bulunamadı",
- "title-remove": "{{name}} ögesini kaldır"
- },
- "operation-header": {
- "placeholder-replace-with": "Bununla değiştir:",
- "title-click-to-view-alternative-operations": "Alternatif işlemleri görüntülemek için tıklayın",
- "title-remove-operation": "İşlemi kaldır"
- },
- "operation-info-button": {
- "title-click-to-show-description": "Açıklamayı görüntülemek için tıklayın",
- "title-remove-operation": "İşlemi kaldır"
- },
- "operation-list": {
- "operations": "İşlemler",
- "placeholder-search": "Ara",
- "title-add-operation": "İşlem ekle"
- },
- "operation-param-editor": {
- "title-add": "{{name}} ekle",
- "title-remove": "{{name}} ögesini kaldır"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "{{labelWord}} {{labels}} korunurken boyutlar üzerinden {{aggregationName}} hesaplar.",
- "label-default": "Boyutlar üzerinden {{aggregationName}} hesaplar.",
- "label-without": "{{labels}} boyutları üzerinden {{aggregationName}} hesaplar. Diğer tüm etiketler korunur."
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "Exemplar (ilişkili örnek) düğmesi.",
- "aria-label-format": "Biçim birleşik giriş kutusu",
- "aria-label-lower-limit-parameter": "Minimum adım metin kutusu, step parametresi için alt sınır belirler",
- "aria-label-select-resolution": "Çözüm seçin",
- "aria-label-type": "Tür radyo düğmesi grubu",
- "format-options": {
- "label-heatmap": "Isı Haritası",
- "label-table": "Tablo",
- "label-time-series": "Zaman serileri"
- },
- "label-exemplars": "Örnekler",
- "label-format": "Biçim",
- "label-min-step": "Min. adım",
- "label-resolution": "Çözünürlük",
- "label-type": "Tür",
- "placeholder-auto": "otomatik",
- "title-options": "Seçenekler",
- "tooltip-min-step": "Prometheus sorgusunun step (adım) parametresi ve <2>{{interval}}2> ile <4>{{rateInterval}}4> değişkenleri için ek bir alt sınırdır."
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "Bir söz dizimi hatası var veya oluşturucu moduna geçerken sorgu yapısı görselleştirilemiyor. Sorgunun bazı kısımları kaybolabilir.",
- "confirmText-continue": "Devam et",
- "kick-start-your-query": "Sorgunuzu hızlı başlatın",
- "label-explain": "Açıkla",
- "run-queries": "Sorguları çalıştır",
- "title-parsing-error-switch-builder": "Ayrıştırma hatası: Oluşturucu moduna geçilsin mi?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "Gösterge birleşik giriş kutusu",
- "label-legend": "Gösterge",
- "placeholder-select-legend-mode": "Gösterge modunu seçin",
- "tooltip-legend": "Seri adı geçersiz kılma veya şablon. Ör: {{templateExample}}, {{labelName}} etiketinin değeriyle değiştirilecektir."
- },
- "query-builder-hints": {
- "hint-details": "ipucu: {{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "Oluşturucu",
- "label-code": "Kod"
- }
- },
- "query-pattern": {
- "apply-query": "Sorguyu uygula",
- "aria-label-apply-query-starter-button": "sorguyu uygula başlatma düğmesi",
- "aria-label-back-button": "geri düğmesi",
- "aria-label-create-new-query-button": "yeni sorgu oluştur düğmesi",
- "aria-label-raw-query": "{{patternName}} ham sorgusu",
- "aria-label-use-this-query-button": "bu sorgu düğmesini kullanın",
- "back": "Geri",
- "create-new-query": "Yeni sorgu oluştur",
- "use-this-query": "Bu sorguyu kullanın"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "sorgunuzu hızlı başlatma modülünü kapat",
- "aria-label-kick-start-your-query-modal": "Sorgu modülünüzü hızlı başlatın",
- "aria-label-toggle-query-starter": "{{patternType}} sorgu başlatıcı kartını aç ve kapat",
- "close": "Kapat",
- "description-kick-start-your-query": "Bu sorgulardan birini seçerek sorgunuzu hızlı başlatın. Ardından sorgunuzu tamamlamaya devam edebilirsiniz.",
- "label-toggle-query-starter": "{{patternType}} sorgu başlatıcıları",
- "title-kick-start-your-query": "Sorgunuzu hızlı başlatın"
- },
- "raw-query": {
- "aria-label-selector": "seçici"
- },
- "results-table": {
- "content-descriptive-type": "Bir {{descriptiveType}} oluşturulduğunda, Prometheus sayaç türünde birden fazla seri sunar. ",
- "description": "Açıklama",
- "message-expand-label-filters": "Metrik bulunamadı. Etiket filtrelerinizi genişletmeyi deneyin.",
- "message-expand-search": "Metrik bulunamadı. Aramanızı ve filtrelerinizi genişletmeyi deneyin.",
- "message-no-metrics-found": "Veri kaynağında metrik bulunamadı.",
- "name": "Ad",
- "type": "Tür"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/zh-Hans/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/zh-Hans/grafana-prometheus.json
deleted file mode 100644
index f3713863495..00000000000
--- a/packages/grafana-prometheus/src/locales/zh-Hans/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "注释数据加载错误!",
- "aria-label-lower-limit-parameter": "设置步长参数的下限",
- "label-min-step": "最小步长",
- "label-series-value-as-timestamp": "作为时间戳的序列值",
- "label-tags": "标签",
- "label-text": "文本",
- "label-title": "标题",
- "placeholder-auto": "自动",
- "tooltip-either-pattern-example-instance-replaced-label": "使用名称或模式。例如,{{labelTemplate}}将替换为标签{{labelName}}的标签值。",
- "tooltip-min-step": "Prometheus 查询的步长参数以及 <2>{{intervalVar}}2> 和 <4>{{rateIntervalVar}}4> 变量的附加下限。",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "时间戳的单位是毫秒。如果序列值的单位为秒,则将其范围向量乘以 1000。"
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "运行即时查询和范围查询"
- },
- "label": {
- "both": "两个都"
- },
- "range-options": {
- "description": {
- "query-range": "针对时间范围运行查询"
- },
- "label": {
- "instant": "即时",
- "range": "范围"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "筛选标签表达式",
- "description-select-labels": "选择标签值后,仅显示可能的标签组合。",
- "select-labels-to-search-in": "2. 选择要搜索的标签"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "筛选指标表达式",
- "aria-label-limit-results-from-series-endpoint": "限制来自序列端点的结果",
- "description-series-limit": "该限制适用于所有指标、标签和值。若将字段留空,则使用默认限制。设置为 0 以禁用限制并获取所有内容,但这可能会导致性能问题。",
- "label-select-metric": "选择指标后,仅显示可能的标签。标签受以下序列限制的约束。",
- "select-a-metric": "1. 选择指标",
- "series-limit": "序列限制"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL 速查表"
- },
- "prom-exemplar-field": {
- "exemplars": "范例",
- "tooltip-disable-query": "禁用带有范例的查询",
- "tooltip-enable-query": "启用带有范例的查询"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus 额外字段",
- "aria-label-query-type-field": "查询类型字段",
- "aria-label-step-field": "步长字段",
- "min-step": "最小步长",
- "query-type": "查询类型",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "此处可以使用时间单位和内置变量,例如:{{example1}}、{{example2}}、{{example3}}、{{example4}}{{example5}}、{{example6}}、{{example7}}(如果未指定单位,则为默认值:{{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "输入 PromQL 查询……"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "经典查询",
- "aria-label-metric-regex": "指标正则表达式",
- "aria-label-metric-selector": "指标选择器",
- "aria-label-prometheus-query": "Prometheus 查询",
- "aria-label-query-type": "查询类型",
- "aria-label-series-query": "序列查询",
- "label-classic-query": "经典查询",
- "label-label": "标签",
- "label-metric-regex": "指标正则表达式",
- "label-query": "查询",
- "label-query-type": "查询类型",
- "label-series-query": "序列查询",
- "placeholder-classic-query": "经典查询",
- "placeholder-metric-regex": "指标正则表达式",
- "placeholder-prometheus-query": "Prometheus 查询",
- "placeholder-select-query-type": "选择查询类型",
- "placeholder-series-query": "序列查询",
- "returns-metrics-matching-specified-metric-regex": "返回与指定指标正则表达式匹配的指标列表。",
- "tooltip-classic-query": "Prometheus 变量查询编辑器的原始执行操作。按照这些文档中所述,输入包含正确查询类型和参数的字符串。例如,{{exampleQuery}}。",
- "tooltip-label": "返回所有指标中标签名称的标签值列表,除非指定了指标。",
- "tooltip-metric-regex": "返回标签名称列表,可选择按指定的指标正则表达式进行筛选。",
- "tooltip-query": "返回查询的 Prometheus 查询结果列表。这可以包含 Prometheus 函数,即 {{exampleQuery}}。",
- "tooltip-query-type": "Prometheus 数据源插件为模板变量提供以下查询类型。",
- "tooltip-series-query": "输入带有标签的指标、仅指标或仅标签,即 {{example1}}、{{example2}} 或 {{example3}}。返回与输入数据关联的时间序列列表。"
- },
- "selector-actions": {
- "aria-label-selector": "选择器",
- "aria-label-selector-clear-button": "选择器清除按钮",
- "aria-label-use-selector-as-metrics-button": "使用选择器作为指标按钮",
- "aria-label-use-selector-for-query-button": "使用选择器作为查询按钮",
- "aria-label-validate-submit-button": "验证提交按钮",
- "clear": "清除",
- "resulting-selector": "4. 结果选择器",
- "use-as-rate-query": "用作速率查询",
- "use-query": "使用查询",
- "validate-selector": "验证选择器"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "筛选标签值表达式",
- "aria-label-values-for": "{{labelKey}}的值",
- "description-search-field-values-across-selected-labels": "使用搜索字段在所选标签中查找值。",
- "select-multiple-values-for-your-labels": "3. 为您的标签选择(多个)值"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "允许作为录制规则目标",
- "label-manage-alerts-via-alerting-ui": "通过警报用户界面管理警报",
- "title-alerting": "警报",
- "tooltip-allow-as-recording-rules-target": "允许此数据源被选为撰写录制规则的目标。",
- "tooltip-manage-alerts-via-alerting-ui": "管理此数据源的提醒规则。要管理其他 Alerting 资源,请添加 Alertmanager 数据源。"
- },
- "config-editor": {
- "browser-access-mode-error": "Prometheus 数据源中的浏览器访问模式不再可用。切换到服务器访问模式。",
- "description-advanced-settings": "附加设置是可选设置,通过配置,可对数据源进行更精细的控制。",
- "title-advanced-settings": "高级设置",
- "title-error": "错误"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "您的访问方式是<1>浏览器1>,这意味着需要从浏览器访问 URL。",
- "tooltip-http-url": "指定完整的 HTTP 网址(例如 {{exampleURL}})",
- "tooltip-server-access-mode": "您的访问方式是<1>服务器1>,这意味着需要从 grafana 后端/服务器访问 URL。"
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "请访问此处的文档了解更多信息。"
- },
- "exemplar-setting": {
- "label-data-source": "数据源",
- "label-internal-link": "内部链接",
- "label-label-name": "标签名称",
- "label-remove-exemplar-link": "移除范例链接",
- "label-url": "URL",
- "label-url-label": "网址标签",
- "placeholder-go-to-examplecom": "前往 example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "移除范例链接",
- "tooltip-data-source": "范例将要导航到的数据源。",
- "tooltip-internal-link": "如果您有内部链接,请启用此选项。启用后,页面将出现数据源选择器。为您的范例数据选择后端跟踪数据存储。",
- "tooltip-label-name": "应用于获取 traceID 的标签对象中的字段名称。",
- "tooltip-url": "用户将查看其跟踪的跟踪后端的网址",
- "tooltip-url-label": "用于覆盖示例 traceID 字段上的按钮标签。"
- },
- "exemplars-settings": {
- "add": "添加",
- "no-exemplars-configurations": "没有范例配置",
- "title-exemplars": "范例"
- },
- "prom-settings": {
- "aria-label-default-editor": "默认编辑器(代码或构建器)",
- "aria-label-prom-type-type": "{{promType}} 类型",
- "aria-label-prometheus-type": "Prometheus 类型",
- "aria-label-select-http-method": "选择 HTTP 方法",
- "editor-options": {
- "label-builder": "构建器",
- "label-code": "代码"
- },
- "label-cache-level": "缓存级别",
- "label-custom-query-parameters": "自定义查询参数",
- "label-default-editor": "默认编辑器",
- "label-disable-metrics-lookup": "禁用指标查找",
- "label-disable-recording-rules-beta": "禁用录制规则(测试版)",
- "label-http-method": "HTTP 方法",
- "label-incremental-querying-beta": "增量查询(测试版)",
- "label-prom-type-version": "{{promType}} 版本",
- "label-prometheus-type": "Prometheus 类型",
- "label-query-overlap-window": "查询重叠窗口",
- "label-query-timeout": "查询超时",
- "label-scrape-interval": "抓取间隔",
- "label-series-limit": "序列限制",
- "label-use-series-endpoint": "使用序列端点",
- "more-info": "有关在数据源中配置 prometheus 类型和版本的更多信息,请参阅<2>预配文档2>。",
- "placeholder-example-maxsourceresolutionmtimeout": "示例:{{example}}",
- "title-interval-behaviour": "间隔行为",
- "title-other": "其他",
- "title-performance": "性能",
- "title-query-editor": "查询编辑器",
- "tooltip-cache-level": "设置编辑器查询的浏览器缓存级别。对于高基数数据源,建议使用更高的缓存设置。",
- "tooltip-custom-query-parameters": "将自定义参数添加到 Prometheus 查询网址。例如 {{example1}}、{{example2}}、{{example3}} 或 {{example4}}。多个参数应使用 {{concatenationChar}} 连接起来。",
- "tooltip-default-editor": "为此数据源的所有用户设置默认编辑器选项。",
- "tooltip-disable-metrics-lookup": "选中此选项将禁用查询字段自动完成中的指标选择器和指标/标签支持。如果您在使用较大的 Prometheus 实例时遇到性能问题,这样做会有所帮助。",
- "tooltip-disable-recording-rules-beta": "此功能将禁用录制规则。开启此选项可提高数据面板性能",
- "tooltip-http-method": "您可以使用 POST 或 GET HTTP 方法来查询 Prometheus 数据源。POST 是推荐的方法,因为它允许更大的查询。如果您的 Prometheus 版本低于 2.1,或者您的网络中限制了 POST 请求,请将其更改为 GET。",
- "tooltip-incremental-querying-beta": "此功能将改变相对查询的默认行为,使其总是从 Prometheus 实例请求新数据,而不会缓存查询结果,且只请求新数据。开启此选项可减少数据库和网络负载。",
- "tooltip-prom-type-version": "如果 {{promType}} 实例未自动配置版本,请使用此项来设置它的版本。",
- "tooltip-prometheus-type": "将此设置为 Prometheus 数据库的类型,例如 Prometheus、Cortex、Mimir 或 Thanos。更改此字段将保存您的当前设置。某些类型的 Prometheus 对 API 的支持不一样。例如,某些类型支持标签查询的正则表达式匹配,以提高性能。某些类型具有用于元数据的 API。如果设置不正确,则在查询指标和标签时可能会遇到奇怪的行为。请检查您的 Prometheus 文档,以确保您输入了正确的类型。",
- "tooltip-query-overlap-window": "设置持续时间,如 {{example1}} 或 {{example2}} 或 {{example3}}。默认值为 {{default}}。此持续时间将添加到每个增量请求的持续时间中。",
- "tooltip-query-timeout": "设置 Prometheus 查询超时。",
- "tooltip-scrape-interval": "此间隔是 Prometheus 抓取目标的频率。将此设置为 Prometheus 配置文件中配置的典型抓取和评估间隔。如果您将此值设置为大于 Prometheus 配置文件的间隔,Grafana 将根据此间隔评估数据,您将看到较少的数据点。默认值为 {{default}}。",
- "tooltip-series-limit": "限制适用于两个端点(系列和标签)的所有资源(指标、标签和值)。将字段留空,以使用默认限制 (40000)。设置为 0 以禁用限制并获取所有内容,但这可能会导致性能问题。默认限制为 40000。",
- "tooltip-use-series-endpoint": "选中此选项将优先使用带有 {{exampleParameter}} 参数的序列端点,而不是带有 {{exampleParameter}} 参数的标签值端点。虽然标签值端点在性能方面表现更好,但有些用户可能更喜欢序列,因为它具有 POST 方法,而标签值端点仅具有 GET 方法。"
- }
- },
- "metrics-browser": {
- "disabled-label": "(已禁用)",
- "enabled-label": "指标浏览器"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "仅包含唯一标签",
- "description-custom": "提供命名模板",
- "description-verbose": "所有标签名称和值",
- "label-auto": "自动",
- "label-custom": "自定义",
- "label-verbose": "详细"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "计算各维度的平均值",
- "documentation-bottomk": "按样本值取最小的 k 个元素",
- "documentation-count": "计算向量中的元素数",
- "documentation-count-values": "计算具有相同值的元素数",
- "documentation-group": "结果向量中的所有值均为 1",
- "documentation-max": "选择各维度的最大值",
- "documentation-min": "选择各维度的最小值",
- "documentation-quantile": "计算各维度的 φ-quantile (0 ≤ φ ≤ 1)",
- "documentation-stddev": "计算各维度的总体标准差",
- "documentation-stdvar": "计算各维度的总体标准差",
- "documentation-sum": "计算各维度的总和",
- "documentation-topk": "按样本值取最大的 k 个元素"
- },
- "getFunctions": {
- "documentation-abs": "返回输入向量,其中所有样本值都转换为其绝对值。",
- "documentation-absent": "如果传入的向量包含任意元素,则返回一个空向量;如果传入的向量不包含任何元素,则返回一个值为 1 的单元素向量。这在针对某个特定指标名称和标签组合不存在任何时间序列时发出告警时非常有用。",
- "documentation-absent-over-time": "如果传入的向量包含任意元素,则返回一个空向量;如果传入的向量不包含任何元素,则返回一个值为·1·的单元素向量。",
- "documentation-avg-over-time": "指定间隔内所有点的平均值。",
- "documentation-ceil": "将“v”中所有元素的样本值向上舍入到最接近的整数。",
- "documentation-changes": "对于每个输入时间序列,“changes(v range-vector)”返回其值在提供的时间范围内更改的次数,作为瞬时向量。",
- "documentation-clamp": "将“v”中所有元素的样本值限制为下限为“min”且上限为“max”。",
- "documentation-clamp-max": "将“v”中所有元素的样本值限制为上限为“max”。",
- "documentation-clamp-min": "将“v”中所有元素的样本值限制为下限为“min”。",
- "documentation-count-over-time": "指定间隔内所有值的计数。",
- "documentation-count-scalar": "返回时间序列向量中元素的数量作为标量。这与 'count()' 聚合运算符相反,后者始终返回一个向量(如果输入向量为空,则为空向量),并允许通过 'by' 子句按标签分组。",
- "documentation-day-of-month": "返回每个月中给定时间的日期(UTC 时间)。返回的值介于 1 到 31 之间。",
- "documentation-day-of-week": "返回每周中给定时间的日期(UTC 时间)。返回的值介于 0 到 6 之间,其中 0 表示星期日,以此类推。",
- "documentation-day-of-year": "返回每年中的给定时间的日期(UTC 时间)。对于非闰年,返回的值介于 1 到 365 之间;对于闰年,返回的值介于 1 到 366 之间。",
- "documentation-days-in-month": "返回每月中给定时间的天数(UTC 时间)。返回的值介于 28 到 31 之间。",
- "documentation-deg": "将 v 中所有元素的弧度转换为度",
- "documentation-delta": "计算范围矢量“v”中每个时间序列元素的第一个值和最后一个值之间的差,返回具有给定增量和等效标签的瞬时矢量。增量被外推以覆盖范围矢量选择器中指定的全时间范围,因此即使样本值都是整数,也可以获得非整数结果。",
- "documentation-deriv": "使用简单线性回归计算范围向量“v”中时间序列的每秒导数。",
- "documentation-double-exponential-smoothing": "根据“v”中的范围为时间序列生成平滑值。平滑因子“sf”越低,旧数据的重要性就越高。趋势因子“tf”越高,考虑的数据趋势就越多。“sf”和“tf”都必须介于 0 和 1 之间。",
- "documentation-drop-common-labels": "删除输入向量中所有序列中具有相同名称和值的所有标签。",
- "documentation-exp": "计算“v”中所有元素的指数函数。\n特殊情况是:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`",
- "documentation-floor": "将“v”中所有元素的样本值向下舍入到最接近的整数。",
- "documentation-histogram-avg": "返回存储在原生直方图中的观测值的算术平均值。非原生直方图的样本将被忽略,不会显示在返回的向量中。",
- "documentation-histogram-count": "返回存储在原生直方图中的观测值的计数。",
- "documentation-histogram-fraction": "返回所提供的下限值和上限值之间的估计观测值分数。",
- "documentation-histogram-quantile": "从直方图的存储桶 'b' 计算 φ-quantile (0 ≤ φ ≤ 1)。'b' 中的样本是每个存储桶中的观测值计数。每个样本都必须有一个标签 'le',其中标签值表示存储桶的包含上限。(没有此类标签的样本将被静默忽略。)直方图指标类型自动为时间序列提供 '_bucket' 后缀和相应的标签。",
- "documentation-histogram-stddev": "根据观测值所在的存储桶的几何平均值,返回原生直方图中观测值的估计标准差。",
- "documentation-histogram-stdvar": "返回原生直方图中观测值的估计标准方差。",
- "documentation-histogram-sum": "返回存储在原生直方图中的观测值的总和。",
- "documentation-holt-winters": "在 prometheus v3.x 中重命名为 double_exponential_smoothing。对于等于和大于 v3.0 的 prometheus 版本,请使用 double_exponential_smoothing。\n\n根据“v”中的范围为时间序列生成平滑值。平滑因子“sf”越低,旧数据的重要性就越高。趋势因子“tf”越高,考虑的数据趋势就越多。“sf”和“tf”都必须介于 0 和 1 之间。",
- "documentation-hour": "返回每天中给定时间的小时(UTC 时间)。返回的值介于 0 到 23 之间。",
- "documentation-idelta": "计算范围矢量“v”中最后两个样本之间的差,返回具有给定增量和等效标签的瞬时矢量。",
- "documentation-increase": "计算范围矢量中时间序列的增加。单调性中断(例如由于目标重新启动而导致的计数器重置)会自动调整。增加被外推以覆盖范围矢量选择器中指定的全时间范围,因此即使计数器仅以整数增量增加,也可以获得非整数结果。",
- "documentation-info": "返回有关一组指标的最新详细信息和元数据,例如其标签和当前值,而无需进行任何计算",
- "documentation-irate": "计算范围矢量中时间序列的每秒瞬时增加率。这是基于最后两个数据点。单调性中断(例如由于目标重新启动而导致的计数器重置)会自动调整。",
- "documentation-label-join": "对于“v”中的每个时间序列,使用“separator”连接所有“src_labels”的所有值,并返回包含连接值的标签“dst_label”的时间序列。此函数中可以有任意数量的“src_labels”。",
- "documentation-label-replace": "对于“v”中的每个时间序列,“label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)”将正则表达式“regex”与标签“src_label”进行匹配。如果匹配,则返回时间序列,并将标签“dst_label”替换为“replacement”的扩展。“$1”替换为第一个匹配的子组,“$2”替换为第二个匹配的子组,依此类推。如果正则表达式不匹配,则返回不变的时间序列。",
- "documentation-last-over-time": "指定间隔内的最近点值。",
- "documentation-ln": "计算“v”中所有元素的自然对数。\n特殊情况是:\n * 'ln(+Inf) = +Inf'\n * 'ln(0) = -Inf'\n * 'ln(x < 0) = NaN'\n * 'ln(NaN) = NaN'",
- "documentation-log10": "计算“v”中所有元素的十进制对数。特殊情况等同于“ln”中的情况。",
- "documentation-log2": "计算“v”中所有元素的二进制对数。特殊情况等同于“ln”中的情况。",
- "documentation-max-over-time": "指定间隔内所有点的最大值。",
- "documentation-min-over-time": "指定间隔内所有点的最小值。",
- "documentation-minute": "返回每小时中给定时间的分钟(UTC 时间)。返回的值介于 0 到 59 之间。",
- "documentation-month": "返回每年中的给定时间的月份(UTC 时间)。返回的值介于 1 到 12 之间,其中 1 表示一月,以此类推。",
- "documentation-pi": "返回 pi",
- "documentation-predict-linear": "使用简单线性回归,根据范围向量“v”预测从现在开始的时间序列“t”秒的值。",
- "documentation-present-over-time": "指定间隔内任何系列的值 1。",
- "documentation-quantile-over-time": "指定间隔内值的 φ-quantile (0 ≤ φ ≤ 1)。",
- "documentation-rad": "将 v 中所有元素的度转换为弧度",
- "documentation-rate": "计算范围矢量中时间序列的每秒平均增加率。单调性中断(例如由于目标重新启动而导致的计数器重置)会自动调整。此外,计算外推到时间范围的末端,允许遗漏的抓取或抓取周期与范围的时间段不完美对齐。",
- "documentation-resets": "对于每个输入时间序列,“resets(v range-vector)”返回提供的时间范围内的计数器重置次数,作为瞬时向量。两个连续样本之间的值的任何减小都被解释为计数器重置。",
- "documentation-round": "将“v”中所有元素的样本值舍入到最接近的整数。通过向上舍入来解决绑定。可选的“to_nearest”参数允许指定应舍入样本值的最接近倍数。这个倍数也可能是分数。",
- "documentation-scalar": "给定单元素输入向量,“scalar(v instant-vector)”返回该单个元素的样本值作为标量。如果输入向量不正好只有一个元素,“scalar”将返回“NaN”。",
- "documentation-sgn": "返回一个向量,其中所有样本值都转换为其符号,定义如下:如果 v 为正,则为 1;如果 v 为负,则为 -1;如果 v 为零,则为 0。",
- "documentation-sort": "返回按样本值排序的矢量元素,按升序排列。",
- "documentation-sort-desc": "返回按样本值排序的向量元素,按降序排列。",
- "documentation-sqrt": "计算“v”中所有元素的平方根。",
- "documentation-stddev-over-time": "指定间隔内值的总体标准差。",
- "documentation-stdvar-over-time": "指定间隔内值的总体标准方差。",
- "documentation-sum-over-time": "指定间隔内所有值的总和。",
- "documentation-time": "返回自 1970 年 1 月 1 日(UTC 时间)起的秒数。请注意,这实际上并不返回当前时间,而是返回要计算表达式的时间。",
- "documentation-timestamp": "返回给定向量每个样本的时间戳,作为自 1970 年 1 月 1 日(UTC 时间)起的秒数。",
- "documentation-vector": "返回标量“s”作为没有标签的矢量。",
- "documentation-year": "返回每年给定时间的年份(UTC 时间)。"
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "计算 {{argument}} 中所有元素的反余弦",
- "documentation-acosh": "计算 {{argument}} 中所有元素的反双曲余弦",
- "documentation-asin": "计算 {{argument}} 中所有元素的反正弦",
- "documentation-asinh": "计算 {{argument}} 中所有元素的反双曲正弦",
- "documentation-atan": "计算 {{argument}} 中所有元素的反正切",
- "documentation-atanh": "计算 {{argument}} 中所有元素的反双曲正切",
- "documentation-cos": "计算 {{argument}} 中所有元素的余弦",
- "documentation-cosh": "计算 {{argument}} 中所有元素的双曲余弦",
- "documentation-sin": "计算 {{argument}} 中所有元素的正弦",
- "documentation-sinh": "计算 {{argument}} 中所有元素的双曲正弦",
- "documentation-tan": "计算 {{argument}} 中所有元素的正切",
- "documentation-tanh": "计算 {{argument}} 中所有元素的双曲正切"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "提供反馈",
- "title-give-feedback": "指标浏览器是新功能,请告诉我们如何改进"
- },
- "get-collapsed-info": {
- "exemplars": "范例:{{value}}",
- "format": "格式:{{value}}",
- "legend": "图例:{{value}}",
- "step": "步骤:{{value}}",
- "type": "类型:{{value}}"
- },
- "get-placeholders": {
- "browse": "按名称搜索指标",
- "type": "按类型筛选"
- },
- "get-prom-types": {
- "description-counter": "表示单个单调递增计数器的累积指标,其值只能在重新启动时增加或重置为零。",
- "description-gauge": "表示可以任意上下移动的单个数值的指标。",
- "description-histogram": "直方图对观测值(通常是请求持续时间或响应大小等)进行抽样,并在可配置的存储桶中对其进行计数。",
- "description-native-histogram": "原生直方图在许多方面与经典的 Prometheus 直方图不同:原生直方图的存储桶边界由公式计算,该公式取决于原生直方图的比例(分辨率),而不是由用户自定义。",
- "description-no-type": "这些指标在元数据中没有定义的类型。",
- "description-summary": "汇总对观测值(通常是请求持续时间和响应大小等)进行抽样,并可以在滑动时间窗口中计算可配置的分位数。",
- "description-unknown": "这些指标在元数据中被赋予未知类型。",
- "label-counter": "计数器",
- "label-gauge": "仪表",
- "label-histogram": "直方图",
- "label-native-histogram": "原生直方图",
- "label-no-type": "无类型",
- "label-summary": "摘要",
- "label-unknown": "未知"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "查询解析不明确。"
- }
- },
- "label-filter-item": {
- "aria-label-remove": "移除{{name}}",
- "placeholder-select-label": "选择标签",
- "placeholder-select-value": "选择值"
- },
- "label-filters": {
- "label-filters": "标签筛选",
- "label-label-filters": "标签筛选",
- "tooltip-label-filters": "可选:用于筛选为此查询类型选择的指标。"
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "正在加载标签",
- "noOptionsMessage-no-labels-found": "未找到标签"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "打开指标浏览器",
- "placeholder-select-metric": "选择指标",
- "tooltip-open-metrics-explorer": "打开指标浏览器"
- },
- "label-metric": "指标",
- "tooltip-metric": "可选:返回指定指标中标签名称的标签值列表。"
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "浏览指标",
- "currently-selected": "当前选择:{{selected}}",
- "metrics-pre-filtered": "这些指标已通过标签筛选器中选择的标签进行预筛选。",
- "title-metrics-explorer": "指标浏览器"
- },
- "nested-query": {
- "label": {
- "ignoring": "忽略",
- "on": "方式"
- },
- "operator": "运算符",
- "tooltip-remove-match": "移除匹配",
- "vector-matches": "矢量匹配"
- },
- "operation-editor": {
- "not-found": "找不到操作 {{id}}",
- "title-remove": "移除{{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "替换为",
- "title-click-to-view-alternative-operations": "点击以查看替代操作",
- "title-remove-operation": "移除操作"
- },
- "operation-info-button": {
- "title-click-to-show-description": "点击以显示描述",
- "title-remove-operation": "移除操作"
- },
- "operation-list": {
- "operations": "操作",
- "placeholder-search": "搜索",
- "title-add-operation": "添加操作"
- },
- "operation-param-editor": {
- "title-add": "添加{{name}}",
- "title-remove": "移除{{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "计算各维度的 {{aggregationName}},同时保留 {{labelWord}} {{labels}}。",
- "label-default": "计算各维度的 {{aggregationName}}。",
- "label-without": "计算各维度的 {{aggregationName}} {{labels}}。所有其他标签都将保留。"
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "范例开关。",
- "aria-label-format": "格式化组合框",
- "aria-label-lower-limit-parameter": "最小步长文本框,设置步长参数的下限",
- "aria-label-select-resolution": "选择分辨率",
- "aria-label-type": "类型单选按钮组",
- "format-options": {
- "label-heatmap": "热图",
- "label-table": "表格",
- "label-time-series": "时间序列"
- },
- "label-exemplars": "范例",
- "label-format": "格式",
- "label-min-step": "最小步长",
- "label-resolution": "分辨率",
- "label-type": "类型",
- "placeholder-auto": "自动",
- "title-options": "选项",
- "tooltip-min-step": "Prometheus 查询的步长参数以及 <2>{{interval}}2> 和 <4>{{rateInterval}}4> 变量的附加下限。"
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "存在语法错误,或者切换到构建器模式时无法可视化查询结构。查询的某些部分可能会丢失。",
- "confirmText-continue": "继续",
- "kick-start-your-query": "启动您的查询",
- "label-explain": "解释",
- "run-queries": "运行查询",
- "title-parsing-error-switch-builder": "解析错误:切换到构建器模式?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "图例组合框",
- "label-legend": "图例",
- "placeholder-select-legend-mode": "选择图例模式",
- "tooltip-legend": "序列名称覆盖或模板。例如,{{templateExample}} 将替换为 {{labelName}} 的标签值。"
- },
- "query-builder-hints": {
- "hint-details": "提示:{{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "构建器",
- "label-code": "代码"
- }
- },
- "query-pattern": {
- "apply-query": "应用查询",
- "aria-label-apply-query-starter-button": "应用查询启动按钮",
- "aria-label-back-button": "后退按钮",
- "aria-label-create-new-query-button": "创建新查询按钮",
- "aria-label-raw-query": "{{patternName}} 原始查询",
- "aria-label-use-this-query-button": "使用此查询按钮",
- "back": "上一步",
- "create-new-query": "创建新查询",
- "use-this-query": "使用此查询"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "关闭“快速启动查询”弹窗",
- "aria-label-kick-start-your-query-modal": "启动您的查询模式",
- "aria-label-toggle-query-starter": "打开和关闭 {{patternType}} 查询启动卡",
- "close": "关闭",
- "description-kick-start-your-query": "通过选择其中一个查询来快速启动您的查询。然后,您可以继续完成查询。",
- "label-toggle-query-starter": "{{patternType}} 查询启动器",
- "title-kick-start-your-query": "启动您的查询"
- },
- "raw-query": {
- "aria-label-selector": "选择器"
- },
- "results-table": {
- "content-descriptive-type": "创建 {{descriptiveType}} 时,Prometheus 会使用类型计数器公开多个序列。",
- "description": "描述",
- "message-expand-label-filters": "未找到指标。尝试展开您的标签筛选条件。",
- "message-expand-search": "未找到指标。尝试展开您的搜索和筛选条件。",
- "message-no-metrics-found": "数据源中未找到指标。",
- "name": "名称",
- "type": "类型"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/locales/zh-Hant/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/zh-Hant/grafana-prometheus.json
deleted file mode 100644
index 48657d311d7..00000000000
--- a/packages/grafana-prometheus/src/locales/zh-Hant/grafana-prometheus.json
+++ /dev/null
@@ -1,492 +0,0 @@
-{
- "grafana-prometheus": {
- "components": {
- "annotation-query-editor": {
- "annotation-data-load-error": "註解資料載入錯誤!",
- "aria-label-lower-limit-parameter": "設定步驟參數的下限",
- "label-min-step": "最少步驟數",
- "label-series-value-as-timestamp": "作為時間戳記的序列值",
- "label-tags": "標籤",
- "label-text": "文字",
- "label-title": "標題",
- "placeholder-auto": "自動",
- "tooltip-either-pattern-example-instance-replaced-label": "使用名稱或模式。例如,{{labelTemplate}} 會替換為標籤{{labelName}}的標籤值。",
- "tooltip-min-step": "Prometheus 查詢的步驟參數以及 <2>{{intervalVar}}2> 和 <4>{{rateIntervalVar}}4> 變數的其他下限。",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "時間戳記的單位為毫秒。如果序列值的單位為秒,請將其範圍向量乘以 1000。"
- },
- "get-query-type-options": {
- "description": {
- "instant-query-range": "執行即時查詢和範圍查詢"
- },
- "label": {
- "both": "兩者"
- },
- "range-options": {
- "description": {
- "query-range": "針對一段時間執行查詢"
- },
- "label": {
- "instant": "立即",
- "range": "範圍"
- }
- }
- },
- "label-selector": {
- "aria-label-filter-expression-for-label": "篩選標籤的運算式",
- "description-select-labels": "一旦選取標籤值,只會顯示可能的標籤組合。",
- "select-labels-to-search-in": "2. 選取您要搜尋的標籤"
- },
- "metric-selector": {
- "aria-label-filter-expression-for-metric": "篩選指標的運算式",
- "aria-label-limit-results-from-series-endpoint": "限制序列端點的結果",
- "description-series-limit": "限制適用於所有指標、標籤和數值。將欄位留空以使用預設的限制。設定為 0 以停用限制並擷取所有內容,不過這可能會導致效能問題。",
- "label-select-metric": "一旦選取指標,只會顯示可能的標籤。標籤受以下序列限制。",
- "select-a-metric": "1. 選擇指標",
- "series-limit": "序列限制"
- },
- "prom-cheat-sheet": {
- "prom-ql-cheat-sheet": "PromQL 速查表"
- },
- "prom-exemplar-field": {
- "exemplars": "範例",
- "tooltip-disable-query": "停用範例查詢",
- "tooltip-enable-query": "啟用範例查詢"
- },
- "prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "Prometheus 額外欄位",
- "aria-label-query-type-field": "查詢類型欄位",
- "aria-label-step-field": "步驟欄位",
- "min-step": "最少步驟數",
- "query-type": "查詢類型",
- "tooltip-units-builtin-variables-example-interval-rateinterval": "此處可使用時間單位和內建變數,例如:{{example1}}、{{example2}}、{{example3}}、{{example4}}、{{example5}}、{{example6}}、{{example7}}(如未指定單位,則為預設值:{{default}})"
- },
- "prom-query-field": {
- "placeholder-enter-a-prom-ql-query": "輸入 PromQL 查詢…"
- },
- "prom-variable-query-editor": {
- "aria-label-classic-query": "經典查詢",
- "aria-label-metric-regex": "指標正規運算式",
- "aria-label-metric-selector": "指標選擇器",
- "aria-label-prometheus-query": "Prometheus 查詢",
- "aria-label-query-type": "查詢類型",
- "aria-label-series-query": "序列查詢",
- "label-classic-query": "經典查詢",
- "label-label": "標籤",
- "label-metric-regex": "指標正規運算式",
- "label-query": "查詢",
- "label-query-type": "查詢類型",
- "label-series-query": "序列查詢",
- "placeholder-classic-query": "經典查詢",
- "placeholder-metric-regex": "指標正規運算式",
- "placeholder-prometheus-query": "Prometheus 查詢",
- "placeholder-select-query-type": "選取查詢類型",
- "placeholder-series-query": "序列查詢",
- "returns-metrics-matching-specified-metric-regex": "回傳與指定指標正規運算式相符的指標清單。",
- "tooltip-classic-query": "Prometheus 變數查詢編輯器的原始實作。輸入一個字串,其中包含如這些文件中所述正確的查詢類型和參數。例如:{{exampleQuery}}。",
- "tooltip-label": "除非有指定指標,否則會回傳所有指標中該標籤名稱的標籤值清單。",
- "tooltip-metric-regex": "回傳標籤名稱清單,選擇性地依據指定指標正規運算式篩選。",
- "tooltip-query": "回傳此查詢的 Prometheus 查詢結果清單。這可能包括 Prometheus 功能,即{{exampleQuery}}。",
- "tooltip-query-type": "Prometheus 資料來源外掛程式為範本變數提供以下查詢類型。",
- "tooltip-series-query": "輸入帶有標籤的指標、僅有指標或僅標籤,即 {{example1}}、{{example2}} 或 {{example3}}。回傳與輸入資料相關的時間序列清單。"
- },
- "selector-actions": {
- "aria-label-selector": "選擇器",
- "aria-label-selector-clear-button": "選擇器清除按鈕",
- "aria-label-use-selector-as-metrics-button": "使用選擇器作為指標按鈕",
- "aria-label-use-selector-for-query-button": "使用選擇器作為查詢按鈕",
- "aria-label-validate-submit-button": "驗證提交按鈕",
- "clear": "清除",
- "resulting-selector": "4. 結果選擇器",
- "use-as-rate-query": "作為速率查詢使用",
- "use-query": "使用此查詢",
- "validate-selector": "驗證選擇器"
- },
- "value-selector": {
- "aria-label-filter-expression-for-label-values": "篩選標籤數值的運算式",
- "aria-label-values-for": "以下項目的值:{{labelKey}}",
- "description-search-field-values-across-selected-labels": "使用搜尋欄位在所選標籤中尋找數值。",
- "select-multiple-values-for-your-labels": "3. 為您的標籤選取(多個)值"
- }
- },
- "configuration": {
- "alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "允許作為錄製規則目標",
- "label-manage-alerts-via-alerting-ui": "透過警示 UI 管理警示",
- "title-alerting": "警報",
- "tooltip-allow-as-recording-rules-target": "允許將此資料來源選為撰寫記錄規則的目標。",
- "tooltip-manage-alerts-via-alerting-ui": "管理此資料來源的警報規則。若要管理其他警報資源,請新增 Alertmanager 資料來源。"
- },
- "config-editor": {
- "browser-access-mode-error": "Prometheus 資料來源中的瀏覽器存取模式無法再使用。切換至伺服器存取模式。",
- "description-advanced-settings": "附加設定為選擇性設定,可進行設定以便更妥善掌控您的資料來源。",
- "title-advanced-settings": "進階設定",
- "title-error": "錯誤"
- },
- "data-source-http-settings-overhaul": {
- "tooltip-browser-access-mode": "您的存取方式是<1>瀏覽器1>,這表示需要從瀏覽器存取網址。",
- "tooltip-http-url": "指定完整的 HTTP URL(例如 {{exampleURL}})",
- "tooltip-server-access-mode": "您的存取方式是<1>伺服器1>,這表示需要從 Grafana 後端/伺服器存取網址。"
- },
- "docs-tip": {
- "visit-docs-for-more-details-here": "在此處瀏覽文件以了解更多詳細資訊。"
- },
- "exemplar-setting": {
- "label-data-source": "資料來源",
- "label-internal-link": "內部連結",
- "label-label-name": "標籤名稱",
- "label-remove-exemplar-link": "移除範例連結",
- "label-url": "網址",
- "label-url-label": "網址標籤",
- "placeholder-go-to-examplecom": "前往 example.com",
- "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
- "placeholder-trace-id": "traceID",
- "title-remove-exemplar-link": "移除範例點連結",
- "tooltip-data-source": "範例所導向的資料來源。",
- "tooltip-internal-link": "若您有內部連結,請啟用此選項。啟用後將顯示資料來源選擇器。為您的範例資料選擇後端追蹤資料存放區。",
- "tooltip-label-name": "標籤物件中應用來取得 traceID 的欄位名稱。",
- "tooltip-url": "使用者將前往查看其追蹤的追蹤後端網址",
- "tooltip-url-label": "用來覆寫範例 traceID 欄位上的按鈕標籤。"
- },
- "exemplars-settings": {
- "add": "新增",
- "no-exemplars-configurations": "沒有範例設定",
- "title-exemplars": "範例"
- },
- "prom-settings": {
- "aria-label-default-editor": "預設編輯器(程式碼或編輯器)",
- "aria-label-prom-type-type": "{{promType}} 類型",
- "aria-label-prometheus-type": "Prometheus 類型",
- "aria-label-select-http-method": "選取 HTTP 方法",
- "editor-options": {
- "label-builder": "建立器",
- "label-code": "代碼"
- },
- "label-cache-level": "快取層級",
- "label-custom-query-parameters": "自訂查詢參數",
- "label-default-editor": "預設編輯器",
- "label-disable-metrics-lookup": "停用指標檢索",
- "label-disable-recording-rules-beta": "停用錄製規則(測試版)",
- "label-http-method": "HTTP 方法",
- "label-incremental-querying-beta": "增量查詢(測試版)",
- "label-prom-type-version": "{{promType}} 版本",
- "label-prometheus-type": "Prometheus 類型",
- "label-query-overlap-window": "查詢重疊視窗",
- "label-query-timeout": "查詢逾時",
- "label-scrape-interval": "抓取間隔",
- "label-series-limit": "序列限制",
- "label-use-series-endpoint": "使用序列端點",
- "more-info": "如需更多在資料來源中設定 Prometheus 類型與版本的相關資訊,請參閱<2>佈建文件2>。",
- "placeholder-example-maxsourceresolutionmtimeout": "範例:{{example}}",
- "title-interval-behaviour": "間隔行為",
- "title-other": "其他",
- "title-performance": "成效",
- "title-query-editor": "查詢編輯器",
- "tooltip-cache-level": "設定編輯器查詢的瀏覽器快取層級。針對高基數資料來源,建議使用較高層級的快取設定。",
- "tooltip-custom-query-parameters": "將自訂參數新增至 Prometheus 查詢網址。例如 {{example1}}、{{example2}}、{{example3}} 或 {{example4}}。多個參數應與{{concatenationChar}}串接在一起。",
- "tooltip-default-editor": "為此資料來源的所有使用者設定預設編輯器選項。",
- "tooltip-disable-metrics-lookup": "勾選此選項將停用查詢欄位自動完成中的指標選擇器和指標/標籤支援。如果您在較大的 Prometheus 實例上遇到效能問題,這會有所幫助。",
- "tooltip-disable-recording-rules-beta": "此功能將停用錄製規則。開啟此功能以改善儀表板效能",
- "tooltip-http-method": "您可以使用 POST 或 GET HTTP 方法,來查詢您的 Prometheus 資料來源。POST 是建議的方法,因為它可以處理更大規模的查詢。如果您的 Prometheus 版本早於 2.1,或您的網路中限制了 POST 請求,請將此更改為 GET。",
- "tooltip-incremental-querying-beta": "此功能將變更相對時間查詢的預設行為,以便隨時從 Prometheus 執行個體要求新資料,而不會快取查詢結果,並且只會請求新記錄。開啟此功能以減少資料庫和網路負載。",
- "tooltip-prom-type-version": "如果您的{{promType}}執行個體未自動設定版本,請使用此功能進行設定。",
- "tooltip-prometheus-type": "將此設定為 Prometheus 資料庫的類型,例如 Prometheus、Cortex、Mimir 或 Thanos。變更此欄位將儲存您目前的設定。特定類型的 Prometheus 支援或無法支援各種 API。例如,某些類型支援對標籤查詢使用正規運算式匹配,以提高效能。部分類型具有元資料的 API。若您設定錯誤,在查詢指標和標籤時可能會遇到異常行為。請檢查您的 Prometheus 文件,以確保您輸入正確的類型。",
- "tooltip-query-overlap-window": "設定持續時間,例如 {{example1}} 或 {{example2}} 或 {{example3}}。預設為{{default}}。將新增此持續時間至每個增量請求的持續時間。",
- "tooltip-query-timeout": "設定 Prometheus 查詢逾時。",
- "tooltip-scrape-interval": "此間隔是 Prometheus 抓取目標的頻率。將此設定為 Prometheus 設定檔案中設定的典型抓取和評估間隔。若您將此設定為大於 Prometheus 設定檔案間隔的數值,Grafana 將根據此間隔評估資料,您將看到較少的資料點。預設為{{default}}。",
- "tooltip-series-limit": "限制適用於兩個端點(序列和標籤)的所有資源(指標、標籤和值)。將欄位留空以使用預設的限制 (40000)。設定為 0 以停用限制並擷取所有內容,不過這可能會導致效能問題。預設限制為 40000。",
- "tooltip-use-series-endpoint": "勾選此選項將優先使用具有 {{exampleParameter}} 參數的序列端點,而非具有 {{exampleParameter}} 參數的標籤值端點。雖然標籤值端點被視為擁有更佳效能,但有些使用者可能會更喜歡該序列,因為它具有 POST 方法,而標籤值端點僅具有 GET 方法。"
- }
- },
- "metrics-browser": {
- "disabled-label": "(已停用)",
- "enabled-label": "指標瀏覽器"
- },
- "prom-query-legend-editor": {
- "get-legend-mode-options": {
- "description-auto": "僅包含唯一標籤",
- "description-custom": "提供命名範本",
- "description-verbose": "所有標籤名稱和值",
- "label-auto": "自動",
- "label-custom": "自訂",
- "label-verbose": "詳細"
- }
- },
- "promql": {
- "getAggregationOptions": {
- "documentation-avg": "計算維度的平均值",
- "documentation-bottomk": "依照樣本值的最小 k 元素",
- "documentation-count": "計算向量中的元素數量",
- "documentation-count-values": "計算具有相同值的元素數",
- "documentation-group": "結果向量中的所有值均為 1",
- "documentation-max": "選取維度的最大值",
- "documentation-min": "選取維度的最小值",
- "documentation-quantile": "計算維度的 φ-quantile (0 ≤ φ ≤ 1)",
- "documentation-stddev": "計算維度的總體標準差",
- "documentation-stdvar": "計算維度上的總體標準差",
- "documentation-sum": "計算維度的總和",
- "documentation-topk": "按樣本值的最大 k 元素"
- },
- "getFunctions": {
- "documentation-abs": "傳回輸入向量,其中所有樣本值都轉換為其絕對值。",
- "documentation-absent": "如果傳遞給它的向量有任何元素,則傳回空向量;如果傳遞給它的向量沒有元素,則傳回值為 1 的 1 元素向量。這對於在給定的指標名稱和標籤組合不存在時間序列時發出警示很有用。",
- "documentation-absent-over-time": "如果傳遞給它的範圍向量有任何元素,則傳回空向量;如果傳遞給它的範圍向量沒有元素,則傳回值為 1 的 1 元素向量。",
- "documentation-avg-over-time": "指定間隔內所有點的平均值。",
- "documentation-ceil": "將「v」中所有元素的樣本值四捨五入為最接近的整數。",
- "documentation-changes": "對於每個輸入時間序列,「changes(v range-vector)」會傳回其值在提供的時間範圍內作為即時向量變更的次數。",
- "documentation-clamp": "將「v」中所有元素的樣本值限制為下限為「min」且上限為「max」。",
- "documentation-clamp-max": "將「v」中所有元素的樣本值限制為「max」的上限。",
- "documentation-clamp-min": "將「v」中所有元素的樣本值限制為「min」的下限。",
- "documentation-count-over-time": "指定間隔中的所有值計數。",
- "documentation-count-scalar": "以純量形式傳回時間序列向量中的元素數量。這與「count()」彙總運算子相反,後者始終傳回向量(如果輸入向量為空,則為空向量),並允許透過「by」子句按標籤分組。",
- "documentation-day-of-month": "傳回 UTC 中每個指定時間的當月日期。傳回的值介於 1 至 31 之間。",
- "documentation-day-of-week": "以 UTC 格式傳回每個指定時間的星期幾。傳回的值介於 0 至 6 之間,其中 0 表示星期日等。",
- "documentation-day-of-year": "傳回每個指定時間的當年日期(UTC 時區)。傳回的值在非閏年為 1 至 365,在閏年為 1 至 366。",
- "documentation-days-in-month": "針對 UTC 中的每個指定時間,傳回當月的天數。傳回的值介於 28 至 31 之間。",
- "documentation-deg": "將 v 中所有元素的弧度轉換為度數",
- "documentation-delta": "計算範圍向量「v」中每個時間序列元素的第一個值和最後一個值之間的差異,傳回具有給定增量和等效標籤的即時向量。增量被外推以涵蓋範圍向量選擇器中指定的完整時間範圍,因此即使樣本值都是整數,也可以得到非整數結果。",
- "documentation-deriv": "使用簡單的線性回歸計算範圍向量「v」中時間序列的每秒導數。",
- "documentation-double-exponential-smoothing": "根據「v」中的範圍,產生時間序列的平滑值。平滑因子「sf」越低,舊資料的重要性就越高。趨勢因子「tf」越高,就越考慮資料中的趨勢。「sf」和「tf」都必須介於 0 和 1 之間。",
- "documentation-drop-common-labels": "刪除輸入向量中所有序列中具有相同名稱和值的所有標籤。",
- "documentation-exp": "計算「v」中所有元素的指數函數。\n特殊情況為:\n* 'Exp(+Inf) = +Inf' \n* 'Exp(NaN) = NaN'",
- "documentation-floor": "將「v」中所有元素的樣本值向下四捨五入為最接近的整數。",
- "documentation-histogram-avg": "傳回儲存在原生直方圖中觀測值的算術平均值。將忽略非原生直方圖的樣本,且不會顯示在傳回的向量中。",
- "documentation-histogram-count": "傳回儲存在本機直方圖中的觀測值計數。",
- "documentation-histogram-fraction": "傳回所提供的下限值和上限值之間的估計觀測值分數。",
- "documentation-histogram-quantile": "從直方圖的區塊「b」計算 φ-quantile (0 ≤ φ ≤ 1)。「b」中的樣本是每個區塊中的觀測值計數。每個樣本都必須有一個標籤「le」,其中標籤值表示區塊的包含上限。(沒有這樣標籤的樣本會被靜默忽略。)直方圖度量類型會自動提供帶有「_bucket」後綴和適當標籤的時間序列。",
- "documentation-histogram-stddev": "根據觀測值所在的儲存貯體的幾何平均值,傳回原生直方圖中觀測值的估計標準差。",
- "documentation-histogram-stdvar": "傳回原生直方圖中觀測值的估計標準差。",
- "documentation-histogram-sum": "傳回儲存在本機直方圖中的觀測值總和。",
- "documentation-holt-winters": "在 prometheus v3.x 中重新命名為 double_exponential_smoothing。對於等於或大於 v3.0 的 prometheus 版本,請使用 double_exponential_smoothing。\n\n根據「v」中的範圍為時間序列產生平滑值。平滑因子「sf」越低,舊資料的重要性就越高。趨勢因子「tf」越高,就會考慮越多的資料趨勢。「sf」和「tf」都必須介於 0 和 1 之間。",
- "documentation-hour": "傳回 UTC 中每個指定時間的當日時數。傳回的值介於 0 到 23 之間。",
- "documentation-idelta": "計算範圍向量「v」中最後兩個樣本之間的差異,傳回具有指定增量和等效標籤的即時向量。",
- "documentation-increase": "計算範圍向量中時間序列的增加。單調性中斷(例如由於目標重新啟動而導致的計數器重置)會自動調整。增加會推斷為涵蓋範圍向量選擇器中指定的完整時間範圍,因此即使計數器僅以整數增量增加,也可以獲得非整數結果。",
- "documentation-info": "傳回一組指標的最新詳細資訊和中繼資料,例如其標籤和目前值,而無需進行任何計算",
- "documentation-irate": "計算範圍向量中時間序列的每秒瞬間增長率。這是以最後兩個資料點為基礎。單調性中斷(例如由於目標重新啟動而導致的計數器重置)會自動調整。",
- "documentation-label-join": "對於「v」中的每個時序,使用「separator」連接所有「src_labels」的所有值,並傳回包含連接值的標籤「dst_label」的時序。此函數中可以有任意數量的「src_labels」。",
- "documentation-label-replace": "對於「v」中的每個時序,「label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)」將標籤「src_label」與正則表達式「regex」進行比對。如果匹配,則返回時序,並將標籤「dst_label」替換為「replacement」的擴展。「$1」被替換為第一個匹配的子群組,「$2」被替換為第二個匹配的子群組,依此類推。如果正則表達式不匹配,則返回不變的時序。",
- "documentation-last-over-time": "指定間隔內的最新點值。",
- "documentation-ln": "計算「v」中所有元素的自然對數。\n特殊情況為:\n * 'ln(+Inf) = +Inf'\n * 'ln(0) = -Inf'\n * 'ln(x < 0) = NaN'\n * 'ln(NaN) = NaN'",
- "documentation-log10": "計算「v」中所有元素的十進位對數。特殊案例等同於「ln」中的案例。",
- "documentation-log2": "計算「v」中所有元素的二進位對數。特殊案例等同於「ln」中的案例。",
- "documentation-max-over-time": "指定間隔內所有點的最大值。",
- "documentation-min-over-time": "指定間隔內所有點的最小值。",
- "documentation-minute": "傳回 UTC 中每個指定時間的分鐘。傳回的值介於 0 到 59 之間。",
- "documentation-month": "傳回 UTC 中每個指定時間的月份。傳回的值介於 1 到 12 之間,其中 1 表示一月等。",
- "documentation-pi": "傳回 pi",
- "documentation-predict-linear": "使用簡單的線性回歸,根據範圍向量「v」,預測從現在開始的時間序列「t」秒的值。",
- "documentation-present-over-time": "指定間隔內任何序列的值 1。",
- "documentation-quantile-over-time": "指定間隔內的 φ-quantile (0 ≤ φ ≤ 1) 值。",
- "documentation-rad": "將 v 中所有元素的度數轉換為弧度",
- "documentation-rate": "計算範圍向量中時間序列的每秒平均增長率。單調性中斷(例如由於目標重新啟動而導致的計數器重置)會自動調整。此外,計算外推到時間範圍的末端,允許錯過的刮擦或刮擦週期與範圍時間段的不完美對齊。",
- "documentation-resets": "對於每個輸入時間序列,「resets(v range-vector)」會將提供的時間範圍內的計數器重設數傳回為即時向量。兩個連續樣本之間的數值減少會被解釋為計數器重設。",
- "documentation-round": "將「v」中所有元素的樣本值四捨五入為最接近的整數。若出現相同情況,則向上取整。可選的「to_nearest」引數允許指定應將樣本值四捨五入為最接近的倍數。此倍數也可以是分數。",
- "documentation-scalar": "假設有一個單元素輸入向量,「scalar(v instant-vector)」會將該單元素的樣本值作為純量傳回。如果輸入向量不僅僅只有一個元素,「scalar」會傳回「NaN」。",
- "documentation-sgn": "傳回一個向量,其中所有樣本值都轉換為其符號,定義如下:如果 v 為正數,則為 1;如果 v 為負數,則為 -1;如果 v 等於零,則為 0。",
- "documentation-sort": "傳回按樣本值排序的向量元素,按遞增順序排序。",
- "documentation-sort-desc": "傳回按樣本值排序的向量元素,按遞減順序排列。",
- "documentation-sqrt": "計算「v」中所有元素的平方根。",
- "documentation-stddev-over-time": "指定間隔內值的總體標準差。",
- "documentation-stdvar-over-time": "指定間隔內值的母體標準差。",
- "documentation-sum-over-time": "指定間隔內所有值的總和。",
- "documentation-time": "傳回自 1970 年 1 月 1 日 (UTC) 以來的秒數。請注意,這實際上並不會傳回目前時間,而是傳回要評估運算式的時間。",
- "documentation-timestamp": "傳回指定向量每個樣本的時間戳記,作為自 1970 年 1 月 1 日 (UTC) 起的秒數。",
- "documentation-vector": "傳回標量「s」作為沒有標籤的向量。",
- "documentation-year": "傳回每個指定時間的年份(UTC 時間)。"
- },
- "getTrigonometricFunctions": {
- "documentation-acos": "計算「{{argument}}」中所有元素的反餘弦值",
- "documentation-acosh": "計算「{{argument}}」中所有元素的反雙曲餘弦值",
- "documentation-asin": "計算「{{argument}}」中所有元素的反正弦值",
- "documentation-asinh": "計算「{{argument}}」中所有元素的反雙曲正弦值",
- "documentation-atan": "計算「{{argument}}」所有元素的反正切",
- "documentation-atanh": "計算「{{argument}}」中所有元素的反雙曲正切",
- "documentation-cos": "計算「{{argument}}」中所有元素的餘弦值",
- "documentation-cosh": "計算「{{argument}}」中所有元素的雙曲餘弦值",
- "documentation-sin": "計算「{{argument}}」中所有元素的正弦值",
- "documentation-sinh": "計算「{{argument}}」中所有元素的反雙曲正弦值",
- "documentation-tan": "計算「{{argument}}」中所有元素的正切值",
- "documentation-tanh": "計算「{{argument}}」中所有元素的雙曲正切"
- }
- },
- "querybuilder": {
- "feedback-link": {
- "give-feedback": "提供意見回饋",
- "title-give-feedback": "指標瀏覽器為新功能,請告訴我們如何改善"
- },
- "get-collapsed-info": {
- "exemplars": "範例:{{value}}",
- "format": "格式:{{value}}",
- "legend": "圖例:{{value}}",
- "step": "步驟:{{value}}",
- "type": "類型:{{value}}"
- },
- "get-placeholders": {
- "browse": "按名稱搜尋指標",
- "type": "依照類型篩選"
- },
- "get-prom-types": {
- "description-counter": "累積指標,代表單一單調遞增計數器,其值只能增加或在重新啟動時重設為零。",
- "description-gauge": "代表單一數值的指標,可以任意上下移動。",
- "description-histogram": "直方圖對觀察結果(通常是請求持續時間或回應大小等)進行抽樣,並在可設定的區塊中進行計數。",
- "description-native-histogram": "原生直方圖在許多方面與經典的 Prometheus 直方圖不同:原生直方圖的區間界限是由一個公式計算得出,該公式取決於原生直方圖的比例(解析度),並且不是使用者定義的。",
- "description-no-type": "這些指標在中繼資料中沒有定義的類型。",
- "description-summary": "摘要樣本觀察(通常是請求持續時間和回應大小等),並且可以在滑動時間窗口中計算可設定的分位數。",
- "description-unknown": "這些指標在中繼資料中被賦予未知類型。",
- "label-counter": "計數器",
- "label-gauge": "儀表",
- "label-histogram": "直方圖",
- "label-native-histogram": "原生直方圖",
- "label-no-type": "無類型",
- "label-summary": "摘要",
- "label-unknown": "未知"
- },
- "handle-function": {
- "text": {
- "query-parsing-is-ambiguous": "查詢剖析不明確。"
- }
- },
- "label-filter-item": {
- "aria-label-remove": "移除{{name}}",
- "placeholder-select-label": "選擇標籤",
- "placeholder-select-value": "選擇值"
- },
- "label-filters": {
- "label-filters": "標籤篩選條件",
- "label-label-filters": "標籤篩選條件",
- "tooltip-label-filters": "選擇性設定:用於篩選為此查詢類型的指標選擇。"
- },
- "label-param-editor": {
- "loadingMessage-loading-labels": "載入標籤",
- "noOptionsMessage-no-labels-found": "未找到標籤"
- },
- "metric-combobox": {
- "async-select": {
- "aria-label-open-metrics-explorer": "開啟指標瀏覽器",
- "placeholder-select-metric": "選擇指標",
- "tooltip-open-metrics-explorer": "開啟計量瀏覽器"
- },
- "label-metric": "指標",
- "tooltip-metric": "選擇性設定:回傳指定指標中該標籤名稱的標籤值清單。"
- },
- "metrics-modal": {
- "aria-label-browse-metrics": "瀏覽指標",
- "currently-selected": "目前已選取:{{selected}}",
- "metrics-pre-filtered": "這些指標已透過標籤篩選條件中選擇的標籤進行預先篩選。",
- "title-metrics-explorer": "指標瀏覽器"
- },
- "nested-query": {
- "label": {
- "ignoring": "忽略",
- "on": "開啟"
- },
- "operator": "運算子",
- "tooltip-remove-match": "移除比對",
- "vector-matches": "向量比對"
- },
- "operation-editor": {
- "not-found": "找不到{{id}}操作",
- "title-remove": "移除{{name}}"
- },
- "operation-header": {
- "placeholder-replace-with": "取代為",
- "title-click-to-view-alternative-operations": "按一下以檢視替代操作",
- "title-remove-operation": "移除操作"
- },
- "operation-info-button": {
- "title-click-to-show-description": "按一下以顯示說明",
- "title-remove-operation": "移除操作"
- },
- "operation-list": {
- "operations": "操作",
- "placeholder-search": "搜尋",
- "title-add-operation": "新增操作"
- },
- "operation-param-editor": {
- "title-add": "新增{{name}}",
- "title-remove": "移除{{name}}"
- },
- "operation-utils": {
- "getAggregationExplainer": {
- "label-by": "計算維度上的「{{aggregationName}}」,同時保留 {{labelWord}} {{labels}}。",
- "label-default": "計算維度的「{{aggregationName}}」。",
- "label-without": "計算維度{{labels}}的「{{aggregationName}}」。保留所有其他標籤。"
- }
- },
- "prom-query-builder-options": {
- "aria-label-exemplars": "範例切換。",
- "aria-label-format": "格式化組合方塊",
- "aria-label-lower-limit-parameter": "最小步驟文字方塊,設定步驟參數的下限",
- "aria-label-select-resolution": "選擇解決方案",
- "aria-label-type": "類型單選按鈕群組",
- "format-options": {
- "label-heatmap": "熱圖",
- "label-table": "表格",
- "label-time-series": "時間序列"
- },
- "label-exemplars": "範例",
- "label-format": "格式",
- "label-min-step": "最少步驟數",
- "label-resolution": "解析度",
- "label-type": "類型",
- "placeholder-auto": "自動",
- "title-options": "選項",
- "tooltip-min-step": "Prometheus 查詢的步驟參數以及 <2>{{interval}}2> 和 <4>{{rateInterval}}4> 變數的其他下限。"
- },
- "prom-query-editor-selector": {
- "body-syntax-error": "存在語法錯誤,或在切換至編輯器模式時無法將查詢結構視覺化。查詢的部分可能會遺失。",
- "confirmText-continue": "繼續",
- "kick-start-your-query": "啟動您的查詢",
- "label-explain": "說明",
- "run-queries": "執行查詢",
- "title-parsing-error-switch-builder": "剖析錯誤:要切換至編輯器模式嗎?"
- },
- "prom-query-legend-editor": {
- "aria-label-legend": "圖例組合方塊",
- "label-legend": "圖例",
- "placeholder-select-legend-mode": "選擇圖例模式",
- "tooltip-legend": "序列名稱覆寫或範本。例如:{{templateExample}} 將替換為{{labelName}}的標籤值。"
- },
- "query-builder-hints": {
- "hint-details": "提示:{{hintDetails}}"
- },
- "query-editor-mode-toggle": {
- "editor-modes": {
- "label-builder": "建立器",
- "label-code": "代碼"
- }
- },
- "query-pattern": {
- "apply-query": "套用查詢",
- "aria-label-apply-query-starter-button": "套用查詢啟動按鈕",
- "aria-label-back-button": "返回鍵",
- "aria-label-create-new-query-button": "建立新查詢按鈕",
- "aria-label-raw-query": "{{patternName}} 原始查詢",
- "aria-label-use-this-query-button": "使用此查詢按鈕",
- "back": "返回",
- "create-new-query": "建立新查詢",
- "use-this-query": "使用此查詢"
- },
- "query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "關閉啟動您的查詢模式",
- "aria-label-kick-start-your-query-modal": "啟動您的查詢模式",
- "aria-label-toggle-query-starter": "開啟和關閉{{patternType}}查詢啟動卡",
- "close": "關閉",
- "description-kick-start-your-query": "選擇其中一項查詢來啟動您的查詢。您可以接著繼續完成查詢。",
- "label-toggle-query-starter": "{{patternType}} 查詢啟動器",
- "title-kick-start-your-query": "啟動您的查詢"
- },
- "raw-query": {
- "aria-label-selector": "選擇器"
- },
- "results-table": {
- "content-descriptive-type": "建立{{descriptiveType}}時,Prometheus 會透過類型計數器顯示多個序列。",
- "description": "說明",
- "message-expand-label-filters": "未找到指標。請嘗試展開標籤篩選條件。",
- "message-expand-search": "未找到指標。請嘗試擴大搜尋範圍和篩選條件。",
- "message-no-metrics-found": "在資料來源中未找到任何指標。",
- "name": "名稱(名字)",
- "type": "類型"
- }
- }
- }
-}
\ No newline at end of file
diff --git a/packages/grafana-prometheus/src/metric_find_query.test.ts b/packages/grafana-prometheus/src/metric_find_query.test.ts
deleted file mode 100644
index 4ba160d5ae3..00000000000
--- a/packages/grafana-prometheus/src/metric_find_query.test.ts
+++ /dev/null
@@ -1,229 +0,0 @@
-import { getDefaultTimeRange, type TimeRange } from '@grafana/data';
-
-import { type PrometheusDatasource } from './datasource';
-import { PrometheusMetricFindQuery } from './metric_find_query';
-
-jest.mock('./datasource');
-
-describe('PrometheusMetricFindQuery', () => {
- let datasource: jest.Mocked;
- let timeRange: TimeRange;
-
- beforeEach(() => {
- datasource = {
- metadataRequest: jest.fn(),
- languageProvider: {
- start: jest.fn(),
- queryLabelKeys: jest.fn().mockResolvedValue([]),
- queryLabelValues: jest.fn().mockResolvedValue([]),
- },
- getTagKeys: jest.fn(),
- } as unknown as jest.Mocked;
-
- timeRange = getDefaultTimeRange();
- });
-
- describe('Label Names Query', () => {
- it('should call getTagKeys for simple label_names query', async () => {
- const expectedLabelNames = [{ text: 'label1' }, { text: 'label2' }, { text: 'label3' }];
- datasource.getTagKeys.mockResolvedValue(expectedLabelNames);
-
- const query = new PrometheusMetricFindQuery(datasource, 'label_names()');
- const results = await query.process(timeRange);
-
- expect(results).toEqual(expectedLabelNames);
- expect(datasource.getTagKeys).toHaveBeenCalledWith({ filters: [], timeRange });
- });
-
- it('should call queryLabelKeys with correct parameters', async () => {
- const query = new PrometheusMetricFindQuery(datasource, 'label_names(metric_name) ');
- await query.process(timeRange);
- expect(datasource.languageProvider.queryLabelKeys).toHaveBeenCalledWith(
- timeRange,
- '{__name__=~".*metric_name.*"}'
- );
- });
- });
-
- describe('Label Values Query', () => {
- it('should call queryLabelValues with correct parameters without metric filter', async () => {
- const query = new PrometheusMetricFindQuery(datasource, 'label_values(label1)');
- await query.process(timeRange);
-
- expect(datasource.languageProvider.queryLabelValues).toHaveBeenCalledWith(timeRange, 'label1', undefined);
- });
-
- it('should call queryLabelValues with correct parameters with metric filter', async () => {
- const query = new PrometheusMetricFindQuery(datasource, 'label_values(metric{label="value"}, label1)');
- await query.process(timeRange);
-
- expect(datasource.languageProvider.queryLabelValues).toHaveBeenCalledWith(
- timeRange,
- 'label1',
- 'metric{label="value"}'
- );
- });
- });
-
- describe('Metric Names Query', () => {
- it('should call queryLabelValues with correct parameters', async () => {
- const query = new PrometheusMetricFindQuery(datasource, 'metrics(.*metric.*)');
- await query.process(timeRange);
-
- expect(datasource.languageProvider.queryLabelValues).toHaveBeenCalledWith(
- timeRange,
- '__name__',
- '{__name__=~".*metric.*"}'
- );
- });
- });
-
- describe('Query Result', () => {
- it('should handle scalar result', async () => {
- datasource.metadataRequest = jest.fn().mockResolvedValue({
- data: {
- data: {
- resultType: 'scalar',
- result: [1234567, '42'],
- },
- },
- });
-
- const query = new PrometheusMetricFindQuery(datasource, 'query_result(sum(metric))');
- const results = await query.process(timeRange);
-
- expect(results).toEqual([{ text: '42', expandable: false }]);
- });
-
- it('should handle vector result', async () => {
- datasource.metadataRequest = jest.fn().mockResolvedValue({
- data: {
- data: {
- resultType: 'vector',
- result: [
- {
- metric: { __name__: 'metric', label: 'value' },
- value: [1234567, '42'],
- },
- ],
- },
- },
- });
-
- const query = new PrometheusMetricFindQuery(datasource, 'query_result(metric)');
- const results = await query.process(timeRange);
-
- expect(results).toEqual([
- {
- text: 'metric{label="value"} 42 1234567000',
- expandable: true,
- },
- ]);
- });
-
- it('should handle scalar result with timestamp', async () => {
- datasource.metadataRequest = jest.fn().mockResolvedValue({
- data: {
- data: {
- resultType: 'scalar',
- result: [1443454528.0, '2'],
- },
- },
- });
-
- const query = new PrometheusMetricFindQuery(datasource, 'query_result(1+1)');
- const results = await query.process(timeRange);
-
- expect(results).toEqual([{ text: '2', expandable: false }]);
- });
-
- it('should handle vector result with metric name and labels', async () => {
- datasource.metadataRequest = jest.fn().mockResolvedValue({
- data: {
- data: {
- resultType: 'vector',
- result: [
- {
- metric: { __name__: 'metric', job: 'testjob' },
- value: [1443454528.0, '3846'],
- },
- ],
- },
- },
- });
-
- const query = new PrometheusMetricFindQuery(datasource, 'query_result(metric)');
- const results = await query.process(timeRange);
-
- expect(results).toEqual([{ text: 'metric{job="testjob"} 3846 1443454528000', expandable: true }]);
- });
-
- it('should throw error for unknown result type', async () => {
- datasource.metadataRequest = jest.fn().mockResolvedValue({
- data: {
- data: {
- resultType: 'unknown',
- },
- },
- });
-
- const query = new PrometheusMetricFindQuery(datasource, 'query_result(metric)');
- await expect(query.process(timeRange)).rejects.toThrow('Unknown/Unhandled result type: [unknown]');
- });
- });
-
- describe('Series Query', () => {
- it('should return series', async () => {
- const metric = { __name__: 'metric', label: 'value' };
- datasource.metadataRequest = jest.fn().mockResolvedValue({
- data: {
- data: [metric],
- },
- });
-
- const query = new PrometheusMetricFindQuery(datasource, 'metric{label="value"}');
- const results = await query.process(timeRange);
-
- expect(results).toEqual([{ text: 'metric{label="value"}', expandable: true }]);
- expect(datasource.metadataRequest).toHaveBeenCalledWith('/api/v1/series', {
- 'match[]': 'metric{label="value"}',
- start: expect.any(String),
- end: expect.any(String),
- });
- });
-
- it('should return series with metric name and labels', async () => {
- const metric = { __name__: 'up', instance: '127.0.0.1:1234', job: 'job1' };
- datasource.metadataRequest = jest.fn().mockResolvedValue({
- data: {
- data: [metric],
- },
- });
-
- const query = new PrometheusMetricFindQuery(datasource, 'up{job="job1"}');
- const results = await query.process(timeRange);
-
- expect(results).toEqual([{ text: 'up{instance="127.0.0.1:1234",job="job1"}', expandable: true }]);
- });
- });
-
- describe('UTF-8 Support', () => {
- it('should handle UTF-8 label names in label_values query', async () => {
- datasource.languageProvider.queryLabelValues = jest.fn().mockResolvedValue(['value1', 'value2']);
-
- const query = new PrometheusMetricFindQuery(datasource, 'label_values(metric,instance.test)');
- await query.process(timeRange);
-
- expect(datasource.languageProvider.queryLabelValues).toHaveBeenCalledWith(timeRange, 'instance.test', 'metric');
- });
-
- it('should handle UTF-8 metric names in label_values query', async () => {
- datasource.languageProvider.queryLabelValues = jest.fn().mockResolvedValue(['value1', 'value2']);
-
- const query = new PrometheusMetricFindQuery(datasource, 'label_values(utf8.metric,label)');
- await query.process(timeRange);
-
- expect(datasource.languageProvider.queryLabelValues).toHaveBeenCalledWith(timeRange, 'label', 'utf8.metric');
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/metric_find_query.ts b/packages/grafana-prometheus/src/metric_find_query.ts
deleted file mode 100644
index 24dae4f35af..00000000000
--- a/packages/grafana-prometheus/src/metric_find_query.ts
+++ /dev/null
@@ -1,150 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/metric_find_query.ts
-import { map as _map } from 'lodash';
-
-import { type MetricFindValue, type TimeRange } from '@grafana/data';
-
-import { METRIC_LABEL } from './constants';
-import { type PrometheusDatasource } from './datasource';
-import { getPrometheusTime } from './language_utils';
-import {
- PrometheusLabelNamesRegex,
- PrometheusLabelNamesRegexWithMatch,
- PrometheusLabelValuesRegex,
- PrometheusMetricNamesRegex,
- PrometheusQueryResultRegex,
-} from './migrations/variableMigration';
-import { getOriginalMetricName } from './result_transformer';
-
-export class PrometheusMetricFindQuery {
- constructor(
- private datasource: PrometheusDatasource,
- private query: string
- ) {
- this.datasource = datasource;
- this.query = query;
- }
-
- async process(timeRange: TimeRange): Promise {
- const labelNamesRegex = PrometheusLabelNamesRegex;
- const labelNamesRegexWithMatch = PrometheusLabelNamesRegexWithMatch;
- const labelValuesRegex = PrometheusLabelValuesRegex;
- const metricNamesRegex = PrometheusMetricNamesRegex;
- const queryResultRegex = PrometheusQueryResultRegex;
- const labelNamesQuery = this.query.match(labelNamesRegex);
- const labelNamesMatchQuery = this.query.match(labelNamesRegexWithMatch);
-
- if (labelNamesMatchQuery) {
- const selector = `{__name__=~".*${labelNamesMatchQuery[1]}.*"}`;
- const keys = await this.datasource.languageProvider.queryLabelKeys(timeRange, selector);
- return keys.filter((key) => key !== METRIC_LABEL).map((result) => ({ text: result }));
- }
-
- if (labelNamesQuery) {
- return this.datasource.getTagKeys({ filters: [], timeRange });
- }
-
- const labelValuesQuery = this.query.match(labelValuesRegex);
- if (labelValuesQuery) {
- const filter = labelValuesQuery[1];
- const label = labelValuesQuery[2];
- if (isFilterDefined(filter)) {
- return await this.labelValuesQuery(label, timeRange, filter);
- } else {
- // Exclude the filter part of the expression because it is blank or empty
- return await this.labelValuesQuery(label, timeRange);
- }
- }
-
- const metricNamesQuery = this.query.match(metricNamesRegex);
- if (metricNamesQuery) {
- return await this.metricNameQuery(metricNamesQuery[1], timeRange);
- }
-
- const queryResultQuery = this.query.match(queryResultRegex);
- if (queryResultQuery) {
- return this.queryResultQuery(queryResultQuery[1], timeRange);
- }
-
- // if query contains full metric name, return metric name and label list
- const expressions = ['label_values()', 'metrics()', 'query_result()'];
- if (!expressions.includes(this.query)) {
- return await this.metricNameAndLabelsQuery(this.query, timeRange);
- }
-
- return Promise.resolve([]);
- }
-
- async labelValuesQuery(label: string, range: TimeRange, metric?: string) {
- const values = await this.datasource.languageProvider.queryLabelValues(range, label, metric);
- return values.map((value) => ({ text: value }));
- }
-
- async metricNameQuery(metricFilterPattern: string, range: TimeRange) {
- const names = await this.datasource.languageProvider.queryLabelValues(
- range,
- METRIC_LABEL,
- `{__name__=~"${metricFilterPattern}"}`
- );
- return names.map((n) => ({ text: n, expandable: true }));
- }
-
- queryResultQuery(query: string, range: TimeRange) {
- const url = '/api/v1/query';
- const params = {
- query,
- time: getPrometheusTime(range.to, true).toString(),
- };
- return this.datasource.metadataRequest(url, params).then((result) => {
- switch (result.data.data.resultType) {
- case 'scalar': // [ , "" ]
- case 'string': // [ , "" ]
- return [
- {
- text: result.data.data.result[1] || '',
- expandable: false,
- },
- ];
- case 'vector':
- return _map(result.data.data.result, (metricData) => {
- let text = metricData.metric.__name__ || '';
- delete metricData.metric.__name__;
- text +=
- '{' +
- _map(metricData.metric, (v, k) => {
- return k + '="' + v + '"';
- }).join(',') +
- '}';
- text += ' ' + metricData.value[1] + ' ' + metricData.value[0] * 1000;
-
- return {
- text: text,
- expandable: true,
- };
- });
- default:
- throw Error(`Unknown/Unhandled result type: [${result.data.data.resultType}]`);
- }
- });
- }
-
- async metricNameAndLabelsQuery(query: string, range: TimeRange): Promise {
- const start = getPrometheusTime(range.from, false);
- const end = getPrometheusTime(range.to, true);
- const params = {
- 'match[]': query,
- start: start.toString(),
- end: end.toString(),
- };
-
- const result = await this.datasource.metadataRequest(`/api/v1/series`, params);
- return result.data.data.map((metric: Record) => ({
- text: getOriginalMetricName(metric),
- expandable: true,
- }));
- }
-}
-
-function isFilterDefined(filter: string) {
- // We consider blank strings or the empty filter {} as an undefined filter
- return filter && filter.split(' ').join('') !== '{}';
-}
diff --git a/packages/grafana-prometheus/src/migrations/variableMigration.ts b/packages/grafana-prometheus/src/migrations/variableMigration.ts
deleted file mode 100644
index 7008b19e7a1..00000000000
--- a/packages/grafana-prometheus/src/migrations/variableMigration.ts
+++ /dev/null
@@ -1,137 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/migrations/variableMigration.ts
-import { buildVisualQueryFromString } from '../querybuilder/parsing';
-import { promQueryModeller } from '../querybuilder/shared/modeller_instance';
-import { type PromVariableQuery, PromVariableQueryType as QueryType } from '../types';
-
-export const PrometheusLabelNamesRegex = /^label_names\(\)\s*$/;
-export const PrometheusLabelValuesRegex = /^label_values\((?:(.+),\s*)?(.+)\)\s*$/;
-export const PrometheusMetricNamesRegex = /^metrics\((.+)\)\s*$/;
-export const PrometheusQueryResultRegex = /^query_result\((.+)\)\s*$/;
-export const PrometheusLabelNamesRegexWithMatch = /^label_names\((.+)\)\s*$/;
-
-export function migrateVariableQueryToEditor(rawQuery: string | PromVariableQuery): PromVariableQuery {
- // If not string, we assume PromVariableQuery
- if (typeof rawQuery !== 'string') {
- return rawQuery;
- }
-
- const queryBase = {
- refId: 'PrometheusDatasource-VariableQuery',
- qryType: QueryType.LabelNames,
- };
-
- const labelNamesMatchQuery = rawQuery.match(PrometheusLabelNamesRegexWithMatch);
-
- if (labelNamesMatchQuery) {
- return {
- ...queryBase,
- qryType: QueryType.LabelNames,
- match: labelNamesMatchQuery[1],
- };
- }
-
- const labelNames = rawQuery.match(PrometheusLabelNamesRegex);
- if (labelNames) {
- return {
- ...queryBase,
- qryType: QueryType.LabelNames,
- };
- }
-
- const labelValuesCheck = rawQuery.match(/^label_values\(/);
- if (labelValuesCheck) {
- const labelValues = rawQuery.match(PrometheusLabelValuesRegex);
- const label = labelValues ? labelValues[2] : '';
- const metric = labelValues ? labelValues[1] : '';
-
- if (metric) {
- const visQuery = buildVisualQueryFromString(metric);
- return {
- ...queryBase,
- qryType: QueryType.LabelValues,
- label,
- metric: visQuery.query.metric,
- labelFilters: visQuery.query.labels,
- };
- } else {
- return {
- ...queryBase,
- qryType: QueryType.LabelValues,
- label,
- };
- }
- }
-
- const metricNamesCheck = rawQuery.match(/^metrics\(/);
- if (metricNamesCheck) {
- const metricNames = rawQuery.match(PrometheusMetricNamesRegex);
- const metric = metricNames ? metricNames[1] : '';
- return {
- ...queryBase,
- qryType: QueryType.MetricNames,
- metric,
- };
- }
-
- const queryResultCheck = rawQuery.match(/^query_result\(/);
- if (queryResultCheck) {
- const queryResult = rawQuery.match(PrometheusQueryResultRegex);
- const varQuery = queryResult ? queryResult[1] : '';
- return {
- ...queryBase,
- qryType: QueryType.VarQueryResult,
- varQuery,
- };
- }
-
- // seriesQuery does not have a function and no regex above
- if (!labelNames && !labelValuesCheck && !metricNamesCheck && !queryResultCheck) {
- return {
- ...queryBase,
- qryType: QueryType.SeriesQuery,
- seriesQuery: rawQuery,
- };
- }
-
- return queryBase;
-}
-
-// migrate it back to a string with the correct variables in place
-export function migrateVariableEditorBackToVariableSupport(QueryVariable: PromVariableQuery): string {
- switch (QueryVariable.qryType) {
- case QueryType.LabelNames:
- if (QueryVariable.match) {
- return `label_names(${QueryVariable.match})`;
- }
- return 'label_names()';
- case QueryType.LabelValues:
- if (QueryVariable.metric || (QueryVariable.labelFilters && QueryVariable.labelFilters.length !== 0)) {
- const visualQueryQuery = {
- metric: QueryVariable.metric ?? '',
- labels: QueryVariable.labelFilters ?? [],
- operations: [],
- };
-
- const metric = promQueryModeller.renderQuery(visualQueryQuery);
- return `label_values(${metric},${QueryVariable.label})`;
- } else {
- return `label_values(${QueryVariable.label})`;
- }
- case QueryType.MetricNames:
- return `metrics(${QueryVariable.metric})`;
- case QueryType.VarQueryResult:
- const varQuery = removeLineBreaks(QueryVariable.varQuery);
- return `query_result(${varQuery})`;
- case QueryType.SeriesQuery:
- return QueryVariable.seriesQuery ?? '';
- case QueryType.ClassicQuery:
- return QueryVariable.classicQuery ?? '';
- }
-
- return '';
-}
-
-// allow line breaks in query result textarea
-function removeLineBreaks(input?: string) {
- return input ? input.replace(/[\r\n]+/gm, '') : '';
-}
diff --git a/packages/grafana-prometheus/src/module.test.ts b/packages/grafana-prometheus/src/module.test.ts
deleted file mode 100644
index 0fb7bb592a8..00000000000
--- a/packages/grafana-prometheus/src/module.test.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/module.test.ts
-import { plugin as PrometheusDatasourcePlugin } from './module';
-
-describe('module', () => {
- it('should have metrics query field in panels and Explore', () => {
- expect(PrometheusDatasourcePlugin.components.QueryEditor).toBeDefined();
- });
-});
diff --git a/packages/grafana-prometheus/src/module.ts b/packages/grafana-prometheus/src/module.ts
deleted file mode 100644
index 0bbabf50383..00000000000
--- a/packages/grafana-prometheus/src/module.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/module.ts
-// DONT NEED THIS BUT MAYBE EXPORT THIS TO CORE PROM
-
-import { DataSourcePlugin } from '@grafana/data';
-
-import { PromCheatSheet } from './components/PromCheatSheet';
-import { PromQueryEditorByApp } from './components/PromQueryEditorByApp';
-import { ConfigEditor } from './configuration/ConfigEditor';
-import { PrometheusDatasource } from './datasource';
-
-export const plugin = new DataSourcePlugin(PrometheusDatasource)
- .setQueryEditor(PromQueryEditorByApp)
- .setConfigEditor(ConfigEditor)
- .setQueryEditorHelp(PromCheatSheet);
diff --git a/packages/grafana-prometheus/src/promql.test.ts b/packages/grafana-prometheus/src/promql.test.ts
deleted file mode 100644
index 219d5eac3b8..00000000000
--- a/packages/grafana-prometheus/src/promql.test.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/promql.test.ts
-import Prism from 'prismjs';
-
-import { promqlGrammar } from './promql';
-
-describe('Loki syntax', () => {
- it('should highlight Loki query correctly', () => {
- expect(Prism.highlight('{key="val#ue"}', promqlGrammar, 'promql')).toBe(
- '{ key ="val#ue" } '
- );
- expect(Prism.highlight('{key="#value"}', promqlGrammar, 'promql')).toBe(
- '{ key ="#value" } '
- );
- expect(Prism.highlight('{key="value#"}', promqlGrammar, 'promql')).toBe(
- '{ key ="value#" } '
- );
- expect(Prism.highlight('#test{key="value"}', promqlGrammar, 'promql')).toBe(
- ''
- );
- expect(Prism.highlight('{key="value"}#test', promqlGrammar, 'promql')).toBe(
- '{ key ="value" } '
- );
- });
-});
diff --git a/packages/grafana-prometheus/src/promql.ts b/packages/grafana-prometheus/src/promql.ts
deleted file mode 100644
index d6e8a919d63..00000000000
--- a/packages/grafana-prometheus/src/promql.ts
+++ /dev/null
@@ -1,889 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/promql.ts
-import { type Grammar } from 'prismjs';
-
-import { t } from '@grafana/i18n';
-import { type CompletionItem } from '@grafana/ui';
-
-export const OPERATORS = ['by', 'group_left', 'group_right', 'ignoring', 'on', 'offset', 'without'];
-export const LOGICAL_OPERATORS = ['or', 'and', 'unless'];
-
-const getTrigonometricFunctions: () => CompletionItem[] = () => [
- {
- label: 'acos',
- insertText: 'acos',
- detail: 'acos(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-acos',
- 'calculates the arccosine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'acosh',
- insertText: 'acosh',
- detail: 'acosh(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-acosh',
- 'calculates the inverse hyperbolic cosine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'asin',
- insertText: 'asin',
- detail: 'asin(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-asin',
- 'calculates the arcsine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'asinh',
- insertText: 'asinh',
- detail: 'asinh(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-asinh',
- 'calculates the inverse hyperbolic sine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'atan',
- insertText: 'atan',
- detail: 'atan(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-atan',
- 'calculates the arctangent of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'atanh',
- insertText: 'atanh',
- detail: 'atanh(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-atanh',
- 'calculates the inverse hyperbolic tangent of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'cos',
- insertText: 'cos',
- detail: 'cos(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-cos',
- 'calculates the cosine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'cosh',
- insertText: 'cosh',
- detail: 'cosh(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-cosh',
- 'calculates the hyperbolic cosine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'sin',
- insertText: 'sin',
- detail: 'sin(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-sin',
- 'calculates the sine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'sinh',
- insertText: 'sinh',
- detail: 'sinh(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-sinh',
- 'calculates the hyperbolic sine of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'tan',
- insertText: 'tan',
- detail: 'tan(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-tan',
- 'calculates the tangent of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
- {
- label: 'tanh',
- insertText: 'tanh',
- detail: 'tanh(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-tanh',
- 'calculates the hyperbolic tangent of all elements in {{argument}}',
- { argument: 'v' }
- ),
- },
-];
-
-const getAggregationOptions: () => CompletionItem[] = () => [
- {
- label: 'sum',
- insertText: 'sum',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-sum',
- 'Calculate sum over dimensions'
- ),
- },
- {
- label: 'min',
- insertText: 'min',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-min',
- 'Select minimum over dimensions'
- ),
- },
- {
- label: 'max',
- insertText: 'max',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-max',
- 'Select maximum over dimensions'
- ),
- },
- {
- label: 'avg',
- insertText: 'avg',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-avg',
- 'Calculate the average over dimensions'
- ),
- },
- {
- label: 'group',
- insertText: 'group',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-group',
- 'All values in the resulting vector are 1'
- ),
- },
- {
- label: 'stddev',
- insertText: 'stddev',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-stddev',
- 'Calculate population standard deviation over dimensions'
- ),
- },
- {
- label: 'stdvar',
- insertText: 'stdvar',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-stdvar',
- 'Calculate population standard variance over dimensions'
- ),
- },
- {
- label: 'count',
- insertText: 'count',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-count',
- 'Count number of elements in the vector'
- ),
- },
- {
- label: 'count_values',
- insertText: 'count_values',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-count-values',
- 'Count number of elements with the same value'
- ),
- },
- {
- label: 'bottomk',
- insertText: 'bottomk',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-bottomk',
- 'Smallest k elements by sample value'
- ),
- },
- {
- label: 'topk',
- insertText: 'topk',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-topk',
- 'Largest k elements by sample value'
- ),
- },
- {
- label: 'quantile',
- insertText: 'quantile',
- documentation: t(
- 'grafana-prometheus.promql.getAggregationOptions.documentation-quantile',
- 'Calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions'
- ),
- },
-];
-
-export const getFunctions = () => [
- ...getAggregationOptions(),
- ...getTrigonometricFunctions(),
- {
- insertText: 'abs',
- label: 'abs',
- detail: 'abs(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-abs',
- 'Returns the input vector with all sample values converted to their absolute value.'
- ),
- },
- {
- insertText: 'absent',
- label: 'absent',
- detail: 'absent(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-absent',
- 'Returns an empty vector if the vector passed to it has any elements and a 1-element vector with the value 1 if the vector passed to it has no elements. This is useful for alerting on when no time series exist for a given metric name and label combination.'
- ),
- },
- {
- insertText: 'absent_over_time',
- label: 'absent_over_time',
- detail: 'absent(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-absent-over-time',
- 'Returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements.'
- ),
- },
- {
- insertText: 'ceil',
- label: 'ceil',
- detail: 'ceil(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-ceil',
- 'Rounds the sample values of all elements in `v` up to the nearest integer.'
- ),
- },
- {
- insertText: 'changes',
- label: 'changes',
- detail: 'changes(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-changes',
- 'For each input time series, `changes(v range-vector)` returns the number of times its value has changed within the provided time range as an instant vector.'
- ),
- },
- {
- insertText: 'clamp',
- label: 'clamp',
- detail: 'clamp(v instant-vector, min scalar, max scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-clamp',
- 'Clamps the sample values of all elements in `v` to have a lower limit of `min` and an upper limit of `max`.'
- ),
- },
- {
- insertText: 'clamp_max',
- label: 'clamp_max',
- detail: 'clamp_max(v instant-vector, max scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-clamp-max',
- 'Clamps the sample values of all elements in `v` to have an upper limit of `max`.'
- ),
- },
- {
- insertText: 'clamp_min',
- label: 'clamp_min',
- detail: 'clamp_min(v instant-vector, min scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-clamp-min',
- 'Clamps the sample values of all elements in `v` to have a lower limit of `min`.'
- ),
- },
- {
- insertText: 'count_scalar',
- label: 'count_scalar',
- detail: 'count_scalar(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-count-scalar',
- 'Returns the number of elements in a time series vector as a scalar. This is in contrast to the `count()` aggregation operator, which always returns a vector (an empty one if the input vector is empty) and allows grouping by labels via a `by` clause.'
- ),
- },
- {
- insertText: 'deg',
- label: 'deg',
- detail: 'deg(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-deg',
- 'Converts radians to degrees for all elements in v'
- ),
- },
- {
- insertText: 'day_of_month',
- label: 'day_of_month',
- detail: 'day_of_month(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-day-of-month',
- 'Returns the day of the month for each of the given times in UTC. Returned values are from 1 to 31.'
- ),
- },
- {
- insertText: 'day_of_week',
- label: 'day_of_week',
- detail: 'day_of_week(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-day-of-week',
- 'Returns the day of the week for each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc.'
- ),
- },
- {
- insertText: 'day_of_year',
- label: 'day_of_year',
- detail: 'day_of_year(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-day-of-year',
- 'Returns the day of the year for each of the given times in UTC. Returned values are from 1 to 365 for non-leap years, and 1 to 366 in leap years.'
- ),
- },
- {
- insertText: 'days_in_month',
- label: 'days_in_month',
- detail: 'days_in_month(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-days-in-month',
- 'Returns number of days in the month for each of the given times in UTC. Returned values are from 28 to 31.'
- ),
- },
- {
- insertText: 'delta',
- label: 'delta',
- detail: 'delta(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-delta',
- 'Calculates the difference between the first and last value of each time series element in a range vector `v`, returning an instant vector with the given deltas and equivalent labels. The delta is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if the sample values are all integers.'
- ),
- },
- {
- insertText: 'deriv',
- label: 'deriv',
- detail: 'deriv(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-deriv',
- 'Calculates the per-second derivative of the time series in a range vector `v`, using simple linear regression.'
- ),
- },
- {
- insertText: 'double_exponential_smoothing',
- label: 'double_exponential_smoothing',
- detail: 'double_exponential_smoothing(v range-vector, sf scalar, tf scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-double-exponential-smoothing',
- 'Produces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.'
- ),
- },
- {
- insertText: 'drop_common_labels',
- label: 'drop_common_labels',
- detail: 'drop_common_labels(instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-drop-common-labels',
- 'Drops all labels that have the same name and value across all series in the input vector.'
- ),
- },
- {
- insertText: 'exp',
- label: 'exp',
- detail: 'exp(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-exp',
- 'Calculates the exponential function for all elements in `v`.\nSpecial cases are:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`'
- ),
- },
- {
- insertText: 'floor',
- label: 'floor',
- detail: 'floor(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-floor',
- 'Rounds the sample values of all elements in `v` down to the nearest integer.'
- ),
- },
- {
- insertText: 'histogram_quantile',
- label: 'histogram_quantile',
- detail: 'histogram_quantile(φ float, b instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-histogram-quantile',
- 'Calculates the φ-quantile (0 ≤ φ ≤ 1) from the buckets `b` of a histogram. The samples in `b` are the counts of observations in each bucket. Each sample must have a label `le` where the label value denotes the inclusive upper bound of the bucket. (Samples without such a label are silently ignored.) The histogram metric type automatically provides time series with the `_bucket` suffix and the appropriate labels.'
- ),
- },
- {
- insertText: 'holt_winters',
- label: 'holt_winters',
- detail: 'holt_winters(v range-vector, sf scalar, tf scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-holt-winters',
- 'Renamed as double_exponential_smoothing in prometheus v3.x. For prometheus versions equal and greater than v3.0 please use double_exponential_smoothing. \n\nProduces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.'
- ),
- },
- {
- insertText: 'hour',
- label: 'hour',
- detail: 'hour(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-hour',
- 'Returns the hour of the day for each of the given times in UTC. Returned values are from 0 to 23.'
- ),
- },
- {
- insertText: 'idelta',
- label: 'idelta',
- detail: 'idelta(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-idelta',
- 'Calculates the difference between the last two samples in the range vector `v`, returning an instant vector with the given deltas and equivalent labels.'
- ),
- },
- {
- insertText: 'increase',
- label: 'increase',
- detail: 'increase(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-increase',
- 'Calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.'
- ),
- },
- {
- insertText: 'info',
- label: 'info',
- detail: 'info(v instant-vector, [data-label-selector instant-vector])',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-info',
- 'Returns latest details and metadata about a group of metrics, such as their labels and current values, without doing any calculations'
- ),
- },
- {
- insertText: 'irate',
- label: 'irate',
- detail: 'irate(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-irate',
- 'Calculates the per-second instant rate of increase of the time series in the range vector. This is based on the last two data points. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for.'
- ),
- },
- {
- insertText: 'label_join',
- label: 'label_join',
- detail:
- 'label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-label-join',
- 'For each timeseries in `v`, joins all the values of all the `src_labels` using `separator` and returns the timeseries with the label `dst_label` containing the joined value. There can be any number of `src_labels` in this function.'
- ),
- },
- {
- insertText: 'label_replace',
- label: 'label_replace',
- detail: 'label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-label-replace',
- "For each timeseries in `v`, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)` matches the regular expression `regex` against the label `src_label`. If it matches, then the timeseries is returned with the label `dst_label` replaced by the expansion of `replacement`. `$1` is replaced with the first matching subgroup, `$2` with the second etc. If the regular expression doesn't match then the timeseries is returned unchanged."
- ),
- },
- {
- insertText: 'ln',
- label: 'ln',
- detail: 'ln(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-ln',
- 'Calculates the natural logarithm for all elements in `v`.\nSpecial cases are:\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`'
- ),
- },
- {
- insertText: 'log2',
- label: 'log2',
- detail: 'log2(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-log2',
- 'Calculates the binary logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.'
- ),
- },
- {
- insertText: 'log10',
- label: 'log10',
- detail: 'log10(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-log10',
- 'Calculates the decimal logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.'
- ),
- },
- {
- insertText: 'minute',
- label: 'minute',
- detail: 'minute(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-minute',
- 'Returns the minute of the hour for each of the given times in UTC. Returned values are from 0 to 59.'
- ),
- },
- {
- insertText: 'month',
- label: 'month',
- detail: 'month(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-month',
- 'Returns the month of the year for each of the given times in UTC. Returned values are from 1 to 12, where 1 means January etc.'
- ),
- },
- {
- insertText: 'pi',
- label: 'pi',
- detail: 'pi()',
- documentation: t('grafana-prometheus.promql.getFunctions.documentation-pi', 'Returns pi'),
- },
- {
- insertText: 'predict_linear',
- label: 'predict_linear',
- detail: 'predict_linear(v range-vector, t scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-predict-linear',
- 'Predicts the value of time series `t` seconds from now, based on the range vector `v`, using simple linear regression.'
- ),
- },
- {
- insertText: 'rad',
- label: 'rad',
- detail: 'rad(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-rad',
- 'Converts degrees to radians for all elements in v'
- ),
- },
- {
- insertText: 'rate',
- label: 'rate',
- detail: 'rate(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-rate',
- "Calculates the per-second average rate of increase of the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. Also, the calculation extrapolates to the ends of the time range, allowing for missed scrapes or imperfect alignment of scrape cycles with the range's time period."
- ),
- },
- {
- insertText: 'resets',
- label: 'resets',
- detail: 'resets(v range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-resets',
- 'For each input time series, `resets(v range-vector)` returns the number of counter resets within the provided time range as an instant vector. Any decrease in the value between two consecutive samples is interpreted as a counter reset.'
- ),
- },
- {
- insertText: 'round',
- label: 'round',
- detail: 'round(v instant-vector, to_nearest=1 scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-round',
- 'Rounds the sample values of all elements in `v` to the nearest integer. Ties are resolved by rounding up. The optional `to_nearest` argument allows specifying the nearest multiple to which the sample values should be rounded. This multiple may also be a fraction.'
- ),
- },
- {
- insertText: 'scalar',
- label: 'scalar',
- detail: 'scalar(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-scalar',
- 'Given a single-element input vector, `scalar(v instant-vector)` returns the sample value of that single element as a scalar. If the input vector does not have exactly one element, `scalar` will return `NaN`.'
- ),
- },
- {
- insertText: 'sgn',
- label: 'sgn',
- detail: 'sgn(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-sgn',
- 'Returns a vector with all sample values converted to their sign, defined as this: 1 if v is positive, -1 if v is negative and 0 if v is equal to zero.'
- ),
- },
- {
- insertText: 'sort',
- label: 'sort',
- detail: 'sort(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-sort',
- 'Returns vector elements sorted by their sample values, in ascending order.'
- ),
- },
- {
- insertText: 'sort_desc',
- label: 'sort_desc',
- detail: 'sort_desc(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-sort-desc',
- 'Returns vector elements sorted by their sample values, in descending order.'
- ),
- },
- {
- insertText: 'sqrt',
- label: 'sqrt',
- detail: 'sqrt(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-sqrt',
- 'Calculates the square root of all elements in `v`.'
- ),
- },
- {
- insertText: 'time',
- label: 'time',
- detail: 'time()',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-time',
- 'Returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated.'
- ),
- },
- {
- insertText: 'timestamp',
- label: 'timestamp',
- detail: 'timestamp(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-timestamp',
- 'Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.'
- ),
- },
- {
- insertText: 'vector',
- label: 'vector',
- detail: 'vector(s scalar)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-vector',
- 'Returns the scalar `s` as a vector with no labels.'
- ),
- },
- {
- insertText: 'year',
- label: 'year',
- detail: 'year(v=vector(time()) instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-year',
- 'Returns the year for each of the given times in UTC.'
- ),
- },
- {
- insertText: 'avg_over_time',
- label: 'avg_over_time',
- detail: 'avg_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-avg-over-time',
- 'The average value of all points in the specified interval.'
- ),
- },
- {
- insertText: 'min_over_time',
- label: 'min_over_time',
- detail: 'min_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-min-over-time',
- 'The minimum value of all points in the specified interval.'
- ),
- },
- {
- insertText: 'max_over_time',
- label: 'max_over_time',
- detail: 'max_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-max-over-time',
- 'The maximum value of all points in the specified interval.'
- ),
- },
- {
- insertText: 'sum_over_time',
- label: 'sum_over_time',
- detail: 'sum_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-sum-over-time',
- 'The sum of all values in the specified interval.'
- ),
- },
- {
- insertText: 'count_over_time',
- label: 'count_over_time',
- detail: 'count_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-count-over-time',
- 'The count of all values in the specified interval.'
- ),
- },
- {
- insertText: 'quantile_over_time',
- label: 'quantile_over_time',
- detail: 'quantile_over_time(scalar, range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-quantile-over-time',
- 'The φ-quantile (0 ≤ φ ≤ 1) of the values in the specified interval.'
- ),
- },
- {
- insertText: 'stddev_over_time',
- label: 'stddev_over_time',
- detail: 'stddev_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-stddev-over-time',
- 'The population standard deviation of the values in the specified interval.'
- ),
- },
- {
- insertText: 'stdvar_over_time',
- label: 'stdvar_over_time',
- detail: 'stdvar_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-stdvar-over-time',
- 'The population standard variance of the values in the specified interval.'
- ),
- },
- {
- insertText: 'last_over_time',
- label: 'last_over_time',
- detail: 'last_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-last-over-time',
- 'The most recent point value in specified interval.'
- ),
- },
- {
- insertText: 'present_over_time',
- label: 'present_over_time',
- detail: 'present_over_time(range-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-present-over-time',
- 'The value 1 for any series in the specified interval.'
- ),
- },
- {
- insertText: 'histogram_avg',
- label: 'histogram_avg',
- detail: 'histogram_avg(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-histogram-avg',
- 'Returns the arithmetic average of observed values stored in a native histogram. Samples that are not native histograms are ignored and do not show up in the returned vector.'
- ),
- },
- {
- insertText: 'histogram_count',
- label: 'histogram_count',
- detail: 'histogram_count(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-histogram-count',
- 'Returns the count of observations stored in a native histogram.'
- ),
- },
- {
- insertText: 'histogram_sum',
- label: 'histogram_sum',
- detail: 'histogram_sum(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-histogram-sum',
- 'Returns the sum of observations stored in a native histogram.'
- ),
- },
- {
- insertText: 'histogram_fraction',
- label: 'histogram_fraction',
- detail: 'histogram_fraction(lower scalar, upper scalar, v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-histogram-fraction',
- 'Returns the estimated fraction of observations between the provided lower and upper values.'
- ),
- },
- {
- insertText: 'histogram_stddev',
- label: 'histogram_stddev',
- detail: 'histogram_stddev(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-histogram-stddev',
- 'Returns the estimated standard deviation of observations in a native histogram, based on the geometric mean of the buckets where the observations lie.'
- ),
- },
- {
- insertText: 'histogram_stdvar',
- label: 'histogram_stdvar',
- detail: 'histogram_stdvar(v instant-vector)',
- documentation: t(
- 'grafana-prometheus.promql.getFunctions.documentation-histogram-stdvar',
- 'Returns the estimated standard variance of observations in a native histogram.'
- ),
- },
-];
-
-export const promqlGrammar: Grammar = {
- comment: {
- pattern: /#.*/,
- },
- 'context-aggregation': {
- pattern: /((by|without)\s*)\([^)]*\)/, // by ()
- lookbehind: true,
- inside: {
- 'label-key': {
- pattern: /[^(),\s][^,)]*[^),\s]*/,
- alias: 'attr-name',
- },
- punctuation: /[()]/,
- },
- },
- 'context-labels': {
- pattern: /\{[^}]*(?=}?)/,
- greedy: true,
- inside: {
- comment: {
- pattern: /#.*/,
- },
- 'label-key': {
- pattern: /[a-z_]\w*(?=\s*(=|!=|=~|!~))/,
- alias: 'attr-name',
- greedy: true,
- },
- 'label-value': {
- pattern: /"(?:\\.|[^\\"])*"/,
- greedy: true,
- alias: 'attr-value',
- },
- punctuation: /[{]/,
- },
- },
- function: new RegExp(
- `\\b(?:${getFunctions()
- .map((f) => f.label)
- .join('|')})(?=\\s*\\()`,
- 'i'
- ),
- 'context-range': [
- {
- pattern: /\[[^\]]*(?=])/, // [1m]
- inside: {
- 'range-duration': {
- pattern: /\b\d+[smhdwy]\b/i,
- alias: 'number',
- },
- },
- },
- {
- pattern: /(offset\s+)\w+/, // offset 1m
- lookbehind: true,
- inside: {
- 'range-duration': {
- pattern: /\b\d+[smhdwy]\b/i,
- alias: 'number',
- },
- },
- },
- ],
- idList: {
- pattern: /\d+(\|\d+)+/,
- alias: 'number',
- },
- number: /\b-?\d+((\.\d*)?([eE][+-]?\d+)?)?\b/,
- operator: new RegExp(`/[-+*/=%^~]|&&?|\\|?\\||!=?|<(?:=>?|<|>)?|>[>=]?|\\b(?:${OPERATORS.join('|')})\\b`, 'i'),
- punctuation: /[{};()`,.]/,
-};
diff --git a/packages/grafana-prometheus/src/query_hints.test.ts b/packages/grafana-prometheus/src/query_hints.test.ts
deleted file mode 100644
index 4757912e847..00000000000
--- a/packages/grafana-prometheus/src/query_hints.test.ts
+++ /dev/null
@@ -1,664 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/query_hints.test.ts
-import { type QueryHint } from '@grafana/data';
-import { type QueryBuilderLabelFilter } from '@grafana/plugin-ui';
-
-import { type PrometheusDatasource } from './datasource';
-import {
- getExpandRulesHints,
- getQueryHints,
- getQueryLabelsForRuleName,
- getRecordingRuleIdentifierIdx,
- isRuleInQuery,
- SUM_HINT_THRESHOLD_COUNT,
-} from './query_hints';
-import { buildVisualQueryFromString } from './querybuilder/parsing';
-import { type RuleQueryMapping } from './types';
-
-describe('getQueryHints()', () => {
- it('returns no hints for no series', () => {
- expect(getQueryHints('', [])).toEqual([]);
- });
-
- it('returns no hints for empty series', () => {
- expect(getQueryHints('', [{ datapoints: [] }])).toEqual([]);
- });
-
- it('returns a rate hint for a counter metric', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const hints = getQueryHints('metric_total', series);
-
- expect(hints!.length).toBe(1);
- expect(hints![0]).toMatchObject({
- label: 'Selected metric looks like a counter.',
- fix: {
- action: {
- type: 'ADD_RATE',
- query: 'metric_total',
- },
- },
- });
- });
-
- it('returns a certain rate hint for a counter metric', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const mock: unknown = { languageProvider: { retrieveMetricsMetadata: () => ({ foo: { type: 'counter' } }) } };
- const datasource = mock as PrometheusDatasource;
-
- let hints = getQueryHints('foo', series, datasource);
- expect(hints!.length).toBe(1);
- expect(hints![0]).toMatchObject({
- label: 'Selected metric is a counter.',
- fix: {
- action: {
- type: 'ADD_RATE',
- query: 'foo',
- },
- },
- });
-
- // Test substring match not triggering hint
- hints = getQueryHints('foo_foo', series, datasource);
- expect(hints).toEqual([]);
- });
-
- it('returns no rate hint for a counter metric that already has a rate', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const hints = getQueryHints('rate(metric_total[1m])', series);
- expect(hints).toEqual([]);
- });
-
- it('returns no rate hint for a counter metric that already has an increase', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const hints = getQueryHints('increase(metric_total[1m])', series);
- expect(hints).toEqual([]);
- });
-
- it('returns a rate hint with action for a counter metric with labels', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const hints = getQueryHints('metric_total{job="grafana"}', series);
- expect(hints!.length).toBe(1);
- expect(hints![0].label).toContain('Selected metric looks like a counter');
- expect(hints![0].fix).toBeDefined();
- });
-
- it('returns a rate hint w/o action for a complex counter metric', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const hints = getQueryHints('sum(metric_total)', series);
- expect(hints!.length).toBe(1);
- expect(hints![0].label).toContain('rate()');
- expect(hints![0].fix).toBeUndefined();
- });
-
- it('returns a histogram hint for a bucket series', () => {
- const series = [{ datapoints: [[23, 1000]] }];
- const hints = getQueryHints('metric_bucket', series);
- expect(hints!.length).toBe(1);
- expect(hints![0]).toMatchObject({
- label: 'Selected metric has buckets.',
- fix: {
- action: {
- type: 'ADD_HISTOGRAM_QUANTILE',
- query: 'metric_bucket',
- },
- },
- });
- });
-
- it('returns a histogram hint with action for a bucket with labels', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const hints = getQueryHints('metric_bucket{job="grafana"}', series);
- expect(hints!.length).toBe(1);
- expect(hints![0].label).toContain('Selected metric has buckets.');
- expect(hints![0].fix).toBeDefined();
- });
-
- it('returns a sum hint when many time series results are returned for a simple metric', () => {
- const seriesCount = SUM_HINT_THRESHOLD_COUNT;
- const series = Array.from({ length: seriesCount }, (_) => ({
- datapoints: [
- [0, 0],
- [0, 0],
- ],
- }));
- const hints = getQueryHints('metric', series);
- expect(hints!.length).toBe(1);
- expect(hints![0]).toMatchObject({
- type: 'ADD_SUM',
- label: 'Many time series results returned.',
- fix: {
- label: 'Consider aggregating with sum().',
- action: {
- type: 'ADD_SUM',
- query: 'metric',
- preventSubmit: true,
- },
- },
- });
- });
-
- it('should not return rate hint for a recorded query', () => {
- const seriesCount = SUM_HINT_THRESHOLD_COUNT;
- const series = Array.from({ length: seriesCount }, (_) => ({
- datapoints: [
- [0, 0],
- [0, 0],
- ],
- }));
- let hints = getQueryHints('node_namespace_pod_container:container_cpu_usage_seconds_total:sum_irate', series);
- expect(hints!.length).toBe(0);
-
- hints = getQueryHints('node_namespace_pod_container:container_cpu_usage_seconds_total', series);
- expect(hints!.length).toBe(0);
-
- hints = getQueryHints('container_cpu_usage_seconds_total:irate_total', series);
- expect(hints!.length).toBe(0);
- });
-
- // native histograms
- it('returns hints for native histogram by metric type without suffix "_bucket"', () => {
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const mock: unknown = { languageProvider: { retrieveMetricsMetadata: () => ({ foo: { type: 'histogram' } }) } };
- const datasource = mock as PrometheusDatasource;
-
- let hints = getQueryHints('foo', series, datasource);
- expect(hints!.length).toBe(3);
- const hintsString = JSON.stringify(hints);
- expect(hintsString).toContain('ADD_HISTOGRAM_AVG');
- expect(hintsString).toContain('ADD_HISTOGRAM_COUNT');
- expect(hintsString).toContain('ADD_HISTOGRAM_QUANTILE');
- });
-
- it('returns no hints for native histogram when there are native histogram functions in the query', () => {
- const queryWithNativeHistogramFunction = 'histogram_avg(foo)';
- const series = [
- {
- datapoints: [
- [23, 1000],
- [24, 1001],
- ],
- },
- ];
- const mock: unknown = { languageProvider: { retrieveMetricsMetadata: () => ({ foo: { type: 'histogram' } }) } };
- const datasource = mock as PrometheusDatasource;
-
- let hints = getQueryHints(queryWithNativeHistogramFunction, series, datasource);
- expect(hints!.length).toBe(0);
- });
-});
-
-describe('getExpandRulesHints', () => {
- it('should return no hint when no rule is present in query', () => {
- const extractedMapping: RuleQueryMapping = {};
- const hints = getExpandRulesHints('metric_5m', extractedMapping);
- const expected: QueryHint[] = [];
- expect(hints).toEqual(expected);
- });
-
- it('should return expand rule hint, single rules', () => {
- const extractedMapping: RuleQueryMapping = {
- metric_5m: [
- {
- query: 'expanded_metric_query[5m]',
- labels: {},
- },
- ],
- metric_15m: [
- {
- query: 'expanded_metric_query[15m]',
- labels: {},
- },
- ],
- };
- const query = `metric_5m`;
- const hints = getExpandRulesHints('metric_5m', extractedMapping);
- const expected = expect.arrayContaining([expect.objectContaining({ type: 'EXPAND_RULES' })]);
- expect(hints).toEqual(expected);
- expect(hints).toEqual([
- {
- type: 'EXPAND_RULES',
- label: 'Query contains recording rules.',
- fix: {
- label: 'Expand rules',
- action: {
- type: 'EXPAND_RULES',
- query,
- options: {
- metric_5m: {
- expandedQuery: 'expanded_metric_query[5m]',
- },
- },
- },
- },
- },
- ]);
- });
-
- it('should return no expand rule hint, if the given query does not have a label', () => {
- const extractedMapping: RuleQueryMapping = {
- metric_5m: [
- {
- query: 'expanded_metric_query_111[5m]',
- labels: {
- uuid: '111',
- },
- },
- {
- query: 'expanded_metric_query_222[5m]',
- labels: {
- uuid: '222',
- },
- },
- ],
- metric_15m: [
- {
- query: 'expanded_metric_query[15m]',
- labels: {},
- },
- ],
- };
- const hints = getExpandRulesHints(
- `sum(metric_5m{uuid="5m"} + metric_10m{uuid="10m"}) + metric_66m{uuid="66m"}`,
- extractedMapping
- );
- const expected = expect.arrayContaining([expect.objectContaining({ type: 'EXPAND_RULES_WARNING' })]);
- expect(hints).toEqual(expected);
- });
-
- it('should return expand rule warning hint, if the given query *does* have a label', () => {
- const extractedMapping: RuleQueryMapping = {
- metric_5m: [
- {
- query: 'expanded_metric_query_111[5m]',
- labels: {
- uuid: '111',
- },
- },
- {
- query: 'expanded_metric_query_222[5m]',
- labels: {
- uuid: '222',
- },
- },
- ],
- metric_15m: [
- {
- query: 'expanded_metric_query[15m]',
- labels: {},
- },
- ],
- };
- const query = `metric_5m{uuid="111"}`;
- const hints = getExpandRulesHints('metric_5m{uuid="111"}', extractedMapping);
- expect(hints).toEqual([
- {
- type: 'EXPAND_RULES',
- label: 'Query contains recording rules.',
- fix: {
- label: 'Expand rules',
- action: {
- type: 'EXPAND_RULES',
- query,
- options: {
- metric_5m: {
- expandedQuery: 'expanded_metric_query_111[5m]',
- identifier: 'uuid',
- identifierValue: '111',
- },
- },
- },
- },
- },
- ]);
- });
-
- it('should return expand rule hint, when given query include a non-unique rule name', () => {
- const extractedMapping: RuleQueryMapping = {
- 'duration:p95': [
- {
- query: 'expanded_duration_p95{}',
- labels: {},
- },
- {
- query: 'expanded_duration_p95_aggregated{}',
- labels: {
- span_name: '__aggregated__',
- },
- },
- ],
- 'duration:p95:upper_threshold': [
- {
- query: 'expanded_duration_p95_upper_threshold{}',
- labels: {},
- },
- ],
- };
- const query = 'sum(rate(duration:p95:upper_threshold{label="foo"}[5m])) by(bar)';
- const hints = getExpandRulesHints(query, extractedMapping);
- expect(hints).toEqual([
- {
- type: 'EXPAND_RULES',
- label: 'Query contains recording rules.',
- fix: {
- label: 'Expand rules',
- action: {
- type: 'EXPAND_RULES',
- query,
- options: {
- 'duration:p95:upper_threshold': {
- expandedQuery: 'expanded_duration_p95_upper_threshold{}',
- },
- },
- },
- },
- },
- ]);
- });
-
- it('should return expand rule hint, when given query include a non-unique rule name - second case', () => {
- const extractedMapping: RuleQueryMapping = {
- 'duration:p95': [
- {
- query: 'expanded_duration_p95{}',
- labels: {},
- },
- {
- query: 'expanded_duration_p95_aggregated{}',
- labels: {
- span_name: '__aggregated__',
- },
- },
- ],
- 'upper_threshold:duration:p95': [
- {
- query: 'expanded_duration_p95_upper_threshold{}',
- labels: {},
- },
- ],
- };
- const query = 'sum(rate(upper_threshold:duration:p95{label="foo"}[5m])) by(bar)';
- const hints = getExpandRulesHints(query, extractedMapping);
- expect(hints).toEqual([
- {
- type: 'EXPAND_RULES',
- label: 'Query contains recording rules.',
- fix: {
- label: 'Expand rules',
- action: {
- type: 'EXPAND_RULES',
- query,
- options: {
- 'upper_threshold:duration:p95': {
- expandedQuery: 'expanded_duration_p95_upper_threshold{}',
- },
- },
- },
- },
- },
- ]);
- });
-});
-
-describe('getRecordingRuleIdentifierIdx', () => {
- it('should return the matching identifier', () => {
- const mapping: RuleQueryMapping[string] = [
- {
- query: 'expanded_metric_query_111[5m]',
- labels: {
- uuid: '111',
- },
- },
- {
- query: 'expanded_metric_query_222[5m]',
- labels: {
- uuid: '222',
- },
- },
- ];
- const ruleName = `metric_5m`;
- const query = `metric_5m{uuid="111"}`;
- const { idx, identifier, identifierValue, expandedQuery } = getRecordingRuleIdentifierIdx(query, ruleName, mapping);
- expect(idx).toEqual(0);
- expect(identifier).toEqual(`uuid`);
- expect(identifierValue).toEqual('111');
- expect(expandedQuery).toEqual(`expanded_metric_query_111[5m]`);
- });
-
- it('should not return the matching identifier', () => {
- const mapping: RuleQueryMapping[string] = [
- {
- query: 'expanded_metric_query_111[5m]',
- labels: {
- uuid: '111',
- },
- },
- {
- query: 'expanded_metric_query_222[5m]',
- labels: {
- uuid: '222',
- },
- },
- ];
- const ruleName = `metric_5m`;
- const query = `metric_5m{uuid="999"}`;
- const { idx } = getRecordingRuleIdentifierIdx(query, ruleName, mapping);
- expect(idx).toEqual(-1);
- });
-
- it('should return the matching identifier index for a complex query', () => {
- const mapping: RuleQueryMapping[string] = [
- {
- query: 'expanded_metric_query_111[5m]',
- labels: {
- uuid: '111',
- },
- },
- {
- query: 'expanded_metric_query_222[5m]',
- labels: {
- uuid: '222',
- },
- },
- ];
- const ruleName = `metric_55m`;
- const query = `metric_5m{uuid="111"} + metric_55m{uuid="222"}`;
- const { idx, identifier, identifierValue, expandedQuery } = getRecordingRuleIdentifierIdx(query, ruleName, mapping);
- expect(idx).toEqual(1);
- expect(identifier).toEqual(`uuid`);
- expect(identifierValue).toEqual('222');
- expect(expandedQuery).toEqual(`expanded_metric_query_222[5m]`);
- });
-
- it('should return the matching identifier index for a complex query with binary operators', () => {
- const mapping: RuleQueryMapping[string] = [
- {
- query: 'expanded_metric_query_111[5m]',
- labels: {
- uuid: '111',
- },
- },
- {
- query: 'expanded_metric_query_222[5m]',
- labels: {
- uuid: '222',
- },
- },
- {
- query: 'expanded_metric_query_333[5m]',
- labels: {
- uuid: '333',
- },
- },
- ];
- const ruleName = `metric_5m`;
- const query = `metric_7n{} + (metric_5m{uuid="333"} + metric_55m{uuid="222"})`;
- const { idx, identifier, identifierValue, expandedQuery } = getRecordingRuleIdentifierIdx(query, ruleName, mapping);
- expect(idx).toEqual(2);
- expect(identifier).toEqual(`uuid`);
- expect(identifierValue).toEqual('333');
- expect(expandedQuery).toEqual(`expanded_metric_query_333[5m]`);
- });
-});
-
-describe('getQueryLabelsForRuleName', () => {
- it('should return labels for the metric name', () => {
- const metricName = `metric_5m`;
- const query = `metric_5m{uuid="111"}`;
- const { query: visualQuery } = buildVisualQueryFromString(query);
- const result = getQueryLabelsForRuleName(metricName, visualQuery);
- const expected: QueryBuilderLabelFilter[] = [{ label: 'uuid', op: '=', value: '111' }];
- expect(result).toEqual(expected);
- });
-
- it('should return labels from a query with binary operations', () => {
- const metricName = `metric_5m`;
- const query = `metric_55m{uuid="222"} + metric_33m{uuid="333"} + metric_5m{uuid="111"}`;
- const { query: visualQuery } = buildVisualQueryFromString(query);
- const result = getQueryLabelsForRuleName(metricName, visualQuery);
- const expected: QueryBuilderLabelFilter[] = [{ label: 'uuid', op: '=', value: '111' }];
- expect(result).toEqual(expected);
- });
-
- it('should return labels from a query with binary operations with parentheses', () => {
- const metricName = `metric_5m`;
- const query = `(metric_55m{uuid="222"} + metric_33m{uuid="333"}) + metric_5m{uuid="111"}`;
- const { query: visualQuery } = buildVisualQueryFromString(query);
- const result = getQueryLabelsForRuleName(metricName, visualQuery);
- const expected: QueryBuilderLabelFilter[] = [{ label: 'uuid', op: '=', value: '111' }];
- expect(result).toEqual(expected);
- });
-
- it('should return labels from a query for the first metricName match', () => {
- const metricName = `metric_5m`;
- const query = `(metric_55m{uuid="222"} + metric_33m{uuid="333"}) + metric_5m{uuid="999"} + metric_5m{uuid="555"}`;
- const { query: visualQuery } = buildVisualQueryFromString(query);
- const result = getQueryLabelsForRuleName(metricName, visualQuery);
- const expected: QueryBuilderLabelFilter[] = [{ label: 'uuid', op: '=', value: '999' }];
- expect(result).toEqual(expected);
- });
-});
-
-describe('ruleInQuery', () => {
- it('should return true when ruleName is present in the query', () => {
- expect(isRuleInQuery('rate(http_requests_total{job="api"}[5m])', 'http_requests_total')).toBe(true);
- });
-
- it('should return false when ruleName is not present in the query', () => {
- expect(isRuleInQuery('rate(cpu_usage{instance="localhost"}[5m])', 'http_requests_total')).toBe(false);
- });
-
- it('should return true for ruleName at the start of the query', () => {
- expect(isRuleInQuery('http_requests_total{job="api"}', 'http_requests_total')).toBe(true);
- });
-
- it('should return true for ruleName at the end of the query', () => {
- expect(isRuleInQuery('sum by (instance) (http_requests_total)', 'http_requests_total')).toBe(true);
- expect(isRuleInQuery('sum(http_requests_total)', 'http_requests_total')).toBe(true);
- expect(isRuleInQuery('http_requests_total', 'http_requests_total')).toBe(true);
- });
-
- it('should return true when ruleName is followed by spaces', () => {
- expect(isRuleInQuery('http_requests_total { job="api" }', 'http_requests_total')).toBe(true);
- });
-
- it('should return false when ruleName is a substring of another metric', () => {
- expect(isRuleInQuery('rate(http_requests_total_new{job="api"}[5m])', 'http_requests_total')).toBe(false);
- });
-
- it('should return false for escaped ruleName usage', () => {
- expect(isRuleInQuery('rate(\"http_requests_total\"{job="api"}[5m])', 'http_requests_total')).toBe(false);
- });
-
- it('should return false when query is empty', () => {
- expect(isRuleInQuery('', 'http_requests_total')).toBe(false);
- });
-
- it('should return false when ruleName is an empty string', () => {
- expect(isRuleInQuery('rate(http_requests_total{job="api"}[5m])', '')).toBe(false);
- });
-
- it('should return false when both query and ruleName are empty', () => {
- expect(isRuleInQuery('', '')).toBe(false);
- });
-
- it('should return true when used with binary operations', () => {
- expect(isRuleInQuery('rate(http_requests_total{job="api"}[5m]) + my:rule', 'my:rule')).toBe(true);
- expect(isRuleInQuery('rate(http_requests_total{job="api"}[5m])+my:rule', 'my:rule')).toBe(true);
- });
-
- it('should return true when ruleName is inside nested functions', () => {
- expect(isRuleInQuery('sum(rate(http_requests_total[5m]))', 'http_requests_total')).toBe(true);
- });
-
- it('should return false when ruleName is part of a label value', () => {
- expect(isRuleInQuery('http_requests_total_bytes{rule="http_requests_total"}', 'http_requests_total')).toBe(false);
- });
-
- it('should return true when ruleName contains special characters like colon', () => {
- expect(isRuleInQuery('rate(my_namespace:http_requests_total[5m])', 'my_namespace:http_requests_total')).toBe(true);
- });
-
- it('should return false when ruleName appears within string literals', () => {
- expect(
- isRuleInQuery(
- 'label_replace(http_requests_total, "label", "value", "instance", "http_requests_total")',
- 'http_requests_total'
- )
- ).toBe(false);
- });
-});
diff --git a/packages/grafana-prometheus/src/query_hints.ts b/packages/grafana-prometheus/src/query_hints.ts
deleted file mode 100644
index da0b1cb9e90..00000000000
--- a/packages/grafana-prometheus/src/query_hints.ts
+++ /dev/null
@@ -1,346 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/query_hints.ts
-import { size } from 'lodash';
-
-import { type QueryFix, type QueryHint } from '@grafana/data';
-
-import { type PrometheusDatasource } from './datasource';
-import { buildVisualQueryFromString } from './querybuilder/parsing';
-import { type QueryBuilderLabelFilter } from './querybuilder/shared/types';
-import { type PromVisualQuery } from './querybuilder/types';
-import { type PromMetricsMetadata, type RecordingRuleIdentifier, type RuleQueryMapping } from './types';
-
-/**
- * Number of time series results needed before starting to suggest sum aggregation hints
- */
-export const SUM_HINT_THRESHOLD_COUNT = 20;
-
-export function getQueryHints(query: string, series?: unknown[], datasource?: PrometheusDatasource): QueryHint[] {
- const hints = [];
-
- const metricsMetadata = datasource?.languageProvider?.retrieveMetricsMetadata();
-
- // ..._bucket metric needs a histogram_quantile()
- // this regex also prevents hints from being shown when a query already has a function
- const oldHistogramMetric = query.trim().match(/^\w+_bucket$|^\w+_bucket{.*}$/);
- if (oldHistogramMetric) {
- const label = 'Selected metric has buckets.';
- hints.push({
- type: 'HISTOGRAM_QUANTILE',
- label,
- fix: {
- label: 'Consider calculating aggregated quantile by adding histogram_quantile().',
- action: {
- type: 'ADD_HISTOGRAM_QUANTILE',
- query,
- },
- },
- });
- } else if (metricsMetadata && simpleQueryCheck(query)) {
- // having migrated to native histograms
- // there will be no more old histograms (no buckets)
- // and we can identify a native histogram by the following
- // type === 'histogram'
- // metric name does not include '_bucket'
- const queryTokens = getQueryTokens(query);
-
- // Determine whether any of the query identifier tokens refers to a native histogram metric
- const { nameMetric } = checkMetricType(queryTokens, 'histogram', metricsMetadata, false);
-
- const nativeHistogramNameMetric = nameMetric;
-
- if (nativeHistogramNameMetric) {
- // add hints:
- // histogram_quantile, histogram_avg, histogram_count
- const label = 'Selected metric is a native histogram.';
- hints.push(
- {
- type: 'HISTOGRAM_QUANTILE',
- label,
- fix: {
- label: 'Consider calculating aggregated quantile by adding histogram_quantile().',
- action: {
- type: 'ADD_HISTOGRAM_QUANTILE',
- query,
- },
- },
- },
- {
- type: 'HISTOGRAM_AVG',
- label,
- fix: {
- label: 'Consider calculating the arithmetic average of observed values by adding histogram_avg().',
- action: {
- type: 'ADD_HISTOGRAM_AVG',
- query,
- },
- },
- },
- {
- type: 'HISTOGRAM_COUNT',
- label,
- fix: {
- label: 'Consider calculating the count of observations by adding histogram_count().',
- action: {
- type: 'ADD_HISTOGRAM_COUNT',
- query,
- },
- },
- }
- );
- }
- }
-
- // Check for need of rate()
- if (query.indexOf('rate(') === -1 && query.indexOf('increase(') === -1) {
- // Use metric metadata for exact types
- const nameMatch = query.match(/\b((?= SUM_HINT_THRESHOLD_COUNT) {
- const simpleMetric = query.trim().match(/^\w+$/);
- if (simpleMetric) {
- hints.push({
- type: 'ADD_SUM',
- label: 'Many time series results returned.',
- fix: {
- label: 'Consider aggregating with sum().',
- action: {
- type: 'ADD_SUM',
- query: query,
- preventSubmit: true,
- },
- },
- });
- }
- }
-
- return hints;
-}
-
-export function getInitHints(datasource: PrometheusDatasource): QueryHint[] {
- const hints = [];
-
- // 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;
-}
-
-export function isRuleInQuery(query: string, ruleName: string) {
- if (!query || !ruleName) {
- return false;
- }
-
- const getRuleRegex = new RegExp(`(? {
- if (!isRuleInQuery(query, ruleName)) {
- return acc;
- }
-
- if (mapping[ruleName].length > 1) {
- const { idx, expandedQuery, identifier, identifierValue } = getRecordingRuleIdentifierIdx(
- query,
- ruleName,
- mapping[ruleName]
- );
-
- // No identifier detected add warning
- if (idx === -1) {
- hints.push({
- type: 'EXPAND_RULES_WARNING',
- label:
- 'We found multiple recording rules that match in this query. To expand the recording rule, add an identifier label/value.',
- });
- return acc;
- } else {
- // Identifier found.
- return {
- ...acc,
- [ruleName]: {
- expandedQuery,
- identifier,
- identifierValue,
- },
- };
- }
- } else {
- return {
- ...acc,
- [ruleName]: {
- expandedQuery: mapping[ruleName][0].query,
- },
- };
- }
- }, {});
-
- if (size(mappingForQuery) > 0) {
- const label = 'Query contains recording rules.';
- hints.push({
- type: 'EXPAND_RULES',
- label,
- fix: {
- label: 'Expand rules',
- action: {
- type: 'EXPAND_RULES',
- query,
- options: mappingForQuery,
- },
- },
- });
- }
-
- return hints;
-}
-
-export function getRecordingRuleIdentifierIdx(
- queryStr: string,
- ruleName: string,
- mapping: RuleQueryMapping[string]
-): RecordingRuleIdentifier & { idx: number } {
- const { query } = buildVisualQueryFromString(queryStr);
- const queryMetricLabels: QueryBuilderLabelFilter[] = getQueryLabelsForRuleName(ruleName, query);
- if (queryMetricLabels.length === 0) {
- return { idx: -1, identifier: '', identifierValue: '', expandedQuery: '' };
- }
-
- let uuidLabel = '';
- let uuidLabelValue = '';
- let uuidLabelIdx = -1;
-
- queryMetricLabels.forEach((qml) => {
- if (uuidLabelIdx === -1 && qml.label.search('uuid') !== -1) {
- uuidLabel = qml.label;
- uuidLabelValue = qml.value;
- }
- });
-
- mapping.forEach((mp, idx) => {
- if (mp.labels) {
- Object.entries(mp.labels).forEach(([key, value]) => {
- if (uuidLabelIdx === -1 && key === uuidLabel && value === uuidLabelValue) {
- uuidLabelIdx = idx;
- }
- });
- }
- });
-
- return {
- idx: uuidLabelIdx,
- identifier: uuidLabel,
- identifierValue: uuidLabelValue,
- expandedQuery: mapping[uuidLabelIdx]?.query ?? '',
- };
-}
-
-// returns the labels of matching metric
-// metricName is the ruleName in query
-export function getQueryLabelsForRuleName(metricName: string, query: PromVisualQuery): QueryBuilderLabelFilter[] {
- if (query.metric === metricName) {
- return query.labels;
- } else {
- if (query.binaryQueries) {
- for (let i = 0; i < query.binaryQueries.length; i++) {
- const labels = getQueryLabelsForRuleName(metricName, query.binaryQueries[i].query);
- if (labels && labels.length > 0) {
- return labels;
- }
- }
- }
- return [];
- }
-}
-
-function getQueryTokens(query: string) {
- return (
- Array.from(query.matchAll(/\$?[a-zA-Z_:][a-zA-Z0-9_:]*/g))
- .map(([match]) => match)
- // Exclude variable identifiers
- .filter((token) => !token.startsWith('$'))
- // Split composite keys to match the tokens returned by the language provider
- .flatMap((token) => token.split(':'))
- );
-}
-
-function checkMetricType(
- queryTokens: string[],
- metricType: string,
- metricsMetadata: PromMetricsMetadata,
- certain: boolean
-) {
- // update certain to change language for counters
- const nameMetric =
- queryTokens.find((metricName) => {
- // Only considering first type information, could be non-deterministic
- const metadata = metricsMetadata[metricName];
- if (metadata && metadata.type.toLowerCase() === metricType) {
- certain = true;
- return true;
- } else {
- return false;
- }
- }) ?? '';
-
- return { nameMetric, certain };
-}
-
-/**
- * This regex check looks for only metric name and label filters.
- * This prevents hints from being shown when a query already has a functions or is complex.
- * */
-function simpleQueryCheck(query: string) {
- return query.trim().match(/^\w+$|^\w+{.*}$/);
-}
diff --git a/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.test.ts b/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.test.ts
deleted file mode 100644
index 0461458d612..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.test.ts
+++ /dev/null
@@ -1,415 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/PromQueryModeller.test.ts
-import { PromQueryModeller } from './PromQueryModeller';
-import { PromOperationId } from './types';
-
-describe('PromQueryModeller', () => {
- const modeller = new PromQueryModeller();
-
- it('Can render query with metric only', () => {
- expect(
- modeller.renderQuery({
- metric: 'my_totals',
- labels: [],
- operations: [],
- })
- ).toBe('my_totals');
- });
-
- it('Can render query with label filters', () => {
- expect(
- modeller.renderQuery({
- metric: 'my_totals',
- labels: [
- { label: 'cluster', op: '=', value: 'us-east' },
- { label: 'job', op: '=~', value: 'abc' },
- ],
- operations: [],
- })
- ).toBe('my_totals{cluster="us-east", job=~"abc"}');
- });
-
- it('Can render query with function', () => {
- expect(
- modeller.renderQuery({
- metric: 'my_totals',
- labels: [],
- operations: [{ id: 'sum', params: [] }],
- })
- ).toBe('sum(my_totals)');
- });
-
- it('Can render query with function with parameter to left of inner expression', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [],
- operations: [{ id: PromOperationId.HistogramQuantile, params: [0.86] }],
- })
- ).toBe('histogram_quantile(0.86, metric)');
- });
-
- it('Can render query with function with function parameters to the right of inner expression', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [],
- operations: [{ id: PromOperationId.LabelReplace, params: ['server', '$1', 'instance', 'as(.*)d'] }],
- })
- ).toBe('label_replace(metric, "server", "$1", "instance", "as(.*)d")');
- });
-
- it('Can group by expressions', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [],
- operations: [{ id: '__sum_by', params: ['server', 'job'] }],
- })
- ).toBe('sum by(server, job) (metric)');
- });
-
- it('Can render avg around a group by', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [],
- operations: [
- { id: '__sum_by', params: ['server', 'job'] },
- { id: 'avg', params: [] },
- ],
- })
- ).toBe('avg(sum by(server, job) (metric))');
- });
-
- it('Can use aggregation without label', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [],
- operations: [{ id: '__sum_without', params: ['server', 'job'] }],
- })
- ).toBe('sum without(server, job) (metric)');
- });
-
- it('Can render aggregations with parameters', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [],
- operations: [{ id: 'topk', params: [5] }],
- })
- ).toBe('topk(5, metric)');
- });
-
- it('Can render rate', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [{ label: 'pod', op: '=', value: 'A' }],
- operations: [{ id: PromOperationId.Rate, params: ['$__rate_interval'] }],
- })
- ).toBe('rate(metric{pod="A"}[$__rate_interval])');
- });
-
- it('Can render increase', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [{ label: 'pod', op: '=', value: 'A' }],
- operations: [{ id: PromOperationId.Increase, params: ['$__interval'] }],
- })
- ).toBe('increase(metric{pod="A"}[$__interval])');
- });
-
- it('Can render rate with custom range-vector', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [{ label: 'pod', op: '=', value: 'A' }],
- operations: [{ id: PromOperationId.Rate, params: ['10m'] }],
- })
- ).toBe('rate(metric{pod="A"}[10m])');
- });
-
- it('Can render multiply operation', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric',
- labels: [],
- operations: [{ id: PromOperationId.MultiplyBy, params: [1000] }],
- })
- ).toBe('metric * 1000');
- });
-
- it('Can render query with simple binary query', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [],
- binaryQueries: [
- {
- operator: '/',
- query: {
- metric: 'metric_b',
- labels: [],
- operations: [],
- },
- },
- ],
- })
- ).toBe('metric_a / metric_b');
- });
-
- it('Can render query with multiple binary queries and nesting', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [],
- binaryQueries: [
- {
- operator: '+',
- query: {
- metric: 'metric_b',
- labels: [],
- operations: [],
- },
- },
- {
- operator: '+',
- query: {
- metric: 'metric_c',
- labels: [],
- operations: [],
- },
- },
- ],
- })
- ).toBe('metric_a + metric_b + metric_c');
- });
-
- it('Can render query with nested query with binary op', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [],
- binaryQueries: [
- {
- operator: '/',
- query: {
- metric: 'metric_b',
- labels: [],
- operations: [{ id: PromOperationId.MultiplyBy, params: [1000] }],
- },
- },
- ],
- })
- ).toBe('metric_a / (metric_b * 1000)');
- });
-
- it('Can render query with nested binary query with parentheses', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [],
- binaryQueries: [
- {
- operator: '/',
- query: {
- metric: 'metric_b',
- labels: [],
- operations: [],
- binaryQueries: [
- {
- operator: '*',
- query: {
- metric: 'metric_c',
- labels: [],
- operations: [],
- },
- },
- ],
- },
- },
- ],
- })
- ).toBe('metric_a / (metric_b * metric_c)');
- });
-
- it('Should add parantheis around first query if it has binary op', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [{ id: PromOperationId.MultiplyBy, params: [1000] }],
- binaryQueries: [
- {
- operator: '/',
- query: {
- metric: 'metric_b',
- labels: [],
- operations: [],
- },
- },
- ],
- })
- ).toBe('(metric_a * 1000) / metric_b');
- });
-
- it('Can render functions that require a range as a parameter', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [{ id: 'double_exponential_smoothing', params: ['5m', 0.5, 0.5] }],
- })
- ).toBe('double_exponential_smoothing(metric_a[5m], 0.5, 0.5)');
- });
- it('Can render functions that require parameters left of a range', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [{ id: 'quantile_over_time', params: ['5m', 1] }],
- })
- ).toBe('quantile_over_time(1, metric_a[5m])');
- });
- it('Can render the label_join function', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [{ id: 'label_join', params: ['label_1', ',', 'label_2'] }],
- })
- ).toBe('label_join(metric_a, "label_1", ",", "label_2")');
- });
-
- it('Can render label_join with extra parameters', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [{ id: 'label_join', params: ['label_1', ', ', 'label_2', 'label_3', 'label_4', 'label_5'] }],
- })
- ).toBe('label_join(metric_a, "label_1", ", ", "label_2", "label_3", "label_4", "label_5")');
- });
-
- it('can render vector matchers', () => {
- expect(
- modeller.renderQuery({
- metric: 'metric_a',
- labels: [],
- operations: [],
- binaryQueries: [
- {
- operator: '/',
- vectorMatches: 'le, foo',
- vectorMatchesType: 'on',
- query: {
- metric: 'metric_b',
- labels: [],
- operations: [],
- },
- },
- ],
- })
- ).toBe('metric_a / on(le, foo) metric_b');
- });
-
- it('can render bool in binary ops', () => {
- expect(
- modeller.renderQuery({
- metric: 'cluster_namespace_slug_dialer_name',
- labels: [],
- operations: [
- {
- id: '__less_or_equal',
- params: [2, true],
- },
- ],
- })
- ).toBe('cluster_namespace_slug_dialer_name <= bool 2');
- });
-});
-
-describe('PromQueryModeller with utf8 support', () => {
- const modeller = new PromQueryModeller();
-
- it('should render nothing if there is nothing', () => {
- expect(
- modeller.renderQuery({
- metric: undefined,
- labels: [],
- operations: [],
- })
- ).toBe('');
-
- expect(
- modeller.renderQuery({
- metric: '',
- labels: [],
- operations: [],
- })
- ).toBe('');
- });
-
- it('should render legacy metric name as usual', () => {
- expect(
- modeller.renderQuery({
- metric: 'not_a_utf8_metric',
- labels: [],
- operations: [],
- })
- ).toBe('not_a_utf8_metric');
- });
-
- it('can render utf8 metric name in curly braces', () => {
- expect(
- modeller.renderQuery({
- metric: 'a.utf8.metric',
- labels: [],
- operations: [],
- })
- ).toBe('{"a.utf8.metric"}');
- });
-
- it('can render utf8 metric name in curly braces with legacy labels', () => {
- expect(
- modeller.renderQuery({
- metric: 'a.utf8.metric',
- labels: [
- {
- label: 'label',
- value: 'value',
- op: '=',
- },
- ],
- operations: [],
- })
- ).toBe('{"a.utf8.metric", label="value"}');
- });
-
- it('can render utf8 metric name in curly braces with legacy and utf8 labels', () => {
- expect(
- modeller.renderQuery({
- metric: 'a.utf8.metric',
- labels: [
- {
- label: 'label',
- value: 'value',
- op: '=',
- },
- {
- label: 'utf8.label',
- value: 'value',
- op: '=',
- },
- ],
- operations: [],
- })
- ).toBe('{"a.utf8.metric", label="value", "utf8.label"="value"}');
- });
-});
diff --git a/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts b/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts
deleted file mode 100644
index a63b24b1bc4..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts
+++ /dev/null
@@ -1,97 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/PromQueryModeller.ts
-import { getFunctions } from '../promql';
-
-import { getAggregationOperations } from './aggregations';
-import { getOperationDefinitions } from './operations';
-import { PromQueryModellerBase } from './shared/PromQueryModellerBase';
-import {
- type PromQueryPattern,
- PromQueryPatternType,
- PromVisualQueryOperationCategory,
- type PromQueryModellerInterface,
-} from './types';
-
-export class PromQueryModeller extends PromQueryModellerBase implements PromQueryModellerInterface {
- constructor() {
- super(() => {
- const allOperations = [...getOperationDefinitions(), ...getAggregationOperations()];
- for (const op of allOperations) {
- const func = getFunctions().find((x) => x.insertText === op.id);
- if (func) {
- op.documentation = func.documentation;
- }
- }
- return allOperations;
- });
-
- this.setOperationCategories([
- PromVisualQueryOperationCategory.Aggregations,
- PromVisualQueryOperationCategory.RangeFunctions,
- PromVisualQueryOperationCategory.Functions,
- PromVisualQueryOperationCategory.BinaryOps,
- PromVisualQueryOperationCategory.Trigonometric,
- PromVisualQueryOperationCategory.Time,
- ]);
- }
-
- getQueryPatterns(): PromQueryPattern[] {
- return [
- {
- name: 'Rate then sum',
- type: PromQueryPatternType.Rate,
- operations: [
- { id: 'rate', params: ['$__rate_interval'] },
- { id: 'sum', params: [] },
- ],
- },
- {
- name: 'Rate then sum by(label) then avg',
- type: PromQueryPatternType.Rate,
- operations: [
- { id: 'rate', params: ['$__rate_interval'] },
- { id: '__sum_by', params: [''] },
- { id: 'avg', params: [] },
- ],
- },
- {
- name: 'Histogram quantile on rate',
- type: PromQueryPatternType.Histogram,
- operations: [
- { id: 'rate', params: ['$__rate_interval'] },
- { id: '__sum_by', params: ['le'] },
- { id: 'histogram_quantile', params: [0.95] },
- ],
- },
- {
- name: 'Histogram quantile on increase',
- type: PromQueryPatternType.Histogram,
- operations: [
- { id: 'increase', params: ['$__rate_interval'] },
- { id: '__max_by', params: ['le'] },
- { id: 'histogram_quantile', params: [0.95] },
- ],
- },
- {
- name: 'Binary Query',
- type: PromQueryPatternType.Binary,
- operations: [
- { id: 'rate', params: ['$__rate_interval'] },
- { id: 'sum', params: [] },
- ],
- binaryQueries: [
- {
- operator: '/',
- query: {
- metric: '',
- labels: [],
- operations: [
- { id: 'rate', params: ['$__rate_interval'] },
- { id: 'sum', params: [] },
- ],
- },
- },
- ],
- },
- ];
- }
-}
diff --git a/packages/grafana-prometheus/src/querybuilder/QueryPattern.tsx b/packages/grafana-prometheus/src/querybuilder/QueryPattern.tsx
deleted file mode 100644
index 1bc26bf0821..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/QueryPattern.tsx
+++ /dev/null
@@ -1,140 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/QueryPattern.tsx
-import { css } from '@emotion/css';
-
-import { type GrafanaTheme2 } from '@grafana/data';
-import { t, Trans } from '@grafana/i18n';
-import { Button, Card, useStyles2 } from '@grafana/ui';
-
-import { promqlGrammar } from '../promql';
-
-import { RawQuery } from './shared/RawQuery';
-import { promQueryModeller } from './shared/modeller_instance';
-import { type PromQueryPattern } from './types';
-
-type Props = {
- pattern: PromQueryPattern;
- hasNewQueryOption: boolean;
- hasPreviousQuery: boolean | string;
- selectedPatternName: string | null;
- setSelectedPatternName: (name: string | null) => void;
- onPatternSelect: (pattern: PromQueryPattern, selectAsNewQuery?: boolean) => void;
-};
-
-export const QueryPattern = (props: Props) => {
- const { pattern, onPatternSelect, hasNewQueryOption, hasPreviousQuery, selectedPatternName, setSelectedPatternName } =
- props;
-
- const styles = useStyles2(getStyles);
- const lang = { grammar: promqlGrammar, name: 'promql' };
-
- return (
-
- {pattern.name}
-
-
-
-
- {selectedPatternName !== pattern.name ? (
- {
- if (hasPreviousQuery) {
- // If user has previous query, we need to confirm that they want to apply this query pattern
- setSelectedPatternName(pattern.name);
- } else {
- onPatternSelect(pattern);
- }
- }}
- >
- Use this query
-
- ) : (
- <>
-
- {`If you would like to use this query, ${
- hasNewQueryOption
- ? 'you can either apply this query pattern or create a new query'
- : 'this query pattern will be applied to your current query'
- }.`}
-
- setSelectedPatternName(null)}
- >
- Back
-
- {
- onPatternSelect(pattern);
- }}
- >
- Apply query
-
- {hasNewQueryOption && (
- {
- onPatternSelect(pattern, true);
- }}
- >
- Create new query
-
- )}
- >
- )}
-
-
- );
-};
-
-const getStyles = (theme: GrafanaTheme2) => {
- return {
- card: css({
- width: '49.5%',
- display: 'flex',
- flexDirection: 'column',
- }),
- rawQueryContainer: css({
- flexGrow: 1,
- }),
- rawQuery: css({
- backgroundColor: theme.colors.background.primary,
- padding: theme.spacing(1),
- marginTop: theme.spacing(1),
- }),
- spacing: css({
- marginBottom: theme.spacing(1),
- }),
- };
-};
diff --git a/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.test.tsx b/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.test.tsx
deleted file mode 100644
index d3d249c258b..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.test.tsx
+++ /dev/null
@@ -1,143 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/QueryPatternsModal.test.tsx
-import { render, screen, waitFor } from '@testing-library/react';
-import userEvent from '@testing-library/user-event';
-
-import { QueryPatternsModal } from './QueryPatternsModal';
-import { promQueryModeller } from './shared/modeller_instance';
-import { PromQueryPatternType } from './types';
-
-// don't care about interaction tracking in our unit tests
-jest.mock('@grafana/runtime', () => ({
- ...jest.requireActual('@grafana/runtime'),
- reportInteraction: jest.fn(),
-}));
-
-const defaultProps = {
- isOpen: true,
- onClose: jest.fn(),
- onChange: jest.fn(),
- onAddQuery: jest.fn(),
- query: {
- refId: 'A',
- expr: 'sum(rate({job="grafana"}[$__rate_interval]))',
- },
- queries: [
- {
- refId: 'A',
- expr: 'go_goroutines{instance="localhost:9090"}',
- },
- ],
-};
-
-const queryPatterns = {
- rateQueryPatterns: promQueryModeller
- .getQueryPatterns()
- .filter((pattern) => pattern.type === PromQueryPatternType.Rate),
- histogramQueryPatterns: promQueryModeller
- .getQueryPatterns()
- .filter((pattern) => pattern.type === PromQueryPatternType.Histogram),
- binaryQueryPatterns: promQueryModeller
- .getQueryPatterns()
- .filter((pattern) => pattern.type === PromQueryPatternType.Binary),
-};
-
-describe('QueryPatternsModal', () => {
- it('renders the modal', () => {
- render( );
- expect(screen.getByText('Kick start your query')).toBeInTheDocument();
- });
- it('renders collapsible elements with all query pattern types', () => {
- render( );
- Object.values(PromQueryPatternType).forEach((pattern) => {
- expect(screen.getByText(new RegExp(`${pattern} query starters`, 'i'))).toBeInTheDocument();
- });
- });
- it('can open and close query patterns section', async () => {
- render( );
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.getByText(queryPatterns.rateQueryPatterns[0].name)).toBeInTheDocument();
-
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.queryByText(queryPatterns.rateQueryPatterns[0].name)).not.toBeInTheDocument();
- });
-
- it('can open and close multiple query patterns section', async () => {
- render( );
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.getByText(queryPatterns.rateQueryPatterns[0].name)).toBeInTheDocument();
-
- await userEvent.click(screen.getByText('Histogram query starters'));
- expect(screen.getByText(queryPatterns.histogramQueryPatterns[0].name)).toBeInTheDocument();
-
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.queryByText(queryPatterns.rateQueryPatterns[0].name)).not.toBeInTheDocument();
-
- // Histogram patterns should still be open
- expect(screen.getByText(queryPatterns.histogramQueryPatterns[0].name)).toBeInTheDocument();
- });
-
- it('uses pattern if there is no existing query', async () => {
- render( );
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.getByText(queryPatterns.rateQueryPatterns[0].name)).toBeInTheDocument();
- const firstUseQueryButton = screen.getAllByRole('button', { name: 'use this query button' })[0];
- await userEvent.click(firstUseQueryButton);
- await waitFor(() => {
- expect(defaultProps.onChange).toHaveBeenCalledWith({
- expr: 'sum(rate([$__rate_interval]))',
- refId: 'A',
- });
- });
- });
-
- it('gives warning when selecting pattern if there are already existing query', async () => {
- render( );
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.getByText(queryPatterns.rateQueryPatterns[0].name)).toBeInTheDocument();
- const firstUseQueryButton = screen.getAllByRole('button', { name: 'use this query button' })[0];
- await userEvent.click(firstUseQueryButton);
-
- expect(screen.getByText(/you can either apply this query pattern or create a new query/)).toBeInTheDocument();
- });
-
- it('can use create new query when selecting pattern if there is already existing query', async () => {
- render( );
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.getByText(queryPatterns.rateQueryPatterns[0].name)).toBeInTheDocument();
- const firstUseQueryButton = screen.getAllByRole('button', { name: 'use this query button' })[0];
- await userEvent.click(firstUseQueryButton);
- const createNewQueryButton = screen.getByRole('button', { name: 'create new query button' });
- expect(createNewQueryButton).toBeInTheDocument();
- await userEvent.click(createNewQueryButton);
- await waitFor(() => {
- expect(defaultProps.onAddQuery).toHaveBeenCalledWith({
- expr: 'sum(rate([$__rate_interval]))',
- refId: 'B',
- });
- });
- });
-
- it('does not show create new query option if onAddQuery function is not provided ', async () => {
- render( );
- await userEvent.click(screen.getByText('Rate query starters'));
- expect(screen.getByText(queryPatterns.rateQueryPatterns[0].name)).toBeInTheDocument();
- const useQueryButton = screen.getAllByRole('button', { name: 'use this query button' })[0];
- await userEvent.click(useQueryButton);
- expect(screen.queryByRole('button', { name: 'Create new query' })).not.toBeInTheDocument();
- expect(screen.getByText(/this query pattern will be applied to your current query/)).toBeInTheDocument();
- });
-
- it('applies binary query patterns to query', async () => {
- render( );
- await userEvent.click(screen.getByText('Binary query starters'));
- expect(screen.getByText(queryPatterns.binaryQueryPatterns[0].name)).toBeInTheDocument();
- const firstUseQueryButton = screen.getAllByRole('button', { name: 'use this query button' })[0];
- await userEvent.click(firstUseQueryButton);
- await waitFor(() => {
- expect(defaultProps.onChange).toHaveBeenCalledWith({
- expr: 'sum(rate([$__rate_interval])) / sum(rate([$__rate_interval]))',
- refId: 'A',
- });
- });
- });
-});
diff --git a/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx b/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx
deleted file mode 100644
index 701433ff109..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx
+++ /dev/null
@@ -1,166 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/QueryPatternsModal.tsx
-import { css } from '@emotion/css';
-import { capitalize } from 'lodash';
-import { useMemo, useState } from 'react';
-
-import { type CoreApp, type DataQuery, getNextRefId, type GrafanaTheme2 } from '@grafana/data';
-import { t, Trans } from '@grafana/i18n';
-import { reportInteraction } from '@grafana/runtime';
-import { Button, Collapse, Modal, Stack, useStyles2 } from '@grafana/ui';
-
-import { type PromQuery } from '../types';
-
-import { QueryPattern } from './QueryPattern';
-import { buildVisualQueryFromString } from './parsing';
-import { promQueryModeller } from './shared/modeller_instance';
-import { type PromQueryPattern, PromQueryPatternType } from './types';
-
-type Props = {
- isOpen: boolean;
- query: PromQuery;
- queries: DataQuery[] | undefined;
- app?: CoreApp;
- onClose: () => void;
- onChange: (query: PromQuery) => void;
- onAddQuery?: (query: PromQuery) => void;
-};
-
-export const QueryPatternsModal = (props: Props) => {
- const { isOpen, onClose, onChange, onAddQuery, query, queries, app } = props;
- const [openTabs, setOpenTabs] = useState([]);
- const [selectedPatternName, setSelectedPatternName] = useState(null);
-
- const styles = useStyles2(getStyles);
- const hasNewQueryOption = !!onAddQuery;
- const hasPreviousQuery = useMemo(() => {
- const visualQuery = buildVisualQueryFromString(query.expr ?? '');
- // has anything entered in the query, metric, labels, operations, or binary queries
- const hasOperations = visualQuery.query.operations.length > 0,
- hasMetric = visualQuery.query.metric,
- hasLabels = visualQuery.query.labels.length > 0,
- hasBinaryQueries = visualQuery.query.binaryQueries ? visualQuery.query.binaryQueries.length > 0 : false;
-
- return hasOperations || hasMetric || hasLabels || hasBinaryQueries;
- }, [query.expr]);
-
- const onPatternSelect = (pattern: PromQueryPattern, selectAsNewQuery = false) => {
- const visualQuery = buildVisualQueryFromString(selectAsNewQuery ? '' : query.expr);
- reportInteraction('grafana_prom_kickstart_your_query_selected', {
- app: app ?? '',
- editorMode: query.editorMode,
- selectedPattern: pattern.name,
- preSelectedOperationsCount: visualQuery.query.operations.length,
- preSelectedLabelsCount: visualQuery.query.labels.length,
- createNewQuery: hasNewQueryOption && selectAsNewQuery,
- });
-
- // Apply the pattern operations before rendering the expression
- visualQuery.query.operations = pattern.operations;
- visualQuery.query.binaryQueries = pattern.binaryQueries;
- const renderedExpr = promQueryModeller.renderQuery(visualQuery.query);
-
- if (hasNewQueryOption && selectAsNewQuery) {
- onAddQuery({
- ...query,
- refId: getNextRefId(queries ?? [query]),
- expr: renderedExpr,
- });
- } else {
- onChange({
- ...query,
- expr: renderedExpr,
- });
- }
- setSelectedPatternName(null);
- onClose();
- };
-
- return (
-
-
-
- Kick start your query by selecting one of these queries. You can then continue to complete your query.
-
-
- {Object.values(PromQueryPatternType).map((patternType) => {
- const isOpen = openTabs.includes(patternType);
- return (
- {
- const action = isOpen ? 'close' : 'open';
- reportInteraction(`grafana_prom_kickstart_toggle_pattern_card`, {
- action,
- patternType,
- });
-
- setOpenTabs((tabs) =>
- // close tab if it's already open, otherwise open it
- tabs.includes(patternType) ? tabs.filter((t) => t !== patternType) : [...tabs, patternType]
- );
- }}
- >
-
- {promQueryModeller
- .getQueryPatterns()
- .filter((pattern) => pattern.type === patternType)
- .map((pattern) => (
-
- ))}
-
-
- );
- })}
-
- Close
-
-
- );
-};
-
-const getStyles = (theme: GrafanaTheme2) => {
- return {
- spacing: css({
- marginBottom: theme.spacing(1),
- }),
- };
-};
diff --git a/packages/grafana-prometheus/src/querybuilder/aggregations.test.ts b/packages/grafana-prometheus/src/querybuilder/aggregations.test.ts
deleted file mode 100644
index a73838a751b..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/aggregations.test.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { getAggregationOperations } from './aggregations';
-import { type QueryBuilderOperation } from './shared/types';
-import { PromOperationId } from './types';
-
-describe('getAggregationOperations', () => {
- it('returns a list containing all aggregation IDs', () => {
- const ops = getAggregationOperations();
- const ids = ops.map((o) => o.id);
-
- expect(ids).toContain(PromOperationId.Sum);
- expect(ids).toContain(PromOperationId.Avg);
- expect(ids).toContain(PromOperationId.Min);
- expect(ids).toContain(PromOperationId.Max);
- expect(ids).toContain(PromOperationId.Count);
- expect(ids).toContain(PromOperationId.Group);
- expect(ids).toContain(PromOperationId.Stddev);
- expect(ids).toContain(PromOperationId.Stdvar);
-
- // aggregations with params
- expect(ids).toContain(PromOperationId.TopK);
- expect(ids).toContain(PromOperationId.BottomK);
- expect(ids).toContain(PromOperationId.CountValues);
- expect(ids).toContain(PromOperationId.Quantile);
- expect(ids).toContain(PromOperationId.LimitK);
- expect(ids).toContain(PromOperationId.LimitRatio);
-
- // over-time range aggregations
- expect(ids).toContain(PromOperationId.SumOverTime);
- expect(ids).toContain(PromOperationId.AvgOverTime);
- expect(ids).toContain(PromOperationId.MinOverTime);
- expect(ids).toContain(PromOperationId.MaxOverTime);
- expect(ids).toContain(PromOperationId.CountOverTime);
- expect(ids).toContain(PromOperationId.LastOverTime);
- expect(ids).toContain(PromOperationId.PresentOverTime);
- expect(ids).toContain(PromOperationId.AbsentOverTime);
- expect(ids).toContain(PromOperationId.StddevOverTime);
- });
-
- it('includes over-time range functions with correct renderer behavior', () => {
- const ops = getAggregationOperations();
- const sumOverTime = ops.find((o) => o.id === PromOperationId.SumOverTime)!;
- expect(sumOverTime).toBeDefined();
- expect(sumOverTime.params.length).toBeGreaterThan(0);
-
- // call renderer with default param
- const model: QueryBuilderOperation = { id: sumOverTime.id, params: sumOverTime.defaultParams };
- const rendered = sumOverTime.renderer(model, sumOverTime, 'metric');
- expect(rendered).toBe(`${PromOperationId.SumOverTime}(metric[$__interval])`);
-
- // call renderer with custom param
- const modelCustom: QueryBuilderOperation = { id: sumOverTime.id, params: ['5m'] };
- const renderedCustom = sumOverTime.renderer(modelCustom, sumOverTime, 'metric');
- expect(renderedCustom).toBe(`${PromOperationId.SumOverTime}(metric[5m])`);
- });
-});
diff --git a/packages/grafana-prometheus/src/querybuilder/aggregations.ts b/packages/grafana-prometheus/src/querybuilder/aggregations.ts
deleted file mode 100644
index c8ea8ed7c72..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/aggregations.ts
+++ /dev/null
@@ -1,78 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/aggregations.ts
-import {
- createAggregationOperation,
- createAggregationOperationWithParam,
- getPromOperationDisplayName,
- getRangeVectorParamDef,
-} from './operationUtils';
-import { addOperationWithRangeVector } from './operations';
-import { type QueryBuilderOperation, type QueryBuilderOperationDef } from './shared/types';
-import { PromOperationId, PromVisualQueryOperationCategory } from './types';
-
-export function getAggregationOperations(): QueryBuilderOperationDef[] {
- return [
- ...createAggregationOperation(PromOperationId.Sum),
- ...createAggregationOperation(PromOperationId.Avg),
- ...createAggregationOperation(PromOperationId.Min),
- ...createAggregationOperation(PromOperationId.Max),
- ...createAggregationOperation(PromOperationId.Count),
- ...createAggregationOperation(PromOperationId.Group),
- ...createAggregationOperation(PromOperationId.Stddev),
- ...createAggregationOperation(PromOperationId.Stdvar),
- ...createAggregationOperationWithParam(PromOperationId.TopK, {
- params: [{ name: 'K-value', type: 'number' }],
- defaultParams: [5],
- }),
- ...createAggregationOperationWithParam(PromOperationId.BottomK, {
- params: [{ name: 'K-value', type: 'number' }],
- defaultParams: [5],
- }),
- ...createAggregationOperationWithParam(PromOperationId.CountValues, {
- params: [{ name: 'Identifier', type: 'string' }],
- defaultParams: ['count'],
- }),
- ...createAggregationOperationWithParam(PromOperationId.Quantile, {
- params: [{ name: 'Value', type: 'number' }],
- defaultParams: [1],
- }),
- ...createAggregationOperationWithParam(PromOperationId.LimitK, {
- params: [{ name: 'K-value', type: 'number' }],
- defaultParams: [5],
- }),
- ...createAggregationOperationWithParam(PromOperationId.LimitRatio, {
- params: [{ name: 'Ratio', type: 'number' }],
- defaultParams: [1],
- }),
- createAggregationOverTime(PromOperationId.SumOverTime),
- createAggregationOverTime(PromOperationId.AvgOverTime),
- createAggregationOverTime(PromOperationId.MinOverTime),
- createAggregationOverTime(PromOperationId.MaxOverTime),
- createAggregationOverTime(PromOperationId.CountOverTime),
- createAggregationOverTime(PromOperationId.LastOverTime),
- createAggregationOverTime(PromOperationId.PresentOverTime),
- createAggregationOverTime(PromOperationId.AbsentOverTime),
- createAggregationOverTime(PromOperationId.StddevOverTime),
- ];
-}
-
-function createAggregationOverTime(name: string): QueryBuilderOperationDef {
- return {
- id: name,
- name: getPromOperationDisplayName(name),
- params: [getRangeVectorParamDef()],
- defaultParams: ['$__interval'],
- alternativesKey: 'overtime function',
- category: PromVisualQueryOperationCategory.RangeFunctions,
- renderer: operationWithRangeVectorRenderer,
- addOperationHandler: addOperationWithRangeVector,
- };
-}
-
-function operationWithRangeVectorRenderer(
- model: QueryBuilderOperation,
- def: QueryBuilderOperationDef,
- innerExpr: string
-) {
- let rangeVector = (model.params ?? [])[0] ?? '$__interval';
- return `${def.id}(${innerExpr}[${rangeVector}])`;
-}
diff --git a/packages/grafana-prometheus/src/querybuilder/binaryScalarOperations.ts b/packages/grafana-prometheus/src/querybuilder/binaryScalarOperations.ts
deleted file mode 100644
index 3f605b777b2..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/binaryScalarOperations.ts
+++ /dev/null
@@ -1,125 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/binaryScalarOperations.ts
-import { defaultAddOperationHandler } from './operationUtils';
-import {
- type QueryBuilderOperation,
- type QueryBuilderOperationDef,
- type QueryBuilderOperationParamDef,
-} from './shared/types';
-import { PromOperationId, PromVisualQueryOperationCategory } from './types';
-
-export const binaryScalarDefs = [
- {
- id: PromOperationId.Addition,
- name: 'Add scalar',
- sign: '+',
- },
- {
- id: PromOperationId.Subtraction,
- name: 'Subtract scalar',
- sign: '-',
- },
- {
- id: PromOperationId.MultiplyBy,
- name: 'Multiply by scalar',
- sign: '*',
- },
- {
- id: PromOperationId.DivideBy,
- name: 'Divide by scalar',
- sign: '/',
- },
- {
- id: PromOperationId.Modulo,
- name: 'Modulo by scalar',
- sign: '%',
- },
- {
- id: PromOperationId.Exponent,
- name: 'Exponent',
- sign: '^',
- },
- {
- id: PromOperationId.EqualTo,
- name: 'Equal to',
- sign: '==',
- comparison: true,
- },
- {
- id: PromOperationId.NotEqualTo,
- name: 'Not equal to',
- sign: '!=',
- comparison: true,
- },
- {
- id: PromOperationId.GreaterThan,
- name: 'Greater than',
- sign: '>',
- comparison: true,
- },
- {
- id: PromOperationId.LessThan,
- name: 'Less than',
- sign: '<',
- comparison: true,
- },
- {
- id: PromOperationId.GreaterOrEqual,
- name: 'Greater or equal to',
- sign: '>=',
- comparison: true,
- },
- {
- id: PromOperationId.LessOrEqual,
- name: 'Less or equal to',
- sign: '<=',
- comparison: true,
- },
-];
-
-export const binaryScalarOperatorToOperatorName = binaryScalarDefs.reduce<
- Record
->((acc, def) => {
- acc[def.sign] = {
- id: def.id,
- comparison: def.comparison,
- };
- return acc;
-}, {});
-
-// Not sure about this one. It could also be a more generic 'Simple math operation' where user specifies
-// both the operator and the operand in a single input
-export const binaryScalarOperations: QueryBuilderOperationDef[] = binaryScalarDefs.map((opDef) => {
- const params: QueryBuilderOperationParamDef[] = [{ name: 'Value', type: 'number' }];
- let defaultParams: [number] | [number, boolean] = [2];
- if (opDef.comparison) {
- params.push({
- name: 'Bool',
- type: 'boolean',
- description: 'If checked comparison will return 0 or 1 for the value rather than filtering.',
- });
- defaultParams = [2, false];
- }
-
- return {
- id: opDef.id,
- name: opDef.name,
- params,
- defaultParams,
- alternativesKey: 'binary scalar operations',
- category: PromVisualQueryOperationCategory.BinaryOps,
- renderer: getSimpleBinaryRenderer(opDef.sign),
- addOperationHandler: defaultAddOperationHandler,
- };
-});
-
-function getSimpleBinaryRenderer(operator: string) {
- return function binaryRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) {
- let param = model.params[0];
- let bool = '';
- if (model.params.length === 2) {
- bool = model.params[1] ? ' bool' : '';
- }
-
- return `${innerExpr} ${operator}${bool} ${param}`;
- };
-}
diff --git a/packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx b/packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx
deleted file mode 100644
index c344218937e..00000000000
--- a/packages/grafana-prometheus/src/querybuilder/components/LabelFilterItem.tsx
+++ /dev/null
@@ -1,223 +0,0 @@
-// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/components/LabelFilterItem.tsx
-import debounce from 'debounce-promise';
-import { useState } from 'react';
-
-import { type SelectableValue, toOption } from '@grafana/data';
-import { selectors } from '@grafana/e2e-selectors';
-import { t } from '@grafana/i18n';
-import { AccessoryButton, InputGroup } from '@grafana/plugin-ui';
-import { AsyncSelect, Select } from '@grafana/ui';
-
-import { truncateResult } from '../../language_utils';
-import { type QueryBuilderLabelFilter } from '../shared/types';
-
-interface LabelFilterItemProps {
- defaultOp: string;
- item: Partial;
- onChange: (value: QueryBuilderLabelFilter) => void;
- onGetLabelNames: (forLabel: Partial) => Promise;
- onGetLabelValues: (forLabel: Partial) => Promise;
- onDelete: () => void;
- invalidLabel?: boolean;
- invalidValue?: boolean;
- getLabelValuesAutofillSuggestions: (query: string, labelName?: string) => Promise;
- debounceDuration: number;
-}
-
-export function LabelFilterItem({
- item,
- defaultOp,
- onChange,
- onDelete,
- onGetLabelNames,
- onGetLabelValues,
- invalidLabel,
- invalidValue,
- getLabelValuesAutofillSuggestions,
- debounceDuration,
-}: LabelFilterItemProps) {
- const [state, setState] = useState<{
- labelNames?: SelectableValue[];
- labelValues?: SelectableValue[];
- isLoadingLabelNames?: boolean;
- isLoadingLabelValues?: boolean;
- }>({});
- // there's a bug in react-select where the menu doesn't recalculate its position when the options are loaded asynchronously
- // see https://github.com/grafana/grafana/issues/63558
- // instead, we explicitly control the menu visibility and prevent showing it until the options have fully loaded
- const [labelNamesMenuOpen, setLabelNamesMenuOpen] = useState(false);
- const [labelValuesMenuOpen, setLabelValuesMenuOpen] = useState(false);
- const [allLabels, setAllLabels] = useState([]);
-
- const isMultiSelect = (operator = item.op) => {
- return operators.find((op) => op.label === operator)?.isMultiValue;
- };
-
- const getSelectOptionsFromString = (item?: string): string[] => {
- if (item) {
- const regExp = /\(([^)]+)\)/;
- const matches = item?.match(regExp);
-
- if (matches && matches[0].indexOf('|') > 0) {
- return [item];
- }
-
- if (item.indexOf('|') > 0) {
- return item.split('|');
- }
- return [item];
- }
- return [];
- };
-
- const labelValueSearch = debounce(
- (query: string) => getLabelValuesAutofillSuggestions(query, item.label),
- debounceDuration
- );
-
- /**
- * Debounce a search through all the labels possible and truncate by .
- */
- const labelNamesSearch = debounce((query: string) => {
- // we limit the select to show 1000 options,
- // but we still search through all the possible options
- const results = allLabels.filter((label) => {
- return label.value.includes(query);
- });
- return truncateResult(results);
- }, debounceDuration);
-
- const itemValue = item?.value ?? '';
-
- return (
-
-
- {/* Label name select, loads all values at once */}
-