summaryrefslogtreecommitdiffstats
path: root/src/go/collectors/go.d.plugin/modules/squidlog/init.go
blob: b995b3e654bb4a02be9fa8ff188b6023630d6f83 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// SPDX-License-Identifier: GPL-3.0-or-later

package squidlog

import (
	"bytes"
	"fmt"
	"strings"

	"github.com/netdata/netdata/go/go.d.plugin/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")
	lastLine, err := logs.ReadLastLine(s.file.CurrentFilename(), 0)
	if err != nil {
		return fmt.Errorf("read last line: %v", err)
	}

	lastLine = bytes.TrimRight(lastLine, "\n")
	s.Debugf("last line: '%s'", string(lastLine))

	s.parser, err = logs.NewParser(s.ParserConfig, s.file)
	if err != nil {
		return fmt.Errorf("create parser: %v", err)
	}
	s.Debugf("created parser: %s", s.parser.Info())

	err = s.parser.Parse(lastLine, s.line)
	if err != nil {
		return fmt.Errorf("parse last line: %v (%s)", err, string(lastLine))
	}

	if err = s.line.verify(); err != nil {
		return fmt.Errorf("verify last line: %v (%s)", err, string(lastLine))
	}
	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
}