The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
grafana/public/app/plugins/datasource/dashboard/datasource.ts

89 lines
2.5 KiB

import { Observable, defer, finalize, map, of } from 'rxjs';
import {
DataSourceApi,
DataQueryRequest,
DataQueryResponse,
DataSourceInstanceSettings,
TestDataSourceResponse,
} from '@grafana/data';
import { SceneDataProvider, SceneDataTransformer, SceneObject } from '@grafana/scenes';
import { findVizPanelByKey, getVizPanelKeyForPanelId } from 'app/features/dashboard-scene/utils/utils';
import { DashboardQuery } from './types';
/**
* This should not really be called
*/
export class DashboardDatasource extends DataSourceApi<DashboardQuery> {
constructor(instanceSettings: DataSourceInstanceSettings) {
super(instanceSettings);
}
getCollapsedText(query: DashboardQuery) {
return `Dashboard Reference: ${query.panelId}`;
}
query(options: DataQueryRequest<DashboardQuery>): Observable<DataQueryResponse> {
const scene: SceneObject | undefined = options.scopedVars?.__sceneObject?.value;
if (!scene) {
throw new Error('Can only be called from a scene');
}
const query = options.targets[0];
if (!query) {
return of({ data: [] });
}
const panelId = query.panelId;
if (!panelId) {
return of({ data: [] });
}
let sourcePanel = this.findSourcePanel(scene, panelId);
if (!sourcePanel) {
return of({ data: [], error: { message: 'Could not find source panel' } });
}
let sourceDataProvider: SceneDataProvider | undefined = sourcePanel.state.$data;
if (!query.withTransforms && sourceDataProvider instanceof SceneDataTransformer) {
sourceDataProvider = sourceDataProvider.state.$data;
}
if (!sourceDataProvider || !sourceDataProvider.getResultsStream) {
return of({ data: [] });
}
return defer(() => {
if (!sourceDataProvider!.isActive && sourceDataProvider?.setContainerWidth) {
sourceDataProvider?.setContainerWidth(500);
}
const cleanUp = sourceDataProvider!.activate();
return sourceDataProvider!.getResultsStream!().pipe(
map((result) => {
return {
data: result.data.series,
state: result.data.state,
errors: result.data.errors,
error: result.data.error,
};
}),
finalize(cleanUp)
);
});
}
private findSourcePanel(scene: SceneObject, panelId: number) {
return findVizPanelByKey(scene, getVizPanelKeyForPanelId(panelId));
}
testDatasource(): Promise<TestDataSourceResponse> {
return Promise.resolve({ message: '', status: '' });
}
}