Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/otelcol/receiver/prometheus/internal/starttimemetricadjuster.go
5443 views
1
// Copyright The OpenTelemetry Authors
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
// http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
package internal // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver/internal"
16
17
import (
18
"errors"
19
"regexp"
20
21
"go.opentelemetry.io/collector/pdata/pmetric"
22
"go.uber.org/zap"
23
)
24
25
var (
26
errNoStartTimeMetrics = errors.New("start_time metric is missing")
27
errNoDataPointsStartTimeMetric = errors.New("start time metric with no data points")
28
errUnsupportedTypeStartTimeMetric = errors.New("unsupported data type for start time metric")
29
)
30
31
type startTimeMetricAdjuster struct {
32
startTimeMetricRegex *regexp.Regexp
33
logger *zap.Logger
34
}
35
36
// NewStartTimeMetricAdjuster returns a new MetricsAdjuster that adjust metrics' start times based on a start time metric.
37
func NewStartTimeMetricAdjuster(logger *zap.Logger, startTimeMetricRegex *regexp.Regexp) MetricsAdjuster {
38
return &startTimeMetricAdjuster{
39
startTimeMetricRegex: startTimeMetricRegex,
40
logger: logger,
41
}
42
}
43
44
func (stma *startTimeMetricAdjuster) AdjustMetrics(metrics pmetric.Metrics) error {
45
startTime, err := stma.getStartTime(metrics)
46
if err != nil {
47
return err
48
}
49
50
startTimeTs := timestampFromFloat64(startTime)
51
for i := 0; i < metrics.ResourceMetrics().Len(); i++ {
52
rm := metrics.ResourceMetrics().At(i)
53
for j := 0; j < rm.ScopeMetrics().Len(); j++ {
54
ilm := rm.ScopeMetrics().At(j)
55
for k := 0; k < ilm.Metrics().Len(); k++ {
56
metric := ilm.Metrics().At(k)
57
switch metric.Type() {
58
case pmetric.MetricTypeGauge:
59
continue
60
61
case pmetric.MetricTypeSum:
62
dataPoints := metric.Sum().DataPoints()
63
for l := 0; l < dataPoints.Len(); l++ {
64
dp := dataPoints.At(l)
65
dp.SetStartTimestamp(startTimeTs)
66
}
67
68
case pmetric.MetricTypeSummary:
69
dataPoints := metric.Summary().DataPoints()
70
for l := 0; l < dataPoints.Len(); l++ {
71
dp := dataPoints.At(l)
72
dp.SetStartTimestamp(startTimeTs)
73
}
74
75
case pmetric.MetricTypeHistogram:
76
dataPoints := metric.Histogram().DataPoints()
77
for l := 0; l < dataPoints.Len(); l++ {
78
dp := dataPoints.At(l)
79
dp.SetStartTimestamp(startTimeTs)
80
}
81
82
default:
83
stma.logger.Warn("Unknown metric type", zap.String("type", metric.Type().String()))
84
}
85
}
86
}
87
}
88
89
return nil
90
}
91
92
func (stma *startTimeMetricAdjuster) getStartTime(metrics pmetric.Metrics) (float64, error) {
93
for i := 0; i < metrics.ResourceMetrics().Len(); i++ {
94
rm := metrics.ResourceMetrics().At(i)
95
for j := 0; j < rm.ScopeMetrics().Len(); j++ {
96
ilm := rm.ScopeMetrics().At(j)
97
for k := 0; k < ilm.Metrics().Len(); k++ {
98
metric := ilm.Metrics().At(k)
99
if stma.matchStartTimeMetric(metric.Name()) {
100
switch metric.Type() {
101
case pmetric.MetricTypeGauge:
102
if metric.Gauge().DataPoints().Len() == 0 {
103
return 0.0, errNoDataPointsStartTimeMetric
104
}
105
return metric.Gauge().DataPoints().At(0).DoubleValue(), nil
106
107
case pmetric.MetricTypeSum:
108
if metric.Sum().DataPoints().Len() == 0 {
109
return 0.0, errNoDataPointsStartTimeMetric
110
}
111
return metric.Sum().DataPoints().At(0).DoubleValue(), nil
112
113
default:
114
return 0, errUnsupportedTypeStartTimeMetric
115
}
116
}
117
}
118
}
119
}
120
return 0.0, errNoStartTimeMetrics
121
}
122
func (stma *startTimeMetricAdjuster) matchStartTimeMetric(metricName string) bool {
123
if stma.startTimeMetricRegex != nil {
124
return stma.startTimeMetricRegex.MatchString(metricName)
125
}
126
127
return metricName == startTimeMetricName
128
}
129
130