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 }