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