func()

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
}