github.com/netdata/go.d.plugin@v0.58.1/pkg/logs/parser.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package logs
     4  
     5  import (
     6  	"errors"
     7  	"fmt"
     8  	"io"
     9  	"strconv"
    10  )
    11  
    12  type ParseError struct {
    13  	msg string
    14  	err error
    15  }
    16  
    17  func (e ParseError) Error() string { return e.msg }
    18  
    19  func (e ParseError) Unwrap() error { return e.err }
    20  
    21  func IsParseError(err error) bool { var v *ParseError; return errors.As(err, &v) }
    22  
    23  type (
    24  	LogLine interface {
    25  		Assign(name string, value string) error
    26  	}
    27  
    28  	Parser interface {
    29  		ReadLine(LogLine) error
    30  		Parse(row []byte, line LogLine) error
    31  		Info() string
    32  	}
    33  )
    34  
    35  const (
    36  	TypeCSV    = "csv"
    37  	TypeLTSV   = "ltsv"
    38  	TypeRegExp = "regexp"
    39  	TypeJSON   = "json"
    40  )
    41  
    42  type ParserConfig struct {
    43  	LogType string       `yaml:"log_type"`
    44  	CSV     CSVConfig    `yaml:"csv_config"`
    45  	LTSV    LTSVConfig   `yaml:"ltsv_config"`
    46  	RegExp  RegExpConfig `yaml:"regexp_config"`
    47  	JSON    JSONConfig   `yaml:"json_config"`
    48  }
    49  
    50  func NewParser(config ParserConfig, in io.Reader) (Parser, error) {
    51  	switch config.LogType {
    52  	case TypeCSV:
    53  		return NewCSVParser(config.CSV, in)
    54  	case TypeLTSV:
    55  		return NewLTSVParser(config.LTSV, in)
    56  	case TypeRegExp:
    57  		return NewRegExpParser(config.RegExp, in)
    58  	case TypeJSON:
    59  		return NewJSONParser(config.JSON, in)
    60  	default:
    61  		return nil, fmt.Errorf("invalid type: %q", config.LogType)
    62  	}
    63  }
    64  
    65  func isNumber(s string) bool { _, err := strconv.Atoi(s); return err == nil }