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