github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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 "github.com/juju/names" 13 corecharm "gopkg.in/juju/charm.v6-unstable" 14 15 "github.com/juju/juju/worker/metrics/spool" 16 ) 17 18 // handlerConfig stores configuration values for the socketListener. 19 type handlerConfig struct { 20 unitTag names.UnitTag 21 charmURL *corecharm.URL 22 validMetrics map[string]corecharm.Metric 23 metricsFactory spool.MetricFactory 24 runner *hookRunner 25 } 26 27 func newHandler(config handlerConfig) *handler { 28 return &handler{config: config} 29 } 30 31 type handler struct { 32 config handlerConfig 33 } 34 35 // Handle triggers the collect-metrics hook and writes collected metrics 36 // to the specified connection. 37 func (l *handler) Handle(c net.Conn) (err error) { 38 defer func() { 39 if err != nil { 40 fmt.Fprintf(c, "%v\n", err.Error()) 41 } else { 42 fmt.Fprintf(c, "ok\n") 43 } 44 c.Close() 45 }() 46 // TODO(fwereade): 2016-03-17 lp:1558657 47 err = c.SetDeadline(time.Now().Add(spool.DefaultTimeout)) 48 if err != nil { 49 return errors.Annotate(err, "failed to set the deadline") 50 } 51 recorder, err := l.config.metricsFactory.Recorder( 52 l.config.validMetrics, 53 l.config.charmURL.String(), 54 l.config.unitTag.String(), 55 ) 56 if err != nil { 57 return errors.Annotate(err, "failed to create the metric recorder") 58 } 59 defer recorder.Close() 60 err = l.config.runner.do(recorder) 61 if err != nil { 62 return errors.Annotate(err, "failed to collect metrics") 63 } 64 return nil 65 }