master
go 127 lines 2.86 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package filecheck
4
5 import (
6 "context"
7 _ "embed"
8 "fmt"
9 "time"
10
11 "github.com/netdata/netdata/go/plugins/pkg/confopt"
12 "github.com/netdata/netdata/go/plugins/pkg/matcher"
13 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
14 )
15
16 //go:embed "config_schema.json"
17 var configSchema string
18
19 func init() {
20 collectorapi.Register("filecheck", collectorapi.Creator{
21 JobConfigSchema: configSchema,
22 Defaults: collectorapi.Defaults{
23 UpdateEvery: 10,
24 },
25 Create: func() collectorapi.CollectorV1 { return New() },
26 Config: func() any { return &Config{} },
27 })
28 }
29
30 func New() *Collector {
31 return &Collector{
32 Config: Config{
33 DiscoveryEvery: confopt.Duration(time.Minute * 1),
34 Files: filesConfig{},
35 Dirs: dirsConfig{CollectDirSize: false},
36 },
37 charts: &collectorapi.Charts{},
38 seenFiles: newSeenItems(),
39 seenDirs: newSeenItems(),
40 }
41 }
42
43 type (
44 Config struct {
45 UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
46 DiscoveryEvery confopt.Duration `yaml:"discovery_every,omitempty" json:"discovery_every"`
47 Files filesConfig `yaml:"files" json:"files"`
48 Dirs dirsConfig `yaml:"dirs" json:"dirs"`
49 }
50 filesConfig struct {
51 Include []string `yaml:"include" json:"include"`
52 Exclude []string `yaml:"exclude,omitempty" json:"exclude"`
53 }
54 dirsConfig struct {
55 Include []string `yaml:"include" json:"include"`
56 Exclude []string `yaml:"exclude,omitempty" json:"exclude"`
57 CollectDirSize bool `yaml:"collect_dir_size" json:"collect_dir_size"`
58 }
59 )
60
61 type Collector struct {
62 collectorapi.Base
63 Config `yaml:",inline" json:""`
64
65 charts *collectorapi.Charts
66
67 filesFilter matcher.Matcher
68 lastDiscFilesTime time.Time
69 curFiles []string
70 seenFiles *seenItems
71
72 dirsFilter matcher.Matcher
73 lastDiscDirsTime time.Time
74 curDirs []string
75 seenDirs *seenItems
76 }
77
78 func (c *Collector) Configuration() any {
79 return c.Config
80 }
81
82 func (c *Collector) Init(context.Context) error {
83 err := c.validateConfig()
84 if err != nil {
85 return fmt.Errorf("config validation: %v", err)
86 }
87
88 ff, err := c.initFilesFilter()
89 if err != nil {
90 return fmt.Errorf("files filter initialization: %v", err)
91 }
92 c.filesFilter = ff
93
94 df, err := c.initDirsFilter()
95 if err != nil {
96 return fmt.Errorf("dirs filter initialization: %v", err)
97 }
98 c.dirsFilter = df
99
100 c.Debugf("monitored files: %v", c.Files.Include)
101 c.Debugf("monitored dirs: %v", c.Dirs.Include)
102
103 return nil
104 }
105
106 func (c *Collector) Check(context.Context) error {
107 return nil
108 }
109
110 func (c *Collector) Charts() *collectorapi.Charts {
111 return c.charts
112 }
113
114 func (c *Collector) Collect(context.Context) map[string]int64 {
115 mx, err := c.collect()
116 if err != nil {
117 c.Error(err)
118 }
119
120 if len(mx) == 0 {
121 return nil
122 }
123
124 return mx
125 }
126
127 func (c *Collector) Cleanup(context.Context) {}