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