github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/worker/metrics/sender/manifold.go (about) 1 // Copyright 2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package sender 5 6 import ( 7 "time" 8 9 "github.com/juju/errors" 10 "github.com/juju/loggo" 11 "gopkg.in/juju/names.v2" 12 "gopkg.in/juju/worker.v1" 13 "gopkg.in/juju/worker.v1/dependency" 14 15 "github.com/juju/juju/agent" 16 "github.com/juju/juju/api/base" 17 "github.com/juju/juju/api/metricsadder" 18 jworker "github.com/juju/juju/worker" 19 "github.com/juju/juju/worker/metrics/spool" 20 "github.com/juju/juju/worker/uniter" 21 ) 22 23 var ( 24 logger = loggo.GetLogger("juju.worker.metrics.sender") 25 newMetricAdderClient = func(apiCaller base.APICaller) metricsadder.MetricsAdderClient { 26 return metricsadder.NewClient(apiCaller) 27 } 28 period = time.Minute * 5 29 ) 30 31 // ManifoldConfig defines configuration of a metric sender manifold. 32 type ManifoldConfig struct { 33 AgentName string 34 APICallerName string 35 MetricSpoolName string 36 } 37 38 // Manifold creates a metric sender manifold. 39 func Manifold(config ManifoldConfig) dependency.Manifold { 40 return dependency.Manifold{ 41 Inputs: []string{ 42 config.AgentName, 43 config.APICallerName, 44 config.MetricSpoolName, 45 }, 46 Start: func(context dependency.Context) (worker.Worker, error) { 47 var apicaller base.APICaller 48 var factory spool.MetricFactory 49 err := context.Get(config.APICallerName, &apicaller) 50 if err != nil { 51 return nil, errors.Trace(err) 52 } 53 err = context.Get(config.MetricSpoolName, &factory) 54 if err != nil { 55 return nil, errors.Trace(err) 56 } 57 var agent agent.Agent 58 if err := context.Get(config.AgentName, &agent); err != nil { 59 return nil, err 60 } 61 agentConfig := agent.CurrentConfig() 62 tag := agentConfig.Tag() 63 unitTag, ok := tag.(names.UnitTag) 64 if !ok { 65 return nil, errors.Errorf("expected a unit tag, got %v", tag) 66 } 67 paths := uniter.NewWorkerPaths(agentConfig.DataDir(), unitTag, "metrics-send") 68 69 client := newMetricAdderClient(apicaller) 70 71 s, err := newSender(client, factory, paths.State.BaseDir, unitTag.String()) 72 if err != nil { 73 return nil, errors.Trace(err) 74 } 75 return spool.NewPeriodicWorker(s.Do, period, jworker.NewTimer, s.stop), nil 76 }, 77 } 78 }