github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/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 }