LogsContainer.tsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. width: number;
  42. isLive: boolean;
  43. stopLive: typeof changeRefreshIntervalAction;
  44. updateTimeRange: typeof updateTimeRange;
  45. range: TimeRange;
  46. absoluteRange: AbsoluteTimeRange;
  47. }
  48. export class LogsContainer extends PureComponent<LogsContainerProps> {
  49. onChangeTime = (absoluteRange: AbsoluteTimeRange) => {
  50. const { exploreId, updateTimeRange } = this.props;
  51. updateTimeRange({ exploreId, absoluteRange });
  52. };
  53. onStopLive = () => {
  54. const { exploreId } = this.props;
  55. this.props.stopLive({ exploreId, refreshInterval: offOption.value });
  56. };
  57. handleDedupStrategyChange = (dedupStrategy: LogsDedupStrategy) => {
  58. this.props.changeDedupStrategy(this.props.exploreId, dedupStrategy);
  59. };
  60. handleToggleLogLevel = (hiddenLogLevels: LogLevel[]) => {
  61. const { exploreId } = this.props;
  62. this.props.toggleLogLevelAction({
  63. exploreId,
  64. hiddenLogLevels,
  65. });
  66. };
  67. getLogRowContext = async (row: LogRowModel, options?: any): Promise<any> => {
  68. const { datasourceInstance } = this.props;
  69. if (datasourceInstance) {
  70. return datasourceInstance.getLogRowContext(row, options);
  71. }
  72. return [];
  73. };
  74. render() {
  75. const {
  76. loading,
  77. logsHighlighterExpressions,
  78. logsResult,
  79. dedupedResult,
  80. onClickLabel,
  81. onStartScanning,
  82. onStopScanning,
  83. absoluteRange,
  84. timeZone,
  85. scanning,
  86. range,
  87. width,
  88. isLive,
  89. } = this.props;
  90. if (isLive) {
  91. return (
  92. <Collapse label="Logs" loading={false} isOpen>
  93. <LiveLogsWithTheme logsResult={logsResult} timeZone={timeZone} stopLive={this.onStopLive} />
  94. </Collapse>
  95. );
  96. }
  97. return (
  98. <Collapse label="Logs" loading={loading} isOpen>
  99. <Logs
  100. dedupStrategy={this.props.dedupStrategy || LogsDedupStrategy.none}
  101. data={logsResult}
  102. dedupedData={dedupedResult}
  103. highlighterExpressions={logsHighlighterExpressions}
  104. loading={loading}
  105. onChangeTime={this.onChangeTime}
  106. onClickLabel={onClickLabel}
  107. onStartScanning={onStartScanning}
  108. onStopScanning={onStopScanning}
  109. onDedupStrategyChange={this.handleDedupStrategyChange}
  110. onToggleLogLevel={this.handleToggleLogLevel}
  111. absoluteRange={absoluteRange}
  112. timeZone={timeZone}
  113. scanning={scanning}
  114. scanRange={range.raw}
  115. width={width}
  116. getRowContext={this.getLogRowContext}
  117. />
  118. </Collapse>
  119. );
  120. }
  121. }
  122. function mapStateToProps(state: StoreState, { exploreId }: { exploreId: string }) {
  123. const explore = state.explore;
  124. // @ts-ignore
  125. const item: ExploreItemState = explore[exploreId];
  126. const {
  127. logsHighlighterExpressions,
  128. logsResult,
  129. loadingState,
  130. scanning,
  131. datasourceInstance,
  132. isLive,
  133. range,
  134. absoluteRange,
  135. } = item;
  136. const loading = loadingState === LoadingState.Loading || loadingState === LoadingState.Streaming;
  137. const { dedupStrategy } = exploreItemUIStateSelector(item);
  138. const dedupedResult = deduplicatedLogsSelector(item);
  139. const timeZone = getTimeZone(state.user);
  140. return {
  141. loading,
  142. logsHighlighterExpressions,
  143. logsResult,
  144. scanning,
  145. timeZone,
  146. dedupStrategy,
  147. dedupedResult,
  148. datasourceInstance,
  149. isLive,
  150. range,
  151. absoluteRange,
  152. };
  153. }
  154. const mapDispatchToProps = {
  155. changeDedupStrategy,
  156. toggleLogLevelAction,
  157. stopLive: changeRefreshIntervalAction,
  158. updateTimeRange,
  159. };
  160. export default hot(module)(
  161. connect(
  162. mapStateToProps,
  163. mapDispatchToProps
  164. )(LogsContainer)
  165. );