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