LogsContainer.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import { DataSourceApi } from '@grafana/ui';
  5. import {
  6. RawTimeRange,
  7. LogLevel,
  8. TimeZone,
  9. AbsoluteTimeRange,
  10. LogsModel,
  11. LogRowModel,
  12. LogsDedupStrategy,
  13. LoadingState,
  14. TimeRange,
  15. } from '@grafana/data';
  16. import { ExploreId, ExploreItemState } from 'app/types/explore';
  17. import { StoreState } from 'app/types';
  18. import { changeDedupStrategy, updateTimeRange } from './state/actions';
  19. import Logs from './Logs';
  20. import Panel from './Panel';
  21. import { toggleLogLevelAction, changeRefreshIntervalAction } from 'app/features/explore/state/actionTypes';
  22. import { deduplicatedLogsSelector, exploreItemUIStateSelector } from 'app/features/explore/state/selectors';
  23. import { getTimeZone } from '../profile/state/selectors';
  24. import { LiveLogsWithTheme } from './LiveLogs';
  25. import { offOption } from '@grafana/ui/src/components/RefreshPicker/RefreshPicker';
  26. interface LogsContainerProps {
  27. datasourceInstance: DataSourceApi | null;
  28. exploreId: ExploreId;
  29. loading: boolean;
  30. logsHighlighterExpressions?: string[];
  31. logsResult?: LogsModel;
  32. dedupedResult?: LogsModel;
  33. onClickLabel: (key: string, value: string) => void;
  34. onStartScanning: () => void;
  35. onStopScanning: () => void;
  36. timeZone: TimeZone;
  37. scanning?: boolean;
  38. scanRange?: RawTimeRange;
  39. toggleLogLevelAction: typeof toggleLogLevelAction;
  40. changeDedupStrategy: typeof changeDedupStrategy;
  41. dedupStrategy: LogsDedupStrategy;
  42. hiddenLogLevels: Set<LogLevel>;
  43. width: number;
  44. isLive: boolean;
  45. stopLive: typeof changeRefreshIntervalAction;
  46. updateTimeRange: typeof updateTimeRange;
  47. range: TimeRange;
  48. absoluteRange: AbsoluteTimeRange;
  49. }
  50. export class LogsContainer extends PureComponent<LogsContainerProps> {
  51. onChangeTime = (absoluteRange: AbsoluteTimeRange) => {
  52. const { exploreId, updateTimeRange } = this.props;
  53. updateTimeRange({ exploreId, absoluteRange });
  54. };
  55. onStopLive = () => {
  56. const { exploreId } = this.props;
  57. this.props.stopLive({ exploreId, refreshInterval: offOption.value });
  58. };
  59. handleDedupStrategyChange = (dedupStrategy: LogsDedupStrategy) => {
  60. this.props.changeDedupStrategy(this.props.exploreId, dedupStrategy);
  61. };
  62. handleToggleLogLevel = (hiddenLogLevels: LogLevel[]) => {
  63. const { exploreId } = this.props;
  64. this.props.toggleLogLevelAction({
  65. exploreId,
  66. hiddenLogLevels,
  67. });
  68. };
  69. getLogRowContext = async (row: LogRowModel, options?: any) => {
  70. const { datasourceInstance } = this.props;
  71. if (datasourceInstance) {
  72. return datasourceInstance.getLogRowContext(row, options);
  73. }
  74. return [];
  75. };
  76. render() {
  77. const {
  78. exploreId,
  79. loading,
  80. logsHighlighterExpressions,
  81. logsResult,
  82. dedupedResult,
  83. onClickLabel,
  84. onStartScanning,
  85. onStopScanning,
  86. absoluteRange,
  87. timeZone,
  88. scanning,
  89. range,
  90. width,
  91. hiddenLogLevels,
  92. isLive,
  93. } = this.props;
  94. if (isLive) {
  95. return (
  96. <Panel label="Logs" loading={false} isOpen>
  97. <LiveLogsWithTheme logsResult={logsResult} timeZone={timeZone} stopLive={this.onStopLive} />
  98. </Panel>
  99. );
  100. }
  101. return (
  102. <Panel label="Logs" loading={loading} isOpen>
  103. <Logs
  104. dedupStrategy={this.props.dedupStrategy || LogsDedupStrategy.none}
  105. data={logsResult}
  106. dedupedData={dedupedResult}
  107. exploreId={exploreId}
  108. highlighterExpressions={logsHighlighterExpressions}
  109. loading={loading}
  110. onChangeTime={this.onChangeTime}
  111. onClickLabel={onClickLabel}
  112. onStartScanning={onStartScanning}
  113. onStopScanning={onStopScanning}
  114. onDedupStrategyChange={this.handleDedupStrategyChange}
  115. onToggleLogLevel={this.handleToggleLogLevel}
  116. absoluteRange={absoluteRange}
  117. timeZone={timeZone}
  118. scanning={scanning}
  119. scanRange={range.raw}
  120. width={width}
  121. hiddenLogLevels={hiddenLogLevels}
  122. getRowContext={this.getLogRowContext}
  123. />
  124. </Panel>
  125. );
  126. }
  127. }
  128. function mapStateToProps(state: StoreState, { exploreId }) {
  129. const explore = state.explore;
  130. const item: ExploreItemState = explore[exploreId];
  131. const {
  132. logsHighlighterExpressions,
  133. logsResult,
  134. loadingState,
  135. scanning,
  136. datasourceInstance,
  137. isLive,
  138. range,
  139. absoluteRange,
  140. } = item;
  141. const loading = loadingState === LoadingState.Loading || loadingState === LoadingState.Streaming;
  142. const { dedupStrategy } = exploreItemUIStateSelector(item);
  143. const hiddenLogLevels = new Set(item.hiddenLogLevels);
  144. const dedupedResult = deduplicatedLogsSelector(item);
  145. const timeZone = getTimeZone(state.user);
  146. return {
  147. loading,
  148. logsHighlighterExpressions,
  149. logsResult,
  150. scanning,
  151. timeZone,
  152. dedupStrategy,
  153. hiddenLogLevels,
  154. dedupedResult,
  155. datasourceInstance,
  156. isLive,
  157. range,
  158. absoluteRange,
  159. };
  160. }
  161. const mapDispatchToProps = {
  162. changeDedupStrategy,
  163. toggleLogLevelAction,
  164. stopLive: changeRefreshIntervalAction,
  165. updateTimeRange,
  166. };
  167. export default hot(module)(
  168. connect(
  169. mapStateToProps,
  170. mapDispatchToProps
  171. )(LogsContainer)
  172. );