mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Explore Metrics: Fix existing parent error while opening a panel in explore metrics (#92948)
Fix exiting parent error while opening a panel in explore metrics
This commit is contained in:
parent
ae0e970bef
commit
0ba808805e
@ -1,14 +1,21 @@
|
|||||||
import { AdHocVariableFilter } from '@grafana/data';
|
import { AdHocVariableFilter } from '@grafana/data';
|
||||||
import { SceneComponentProps, SceneObjectBase, SceneObjectState, SceneTimeRangeLike } from '@grafana/scenes';
|
import {
|
||||||
|
SceneComponentProps,
|
||||||
|
SceneObjectBase,
|
||||||
|
SceneObjectState,
|
||||||
|
SceneTimeRange,
|
||||||
|
SceneTimeRangeState,
|
||||||
|
} from '@grafana/scenes';
|
||||||
|
|
||||||
import { DataTrail } from '../DataTrail';
|
import { DataTrail } from '../DataTrail';
|
||||||
|
|
||||||
export interface DataTrailEmbeddedState extends SceneObjectState {
|
export interface DataTrailEmbeddedState extends SceneObjectState {
|
||||||
timeRange: SceneTimeRangeLike;
|
timeRangeState: SceneTimeRangeState;
|
||||||
metric?: string;
|
metric?: string;
|
||||||
filters?: AdHocVariableFilter[];
|
filters?: AdHocVariableFilter[];
|
||||||
dataSourceUid?: string;
|
dataSourceUid?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DataTrailEmbedded extends SceneObjectBase<DataTrailEmbeddedState> {
|
export class DataTrailEmbedded extends SceneObjectBase<DataTrailEmbeddedState> {
|
||||||
static Component = DataTrailEmbeddedRenderer;
|
static Component = DataTrailEmbeddedRenderer;
|
||||||
|
|
||||||
@ -24,9 +31,9 @@ function DataTrailEmbeddedRenderer({ model }: SceneComponentProps<DataTrailEmbed
|
|||||||
return <model.trail.Component model={model.trail} />;
|
return <model.trail.Component model={model.trail} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildDataTrailFromState({ metric, filters, dataSourceUid, timeRange }: DataTrailEmbeddedState) {
|
function buildDataTrailFromState({ metric, filters, dataSourceUid, timeRangeState }: DataTrailEmbeddedState) {
|
||||||
return new DataTrail({
|
return new DataTrail({
|
||||||
$timeRange: timeRange,
|
$timeRange: new SceneTimeRange(timeRangeState),
|
||||||
metric,
|
metric,
|
||||||
initialDS: dataSourceUid,
|
initialDS: dataSourceUid,
|
||||||
initialFilters: filters,
|
initialFilters: filters,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { PanelMenuItem } from '@grafana/data';
|
import { PanelMenuItem } from '@grafana/data';
|
||||||
import { PromQuery } from '@grafana/prometheus';
|
import { PromQuery } from '@grafana/prometheus';
|
||||||
import { getDataSourceSrv } from '@grafana/runtime';
|
import { getDataSourceSrv } from '@grafana/runtime';
|
||||||
import { SceneTimeRangeLike, VizPanel } from '@grafana/scenes';
|
import { SceneTimeRangeState, VizPanel } from '@grafana/scenes';
|
||||||
import { DataQuery, DataSourceRef } from '@grafana/schema';
|
import { DataQuery, DataSourceRef } from '@grafana/schema';
|
||||||
import { getQueryRunnerFor } from 'app/features/dashboard-scene/utils/utils';
|
import { getQueryRunnerFor } from 'app/features/dashboard-scene/utils/utils';
|
||||||
|
|
||||||
@ -11,8 +11,8 @@ import { reportExploreMetrics } from '../interactions';
|
|||||||
|
|
||||||
import { DataTrailEmbedded, DataTrailEmbeddedState } from './DataTrailEmbedded';
|
import { DataTrailEmbedded, DataTrailEmbeddedState } from './DataTrailEmbedded';
|
||||||
import { SceneDrawerAsScene } from './SceneDrawer';
|
import { SceneDrawerAsScene } from './SceneDrawer';
|
||||||
import { QueryMetric, getQueryMetrics } from './getQueryMetrics';
|
import { getQueryMetrics, QueryMetric } from './getQueryMetrics';
|
||||||
import { createAdHocFilters, getQueryMetricLabel, getTimeRangeFromDashboard } from './utils';
|
import { createAdHocFilters, getQueryMetricLabel, getTimeRangeStateFromDashboard } from './utils';
|
||||||
|
|
||||||
export async function addDataTrailPanelAction(dashboard: DashboardScene, panel: VizPanel, items: PanelMenuItem[]) {
|
export async function addDataTrailPanelAction(dashboard: DashboardScene, panel: VizPanel, items: PanelMenuItem[]) {
|
||||||
if (panel.state.pluginId !== 'timeseries') {
|
if (panel.state.pluginId !== 'timeseries') {
|
||||||
@ -64,33 +64,35 @@ export async function addDataTrailPanelAction(dashboard: DashboardScene, panel:
|
|||||||
|
|
||||||
function getUnique<T extends { text: string }>(items: T[]) {
|
function getUnique<T extends { text: string }>(items: T[]) {
|
||||||
const uniqueMenuTexts = new Set<string>();
|
const uniqueMenuTexts = new Set<string>();
|
||||||
|
|
||||||
function isUnique({ text }: { text: string }) {
|
function isUnique({ text }: { text: string }) {
|
||||||
const before = uniqueMenuTexts.size;
|
const before = uniqueMenuTexts.size;
|
||||||
uniqueMenuTexts.add(text);
|
uniqueMenuTexts.add(text);
|
||||||
const after = uniqueMenuTexts.size;
|
const after = uniqueMenuTexts.size;
|
||||||
return after > before;
|
return after > before;
|
||||||
}
|
}
|
||||||
|
|
||||||
return items.filter(isUnique);
|
return items.filter(isUnique);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getEmbeddedTrailsState(
|
function getEmbeddedTrailsState(
|
||||||
{ metric, labelFilters, query }: QueryMetric,
|
{ metric, labelFilters, query }: QueryMetric,
|
||||||
timeRange: SceneTimeRangeLike,
|
timeRangeState: SceneTimeRangeState,
|
||||||
dataSourceUid: string | undefined
|
dataSourceUid: string | undefined
|
||||||
) {
|
) {
|
||||||
const state: DataTrailEmbeddedState = {
|
const state: DataTrailEmbeddedState = {
|
||||||
metric,
|
metric,
|
||||||
filters: createAdHocFilters(labelFilters),
|
filters: createAdHocFilters(labelFilters),
|
||||||
dataSourceUid,
|
dataSourceUid,
|
||||||
timeRange,
|
timeRangeState,
|
||||||
};
|
};
|
||||||
|
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createCommonEmbeddedTrailStateProps(item: QueryMetric, dashboard: DashboardScene, ds: DataSourceRef) {
|
function createCommonEmbeddedTrailStateProps(item: QueryMetric, dashboard: DashboardScene, ds: DataSourceRef) {
|
||||||
const timeRange = getTimeRangeFromDashboard(dashboard);
|
const timeRangeState = getTimeRangeStateFromDashboard(dashboard);
|
||||||
const trailState = getEmbeddedTrailsState(item, timeRange, ds.uid);
|
const trailState = getEmbeddedTrailsState(item, timeRangeState, ds.uid);
|
||||||
const embeddedTrail: DataTrailEmbedded = new DataTrailEmbedded(trailState);
|
const embeddedTrail: DataTrailEmbedded = new DataTrailEmbedded(trailState);
|
||||||
|
|
||||||
embeddedTrail.trail.addActivationHandler(() => {
|
embeddedTrail.trail.addActivationHandler(() => {
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
import { QueryBuilderLabelFilter } from '@grafana/prometheus/src/querybuilder/shared/types';
|
import { QueryBuilderLabelFilter } from '@grafana/prometheus/src/querybuilder/shared/types';
|
||||||
import { DashboardScene } from 'app/features/dashboard-scene/scene/DashboardScene';
|
import { DashboardScene } from 'app/features/dashboard-scene/scene/DashboardScene';
|
||||||
|
|
||||||
import { QueryMetric } from './getQueryMetrics';
|
import { QueryMetric } from './getQueryMetrics'; // We only support label filters with the '=' operator
|
||||||
|
|
||||||
// We only support label filters with the '=' operator
|
// We only support label filters with the '=' operator
|
||||||
export function isEquals(labelFilter: QueryBuilderLabelFilter) {
|
export function isEquals(labelFilter: QueryBuilderLabelFilter) {
|
||||||
return labelFilter.op === '=';
|
return labelFilter.op === '=';
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTimeRangeFromDashboard(dashboard: DashboardScene) {
|
export function getTimeRangeStateFromDashboard(dashboard: DashboardScene) {
|
||||||
return dashboard.state.$timeRange!.clone();
|
return dashboard.state.$timeRange!.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getQueryMetricLabel({ metric, labelFilters }: QueryMetric) {
|
export function getQueryMetricLabel({ metric, labelFilters }: QueryMetric) {
|
||||||
|
Loading…
Reference in New Issue
Block a user