grafana/public/app/features/explore/LogsSamplePanel.tsx
Ivana Huckova a0921f2e88
Explore: Implement logs sample in Explore (#61864)
* Implement log samples

* Explore: Implement logs sample panel

* Log samples: Add documentation

* Update docs

* Add info for log sample

* Fix label

* Update

* Default to true

* Fix copy in test

* Update public/app/features/explore/LogsSamplePanel.tsx

Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>

* Use timeZone from grafana/schema

* Rename data props to queryResponse

* Unify name to logs sample

* Remove redundant optional parameters in LogsSamplePanel

* Make intervalMs parameter optional in dataFrameToLogsModel and remove undefined argument when not needed

* Fix incorrect position of copy log line button

* Update public/app/core/logsModel.ts

Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>

Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>
2023-01-24 19:10:27 +01:00

68 lines
2.5 KiB
TypeScript

import React from 'react';
import { DataQueryResponse, DataSourceApi, LoadingState, LogsDedupStrategy } from '@grafana/data';
import { reportInteraction } from '@grafana/runtime';
import { TimeZone } from '@grafana/schema';
import { Collapse } 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;
datasourceInstance: DataSourceApi | null | undefined;
setLogsSampleEnabled: (enabled: boolean) => void;
};
export function LogsSamplePanel(props: Props) {
const { queryResponse, timeZone, enabled, setLogsSampleEnabled, datasourceInstance } = props;
const onToggleLogsSampleCollapse = (isOpen: boolean) => {
setLogsSampleEnabled(isOpen);
reportInteraction('grafana_explore_logs_sample_toggle_clicked', {
datasourceType: datasourceInstance?.type ?? 'unknown',
type: isOpen ? 'open' : 'close',
});
};
let LogsSamplePanelContent: JSX.Element | null;
if (queryResponse === undefined) {
LogsSamplePanelContent = null;
} else if (queryResponse.error !== undefined) {
LogsSamplePanelContent = (
<SupplementaryResultError error={queryResponse.error} title="Failed to load logs sample for this query" />
);
} else if (queryResponse.state === LoadingState.Loading) {
LogsSamplePanelContent = <span>Logs sample is loading...</span>;
} else if (queryResponse.data.length === 0 || queryResponse.data[0].length === 0) {
LogsSamplePanelContent = <span>No logs sample data.</span>;
} else {
const logs = dataFrameToLogsModel(queryResponse.data);
LogsSamplePanelContent = (
<LogRows
logRows={logs.rows}
dedupStrategy={LogsDedupStrategy.none}
showLabels={store.getBool(SETTINGS_KEYS.showLabels, false)}
showTime={store.getBool(SETTINGS_KEYS.showTime, true)}
wrapLogMessage={store.getBool(SETTINGS_KEYS.wrapLogMessage, true)}
prettifyLogMessage={store.getBool(SETTINGS_KEYS.prettifyLogMessage, false)}
timeZone={timeZone}
enableLogDetails={true}
/>
);
}
return (
<Collapse label="Logs sample" isOpen={enabled} collapsible={true} onToggle={onToggleLogsSampleCollapse}>
{LogsSamplePanelContent}
</Collapse>
);
}