firehol/netdata

View on GitHub
src/go/plugin/go.d/modules/squidlog/init.go

Summary

Maintainability
A
55 mins
Test Coverage
// SPDX-License-Identifier: GPL-3.0-or-later

package squidlog

import (
    "fmt"
    "strings"

    "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/logs"
)

func (s *SquidLog) createLogReader() error {
    s.Cleanup()
    s.Debug("starting log reader creating")

    reader, err := logs.Open(s.Path, s.ExcludePath, s.Logger)
    if err != nil {
        return fmt.Errorf("creating log reader: %v", err)
    }

    s.Debugf("created log reader, current file '%s'", reader.CurrentFilename())
    s.file = reader
    return nil
}

func (s *SquidLog) createParser() error {
    s.Debug("starting parser creating")

    const readLastLinesNum = 100

    lines, err := logs.ReadLastLines(s.file.CurrentFilename(), readLastLinesNum)
    if err != nil {
        return fmt.Errorf("failed to read last lines: %v", err)
    }

    var found bool
    for _, line := range lines {
        if line = strings.TrimSpace(line); line == "" {
            continue
        }

        s.Debugf("last line: '%s'", line)

        s.parser, err = logs.NewParser(s.ParserConfig, s.file)
        if err != nil {
            s.Debugf("failed to create parser from line: %v", err)
            continue
        }

        s.line.reset()

        if err = s.parser.Parse([]byte(line), s.line); err != nil {
            s.Debugf("failed to parse line: %v", err)
            continue
        }

        if err = s.line.verify(); err != nil {
            s.Debugf("failed to verify line: %v", err)
            continue
        }

        found = true
        break
    }

    if !found {
        return fmt.Errorf("failed to create log parser (file '%s')", s.file.CurrentFilename())
    }

    return nil
}

func checkCSVFormatField(name string) (newName string, offset int, valid bool) {
    name = cleanField(name)
    if !knownField(name) {
        return "", 0, false
    }
    return name, 0, true
}

func cleanField(name string) string {
    return strings.TrimLeft(name, "$%")
}

func knownField(name string) bool {
    switch name {
    case fieldRespTime, fieldClientAddr, fieldCacheCode, fieldHTTPCode, fieldRespSize, fieldReqMethod:
        fallthrough
    case fieldHierCode, fieldServerAddr, fieldMimeType, fieldResultCode, fieldHierarchy:
        return true
    }
    return false
}