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  }