mirror of https://github.com/grafana/grafana
Explore/Loki: Toggle parsed fields in logs view (#26178)
* POC for toggling parsed fields in Explore/Loki * fixed issues * add clear button for toggled parsed fields * fix test-frontend failures * use blue eye instead of eye/eye-slash and update tooltips * break out parseMessage * move indicator to meta data section * clean up LogRowMessageParsed * better label * clean up after making optionalpull/27102/head
parent
9f2386a219
commit
e962f02fbc
@ -0,0 +1,40 @@ |
||||
import React, { PureComponent } from 'react'; |
||||
import { LogRowModel } from '@grafana/data'; |
||||
|
||||
import { Themeable } from '../../types/theme'; |
||||
import { withTheme } from '../../themes/index'; |
||||
|
||||
import { parseMessage } from './logParser'; |
||||
|
||||
export interface Props extends Themeable { |
||||
row: LogRowModel; |
||||
showParsedFields: string[]; |
||||
} |
||||
|
||||
class UnThemedLogRowMessageParsed extends PureComponent<Props> { |
||||
render() { |
||||
const { row, showParsedFields } = this.props; |
||||
const fields = parseMessage(row.entry); |
||||
|
||||
const line = showParsedFields |
||||
.map(parsedKey => { |
||||
const field = fields.find(field => { |
||||
const { key } = field; |
||||
return key === parsedKey; |
||||
}); |
||||
|
||||
if (field) { |
||||
return `${parsedKey}=${field.value}`; |
||||
} |
||||
|
||||
return null; |
||||
}) |
||||
.filter(s => s !== null) |
||||
.join(' '); |
||||
|
||||
return <td>{line}</td>; |
||||
} |
||||
} |
||||
|
||||
export const LogRowMessageParsed = withTheme(UnThemedLogRowMessageParsed); |
||||
LogRowMessageParsed.displayName = 'LogRowMessageParsed'; |
||||
@ -0,0 +1,32 @@ |
||||
import { Field, getParser, LinkModel } from '@grafana/data'; |
||||
import memoizeOne from 'memoize-one'; |
||||
|
||||
import { MAX_CHARACTERS } from './LogRowMessage'; |
||||
|
||||
const memoizedGetParser = memoizeOne(getParser); |
||||
|
||||
export type FieldDef = { |
||||
key: string; |
||||
value: string; |
||||
links?: Array<LinkModel<Field>>; |
||||
fieldIndex?: number; |
||||
}; |
||||
|
||||
export const parseMessage = memoizeOne((rowEntry): FieldDef[] => { |
||||
if (rowEntry.length > MAX_CHARACTERS) { |
||||
return []; |
||||
} |
||||
const parser = memoizedGetParser(rowEntry); |
||||
if (!parser) { |
||||
return []; |
||||
} |
||||
// Use parser to highlight detected fields
|
||||
const parsedFields = parser.getFields(rowEntry); |
||||
const fields = parsedFields.map(field => { |
||||
const key = parser.getLabelFromField(field); |
||||
const value = parser.getValueFromField(field); |
||||
return { key, value }; |
||||
}); |
||||
|
||||
return fields; |
||||
}); |
||||
Loading…
Reference in new issue