func()

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)
}