5454import com .google .monitoring .v3 .TimeInterval ;
5555import com .google .monitoring .v3 .TimeSeries ;
5656import com .google .monitoring .v3 .TypedValue ;
57+ import com .google .protobuf .Timestamp ;
5758import com .google .protobuf .util .Timestamps ;
5859import io .opentelemetry .api .common .AttributeKey ;
5960import 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