/
metricsadder.go
60 lines (53 loc) · 1.7 KB
/
metricsadder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Copyright 2015 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
package metricsadder
import (
"github.com/juju/names/v5"
apiservererrors "github.com/juju/juju/apiserver/errors"
"github.com/juju/juju/rpc/params"
"github.com/juju/juju/state"
)
// MetricsAdder defines methods that are used to store metric batches in the state.
type MetricsAdder interface {
// AddMetricBatches stores the specified metric batches in the state.
AddMetricBatches(batches params.MetricBatchParams) (params.ErrorResults, error)
}
// MetricsAdderAPI implements the metrics adder interface and is the concrete
// implementation of the API end point.
type MetricsAdderAPI struct {
state *state.State
}
var _ MetricsAdder = (*MetricsAdderAPI)(nil)
// AddMetricBatches implements the MetricsAdder interface.
func (api *MetricsAdderAPI) AddMetricBatches(args params.MetricBatchParams) (params.ErrorResults, error) {
result := params.ErrorResults{
Results: make([]params.ErrorResult, len(args.Batches)),
}
for i, batch := range args.Batches {
tag, err := names.ParseUnitTag(batch.Tag)
if err != nil {
result.Results[i].Error = apiservererrors.ServerError(err)
continue
}
metrics := make([]state.Metric, len(batch.Batch.Metrics))
for j, metric := range batch.Batch.Metrics {
metrics[j] = state.Metric{
Key: metric.Key,
Value: metric.Value,
Time: metric.Time,
Labels: metric.Labels,
}
}
_, err = api.state.AddMetrics(
state.BatchParam{
UUID: batch.Batch.UUID,
Created: batch.Batch.Created,
CharmURL: batch.Batch.CharmURL,
Metrics: metrics,
Unit: tag,
},
)
result.Results[i].Error = apiservererrors.ServerError(err)
}
return result, nil
}