collector/logs/transforms/parser/parser.go (68 lines of code) (raw):
package parser
import (
"fmt"
"github.com/Azure/adx-mon/collector/logs/types"
"github.com/Azure/adx-mon/pkg/logger"
)
// Parser is the interface for parsing log messages.
type Parser interface {
Parse(*types.Log, string) error
}
type ParserType string
// ParserConfig is a structure used in configs for creating parsers instances.
type ParserConfig struct {
Type ParserType
}
// newParser creates a new parser instance.
func newParser(parserType ParserType) (Parser, error) {
switch parserType {
case ParserTypeJson:
return NewJsonParser(JsonParserConfig{})
case ParserTypeKeyValue:
return NewKeyValueParser(KeyValueParserConfig{})
case ParserTypeSpace:
return NewSpaceParser(SpaceParserConfig{})
case ParserTypeKlog:
return NewKlogParser(KlogParserConfig{})
default:
return nil, fmt.Errorf("unknown parser type: %s", parserType)
}
}
// NewParsers creates a list of valid parser instances.
// Invalid parsers or those that cannot be created will be skipped with warning logs including the source string.
func NewParsers(parserTypes []string, source string) []Parser {
parsers := make([]Parser, 0, len(parserTypes))
for _, parserType := range parserTypes {
parser, err := newParser(ParserType(parserType))
if err != nil {
logger.Warnf("Failed to create parser %s for %s: %v", parserType, source, err)
continue
}
parsers = append(parsers, parser)
}
return parsers
}
func IsValidParser(parserType string) bool {
switch parserType {
case string(ParserTypeJson):
return true
case string(ParserTypeKeyValue):
return true
case string(ParserTypeSpace):
return true
case string(ParserTypeKlog):
return true
default:
return false
}
}
func ExecuteParsers(parsers []Parser, log *types.Log, message string, name string) {
successfulParse := false
for _, parser := range parsers {
err := parser.Parse(log, message)
if err == nil {
successfulParse = true
break // successful parse
} else if logger.IsDebug() {
logger.Debugf("parser error for source %q: %v", name, err)
}
}
if !successfulParse {
// Unsuccessful parse, add the raw message
log.SetBodyValue(types.BodyKeyMessage, message)
}
}