in collector/otlp/metrics.go [111:168]
func (t *OltpMetricWriter) Write(ctx context.Context, msg *v1.ExportMetricsServiceRequest) error {
if !t.healthChecker.IsHealthy() {
return errors.New("Overloaded. Retry later")
}
// Causes allocation. Like in prom remote receiver, create rather than using a bunch of space in pool.
wr := prompb.WriteRequestPool.Get()
defer prompb.WriteRequestPool.Put(wr)
var rejectedRecordsExpHist int64 = 0
for _, resourceMetrics := range msg.ResourceMetrics {
for _, scopeMetrics := range resourceMetrics.ScopeMetrics {
for _, metric := range scopeMetrics.Metrics {
var err error
switch data := metric.Data.(type) {
// Each data point within a metric contains attributes for unique label combinations.
// Therefore, each metric maps to n prom series.
case *metricsv1.Metric_Gauge:
err = t.addOltpNumberPoints(ctx, metric.Name, data.Gauge.DataPoints, wr)
case *metricsv1.Metric_Sum:
err = t.addOltpNumberPoints(ctx, metric.Name, data.Sum.DataPoints, wr)
case *metricsv1.Metric_Histogram:
err = t.addOltpHistogramPoints(ctx, metric.Name, data.Histogram.DataPoints, wr)
case *metricsv1.Metric_Summary:
err = t.addOltpSummaryPoints(ctx, metric.Name, data.Summary.DataPoints, wr)
case *metricsv1.Metric_ExponentialHistogram:
// No widespread support for this complicated protocol. Reject for now.
rejectedRecordsExpHist += int64(len(data.ExponentialHistogram.DataPoints))
// TODO metric
default:
// Return this as a non-retryable error. Since we don't know about this type,
// we can't count up the number of rejected records.
err = ErrUnknownMetricType
}
// If we get errors adding or flushing points, bail out immediately.
if err != nil {
return fmt.Errorf("OTLP Write failure: %w", err)
}
}
}
}
// Flush any remaining points.
if err := t.sendBatch(ctx, wr); err != nil {
return fmt.Errorf("OLTP Write flush failure: %w", err)
}
if rejectedRecordsExpHist > 0 {
return &ErrRejectedMetric{
Msg: fmt.Sprintf("rejected %d records of unsupported type ExponentialHistogram", rejectedRecordsExpHist),
Count: rejectedRecordsExpHist,
}
}
return nil
}