master
go 80 lines 1.74 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package pinger
4
5 import (
6 "context"
7 "errors"
8 "fmt"
9
10 "github.com/netdata/netdata/go/plugins/logger"
11 )
12
13 type Client interface {
14 Probe(ctx context.Context, host string) (Sample, error)
15 ProbeAndTrack(ctx context.Context, host string) (Sample, error)
16 }
17
18 type client struct {
19 log *logger.Logger
20 cfg Config
21 runner probeRunner
22 state *stateStore
23 }
24
25 func New(cfg Config, log *logger.Logger) (Client, error) {
26 return newClient(cfg, log, &defaultRunner{log: ensureLogger(log)})
27 }
28
29 func newClient(cfg Config, log *logger.Logger, runner probeRunner) (*client, error) {
30 if runner == nil {
31 return nil, errors.New("nil probe runner")
32 }
33
34 cfg, err := normalizeConfig(cfg)
35 if err != nil {
36 return nil, err
37 }
38
39 return &client{
40 log: ensureLogger(log),
41 cfg: cfg,
42 runner: runner,
43 state: newStateStore(),
44 }, nil
45 }
46
47 func (c *client) Probe(ctx context.Context, host string) (Sample, error) {
48 return c.probe(ctx, host, false)
49 }
50
51 func (c *client) ProbeAndTrack(ctx context.Context, host string) (Sample, error) {
52 return c.probe(ctx, host, true)
53 }
54
55 func (c *client) probe(ctx context.Context, host string, track bool) (Sample, error) {
56 if ctx == nil {
57 ctx = context.Background()
58 }
59
60 stats, err := c.runner.probe(ctx, host, c.cfg.Probe)
61 if err != nil {
62 var probeErr *ProbeError
63 if errors.As(err, &probeErr) {
64 return Sample{}, err
65 }
66 return Sample{}, &ProbeError{Host: host, Stage: "probe", Err: err}
67 }
68 if stats == nil {
69 return Sample{}, &ProbeError{Host: host, Stage: "probe", Err: fmt.Errorf("nil probe statistics")}
70 }
71
72 return deriveSample(host, stats, track, c.state, c.cfg.Analysis), nil
73 }
74
75 func ensureLogger(log *logger.Logger) *logger.Logger {
76 if log != nil {
77 return log
78 }
79 return logger.New()
80 }