in internal/telemetry/metric_exporter.go [73:136]
func (e *MetricExporter) Export(ctx context.Context, rm *metricdata.ResourceMetrics) error {
if e.processor == nil {
return nil
}
batch := modelpb.Batch{}
now := time.Now()
baseEvent := modelpb.APMEvent{
Service: &modelpb.Service{
Name: "apm-server",
Language: &modelpb.Language{Name: "go"},
},
Event: &modelpb.Event{
Received: modelpb.FromTime(now),
},
}
for _, scopeMetrics := range rm.ScopeMetrics {
ms := make(metricsets)
for _, sm := range scopeMetrics.Metrics {
if e.isMetricFiltered(sm.Name) {
continue
}
if err := addMetric(sm, ms); err != nil {
return err
}
}
for key, ms := range ms {
event := baseEvent.CloneVT()
event.Timestamp = modelpb.FromTime(key.timestamp)
metrs := make([]*modelpb.MetricsetSample, 0, len(ms.samples))
for _, s := range ms.samples {
metrs = append(metrs, s)
}
event.Metricset = &modelpb.Metricset{Samples: metrs, Name: "app"}
if ms.attributes.Len() > 0 {
event.Labels = modelpb.Labels{}
event.NumericLabels = modelpb.NumericLabels{}
iter := ms.attributes.Iter()
for iter.Next() {
_, kv := iter.IndexedAttribute()
setLabel(string(kv.Key), event, kv.Value.Emit())
}
if len(event.Labels) == 0 {
event.Labels = nil
}
if len(event.NumericLabels) == 0 {
event.NumericLabels = nil
}
}
batch = append(batch, event)
}
}
if len(batch) == 0 {
return nil
}
return e.processor.ProcessBatch(ctx, &batch)
}