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