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