LogsContainer.tsx 5.2 KB

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