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() {}