LogsContainer.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. import React, { PureComponent } from 'react';
  2. import { hot } from 'react-hot-loader';
  3. import { connect } from 'react-redux';
  4. import { RawTimeRange, TimeRange } from '@grafana/ui';
  5. import { ExploreId, ExploreItemState } from 'app/types/explore';
  6. import { LogsModel, LogsDedupStrategy, LogLevel } from 'app/core/logs_model';
  7. import { StoreState } from 'app/types';
  8. import { toggleLogs, changeDedupStrategy } from './state/actions';
  9. import Logs from './Logs';
  10. import Panel from './Panel';
  11. import { toggleLogLevelAction } from 'app/features/explore/state/actionTypes';
  12. import { deduplicatedLogsSelector, exploreItemUIStateSelector } from 'app/features/explore/state/selectors';
  13. interface LogsContainerProps {
  14. exploreId: ExploreId;
  15. loading: boolean;
  16. logsHighlighterExpressions?: string[];
  17. logsResult?: LogsModel;
  18. dedupedResult?: LogsModel;
  19. onChangeTime: (range: TimeRange) => void;
  20. onClickLabel: (key: string, value: string) => void;
  21. onStartScanning: () => void;
  22. onStopScanning: () => void;
  23. range: RawTimeRange;
  24. scanning?: boolean;
  25. scanRange?: RawTimeRange;
  26. showingLogs: boolean;
  27. toggleLogs: typeof toggleLogs;
  28. toggleLogLevelAction: typeof toggleLogLevelAction;
  29. changeDedupStrategy: typeof changeDedupStrategy;
  30. dedupStrategy: LogsDedupStrategy;
  31. hiddenLogLevels: Set<LogLevel>;
  32. width: number;
  33. }
  34. export class LogsContainer extends PureComponent<LogsContainerProps> {
  35. onClickLogsButton = () => {
  36. this.props.toggleLogs(this.props.exploreId, this.props.showingLogs);
  37. };
  38. handleDedupStrategyChange = (dedupStrategy: LogsDedupStrategy) => {
  39. this.props.changeDedupStrategy(this.props.exploreId, dedupStrategy);
  40. };
  41. hangleToggleLogLevel = (hiddenLogLevels: Set<LogLevel>) => {
  42. const { exploreId } = this.props;
  43. this.props.toggleLogLevelAction({
  44. exploreId,
  45. hiddenLogLevels,
  46. });
  47. };
  48. render() {
  49. const {
  50. exploreId,
  51. loading,
  52. logsHighlighterExpressions,
  53. logsResult,
  54. dedupedResult,
  55. onChangeTime,
  56. onClickLabel,
  57. onStartScanning,
  58. onStopScanning,
  59. range,
  60. showingLogs,
  61. scanning,
  62. scanRange,
  63. width,
  64. hiddenLogLevels,
  65. } = this.props;
  66. return (
  67. <Panel label="Logs" loading={loading} isOpen={showingLogs} onToggle={this.onClickLogsButton}>
  68. <Logs
  69. dedupStrategy={this.props.dedupStrategy || LogsDedupStrategy.none}
  70. data={logsResult}
  71. dedupedData={dedupedResult}
  72. exploreId={exploreId}
  73. key={logsResult && logsResult.id}
  74. highlighterExpressions={logsHighlighterExpressions}
  75. loading={loading}
  76. onChangeTime={onChangeTime}
  77. onClickLabel={onClickLabel}
  78. onStartScanning={onStartScanning}
  79. onStopScanning={onStopScanning}
  80. onDedupStrategyChange={this.handleDedupStrategyChange}
  81. onToggleLogLevel={this.hangleToggleLogLevel}
  82. range={range}
  83. scanning={scanning}
  84. scanRange={scanRange}
  85. width={width}
  86. hiddenLogLevels={hiddenLogLevels}
  87. />
  88. </Panel>
  89. );
  90. }
  91. }
  92. function mapStateToProps(state: StoreState, { exploreId }) {
  93. const explore = state.explore;
  94. const item: ExploreItemState = explore[exploreId];
  95. const { logsHighlighterExpressions, logsResult, queryTransactions, scanning, scanRange, range } = item;
  96. const loading = queryTransactions.some(qt => qt.resultType === 'Logs' && !qt.done);
  97. const { showingLogs, dedupStrategy } = exploreItemUIStateSelector(item);
  98. const hiddenLogLevels = new Set(item.hiddenLogLevels);
  99. const dedupedResult = deduplicatedLogsSelector(item);
  100. return {
  101. loading,
  102. logsHighlighterExpressions,
  103. logsResult,
  104. scanning,
  105. scanRange,
  106. showingLogs,
  107. range,
  108. dedupStrategy,
  109. hiddenLogLevels,
  110. dedupedResult,
  111. };
  112. }
  113. const mapDispatchToProps = {
  114. toggleLogs,
  115. changeDedupStrategy,
  116. toggleLogLevelAction,
  117. };
  118. export default hot(module)(
  119. connect(
  120. mapStateToProps,
  121. mapDispatchToProps
  122. )(LogsContainer)
  123. );