master
go 139 lines 2.69 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package vcsa
4
5 import (
6 "context"
7 _ "embed"
8 "errors"
9 "fmt"
10 "time"
11
12 "github.com/netdata/netdata/go/plugins/pkg/confopt"
13 "github.com/netdata/netdata/go/plugins/pkg/web"
14 "github.com/netdata/netdata/go/plugins/plugin/framework/collectorapi"
15 )
16
17 //go:embed "config_schema.json"
18 var configSchema string
19
20 func init() {
21 collectorapi.Register("vcsa", collectorapi.Creator{
22 JobConfigSchema: configSchema,
23 Defaults: collectorapi.Defaults{
24 UpdateEvery: 5, // VCSA health checks freq is 5 second.
25 },
26 Create: func() collectorapi.CollectorV1 { return New() },
27 Config: func() any { return &Config{} },
28 })
29 }
30
31 func New() *Collector {
32 return &Collector{
33 Config: Config{
34 HTTPConfig: web.HTTPConfig{
35 ClientConfig: web.ClientConfig{
36 Timeout: confopt.Duration(time.Second * 5),
37 },
38 },
39 },
40 charts: vcsaHealthCharts.Copy(),
41 }
42 }
43
44 type Config struct {
45 Vnode string `yaml:"vnode,omitempty" json:"vnode"`
46 UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
47 AutoDetectionRetry int `yaml:"autodetection_retry,omitempty" json:"autodetection_retry"`
48 web.HTTPConfig `yaml:",inline" json:""`
49 }
50
51 type (
52 Collector struct {
53 collectorapi.Base
54 Config `yaml:",inline" json:""`
55
56 charts *collectorapi.Charts
57
58 client healthClient
59 }
60
61 healthClient interface {
62 Login() error
63 Logout() error
64 Ping() error
65 ApplMgmt() (string, error)
66 DatabaseStorage() (string, error)
67 Load() (string, error)
68 Mem() (string, error)
69 SoftwarePackages() (string, error)
70 Storage() (string, error)
71 Swap() (string, error)
72 System() (string, error)
73 }
74 )
75
76 func (c *Collector) Configuration() any {
77 return c.Config
78 }
79
80 func (c *Collector) Init(context.Context) error {
81 if err := c.validateConfig(); err != nil {
82 return fmt.Errorf("invalid config: %v", err)
83 }
84
85 cli, err := c.initHealthClient()
86 if err != nil {
87 return fmt.Errorf("error on creating health client : %vc", err)
88 }
89 c.client = cli
90
91 c.Debugf("using URL %s", c.URL)
92 c.Debugf("using timeout: %s", c.Timeout)
93
94 return nil
95 }
96
97 func (c *Collector) Check(context.Context) error {
98 err := c.client.Login()
99 if err != nil {
100 return err
101 }
102
103 mx, err := c.collect()
104 if err != nil {
105 return err
106 }
107
108 if len(mx) == 0 {
109 return errors.New("no metrics collected")
110 }
111
112 return nil
113 }
114
115 func (c *Collector) Charts() *collectorapi.Charts {
116 return c.charts
117 }
118
119 func (c *Collector) Collect(context.Context) map[string]int64 {
120 mx, err := c.collect()
121 if err != nil {
122 c.Error(err)
123 }
124
125 if len(mx) == 0 {
126 return nil
127 }
128 return mx
129 }
130
131 func (c *Collector) Cleanup(context.Context) {
132 if c.client == nil {
133 return
134 }
135 err := c.client.Logout()
136 if err != nil {
137 c.Errorf("error on logout : %v", err)
138 }
139 }