@@ -76,7 +76,7 @@ class HeaderInterceptor implements ClientInterceptor {
7676 private static final Metadata .Key <String > GOOGLE_CLOUD_RESOURCE_PREFIX_KEY =
7777 Metadata .Key .of ("google-cloud-resource-prefix" , Metadata .ASCII_STRING_MARSHALLER );
7878 private static final Pattern SERVER_TIMING_PATTERN =
79- Pattern .compile ("(?<metricName>[a-zA-Z0-9_-]+);\\ s*dur=(?<duration>\\ d+)" );
79+ Pattern .compile ("(?<metricName>[a-zA-Z0-9_-]+);\\ s*dur=(?<duration>\\ d+( \\ . \\ d+)? )" );
8080 private static final Pattern GOOGLE_CLOUD_RESOURCE_PREFIX_PATTERN =
8181 Pattern .compile (
8282 ".*projects/(?<project>\\ p{ASCII}[^/]*)(/instances/(?<instance>\\ p{ASCII}[^/]*))?(/databases/(?<database>\\ p{ASCII}[^/]*))?" );
@@ -162,15 +162,15 @@ private void processHeader(
162162 // would fail to parse it correctly. To make the parsing more robust, the logic has been
163163 // updated to handle multiple metrics gracefully.
164164
165- Map <String , Long > serverTimingMetrics = parseServerTimingHeader (serverTiming );
165+ Map <String , Float > serverTimingMetrics = parseServerTimingHeader (serverTiming );
166166 if (serverTimingMetrics .containsKey (GFE_TIMING_HEADER )) {
167- long gfeLatency = serverTimingMetrics .get (GFE_TIMING_HEADER );
167+ float gfeLatency = serverTimingMetrics .get (GFE_TIMING_HEADER );
168168
169- measureMap .put (SPANNER_GFE_LATENCY , gfeLatency );
169+ measureMap .put (SPANNER_GFE_LATENCY , ( long ) gfeLatency );
170170 measureMap .put (SPANNER_GFE_HEADER_MISSING_COUNT , 0L );
171171 measureMap .record (tagContext );
172172
173- spannerRpcMetrics .recordGfeLatency (gfeLatency , attributes );
173+ spannerRpcMetrics .recordGfeLatency (( long ) gfeLatency , attributes );
174174 spannerRpcMetrics .recordGfeHeaderMissingCount (0L , attributes );
175175 if (compositeTracer != null ) {
176176 compositeTracer .recordGFELatency (gfeLatency );
@@ -189,7 +189,7 @@ private void processHeader(
189189 // Record AFE metrics
190190 if (compositeTracer != null && GapicSpannerRpc .isEnableAFEServerTiming ()) {
191191 if (serverTimingMetrics .containsKey (AFE_TIMING_HEADER )) {
192- long afeLatency = serverTimingMetrics .get (AFE_TIMING_HEADER );
192+ float afeLatency = serverTimingMetrics .get (AFE_TIMING_HEADER );
193193 compositeTracer .recordAFELatency (afeLatency );
194194 } else {
195195 compositeTracer .recordAfeHeaderMissingCount (1L );
@@ -200,16 +200,16 @@ private void processHeader(
200200 }
201201 }
202202
203- private Map <String , Long > parseServerTimingHeader (String serverTiming ) {
204- Map <String , Long > serverTimingMetrics = new HashMap <>();
203+ private Map <String , Float > parseServerTimingHeader (String serverTiming ) {
204+ Map <String , Float > serverTimingMetrics = new HashMap <>();
205205 if (serverTiming != null ) {
206206 Matcher matcher = SERVER_TIMING_PATTERN .matcher (serverTiming );
207207 while (matcher .find ()) {
208208 String metricName = matcher .group ("metricName" );
209209 String durationStr = matcher .group ("duration" );
210210
211211 if (metricName != null && durationStr != null ) {
212- serverTimingMetrics .put (metricName , Long .valueOf (durationStr ));
212+ serverTimingMetrics .put (metricName , Float .valueOf (durationStr ));
213213 }
214214 }
215215 }
0 commit comments