123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- import React, { useState } from 'react';
- import { CoreApp, DataSourceApi, formattedValueToString, getValueFormat, PanelData, PanelPlugin } from '@grafana/data';
- import { getTemplateSrv } from '@grafana/runtime';
- import { Drawer, Tab, TabsBar } from '@grafana/ui';
- import { InspectDataTab } from 'app/features/inspector/InspectDataTab';
- import { InspectErrorTab } from 'app/features/inspector/InspectErrorTab';
- import { InspectJSONTab } from 'app/features/inspector/InspectJSONTab';
- import { InspectMetadataTab } from 'app/features/inspector/InspectMetadataTab';
- import { InspectStatsTab } from 'app/features/inspector/InspectStatsTab';
- import { QueryInspector } from 'app/features/inspector/QueryInspector';
- import { InspectTab } from 'app/features/inspector/types';
- import { GetDataOptions } from '../../../query/state/PanelQueryRunner';
- import { DashboardModel, PanelModel } from '../../state';
- interface Props {
- dashboard: DashboardModel;
- panel: PanelModel;
- plugin?: PanelPlugin | null;
- defaultTab?: InspectTab;
- tabs: Array<{ label: string; value: InspectTab }>;
- // The last raw response
- data?: PanelData;
- isDataLoading: boolean;
- dataOptions: GetDataOptions;
- // If the datasource supports custom metadata
- metadataDatasource?: DataSourceApi;
- onDataOptionsChange: (options: GetDataOptions) => void;
- onClose: () => void;
- }
- export const InspectContent: React.FC<Props> = ({
- panel,
- plugin,
- dashboard,
- tabs,
- data,
- isDataLoading,
- dataOptions,
- metadataDatasource,
- defaultTab,
- onDataOptionsChange,
- onClose,
- }) => {
- const [currentTab, setCurrentTab] = useState(defaultTab ?? InspectTab.Data);
- if (!plugin) {
- return null;
- }
- const error = data?.error;
- // Validate that the active tab is actually valid and allowed
- let activeTab = currentTab;
- if (!tabs.find((item) => item.value === currentTab)) {
- activeTab = InspectTab.JSON;
- }
- const title = getTemplateSrv().replace(panel.title, panel.scopedVars, 'text');
- return (
- <Drawer
- title={`Inspect: ${title || 'Panel'}`}
- subtitle={data && formatStats(data)}
- width="50%"
- onClose={onClose}
- expandable
- scrollableContent
- tabs={
- <TabsBar>
- {tabs.map((t, index) => {
- return (
- <Tab
- key={`${t.value}-${index}`}
- label={t.label}
- active={t.value === activeTab}
- onChangeTab={() => setCurrentTab(t.value || InspectTab.Data)}
- />
- );
- })}
- </TabsBar>
- }
- >
- {activeTab === InspectTab.Data && (
- <InspectDataTab
- panel={panel}
- data={data && data.series}
- isLoading={isDataLoading}
- options={dataOptions}
- onOptionsChange={onDataOptionsChange}
- timeZone={dashboard.timezone}
- app={CoreApp.Dashboard}
- />
- )}
- {data && activeTab === InspectTab.Meta && (
- <InspectMetadataTab data={data} metadataDatasource={metadataDatasource} />
- )}
- {activeTab === InspectTab.JSON && (
- <InspectJSONTab panel={panel} dashboard={dashboard} data={data} onClose={onClose} />
- )}
- {activeTab === InspectTab.Error && <InspectErrorTab error={error} />}
- {data && activeTab === InspectTab.Stats && <InspectStatsTab data={data} timeZone={dashboard.getTimezone()} />}
- {data && activeTab === InspectTab.Query && (
- <QueryInspector panel={panel} data={data.series} onRefreshQuery={() => panel.refresh()} />
- )}
- </Drawer>
- );
- };
- function formatStats(data: PanelData) {
- const { request } = data;
- if (!request) {
- return '';
- }
- const queryCount = request.targets.length;
- const requestTime = request.endTime ? request.endTime - request.startTime : 0;
- const formatted = formattedValueToString(getValueFormat('ms')(requestTime));
- return `${queryCount} queries with total query time of ${formatted}`;
- }
|