github.com/netdata/go.d.plugin@v0.58.1/modules/pika/pika.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package pika 4 5 import ( 6 "context" 7 _ "embed" 8 "time" 9 10 "github.com/netdata/go.d.plugin/agent/module" 11 "github.com/netdata/go.d.plugin/pkg/tlscfg" 12 "github.com/netdata/go.d.plugin/pkg/web" 13 14 "github.com/blang/semver/v4" 15 "github.com/go-redis/redis/v8" 16 ) 17 18 //go:embed "config_schema.json" 19 var configSchema string 20 21 func init() { 22 module.Register("pika", module.Creator{ 23 JobConfigSchema: configSchema, 24 Create: func() module.Module { return New() }, 25 }) 26 } 27 28 func New() *Pika { 29 return &Pika{ 30 Config: Config{ 31 Address: "redis://@localhost:9221", 32 Timeout: web.Duration{Duration: time.Second}, 33 }, 34 35 collectedCommands: make(map[string]bool), 36 collectedDbs: make(map[string]bool), 37 } 38 } 39 40 type Config struct { 41 Address string `yaml:"address"` 42 Timeout web.Duration `yaml:"timeout"` 43 tlscfg.TLSConfig `yaml:",inline"` 44 } 45 46 type ( 47 Pika struct { 48 module.Base 49 Config `yaml:",inline"` 50 51 pdb redisClient 52 53 server string 54 version *semver.Version 55 56 collectedCommands map[string]bool 57 collectedDbs map[string]bool 58 59 charts *module.Charts 60 } 61 redisClient interface { 62 Info(ctx context.Context, section ...string) *redis.StringCmd 63 Close() error 64 } 65 ) 66 67 func (p *Pika) Init() bool { 68 err := p.validateConfig() 69 if err != nil { 70 p.Errorf("config validation: %v", err) 71 return false 72 } 73 74 pdb, err := p.initRedisClient() 75 if err != nil { 76 p.Errorf("init redis client: %v", err) 77 return false 78 } 79 p.pdb = pdb 80 81 charts, err := p.initCharts() 82 if err != nil { 83 p.Errorf("init charts: %v", err) 84 return false 85 } 86 p.charts = charts 87 88 return true 89 } 90 91 func (p *Pika) Check() bool { 92 return len(p.Collect()) > 0 93 } 94 95 func (p *Pika) Charts() *module.Charts { 96 return p.charts 97 } 98 99 func (p *Pika) Collect() map[string]int64 { 100 ms, err := p.collect() 101 if err != nil { 102 p.Error(err) 103 } 104 105 if len(ms) == 0 { 106 return nil 107 } 108 return ms 109 } 110 111 func (p *Pika) Cleanup() { 112 if p.pdb == nil { 113 return 114 } 115 err := p.pdb.Close() 116 if err != nil { 117 p.Warningf("cleanup: error on closing redis client [%s]: %v", p.Address, err) 118 } 119 p.pdb = nil 120 }