LogsContainer.tsx 5.2 KB

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