LogsContainer.tsx 5.1 KB

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