瀏覽代碼

Add support for network request completed field. (#8194)

* Add support for network request completed field.

* Update CHANGELOG.

* Clean up log messages

* Address comments
Jeremy Jiang 4 年之前
父節點
當前提交
c69b1ff01c

+ 1 - 0
FirebasePerformance/CHANGELOG.md

@@ -1,5 +1,6 @@
 # Version 8.2.0
 * Update log messages with proper log levels.
+* Fix empty values in `network_info.request_completed_time_us` field from the [data schema](https://firebase.google.com/docs/perf-mon/bigquery-export#detailed_data_schema).
 * Fix a crash on FPRSessionDetails. (#8139)
 
 # Version 8.1.0

+ 3 - 1
FirebasePerformance/Sources/Instrumentation/Network/Delegates/FPRNSURLConnectionDelegate.m

@@ -51,8 +51,10 @@
             totalBytesWritten:(NSInteger)totalBytesWritten
     totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite {
   FPRNetworkTrace *trace = [FPRNetworkTrace networkTraceFromObject:connection];
-  [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
   trace.requestSize = totalBytesWritten;
+  if (totalBytesWritten >= totalBytesExpectedToWrite) {
+    [trace checkpointState:FPRNetworkTraceCheckpointStateRequestCompleted];
+  }
 }
 
 - (void)connectionDidFinishLoading:(NSURLConnection *)connection {

+ 3 - 1
FirebasePerformance/Sources/Instrumentation/Network/Delegates/FPRNSURLConnectionDelegateInstrument.m

@@ -141,8 +141,10 @@ void InstrumentConnectionAllTheTotals(FPRClassInstrumentor *instrumentor) {
         setReplacingBlock:^(id object, NSURLConnection *connection, NSInteger bytesWritten,
                             NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
           FPRNetworkTrace *trace = [FPRNetworkTrace networkTraceFromObject:connection];
-          [trace checkpointState:FPRNetworkTraceCheckpointStateResponseReceived];
           trace.requestSize = totalBytesWritten;
+          if (totalBytesWritten >= totalBytesExpectedToWrite) {
+            [trace checkpointState:FPRNetworkTraceCheckpointStateRequestCompleted];
+          }
           typedef void (*OriginalImp)(id, SEL, NSURLConnection *, NSInteger, NSInteger, NSInteger);
           ((OriginalImp)currentIMP)(object, selector, connection, bytesWritten, totalBytesWritten,
                                     totalBytesExpectedToWrite);

+ 1 - 5
FirebasePerformance/Sources/Instrumentation/Network/Delegates/FPRNSURLSessionDelegate.m

@@ -40,11 +40,7 @@
     FPRNetworkTrace *trace = [FPRNetworkTrace networkTraceFromObject:task];
     trace.requestSize = totalBytesSent;
     if (totalBytesSent >= totalBytesExpectedToSend) {
-      if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {
-        NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
-        [trace didCompleteRequestWithResponse:response error:task.error];
-        [FPRNetworkTrace removeNetworkTraceFromObject:task];
-      }
+      [trace checkpointState:FPRNetworkTraceCheckpointStateRequestCompleted];
     }
   } @catch (NSException *exception) {
     FPRLogWarning(kFPRNetworkTraceNotTrackable, @"Unable to track network request.");

+ 1 - 5
FirebasePerformance/Sources/Instrumentation/Network/Delegates/FPRNSURLSessionDelegateInstrument.m

@@ -83,11 +83,7 @@ void InstrumentURLSessionTaskDidSendBodyDataTotalBytesSentTotalBytesExpectedToSe
             FPRNetworkTrace *trace = [FPRNetworkTrace networkTraceFromObject:task];
             trace.requestSize = totalBytesSent;
             if (totalBytesSent >= totalBytesExpectedToSend) {
-              if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) {
-                NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response;
-                [trace didCompleteRequestWithResponse:response error:task.error];
-                [FPRNetworkTrace removeNetworkTraceFromObject:task];
-              }
+              [trace checkpointState:FPRNetworkTraceCheckpointStateRequestCompleted];
             }
           } @catch (NSException *exception) {
             FPRLogWarning(kFPRNetworkTraceNotTrackable, @"Unable to track network request.");

+ 7 - 0
FirebasePerformance/Tests/Unit/Instruments/FPRNSURLConnectionInstrumentTest.m

@@ -364,10 +364,17 @@
   NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:delegate];
   [connection start];
   XCTAssertNotNil([FPRNetworkTrace networkTraceFromObject:connection]);
+  FPRNetworkTrace *networkTrace = [FPRNetworkTrace networkTraceFromObject:connection];
+
   [self waitAndRunBlockAfterResponse:^(id self, GCDWebServerRequest *_Nonnull request,
                                        GCDWebServerResponse *_Nonnull response) {
     XCTAssertTrue(
         delegate.connectionDidSendBodyDataTotalBytesWrittenTotalBytesExpectedToWriteCalled);
+    XCTAssert(networkTrace.requestSize > 0);
+    XCTAssert(
+        [networkTrace
+            timeIntervalBetweenCheckpointState:FPRNetworkTraceCheckpointStateInitiated
+                                      andState:FPRNetworkTraceCheckpointStateRequestCompleted] > 0);
     XCTAssertNil([FPRNetworkTrace networkTraceFromObject:connection]);
   }];
   [instrument deregisterInstrumentors];

+ 7 - 0
FirebasePerformance/Tests/Unit/Instruments/FPRNSURLSessionInstrumentTest.m

@@ -387,9 +387,16 @@
   [uploadTask resume];
 
   XCTAssertNotNil([FPRNetworkTrace networkTraceFromObject:uploadTask]);
+  FPRNetworkTrace *networkTrace = [FPRNetworkTrace networkTraceFromObject:uploadTask];
+
   [self waitAndRunBlockAfterResponse:^(id self, GCDWebServerRequest *_Nonnull request,
                                        GCDWebServerResponse *_Nonnull response) {
     XCTAssertTrue(delegate.URLSessionTaskDidSendBodyDataTotalBytesSentTotalBytesExpectedCalled);
+    XCTAssert(networkTrace.requestSize > 0);
+    XCTAssert(
+        [networkTrace
+            timeIntervalBetweenCheckpointState:FPRNetworkTraceCheckpointStateInitiated
+                                      andState:FPRNetworkTraceCheckpointStateRequestCompleted] > 0);
     XCTAssertNil([FPRNetworkTrace networkTraceFromObject:uploadTask]);
   }];
   [instrument deregisterInstrumentors];