123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- // SPDX-License-Identifier: GPL-3.0-or-later
- package ceph
- import (
- _ "embed"
- "errors"
- "fmt"
- "net/http"
- "sync"
- "time"
- "github.com/netdata/netdata/go/plugins/plugin/go.d/agent/module"
- "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/confopt"
- "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/tlscfg"
- "github.com/netdata/netdata/go/plugins/plugin/go.d/pkg/web"
- )
- //go:embed "config_schema.json"
- var configSchema string
- func init() {
- module.Register("ceph", module.Creator{
- JobConfigSchema: configSchema,
- Defaults: module.Defaults{
- UpdateEvery: 10,
- },
- Create: func() module.Module { return New() },
- Config: func() any { return &Config{} },
- })
- }
- func New() *Ceph {
- return &Ceph{
- Config: Config{
- HTTPConfig: web.HTTPConfig{
- RequestConfig: web.RequestConfig{
- URL: "https://127.0.0.1:8443",
- },
- ClientConfig: web.ClientConfig{
- Timeout: confopt.Duration(time.Second * 2),
- TLSConfig: tlscfg.TLSConfig{
- InsecureSkipVerify: true,
- },
- },
- },
- },
- charts: &module.Charts{},
- seenPools: make(map[string]bool),
- seenOsds: make(map[string]bool),
- }
- }
- type Config struct {
- UpdateEvery int `yaml:"update_every,omitempty" json:"update_every"`
- web.HTTPConfig `yaml:",inline" json:""`
- }
- type Ceph struct {
- module.Base
- Config `yaml:",inline" json:""`
- charts *module.Charts
- addClusterChartsOnce sync.Once
- httpClient *http.Client
- token string
- fsid string // a unique identifier for the cluster
- seenPools map[string]bool
- seenOsds map[string]bool
- }
- func (c *Ceph) Configuration() any {
- return c.Config
- }
- func (c *Ceph) Init() error {
- if err := c.validateConfig(); err != nil {
- return fmt.Errorf("invalid config: %v", err)
- }
- httpClient, err := web.NewHTTPClient(c.ClientConfig)
- if err != nil {
- return fmt.Errorf("create http client: %v", err)
- }
- c.httpClient = httpClient
- return nil
- }
- func (c *Ceph) Check() error {
- mx, err := c.collect()
- if err != nil {
- return err
- }
- if len(mx) == 0 {
- return errors.New("no metrics collected")
- }
- return nil
- }
- func (c *Ceph) Charts() *module.Charts {
- return c.charts
- }
- func (c *Ceph) Collect() map[string]int64 {
- mx, err := c.collect()
- if err != nil {
- c.Error(err)
- }
- if len(mx) == 0 {
- return nil
- }
- return mx
- }
- func (c *Ceph) Cleanup() {
- if c.httpClient != nil {
- if err := c.authLogout(); err != nil {
- c.Warningf("failed to logout: %v", err)
- }
- c.httpClient.CloseIdleConnections()
- }
- }
|