github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/apiserver/metricsadder/metricsadder.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package metricsadder
     5  
     6  import (
     7  	"github.com/juju/loggo"
     8  	"github.com/juju/names"
     9  
    10  	"github.com/juju/juju/apiserver/common"
    11  	"github.com/juju/juju/apiserver/params"
    12  	"github.com/juju/juju/state"
    13  )
    14  
    15  var (
    16  	logger = loggo.GetLogger("juju.apiserver.metricsadder")
    17  )
    18  
    19  func init() {
    20  	common.RegisterStandardFacade("MetricsAdder", 1, NewMetricsAdderAPI)
    21  }
    22  
    23  // MetricsAdder defines methods that are used to store metric batches in the state.
    24  type MetricsAdder interface {
    25  	// AddMetricBatches stores the specified metric batches in the state.
    26  	AddMetricBatches(batches params.MetricBatchParams) (params.ErrorResults, error)
    27  }
    28  
    29  // MetricsAdderAPI implements the metrics adder interface and is the concrete
    30  // implementation of the API end point.
    31  type MetricsAdderAPI struct {
    32  	state *state.State
    33  }
    34  
    35  var _ MetricsAdder = (*MetricsAdderAPI)(nil)
    36  
    37  // NewMetricsAdderAPI creates a new API endpoint for adding metrics to state.
    38  func NewMetricsAdderAPI(
    39  	st *state.State,
    40  	resources *common.Resources,
    41  	authorizer common.Authorizer,
    42  ) (*MetricsAdderAPI, error) {
    43  	// TODO(cmars): remove unit agent auth, once worker/metrics/sender manifold
    44  	// can be righteously relocated to machine agent.
    45  	if !authorizer.AuthMachineAgent() && !authorizer.AuthUnitAgent() {
    46  		return nil, common.ErrPerm
    47  	}
    48  	return &MetricsAdderAPI{
    49  		state: st,
    50  	}, nil
    51  }
    52  
    53  // AddMetricBatches implements the MetricsAdder interface.
    54  func (api *MetricsAdderAPI) AddMetricBatches(args params.MetricBatchParams) (params.ErrorResults, error) {
    55  	result := params.ErrorResults{
    56  		Results: make([]params.ErrorResult, len(args.Batches)),
    57  	}
    58  	for i, batch := range args.Batches {
    59  		tag, err := names.ParseUnitTag(batch.Tag)
    60  		if err != nil {
    61  			result.Results[i].Error = common.ServerError(err)
    62  			continue
    63  		}
    64  		metrics := make([]state.Metric, len(batch.Batch.Metrics))
    65  		for j, metric := range batch.Batch.Metrics {
    66  			metrics[j] = state.Metric{
    67  				Key:   metric.Key,
    68  				Value: metric.Value,
    69  				Time:  metric.Time,
    70  			}
    71  		}
    72  		_, err = api.state.AddMetrics(
    73  			state.BatchParam{
    74  				UUID:     batch.Batch.UUID,
    75  				Created:  batch.Batch.Created,
    76  				CharmURL: batch.Batch.CharmURL,
    77  				Metrics:  metrics,
    78  				Unit:     tag,
    79  			},
    80  		)
    81  		result.Results[i].Error = common.ServerError(err)
    82  	}
    83  	return result, nil
    84  }