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  }