github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/worker/metrics/collect/handler.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package collect 5 6 import ( 7 "fmt" 8 "net" 9 "time" 10 11 "github.com/juju/errors" 12 "gopkg.in/juju/names.v2" 13 14 "github.com/juju/juju/agent" 15 "github.com/juju/juju/worker/fortress" 16 "github.com/juju/juju/worker/metrics/spool" 17 "github.com/juju/juju/worker/uniter" 18 ) 19 20 // handlerConfig stores configuration values for the socketListener. 21 type handlerConfig struct { 22 charmdir fortress.Guest 23 agent agent.Agent 24 unitTag names.UnitTag 25 metricsFactory spool.MetricFactory 26 runner *hookRunner 27 } 28 29 func newHandler(config handlerConfig) *handler { 30 return &handler{config: config} 31 } 32 33 type handler struct { 34 config handlerConfig 35 } 36 37 // Handle triggers the collect-metrics hook and writes collected metrics 38 // to the specified connection. 39 func (l *handler) Handle(c net.Conn, abort <-chan struct{}) error { 40 defer c.Close() 41 42 // TODO(fwereade): 2016-03-17 lp:1558657 43 err := c.SetDeadline(time.Now().Add(spool.DefaultTimeout)) 44 if err != nil { 45 return errors.Annotate(err, "failed to set the deadline") 46 } 47 48 err = l.config.charmdir.Visit(func() error { 49 return l.do(c) 50 }, abort) 51 if err != nil { 52 fmt.Fprintf(c, "error: %v\n", err.Error()) 53 } else { 54 fmt.Fprintf(c, "ok\n") 55 } 56 return errors.Trace(err) 57 } 58 59 func (l *handler) do(c net.Conn) error { 60 paths := uniter.NewWorkerPaths(l.config.agent.CurrentConfig().DataDir(), l.config.unitTag, "metrics-collect") 61 charmURL, validMetrics, err := readCharm(l.config.unitTag, paths) 62 if err != nil { 63 return errors.Trace(err) 64 } 65 66 recorder, err := l.config.metricsFactory.Recorder( 67 validMetrics, 68 charmURL.String(), 69 l.config.unitTag.String(), 70 ) 71 if err != nil { 72 return errors.Annotate(err, "failed to create the metric recorder") 73 } 74 defer recorder.Close() 75 err = l.config.runner.do(recorder) 76 if err != nil { 77 return errors.Annotate(err, "failed to collect metrics") 78 } 79 return nil 80 }