in otelcollector/prometheusreceiver/internal/transaction.go [379:438]
func (t *transaction) getMetrics() (pmetric.Metrics, error) {
if len(t.families) == 0 {
return pmetric.Metrics{}, errNoDataToBuild
}
md := pmetric.NewMetrics()
for rKey, families := range t.families {
if len(families) == 0 {
continue
}
resource, ok := t.nodeResources[rKey]
if !ok {
continue
}
rms := md.ResourceMetrics().AppendEmpty()
resource.CopyTo(rms.Resource())
for scope, mfs := range families {
ils := rms.ScopeMetrics().AppendEmpty()
// If metrics don't include otel_scope_name or otel_scope_version
// labels, use the receiver name and version.
if scope == emptyScopeID {
ils.Scope().SetName(mdata.ScopeName)
ils.Scope().SetVersion(t.buildInfo.Version)
} else {
// Otherwise, use the scope that was provided with the metrics.
ils.Scope().SetName(scope.name)
ils.Scope().SetVersion(scope.version)
// If we got an otel_scope_info metric for that scope, get scope
// attributes from it.
if scopeAttributes, ok := t.scopeAttributes[rKey]; ok {
if attributes, ok := scopeAttributes[scope]; ok {
attributes.CopyTo(ils.Scope().Attributes())
}
}
}
metrics := ils.Metrics()
for _, mf := range mfs {
mf.appendMetric(metrics, t.trimSuffixes)
}
}
}
// remove the resource if no metrics were added to avoid returning resources with empty data points
md.ResourceMetrics().RemoveIf(func(metrics pmetric.ResourceMetrics) bool {
if metrics.ScopeMetrics().Len() == 0 {
return true
}
remove := true
for i := 0; i < metrics.ScopeMetrics().Len(); i++ {
if metrics.ScopeMetrics().At(i).Metrics().Len() > 0 {
remove = false
break
}
}
return remove
})
return md, nil
}