in metricbeat/module/openmetrics/collector/data.go [74:292]
func (p *openmetricEventGenerator) GenerateOpenMetricsEvents(mf *p.MetricFamily) []OpenMetricEvent {
var events []OpenMetricEvent
name := *mf.Name
_ = name // skip noisy linter
metrics := mf.Metric
help := ""
unit := ""
if mf.Help != nil {
help = *mf.Help
}
if mf.Unit != nil {
unit = *mf.Unit
}
for _, metric := range metrics {
labels := mapstr.M{}
mn := metric.GetName()
_ = mn // skip noisy linter
if len(metric.Label) != 0 {
for _, label := range metric.Label {
if label.Name != "" && label.Value != "" {
labels[label.Name] = label.Value
}
}
}
exemplars := mapstr.M{}
if metric.Exemplar != nil {
exemplars = mapstr.M{*mn: metric.Exemplar.Value}
if metric.Exemplar.HasTs {
_, _ = exemplars.Put("timestamp", metric.Exemplar.Ts)
}
for _, label := range metric.Exemplar.Labels {
if label.Name != "" && label.Value != "" {
_, _ = exemplars.Put("labels."+label.Name, label.Value)
}
}
}
counter := metric.GetCounter()
if counter != nil {
if !math.IsNaN(counter.GetValue()) && !math.IsInf(counter.GetValue(), 0) {
events = append(events, OpenMetricEvent{
Type: model.MetricTypeCounter,
Help: help,
Unit: unit,
Data: mapstr.M{
"metrics": mapstr.M{
*mn: counter.GetValue(),
},
},
Labels: labels,
Exemplars: exemplars,
})
}
}
gauge := metric.GetGauge()
if gauge != nil {
if !math.IsNaN(gauge.GetValue()) && !math.IsInf(gauge.GetValue(), 0) {
events = append(events, OpenMetricEvent{
Type: model.MetricTypeGauge,
Help: help,
Unit: unit,
Data: mapstr.M{
"metrics": mapstr.M{
name: gauge.GetValue(),
},
},
Labels: labels,
})
}
}
info := metric.GetInfo()
if info != nil {
if info.HasValidValue() {
events = append(events, OpenMetricEvent{
Type: model.MetricTypeInfo,
Data: mapstr.M{
"metrics": mapstr.M{
name: info.GetValue(),
},
},
Labels: labels,
})
}
}
stateset := metric.GetStateset()
if stateset != nil {
if stateset.HasValidValue() {
events = append(events, OpenMetricEvent{
Type: model.MetricTypeStateset,
Data: mapstr.M{
"metrics": mapstr.M{
name: stateset.GetValue(),
},
},
Labels: labels,
})
}
}
summary := metric.GetSummary()
if summary != nil {
if !math.IsNaN(summary.GetSampleSum()) && !math.IsInf(summary.GetSampleSum(), 0) {
events = append(events, OpenMetricEvent{
Type: model.MetricTypeSummary,
Help: help,
Unit: unit,
Data: mapstr.M{
"metrics": mapstr.M{
name + "_sum": summary.GetSampleSum(),
name + "_count": summary.GetSampleCount(),
},
},
Labels: labels,
})
}
for _, quantile := range summary.GetQuantile() {
if math.IsNaN(quantile.GetValue()) || math.IsInf(quantile.GetValue(), 0) {
continue
}
quantileLabels := labels.Clone()
quantileLabels["quantile"] = strconv.FormatFloat(quantile.GetQuantile(), 'f', -1, 64)
events = append(events, OpenMetricEvent{
Data: mapstr.M{
"metrics": mapstr.M{
name: quantile.GetValue(),
},
},
Labels: quantileLabels,
})
}
}
histogram := metric.GetHistogram()
if histogram != nil {
if !math.IsNaN(histogram.GetSampleSum()) && !math.IsInf(histogram.GetSampleSum(), 0) {
var sum = "_sum"
var count = "_count"
_, _ = sum, count // skip noisy linter
var typ = model.MetricTypeHistogram
if histogram.IsGaugeHistogram {
sum = "_gsum"
count = "_gcount"
typ = model.MetricTypeGaugeHistogram
}
events = append(events, OpenMetricEvent{
Type: typ,
Help: help,
Unit: unit,
Data: mapstr.M{
"metrics": mapstr.M{
name + sum: histogram.GetSampleSum(),
name + count: histogram.GetSampleCount(),
},
},
Labels: labels,
})
}
for _, bucket := range histogram.GetBucket() {
if bucket.GetCumulativeCount() == uint64(math.NaN()) || bucket.GetCumulativeCount() == uint64(math.Inf(0)) {
continue
}
if bucket.Exemplar != nil {
exemplars = mapstr.M{name: bucket.Exemplar.Value}
if bucket.Exemplar.HasTs {
_, _ = exemplars.Put("timestamp", bucket.Exemplar.Ts)
}
for _, label := range bucket.Exemplar.Labels {
if label.Name != "" && label.Value != "" {
_, _ = exemplars.Put("labels."+label.Name, label.Value)
}
}
}
bucketLabels := labels.Clone()
bucketLabels["le"] = strconv.FormatFloat(bucket.GetUpperBound(), 'f', -1, 64)
events = append(events, OpenMetricEvent{
Data: mapstr.M{
"metrics": mapstr.M{
name + "_bucket": bucket.GetCumulativeCount(),
},
},
Labels: bucketLabels,
Exemplars: exemplars,
})
}
}
unknown := metric.GetUnknown()
if unknown != nil {
if !math.IsNaN(unknown.GetValue()) && !math.IsInf(unknown.GetValue(), 0) {
events = append(events, OpenMetricEvent{
Type: model.MetricTypeUnknown,
Help: help,
Unit: unit,
Data: mapstr.M{
"metrics": mapstr.M{
name: unknown.GetValue(),
},
},
Labels: labels,
})
}
}
}
return events
}