github.com/netdata/go.d.plugin@v0.58.1/modules/docker_engine/docker_engine.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package docker_engine
     4  
     5  import (
     6  	_ "embed"
     7  	"errors"
     8  	"time"
     9  
    10  	"github.com/netdata/go.d.plugin/pkg/prometheus"
    11  	"github.com/netdata/go.d.plugin/pkg/web"
    12  
    13  	"github.com/netdata/go.d.plugin/agent/module"
    14  )
    15  
    16  //go:embed "config_schema.json"
    17  var configSchema string
    18  
    19  func init() {
    20  	module.Register("docker_engine", module.Creator{
    21  		JobConfigSchema: configSchema,
    22  		Create:          func() module.Module { return New() },
    23  	})
    24  }
    25  
    26  func New() *DockerEngine {
    27  	config := Config{
    28  		HTTP: web.HTTP{
    29  			Request: web.Request{
    30  				URL: "http://127.0.0.1:9323/metrics",
    31  			},
    32  			Client: web.Client{
    33  				Timeout: web.Duration{Duration: time.Second},
    34  			},
    35  		},
    36  	}
    37  	return &DockerEngine{
    38  		Config: config,
    39  	}
    40  }
    41  
    42  type (
    43  	Config struct {
    44  		web.HTTP `yaml:",inline"`
    45  	}
    46  	DockerEngine struct {
    47  		module.Base
    48  		Config `yaml:",inline"`
    49  
    50  		prom               prometheus.Prometheus
    51  		isSwarmManager     bool
    52  		hasContainerStates bool
    53  	}
    54  )
    55  
    56  func (de DockerEngine) validateConfig() error {
    57  	if de.URL == "" {
    58  		return errors.New("URL is not set")
    59  	}
    60  	return nil
    61  }
    62  
    63  func (de *DockerEngine) initClient() error {
    64  	client, err := web.NewHTTPClient(de.Client)
    65  	if err != nil {
    66  		return err
    67  	}
    68  
    69  	de.prom = prometheus.New(client, de.Request)
    70  	return nil
    71  }
    72  
    73  func (de *DockerEngine) Init() bool {
    74  	if err := de.validateConfig(); err != nil {
    75  		de.Errorf("config validation: %v", err)
    76  		return false
    77  	}
    78  	if err := de.initClient(); err != nil {
    79  		de.Errorf("client initialization: %v", err)
    80  		return false
    81  	}
    82  	return true
    83  }
    84  
    85  func (de *DockerEngine) Check() bool {
    86  	return len(de.Collect()) > 0
    87  }
    88  
    89  func (de DockerEngine) Charts() *Charts {
    90  	cs := charts.Copy()
    91  	if !de.hasContainerStates {
    92  		if err := cs.Remove("engine_daemon_container_states_containers"); err != nil {
    93  			de.Warning(err)
    94  		}
    95  	}
    96  
    97  	if !de.isSwarmManager {
    98  		return cs
    99  	}
   100  
   101  	if err := cs.Add(*swarmManagerCharts.Copy()...); err != nil {
   102  		de.Warning(err)
   103  	}
   104  	return cs
   105  }
   106  
   107  func (de *DockerEngine) Collect() map[string]int64 {
   108  	mx, err := de.collect()
   109  	if err != nil {
   110  		de.Error(err)
   111  		return nil
   112  	}
   113  
   114  	if len(mx) == 0 {
   115  		return nil
   116  	}
   117  	return mx
   118  }
   119  
   120  func (DockerEngine) Cleanup() {}