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 }