Path: blob/main/component/otelcol/receiver/prometheus/internal/starttimemetricadjuster.go
5443 views
// Copyright The OpenTelemetry Authors1//2// Licensed under the Apache License, Version 2.0 (the "License");3// you may not use this file except in compliance with the License.4// You may obtain a copy of the License at5//6// http://www.apache.org/licenses/LICENSE-2.07//8// Unless required by applicable law or agreed to in writing, software9// distributed under the License is distributed on an "AS IS" BASIS,10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.11// See the License for the specific language governing permissions and12// limitations under the License.1314package internal // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/prometheusreceiver/internal"1516import (17"errors"18"regexp"1920"go.opentelemetry.io/collector/pdata/pmetric"21"go.uber.org/zap"22)2324var (25errNoStartTimeMetrics = errors.New("start_time metric is missing")26errNoDataPointsStartTimeMetric = errors.New("start time metric with no data points")27errUnsupportedTypeStartTimeMetric = errors.New("unsupported data type for start time metric")28)2930type startTimeMetricAdjuster struct {31startTimeMetricRegex *regexp.Regexp32logger *zap.Logger33}3435// NewStartTimeMetricAdjuster returns a new MetricsAdjuster that adjust metrics' start times based on a start time metric.36func NewStartTimeMetricAdjuster(logger *zap.Logger, startTimeMetricRegex *regexp.Regexp) MetricsAdjuster {37return &startTimeMetricAdjuster{38startTimeMetricRegex: startTimeMetricRegex,39logger: logger,40}41}4243func (stma *startTimeMetricAdjuster) AdjustMetrics(metrics pmetric.Metrics) error {44startTime, err := stma.getStartTime(metrics)45if err != nil {46return err47}4849startTimeTs := timestampFromFloat64(startTime)50for i := 0; i < metrics.ResourceMetrics().Len(); i++ {51rm := metrics.ResourceMetrics().At(i)52for j := 0; j < rm.ScopeMetrics().Len(); j++ {53ilm := rm.ScopeMetrics().At(j)54for k := 0; k < ilm.Metrics().Len(); k++ {55metric := ilm.Metrics().At(k)56switch metric.Type() {57case pmetric.MetricTypeGauge:58continue5960case pmetric.MetricTypeSum:61dataPoints := metric.Sum().DataPoints()62for l := 0; l < dataPoints.Len(); l++ {63dp := dataPoints.At(l)64dp.SetStartTimestamp(startTimeTs)65}6667case pmetric.MetricTypeSummary:68dataPoints := metric.Summary().DataPoints()69for l := 0; l < dataPoints.Len(); l++ {70dp := dataPoints.At(l)71dp.SetStartTimestamp(startTimeTs)72}7374case pmetric.MetricTypeHistogram:75dataPoints := metric.Histogram().DataPoints()76for l := 0; l < dataPoints.Len(); l++ {77dp := dataPoints.At(l)78dp.SetStartTimestamp(startTimeTs)79}8081default:82stma.logger.Warn("Unknown metric type", zap.String("type", metric.Type().String()))83}84}85}86}8788return nil89}9091func (stma *startTimeMetricAdjuster) getStartTime(metrics pmetric.Metrics) (float64, error) {92for i := 0; i < metrics.ResourceMetrics().Len(); i++ {93rm := metrics.ResourceMetrics().At(i)94for j := 0; j < rm.ScopeMetrics().Len(); j++ {95ilm := rm.ScopeMetrics().At(j)96for k := 0; k < ilm.Metrics().Len(); k++ {97metric := ilm.Metrics().At(k)98if stma.matchStartTimeMetric(metric.Name()) {99switch metric.Type() {100case pmetric.MetricTypeGauge:101if metric.Gauge().DataPoints().Len() == 0 {102return 0.0, errNoDataPointsStartTimeMetric103}104return metric.Gauge().DataPoints().At(0).DoubleValue(), nil105106case pmetric.MetricTypeSum:107if metric.Sum().DataPoints().Len() == 0 {108return 0.0, errNoDataPointsStartTimeMetric109}110return metric.Sum().DataPoints().At(0).DoubleValue(), nil111112default:113return 0, errUnsupportedTypeStartTimeMetric114}115}116}117}118}119return 0.0, errNoStartTimeMetrics120}121func (stma *startTimeMetricAdjuster) matchStartTimeMetric(metricName string) bool {122if stma.startTimeMetricRegex != nil {123return stma.startTimeMetricRegex.MatchString(metricName)124}125126return metricName == startTimeMetricName127}128129130