github.com/netdata/go.d.plugin@v0.58.1/modules/squidlog/init.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package squidlog
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"strings"
     9  
    10  	"github.com/netdata/go.d.plugin/pkg/logs"
    11  )
    12  
    13  func (s *SquidLog) createLogReader() error {
    14  	s.Cleanup()
    15  	s.Debug("starting log reader creating")
    16  
    17  	reader, err := logs.Open(s.Path, s.ExcludePath, s.Logger)
    18  	if err != nil {
    19  		return fmt.Errorf("creating log reader: %v", err)
    20  	}
    21  
    22  	s.Debugf("created log reader, current file '%s'", reader.CurrentFilename())
    23  	s.file = reader
    24  	return nil
    25  }
    26  
    27  func (s *SquidLog) createParser() error {
    28  	s.Debug("starting parser creating")
    29  	lastLine, err := logs.ReadLastLine(s.file.CurrentFilename(), 0)
    30  	if err != nil {
    31  		return fmt.Errorf("read last line: %v", err)
    32  	}
    33  
    34  	lastLine = bytes.TrimRight(lastLine, "\n")
    35  	s.Debugf("last line: '%s'", string(lastLine))
    36  
    37  	s.parser, err = logs.NewParser(s.Parser, s.file)
    38  	if err != nil {
    39  		return fmt.Errorf("create parser: %v", err)
    40  	}
    41  	s.Debugf("created parser: %s", s.parser.Info())
    42  
    43  	err = s.parser.Parse(lastLine, s.line)
    44  	if err != nil {
    45  		return fmt.Errorf("parse last line: %v (%s)", err, string(lastLine))
    46  	}
    47  
    48  	if err = s.line.verify(); err != nil {
    49  		return fmt.Errorf("verify last line: %v (%s)", err, string(lastLine))
    50  	}
    51  	return nil
    52  }
    53  
    54  func checkCSVFormatField(name string) (newName string, offset int, valid bool) {
    55  	name = cleanField(name)
    56  	if !knownField(name) {
    57  		return "", 0, false
    58  	}
    59  	return name, 0, true
    60  }
    61  
    62  func cleanField(name string) string {
    63  	return strings.TrimLeft(name, "$%")
    64  }
    65  
    66  func knownField(name string) bool {
    67  	switch name {
    68  	case fieldRespTime, fieldClientAddr, fieldCacheCode, fieldHTTPCode, fieldRespSize, fieldReqMethod:
    69  		fallthrough
    70  	case fieldHierCode, fieldServerAddr, fieldMimeType, fieldResultCode, fieldHierarchy:
    71  		return true
    72  	}
    73  	return false
    74  }