Skip to content

Commit 87aa4d5

Browse files
fix(bigtable): add handling for gauge metrics (#2719)
* fix(bigtable): add handling for gauge metrics * add it * chore: generate libraries at Tue Nov 25 20:15:38 UTC 2025 --------- Co-authored-by: cloud-java-bot <cloud-java-bot@google.com>
1 parent 6c5f635 commit 87aa4d5

File tree

1 file changed

+23
-9
lines changed

1 file changed

+23
-9
lines changed

google-cloud-bigtable/src/main/java/com/google/cloud/bigtable/data/v2/stub/metrics/BigtableExporterUtils.java

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.google.monitoring.v3.TimeInterval;
5555
import com.google.monitoring.v3.TimeSeries;
5656
import com.google.monitoring.v3.TypedValue;
57+
import com.google.protobuf.Timestamp;
5758
import com.google.protobuf.util.Timestamps;
5859
import io.opentelemetry.api.common.AttributeKey;
5960
import io.opentelemetry.api.common.Attributes;
@@ -281,11 +282,19 @@ private static TimeSeries convertPointToBigtableTimeSeries(
281282
metricBuilder.putLabels(CLIENT_UID_KEY.getKey(), taskId);
282283
builder.setMetric(metricBuilder.build());
283284

285+
MetricKind kind = convertMetricKind(metricData);
286+
287+
Timestamp endTimestamp = Timestamps.fromNanos(pointData.getEpochNanos());
288+
Timestamp startTimestamp;
289+
290+
if (kind == GAUGE) {
291+
// GAUGE metrics must have start_time equal to end_time.
292+
startTimestamp = endTimestamp;
293+
} else {
294+
startTimestamp = Timestamps.fromNanos(pointData.getStartEpochNanos());
295+
}
284296
TimeInterval timeInterval =
285-
TimeInterval.newBuilder()
286-
.setStartTime(Timestamps.fromNanos(pointData.getStartEpochNanos()))
287-
.setEndTime(Timestamps.fromNanos(pointData.getEpochNanos()))
288-
.build();
297+
TimeInterval.newBuilder().setStartTime(startTimestamp).setEndTime(endTimestamp).build();
289298

290299
builder.addPoints(createPoint(metricData.getType(), pointData, timeInterval));
291300

@@ -294,9 +303,10 @@ private static TimeSeries convertPointToBigtableTimeSeries(
294303

295304
private static Optional<TimeSeries> createInternalMetricsTimeSeries(
296305
MetricData metricData, PointData pointData, MonitoredResource applicationResource) {
306+
MetricKind kind = convertMetricKind(metricData);
297307
TimeSeries.Builder builder =
298308
TimeSeries.newBuilder()
299-
.setMetricKind(convertMetricKind(metricData))
309+
.setMetricKind(kind)
300310
.setValueType(convertValueType(metricData.getType()))
301311
.setResource(applicationResource);
302312

@@ -318,11 +328,15 @@ private static Optional<TimeSeries> createInternalMetricsTimeSeries(
318328

319329
builder.setMetric(metricBuilder.build());
320330

331+
Timestamp endTimestamp = Timestamps.fromNanos(pointData.getEpochNanos());
332+
Timestamp startTimestamp;
333+
if (kind == GAUGE) {
334+
startTimestamp = endTimestamp;
335+
} else {
336+
startTimestamp = Timestamps.fromNanos(pointData.getStartEpochNanos());
337+
}
321338
TimeInterval timeInterval =
322-
TimeInterval.newBuilder()
323-
.setStartTime(Timestamps.fromNanos(pointData.getStartEpochNanos()))
324-
.setEndTime(Timestamps.fromNanos(pointData.getEpochNanos()))
325-
.build();
339+
TimeInterval.newBuilder().setStartTime(startTimestamp).setEndTime(endTimestamp).build();
326340

327341
builder.addPoints(createPoint(metricData.getType(), pointData, timeInterval));
328342
return Optional.of(builder.build());

0 commit comments

Comments
 (0)