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  }