LogsContainer.tsx 4.5 KB

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