github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 "github.com/juju/names" 12 13 "github.com/juju/juju/agent" 14 "github.com/juju/juju/api/base" 15 "github.com/juju/juju/api/metricsadder" 16 "github.com/juju/juju/worker" 17 "github.com/juju/juju/worker/dependency" 18 "github.com/juju/juju/worker/metrics/spool" 19 "github.com/juju/juju/worker/uniter" 20 ) 21 22 var ( 23 logger = loggo.GetLogger("juju.worker.metrics.sender") 24 newMetricAdderClient = func(apiCaller base.APICaller) metricsadder.MetricsAdderClient { 25 return metricsadder.NewClient(apiCaller) 26 } 27 ) 28 29 const ( 30 period = time.Minute * 5 31 ) 32 33 // ManifoldConfig defines configuration of a metric sender manifold. 34 type ManifoldConfig struct { 35 AgentName string 36 APICallerName string 37 MetricSpoolName string 38 } 39 40 // Manifold creates a metric sender manifold. 41 func Manifold(config ManifoldConfig) dependency.Manifold { 42 return dependency.Manifold{ 43 Inputs: []string{ 44 config.AgentName, 45 config.APICallerName, 46 config.MetricSpoolName, 47 }, 48 Start: func(context dependency.Context) (worker.Worker, error) { 49 var apicaller base.APICaller 50 var factory spool.MetricFactory 51 err := context.Get(config.APICallerName, &apicaller) 52 if err != nil { 53 return nil, errors.Trace(err) 54 } 55 err = context.Get(config.MetricSpoolName, &factory) 56 if err != nil { 57 return nil, errors.Trace(err) 58 } 59 var agent agent.Agent 60 if err := context.Get(config.AgentName, &agent); err != nil { 61 return nil, err 62 } 63 agentConfig := agent.CurrentConfig() 64 tag := agentConfig.Tag() 65 unitTag, ok := tag.(names.UnitTag) 66 if !ok { 67 return nil, errors.Errorf("expected a unit tag, got %v", tag) 68 } 69 paths := uniter.NewWorkerPaths(agentConfig.DataDir(), unitTag, "metrics-send") 70 71 client := newMetricAdderClient(apicaller) 72 73 s, err := newSender(client, factory, paths.State.BaseDir, unitTag.String()) 74 if err != nil { 75 return nil, errors.Trace(err) 76 } 77 return spool.NewPeriodicWorker(s.Do, period, worker.NewTimer, s.stop), nil 78 }, 79 } 80 }