in exporters/metrics/src/main/java/com/google/cloud/opentelemetry/metric/InternalMetricExporter.java [179:254]
public CompletableResultCode export(Collection<MetricData> metrics) {
// General Algorithm for export:
// 1. Iterate over all points in the set of metrics to export
// 2. Attempt to register MetricDescriptors (using configured strategy)
// 3. Fire the set of time series off.
MetricTimeSeriesBuilder builder =
new AggregateByLabelMetricTimeSeriesBuilder(
projectId,
prefix,
resourceAttributesFilter,
monitoredResourceDescription,
instrumentationLibraryLabelsEnabled);
for (final MetricData metricData : metrics) {
// Extract all the underlying points.
switch (metricData.getType()) {
case LONG_GAUGE:
for (LongPointData point : metricData.getLongGaugeData().getPoints()) {
builder.recordPoint(metricData, point);
}
break;
case LONG_SUM:
for (LongPointData point : metricData.getLongSumData().getPoints()) {
builder.recordPoint(metricData, point);
}
break;
case DOUBLE_GAUGE:
for (DoublePointData point : metricData.getDoubleGaugeData().getPoints()) {
builder.recordPoint(metricData, point);
}
break;
case DOUBLE_SUM:
for (DoublePointData point : metricData.getDoubleSumData().getPoints()) {
builder.recordPoint(metricData, point);
}
break;
case HISTOGRAM:
for (HistogramPointData point : metricData.getHistogramData().getPoints()) {
builder.recordPoint(metricData, point);
}
break;
default:
logger.error("OpenTelemetry Metric type {} not supported.", metricData.getType());
}
// TODO: Filter metrics by last updated time....
// MetricWithLabels updateKey =
// new MetricWithLabels(descriptor.getType(), metricPoint.getLabels());
// // Cloud Monitoring API allows, for any combination of labels and
// // metric name, one update per WRITE_INTERVAL seconds
// long pointCollectionTime = metricPoint.getEpochNanos();
// if (lastUpdatedTime.containsKey(updateKey)
// && pointCollectionTime
// <= lastUpdatedTime.get(updateKey) / NANO_PER_SECOND + WRITE_INTERVAL_SECOND)
// {
// continue;
// }
}
// Update metric descriptors based on configured strategy.
exportDescriptors(builder);
List<TimeSeries> series = builder.getTimeSeries();
Consumer<List<TimeSeries>> timeSeriesGenerator =
timeSeries -> {
if (useCreateServiceTimeSeries) {
metricServiceClient.createServiceTimeSeries(ProjectName.of(projectId), timeSeries);
} else {
metricServiceClient.createTimeSeries(ProjectName.of(projectId), timeSeries);
}
};
createTimeSeriesBatch(series, timeSeriesGenerator);
// TODO: better error reporting.
if (series.size() < metrics.size()) {
return CompletableResultCode.ofFailure();
}
return CompletableResultCode.ofSuccess();
}