in exporter/collector/metrics.go [1183:1233]
func (m *metricMapper) exponentialHistogramToTimeSeries(
resource *monitoredrespb.MonitoredResource,
extraLabels labels,
metric pmetric.Metric,
exponentialHist pmetric.ExponentialHistogram,
point pmetric.ExponentialHistogramDataPoint,
projectID string,
) []*monitoringpb.TimeSeries {
if point.Flags().NoRecordedValue() {
// Drop points without a value.
return nil
}
t, err := m.metricNameToType(metric.Name(), metric)
if err != nil {
m.obs.log.Debug("Failed to get metric type (i.e. name) for exponential histogram metric. Dropping the metric.", zap.Error(err), zap.Any("metric", metric))
return nil
}
if exponentialHist.AggregationTemporality() == pmetric.AggregationTemporalityCumulative {
// Normalize the histogram point.
metricIdentifier := datapointstorage.Identifier(resource, extraLabels, metric, point.Attributes())
keep := m.normalizer.NormalizeExponentialHistogramDataPoint(point, metricIdentifier)
if !keep {
return nil
}
}
// We treat deltas as cumulatives w/ resets.
metricKind := metricpb.MetricDescriptor_CUMULATIVE
startTime := timestamppb.New(point.StartTimestamp().AsTime())
endTime := timestamppb.New(point.Timestamp().AsTime())
value := m.exponentialHistogramPoint(point, projectID)
return []*monitoringpb.TimeSeries{{
Resource: resource,
Unit: metric.Unit(),
MetricKind: metricKind,
ValueType: metricpb.MetricDescriptor_DISTRIBUTION,
Points: []*monitoringpb.Point{{
Interval: &monitoringpb.TimeInterval{
StartTime: startTime,
EndTime: endTime,
},
Value: value,
}},
Metric: &metricpb.Metric{
Type: t,
Labels: mergeLabels(
attributesToLabels(point.Attributes()),
extraLabels,
),
},
}}
}