2023-07-28 10:35:28 +00:00
|
|
|
// DO NOT EDIT. COPIED AS-IS. SEE README.md
|
|
|
|
|
|
|
|
// Copyright The OpenTelemetry Authors
|
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
|
|
|
package prometheusremotewrite // import "github.com/prometheus/prometheus/storage/remote/otlptranslator/prometheusremotewrite"
|
|
|
|
|
|
|
|
import (
|
|
|
|
"math"
|
|
|
|
|
|
|
|
"github.com/prometheus/common/model"
|
|
|
|
"github.com/prometheus/prometheus/model/value"
|
|
|
|
"github.com/prometheus/prometheus/prompb"
|
|
|
|
"go.opentelemetry.io/collector/pdata/pcommon"
|
|
|
|
"go.opentelemetry.io/collector/pdata/pmetric"
|
|
|
|
|
|
|
|
prometheustranslator "github.com/prometheus/prometheus/storage/remote/otlptranslator/prometheus"
|
|
|
|
)
|
|
|
|
|
|
|
|
// addSingleSumNumberDataPoint converts the Gauge metric data point to a
|
|
|
|
// Prometheus time series with samples and labels. The result is stored in the
|
|
|
|
// series map.
|
|
|
|
func addSingleGaugeNumberDataPoint(
|
|
|
|
pt pmetric.NumberDataPoint,
|
|
|
|
resource pcommon.Resource,
|
|
|
|
metric pmetric.Metric,
|
|
|
|
settings Settings,
|
|
|
|
series map[string]*prompb.TimeSeries,
|
|
|
|
) {
|
2023-11-15 14:09:15 +00:00
|
|
|
name := prometheustranslator.BuildCompliantName(metric, settings.Namespace, settings.AddMetricSuffixes)
|
2023-07-28 10:35:28 +00:00
|
|
|
labels := createAttributes(
|
|
|
|
resource,
|
|
|
|
pt.Attributes(),
|
|
|
|
settings.ExternalLabels,
|
|
|
|
model.MetricNameLabel, name,
|
|
|
|
)
|
|
|
|
sample := &prompb.Sample{
|
|
|
|
// convert ns to ms
|
|
|
|
Timestamp: convertTimeStamp(pt.Timestamp()),
|
|
|
|
}
|
|
|
|
switch pt.ValueType() {
|
|
|
|
case pmetric.NumberDataPointValueTypeInt:
|
|
|
|
sample.Value = float64(pt.IntValue())
|
|
|
|
case pmetric.NumberDataPointValueTypeDouble:
|
|
|
|
sample.Value = pt.DoubleValue()
|
|
|
|
}
|
|
|
|
if pt.Flags().NoRecordedValue() {
|
|
|
|
sample.Value = math.Float64frombits(value.StaleNaN)
|
|
|
|
}
|
|
|
|
addSample(series, sample, labels, metric.Type().String())
|
|
|
|
}
|
|
|
|
|
|
|
|
// addSingleSumNumberDataPoint converts the Sum metric data point to a Prometheus
|
|
|
|
// time series with samples, labels and exemplars. The result is stored in the
|
|
|
|
// series map.
|
|
|
|
func addSingleSumNumberDataPoint(
|
|
|
|
pt pmetric.NumberDataPoint,
|
|
|
|
resource pcommon.Resource,
|
|
|
|
metric pmetric.Metric,
|
|
|
|
settings Settings,
|
|
|
|
series map[string]*prompb.TimeSeries,
|
|
|
|
) {
|
2023-11-15 14:09:15 +00:00
|
|
|
name := prometheustranslator.BuildCompliantName(metric, settings.Namespace, settings.AddMetricSuffixes)
|
2023-07-28 10:35:28 +00:00
|
|
|
labels := createAttributes(
|
|
|
|
resource,
|
|
|
|
pt.Attributes(),
|
|
|
|
settings.ExternalLabels,
|
|
|
|
model.MetricNameLabel, name,
|
|
|
|
)
|
|
|
|
sample := &prompb.Sample{
|
|
|
|
// convert ns to ms
|
|
|
|
Timestamp: convertTimeStamp(pt.Timestamp()),
|
|
|
|
}
|
|
|
|
switch pt.ValueType() {
|
|
|
|
case pmetric.NumberDataPointValueTypeInt:
|
|
|
|
sample.Value = float64(pt.IntValue())
|
|
|
|
case pmetric.NumberDataPointValueTypeDouble:
|
|
|
|
sample.Value = pt.DoubleValue()
|
|
|
|
}
|
|
|
|
if pt.Flags().NoRecordedValue() {
|
|
|
|
sample.Value = math.Float64frombits(value.StaleNaN)
|
|
|
|
}
|
|
|
|
sig := addSample(series, sample, labels, metric.Type().String())
|
|
|
|
|
|
|
|
if ts, ok := series[sig]; sig != "" && ok {
|
|
|
|
exemplars := getPromExemplars[pmetric.NumberDataPoint](pt)
|
|
|
|
ts.Exemplars = append(ts.Exemplars, exemplars...)
|
|
|
|
}
|
|
|
|
|
|
|
|
// add _created time series if needed
|
|
|
|
if settings.ExportCreatedMetric && metric.Sum().IsMonotonic() {
|
|
|
|
startTimestamp := pt.StartTimestamp()
|
|
|
|
if startTimestamp != 0 {
|
|
|
|
createdLabels := createAttributes(
|
|
|
|
resource,
|
|
|
|
pt.Attributes(),
|
|
|
|
settings.ExternalLabels,
|
|
|
|
nameStr,
|
|
|
|
name+createdSuffix,
|
|
|
|
)
|
|
|
|
addCreatedTimeSeriesIfNeeded(series, createdLabels, startTimestamp, metric.Type().String())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|