@ -2,7 +2,7 @@ import React, { Fragment, PureComponent } from 'react';
import Highlighter from 'react-highlight-words' ;
import { RawTimeRange } from 'app/types/series' ;
import { LogsDedupStrategy , LogsModel , dedupLogRows } from 'app/core/logs_model' ;
import { LogsDedupStrategy , LogsModel , dedupLogRows , filterLogLevels , LogLevel } from 'app/core/logs_model' ;
import { findHighlightChunksInText } from 'app/core/utils/text' ;
import { Switch } from 'app/core/components/Switch/Switch' ;
@ -33,6 +33,7 @@ interface LogsProps {
interface LogsState {
dedup : LogsDedupStrategy ;
hiddenLogLevels : Set < LogLevel > ;
showLabels : boolean ;
showLocalTime : boolean ;
showUtc : boolean ;
@ -41,6 +42,7 @@ interface LogsState {
export default class Logs extends PureComponent < LogsProps , LogsState > {
state = {
dedup : LogsDedupStrategy.none ,
hiddenLogLevels : new Set ( ) ,
showLabels : true ,
showLocalTime : true ,
showUtc : false ,
@ -76,11 +78,17 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
} ) ;
} ;
onToggleLogLevel = ( rawLevel : string , hiddenRawLevels : Set < string > ) = > {
const hiddenLogLevels : Set < LogLevel > = new Set ( Array . from ( hiddenRawLevels ) . map ( level = > LogLevel [ level ] ) ) ;
this . setState ( { hiddenLogLevels } ) ;
} ;
render() {
const { className = '' , data , loading = false , position , range } = this . props ;
const { dedup , showLabels , showLocalTime , showUtc } = this . state ;
const { dedup , hiddenLogLevels , showLabels , showLocalTime , showUtc } = this . state ;
const hasData = data && data . rows && data . rows . length > 0 ;
const dedupedData = dedupLogRows ( data , dedup ) ;
const filteredData = filterLogLevels ( data , hiddenLogLevels ) ;
const dedupedData = dedupLogRows ( filteredData , dedup ) ;
const dedupCount = dedupedData . rows . reduce ( ( sum , row ) = > sum + row . duplicates , 0 ) ;
const meta = [ . . . data . meta ] ;
if ( dedup !== LogsDedupStrategy . none ) {
@ -113,6 +121,7 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
range = { range }
id = { ` explore-logs-graph- ${ position } ` }
onChangeTime = { this . props . onChangeTime }
onToggleSeries = { this . onToggleLogLevel }
userOptions = { graphOptions }
/ >
< / div >
@ -163,11 +172,11 @@ export default class Logs extends PureComponent<LogsProps, LogsState> {
< div className = "logs-entries" style = { logEntriesStyle } >
{ hasData &&
dedupedData . rows . map ( row = > (
< Fragment key = { row . key } >
< Fragment key = { row . key + row . duplicates } >
< div className = { row . logLevel ? ` logs-row-level logs-row-level- ${ row . logLevel } ` : '' } >
{ row . duplicates > 0 && (
< div className = "logs-row-level__duplicates" title = { ` ${ row . duplicates } duplicates ` } >
{ Array . apply ( null , { length : row.duplicates } ) . map ( index = > (
{ Array . apply ( null , { length : row.duplicates } ) . map ( ( bogus , index ) = > (
< div className = "logs-row-level__duplicate" key = { ` ${ index } ` } / >
) ) }
< / div >