import { css } from '@emotion/css'; import React from 'react'; import { DataQueryResponse, DataSourceApi, GrafanaTheme2, hasSupplementaryQuerySupport, LoadingState, LogsDedupStrategy, SplitOpen, SupplementaryQueryType, } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { DataQuery, TimeZone } from '@grafana/schema'; import { Button, Collapse, Icon, Tooltip, useStyles2 } from '@grafana/ui'; import { dataFrameToLogsModel } from 'app/core/logsModel'; import store from 'app/core/store'; import { LogRows } from '../../logs/components/LogRows'; import { SupplementaryResultError } from '../SupplementaryResultError'; import { SETTINGS_KEYS } from './utils/logs'; type Props = { queryResponse: DataQueryResponse | undefined; enabled: boolean; timeZone: TimeZone; queries: DataQuery[]; datasourceInstance: DataSourceApi | null | undefined; splitOpen: SplitOpen; setLogsSampleEnabled: (enabled: boolean) => void; }; export function LogsSamplePanel(props: Props) { const { queryResponse, timeZone, enabled, setLogsSampleEnabled, datasourceInstance, queries, splitOpen } = props; const styles = useStyles2(getStyles); const onToggleLogsSampleCollapse = (isOpen: boolean) => { setLogsSampleEnabled(isOpen); reportInteraction('grafana_explore_logs_sample_toggle_clicked', { datasourceType: datasourceInstance?.type ?? 'unknown', type: isOpen ? 'open' : 'close', }); }; const OpenInSplitViewButton = () => { if (!hasSupplementaryQuerySupport(datasourceInstance, SupplementaryQueryType.LogsSample)) { return null; } const logSampleQueries = queries .map((query) => datasourceInstance.getSupplementaryQuery({ type: SupplementaryQueryType.LogsSample }, query)) .filter((query): query is DataQuery => !!query); if (!logSampleQueries.length) { return null; } const onSplitOpen = () => { splitOpen({ queries: logSampleQueries, datasourceUid: datasourceInstance.uid }); reportInteraction('grafana_explore_logs_sample_split_button_clicked', { datasourceType: datasourceInstance?.type ?? 'unknown', queriesCount: logSampleQueries.length, }); }; return ( ); }; let LogsSamplePanelContent: JSX.Element | null; if (queryResponse === undefined) { LogsSamplePanelContent = null; } else if (queryResponse.error !== undefined) { LogsSamplePanelContent = ( ); } else if (queryResponse.state === LoadingState.Loading) { LogsSamplePanelContent = Logs sample is loading...; } else if (queryResponse.data.length === 0 || queryResponse.data[0].length === 0) { LogsSamplePanelContent = No logs sample data.; } else { const logs = dataFrameToLogsModel(queryResponse.data); LogsSamplePanelContent = ( <>
); } return queryResponse?.state !== LoadingState.NotStarted ? ( Logs sample } isOpen={enabled} collapsible={true} onToggle={onToggleLogsSampleCollapse} > {LogsSamplePanelContent} ) : null; } const getStyles = (theme: GrafanaTheme2) => ({ logSamplesButton: css` position: absolute; top: ${theme.spacing(1)}; right: ${theme.spacing(1)}; `, logContainer: css` overflow-x: scroll; `, infoTooltip: css` margin-left: ${theme.spacing(1)}; `, });