|
|
|
@ -65,14 +65,14 @@ type bucketBoundsData struct {
|
|
|
|
|
bound float64 |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// byBucketBoundsData enables the usage of sort.Sort() with a slice of bucket bounds
|
|
|
|
|
// byBucketBoundsData enables the usage of sort.Sort() with a slice of bucket bounds.
|
|
|
|
|
type byBucketBoundsData []bucketBoundsData |
|
|
|
|
|
|
|
|
|
func (m byBucketBoundsData) Len() int { return len(m) } |
|
|
|
|
func (m byBucketBoundsData) Less(i, j int) bool { return m[i].bound < m[j].bound } |
|
|
|
|
func (m byBucketBoundsData) Swap(i, j int) { m[i], m[j] = m[j], m[i] } |
|
|
|
|
|
|
|
|
|
// ByLabelName enables the usage of sort.Sort() with a slice of labels
|
|
|
|
|
// ByLabelName enables the usage of sort.Sort() with a slice of labels.
|
|
|
|
|
type ByLabelName []prompb.Label |
|
|
|
|
|
|
|
|
|
func (a ByLabelName) Len() int { return len(a) } |
|
|
|
@ -115,14 +115,23 @@ var seps = []byte{'\xff'}
|
|
|
|
|
// createAttributes creates a slice of Prometheus Labels with OTLP attributes and pairs of string values.
|
|
|
|
|
// Unpaired string values are ignored. String pairs overwrite OTLP labels if collisions happen and
|
|
|
|
|
// if logOnOverwrite is true, the overwrite is logged. Resulting label names are sanitized.
|
|
|
|
|
func createAttributes(resource pcommon.Resource, attributes pcommon.Map, externalLabels map[string]string, |
|
|
|
|
// If settings.PromoteResourceAttributes is not empty, it's a set of resource attributes that should be promoted to labels.
|
|
|
|
|
func createAttributes(resource pcommon.Resource, attributes pcommon.Map, settings Settings, |
|
|
|
|
ignoreAttrs []string, logOnOverwrite bool, extras ...string) []prompb.Label { |
|
|
|
|
resourceAttrs := resource.Attributes() |
|
|
|
|
serviceName, haveServiceName := resourceAttrs.Get(conventions.AttributeServiceName) |
|
|
|
|
instance, haveInstanceID := resourceAttrs.Get(conventions.AttributeServiceInstanceID) |
|
|
|
|
|
|
|
|
|
promotedAttrs := make([]prompb.Label, 0, len(settings.PromoteResourceAttributes)) |
|
|
|
|
for _, name := range settings.PromoteResourceAttributes { |
|
|
|
|
if value, exists := resourceAttrs.Get(name); exists { |
|
|
|
|
promotedAttrs = append(promotedAttrs, prompb.Label{Name: name, Value: value.AsString()}) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
sort.Stable(ByLabelName(promotedAttrs)) |
|
|
|
|
|
|
|
|
|
// Calculate the maximum possible number of labels we could return so we can preallocate l
|
|
|
|
|
maxLabelCount := attributes.Len() + len(externalLabels) + len(extras)/2 |
|
|
|
|
maxLabelCount := attributes.Len() + len(settings.ExternalLabels) + len(promotedAttrs) + len(extras)/2 |
|
|
|
|
|
|
|
|
|
if haveServiceName { |
|
|
|
|
maxLabelCount++ |
|
|
|
@ -132,9 +141,6 @@ func createAttributes(resource pcommon.Resource, attributes pcommon.Map, externa
|
|
|
|
|
maxLabelCount++ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// map ensures no duplicate label name
|
|
|
|
|
l := make(map[string]string, maxLabelCount) |
|
|
|
|
|
|
|
|
|
// Ensure attributes are sorted by key for consistent merging of keys which
|
|
|
|
|
// collide when sanitized.
|
|
|
|
|
labels := make([]prompb.Label, 0, maxLabelCount) |
|
|
|
@ -148,6 +154,8 @@ func createAttributes(resource pcommon.Resource, attributes pcommon.Map, externa
|
|
|
|
|
}) |
|
|
|
|
sort.Stable(ByLabelName(labels)) |
|
|
|
|
|
|
|
|
|
// map ensures no duplicate label names.
|
|
|
|
|
l := make(map[string]string, maxLabelCount) |
|
|
|
|
for _, label := range labels { |
|
|
|
|
var finalKey = prometheustranslator.NormalizeLabel(label.Name) |
|
|
|
|
if existingValue, alreadyExists := l[finalKey]; alreadyExists { |
|
|
|
@ -157,6 +165,13 @@ func createAttributes(resource pcommon.Resource, attributes pcommon.Map, externa
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for _, lbl := range promotedAttrs { |
|
|
|
|
normalized := prometheustranslator.NormalizeLabel(lbl.Name) |
|
|
|
|
if _, exists := l[normalized]; !exists { |
|
|
|
|
l[normalized] = lbl.Value |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Map service.name + service.namespace to job
|
|
|
|
|
if haveServiceName { |
|
|
|
|
val := serviceName.AsString() |
|
|
|
@ -169,7 +184,7 @@ func createAttributes(resource pcommon.Resource, attributes pcommon.Map, externa
|
|
|
|
|
if haveInstanceID { |
|
|
|
|
l[model.InstanceLabel] = instance.AsString() |
|
|
|
|
} |
|
|
|
|
for key, value := range externalLabels { |
|
|
|
|
for key, value := range settings.ExternalLabels { |
|
|
|
|
// External labels have already been sanitized
|
|
|
|
|
if _, alreadyExists := l[key]; alreadyExists { |
|
|
|
|
// Skip external labels if they are overridden by metric attributes
|
|
|
|
@ -232,7 +247,7 @@ func (c *PrometheusConverter) addHistogramDataPoints(dataPoints pmetric.Histogra
|
|
|
|
|
for x := 0; x < dataPoints.Len(); x++ { |
|
|
|
|
pt := dataPoints.At(x) |
|
|
|
|
timestamp := convertTimeStamp(pt.Timestamp()) |
|
|
|
|
baseLabels := createAttributes(resource, pt.Attributes(), settings.ExternalLabels, nil, false) |
|
|
|
|
baseLabels := createAttributes(resource, pt.Attributes(), settings, nil, false) |
|
|
|
|
|
|
|
|
|
// If the sum is unset, it indicates the _sum metric point should be
|
|
|
|
|
// omitted
|
|
|
|
@ -408,7 +423,7 @@ func (c *PrometheusConverter) addSummaryDataPoints(dataPoints pmetric.SummaryDat
|
|
|
|
|
for x := 0; x < dataPoints.Len(); x++ { |
|
|
|
|
pt := dataPoints.At(x) |
|
|
|
|
timestamp := convertTimeStamp(pt.Timestamp()) |
|
|
|
|
baseLabels := createAttributes(resource, pt.Attributes(), settings.ExternalLabels, nil, false) |
|
|
|
|
baseLabels := createAttributes(resource, pt.Attributes(), settings, nil, false) |
|
|
|
|
|
|
|
|
|
// treat sum as a sample in an individual TimeSeries
|
|
|
|
|
sum := &prompb.Sample{ |
|
|
|
@ -554,7 +569,8 @@ func addResourceTargetInfo(resource pcommon.Resource, settings Settings, timesta
|
|
|
|
|
name = settings.Namespace + "_" + name |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
labels := createAttributes(resource, attributes, settings.ExternalLabels, identifyingAttrs, false, model.MetricNameLabel, name) |
|
|
|
|
settings.PromoteResourceAttributes = nil |
|
|
|
|
labels := createAttributes(resource, attributes, settings, identifyingAttrs, false, model.MetricNameLabel, name) |
|
|
|
|
haveIdentifier := false |
|
|
|
|
for _, l := range labels { |
|
|
|
|
if l.Name == model.JobLabel || l.Name == model.InstanceLabel { |
|
|
|
|