Skip to content

Commit e0782a9

Browse files
Merge remote-tracking branch 'origin/dev' into feat/support-Variants-in-Features-&-Experiments-SDK-APIs-
# Conflicts: # CHANGELOG.md # test/mocks/mockInstabug.ts
2 parents 00d8859 + 635cd47 commit e0782a9

34 files changed

+1215
-233
lines changed

CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010

1111
- Deprecate Experiments APIs `Instabug.addExperiments`, `Instabug.removeExperiments` and `Instabug.clearAllExperiments` in favor of the new Feature Flags APIs ([#1230](https://github.com/Instabug/Instabug-React-Native/pull/1230)).
1212

13+
### Fixed
14+
15+
- Fix APM network logging on Android ([#1253](https://github.com/Instabug/Instabug-React-Native/pull/1253)).
16+
- Fix an OOM (out-of-memory) crash while saving network logs on Android ([#1244](https://github.com/Instabug/Instabug-React-Native/pull/1244)).
17+
1318
## [13.2.0](https://github.com/Instabug/Instabug-React-Native/compare/v13.1.1...v13.2.0) (July 7, 2024)
1419

1520
### Changed
@@ -68,6 +73,11 @@
6873

6974
- Adds symbol files upload script ([#1137](https://github.com/Instabug/Instabug-React-Native/pull/1137))
7075
- Support enabling NDK crash capturing on Android ([#1132](https://github.com/Instabug/Instabug-React-Native/pull/1132)).
76+
- Add support for App Flows APIs `APM.startFlow`, `APM.setFlowAttribute` and `APM.endFlow` ([#1138](https://github.com/Instabug/Instabug-React-Native/pull/1138)).
77+
78+
### Deprecated
79+
80+
- Deprecate execution traces APIs `APM.startExecutionTrace`, `Trace.end` and `Trace.setFlowAttribute` in favor of the new app flow APIs ([#1138](https://github.com/Instabug/Instabug-React-Native/pull/1138)).
7181

7282
### Deprecated
7383

@@ -94,6 +104,10 @@
94104

95105
- Bump Instabug Android SDK to v12.8.0 ([#1149](https://github.com/Instabug/Instabug-React-Native/pull/1149)). [See release notes](https://github.com/Instabug/android/releases/tag/v12.8.0).
96106

107+
### Deprecated
108+
109+
- Deprecate Execution Traces APIs `APM.startExecutionTrace`, `Trace.end` and `Trace.setAttribute` in favor of the new App Flows APIs ([#1138](https://github.com/Instabug/Instabug-React-Native/pull/1138)).
110+
97111
## [12.7.1](https://github.com/Instabug/Instabug-React-Native/compare/v12.7.0...v12.7.1) (February 15, 2024)
98112

99113
### Changed

android/src/main/java/com/instabug/reactlibrary/RNInstabugAPMModule.java

Lines changed: 47 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
import android.util.Log;
66

77
import androidx.annotation.NonNull;
8+
import androidx.annotation.Nullable;
9+
810
import com.facebook.react.bridge.Promise;
911
import com.facebook.react.bridge.ReactApplicationContext;
1012
import com.facebook.react.bridge.ReactContextBaseJavaModule;
1113
import com.facebook.react.bridge.ReactMethod;
1214
import com.instabug.apm.APM;
1315
import com.instabug.apm.model.ExecutionTrace;
1416
import com.instabug.apm.networking.APMNetworkLogger;
17+
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
1518
import com.instabug.reactlibrary.utils.MainThreadHandler;
1619

1720
import org.json.JSONException;
@@ -312,56 +315,59 @@ public void run() {
312315
});
313316
}
314317

315-
/**
316-
* Send Apm network log by Reflection
317-
*/
318318
@ReactMethod
319-
public void networkLog(String networkData) throws JSONException {
320-
try{
321-
APMNetworkLogger apmNetworkLogger = new APMNetworkLogger();
322-
JSONObject jsonObject = new JSONObject(networkData);
323-
final String requestUrl = (String) jsonObject.get("url");
324-
final String requestBody = (String) jsonObject.get("requestBody");
325-
final String responseBody = (String) jsonObject.get("responseBody");
326-
final String requestMethod = (String) jsonObject.get("method");
327-
//--------------------------------------------
328-
final String requestContentType = (String) jsonObject.get("requestContentType");
329-
final String responseContentType = (String) jsonObject.get("contentType");
330-
//--------------------------------------------
331-
final long requestBodySize = ((Number) jsonObject.get("requestBodySize")).longValue();
332-
final long responseBodySize = ((Number) jsonObject.get("responseBodySize")).longValue();
333-
//--------------------------------------------
334-
final String errorDomain = (String) jsonObject.get("errorDomain");
335-
final Integer statusCode = (Integer) jsonObject.get("responseCode");
336-
final long requestDuration = ((Number) jsonObject.get("duration")).longValue();
337-
final long requestStartTime = ((Number) jsonObject.get("startTime")).longValue() * 1000;
338-
final String requestHeaders = (String) jsonObject.get("requestHeaders").toString();
339-
final String responseHeaders = (String) jsonObject.get("responseHeaders").toString();
340-
final String errorMessage;
341-
if(errorDomain.equals("")) {
342-
errorMessage = null;
343-
} else {
344-
errorMessage = errorDomain;
345-
}
346-
//--------------------------------------------
347-
String gqlQueryName = null;
348-
if(jsonObject.has("gqlQueryName")){
349-
gqlQueryName = (String) jsonObject.get("gqlQueryName");
350-
}
351-
final String serverErrorMessage = (String) jsonObject.get("serverErrorMessage");
319+
private void networkLogAndroid(final double requestStartTime,
320+
final double requestDuration,
321+
final String requestHeaders,
322+
final String requestBody,
323+
final double requestBodySize,
324+
final String requestMethod,
325+
final String requestUrl,
326+
final String requestContentType,
327+
final String responseHeaders,
328+
final String responseBody,
329+
final double responseBodySize,
330+
final double statusCode,
331+
final String responseContentType,
332+
@Nullable final String errorDomain,
333+
@Nullable final String gqlQueryName,
334+
@Nullable final String serverErrorMessage) {
335+
try {
336+
APMNetworkLogger networkLogger = new APMNetworkLogger();
337+
338+
final boolean hasError = errorDomain != null && !errorDomain.isEmpty();
339+
final String errorMessage = hasError ? errorDomain : null;
352340

353341
try {
354-
Method method = getMethod(Class.forName("com.instabug.apm.networking.APMNetworkLogger"), "log", long.class, long.class, String.class, String.class, long.class, String.class, String.class, String.class, String.class, String.class, long.class, int.class, String.class, String.class, String.class, String.class);
342+
Method method = getMethod(Class.forName("com.instabug.apm.networking.APMNetworkLogger"), "log", long.class, long.class, String.class, String.class, long.class, String.class, String.class, String.class, String.class, String.class, long.class, int.class, String.class, String.class, String.class, String.class, APMCPNetworkLog.W3CExternalTraceAttributes.class);
355343
if (method != null) {
356-
method.invoke(apmNetworkLogger, requestStartTime, requestDuration, requestHeaders, requestBody, requestBodySize, requestMethod, requestUrl, requestContentType, responseHeaders, responseBody, responseBodySize, statusCode, responseContentType, errorMessage, gqlQueryName, serverErrorMessage);
344+
method.invoke(
345+
networkLogger,
346+
(long) requestStartTime,
347+
(long) requestDuration,
348+
requestHeaders,
349+
requestBody,
350+
(long) requestBodySize,
351+
requestMethod,
352+
requestUrl,
353+
requestContentType,
354+
responseHeaders,
355+
responseBody,
356+
(long)responseBodySize,
357+
(int) statusCode,
358+
responseContentType,
359+
errorMessage,
360+
gqlQueryName,
361+
serverErrorMessage,
362+
null
363+
);
357364
} else {
358-
Log.e("IB-CP-Bridge", "apmNetworkLogByReflection was not found by reflection");
365+
Log.e("IB-CP-Bridge", "APMNetworkLogger.log was not found by reflection");
359366
}
360367
} catch (Throwable e) {
361368
e.printStackTrace();
362369
}
363-
}
364-
catch(Throwable e) {
370+
} catch(Throwable e) {
365371
e.printStackTrace();
366372
}
367373
}

android/src/main/java/com/instabug/reactlibrary/RNInstabugReactnativeModule.java

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import android.app.Application;
66
import android.graphics.Bitmap;
77
import android.net.Uri;
8+
import android.util.Log;
89
import android.view.View;
910

1011
import androidx.annotation.UiThread;
@@ -36,6 +37,7 @@
3637
import com.instabug.library.model.NetworkLog;
3738
import com.instabug.library.model.Report;
3839
import com.instabug.library.ui.onboarding.WelcomeMessage;
40+
import com.instabug.library.util.InstabugSDKLogger;
3941
import com.instabug.reactlibrary.utils.ArrayUtil;
4042
import com.instabug.reactlibrary.utils.EventEmitterModule;
4143
import com.instabug.reactlibrary.utils.MainThreadHandler;
@@ -64,7 +66,7 @@
6466
*/
6567
public class RNInstabugReactnativeModule extends EventEmitterModule {
6668

67-
private static final String TAG = RNInstabugReactnativeModule.class.getSimpleName();
69+
private static final String TAG = "IBG-RN-Core";
6870

6971
private InstabugCustomTextPlaceHolder placeHolders;
7072
private static Report currentReport;
@@ -899,27 +901,38 @@ public void run() {
899901
});
900902
}
901903

902-
/**
903-
* Extracts HTTP connection properties. Request method, Headers, Date, Url and Response code
904-
*
905-
* @param jsonObject the JSON object containing all HTTP connection properties
906-
* @throws JSONException
907-
*/
908904
@ReactMethod
909-
public void networkLog(String jsonObject) throws JSONException {
910-
NetworkLog networkLog = new NetworkLog();
911-
String date = System.currentTimeMillis()+"";
912-
networkLog.setDate(date);
913-
JSONObject newJSONObject = new JSONObject(jsonObject);
914-
networkLog.setUrl(newJSONObject.getString("url"));
915-
networkLog.setRequest(newJSONObject.getString("requestBody"));
916-
networkLog.setResponse(newJSONObject.getString("responseBody"));
917-
networkLog.setMethod(newJSONObject.getString("method"));
918-
networkLog.setResponseCode(newJSONObject.getInt("responseCode"));
919-
networkLog.setRequestHeaders(newJSONObject.getString("requestHeaders"));
920-
networkLog.setResponseHeaders(newJSONObject.getString("responseHeaders"));
921-
networkLog.setTotalDuration(newJSONObject.getLong("duration"));
922-
networkLog.insert();
905+
public void networkLogAndroid(final String url,
906+
final String requestBody,
907+
final String responseBody,
908+
final String method,
909+
final double responseCode,
910+
final String requestHeaders,
911+
final String responseHeaders,
912+
final double duration) {
913+
try {
914+
final String date = String.valueOf(System.currentTimeMillis());
915+
916+
NetworkLog networkLog = new NetworkLog();
917+
networkLog.setDate(date);
918+
networkLog.setUrl(url);
919+
networkLog.setMethod(method);
920+
networkLog.setResponseCode((int) responseCode);
921+
networkLog.setTotalDuration((long) duration);
922+
923+
try {
924+
networkLog.setRequest(requestBody);
925+
networkLog.setResponse(responseBody);
926+
networkLog.setRequestHeaders(requestHeaders);
927+
networkLog.setResponseHeaders(responseHeaders);
928+
} catch (OutOfMemoryError | Exception exception) {
929+
Log.d(TAG, "Error: " + exception.getMessage() + "while trying to set network log contents (request body, response body, request headers, and response headers).");
930+
}
931+
932+
networkLog.insert();
933+
} catch (OutOfMemoryError | Exception exception) {
934+
Log.d(TAG, "Error: " + exception.getMessage() + "while trying to insert a network log");
935+
}
923936
}
924937

925938
@UiThread

examples/default/ios/InstabugTests/InstabugSampleTests.m

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#import <Instabug/IBGTypes.h>
1414
#import "IBGConstants.h"
1515
#import "RNInstabug.h"
16+
#import <RNInstabug/IBGNetworkLogger+CP.h>
1617

1718
@protocol InstabugCPTestProtocol <NSObject>
1819
/**
@@ -313,6 +314,61 @@ - (void)testSetWelcomeMessageMode {
313314
OCMVerify([mock setWelcomeMessageMode:welcomeMessageMode]);
314315
}
315316

317+
- (void)testNetworkLogIOS {
318+
id mIBGNetworkLogger = OCMClassMock([IBGNetworkLogger class]);
319+
320+
NSString *url = @"https://api.instabug.com";
321+
NSString *method = @"GET";
322+
NSString *requestBody = @"requestBody";
323+
double requestBodySize = 10;
324+
NSString *responseBody = @"responseBody";
325+
double responseBodySize = 15;
326+
double responseCode = 200;
327+
NSDictionary *requestHeaders = @{ @"accept": @"application/json" };
328+
NSDictionary *responseHeaders = @{ @"cache-control": @"no-store" };
329+
NSString *contentType = @"application/json";
330+
double errorCode = 0;
331+
NSString *errorDomain = nil;
332+
double startTime = 1719847101199;
333+
double duration = 150;
334+
NSString *gqlQueryName = nil;
335+
NSString *serverErrorMessage = nil;
336+
337+
[self.instabugBridge networkLogIOS:url
338+
method:method
339+
requestBody:requestBody
340+
requestBodySize:requestBodySize
341+
responseBody:responseBody
342+
responseBodySize:responseBodySize
343+
responseCode:responseCode
344+
requestHeaders:requestHeaders
345+
responseHeaders:responseHeaders
346+
contentType:contentType
347+
errorDomain:errorDomain
348+
errorCode:errorCode
349+
startTime:startTime
350+
duration:duration
351+
gqlQueryName:gqlQueryName
352+
serverErrorMessage:serverErrorMessage];
353+
354+
OCMVerify([mIBGNetworkLogger addNetworkLogWithUrl:url
355+
method:method
356+
requestBody:requestBody
357+
requestBodySize:requestBodySize
358+
responseBody:responseBody
359+
responseBodySize:responseBodySize
360+
responseCode:responseCode
361+
requestHeaders:requestHeaders
362+
responseHeaders:responseHeaders
363+
contentType:contentType
364+
errorDomain:errorDomain
365+
errorCode:errorCode
366+
startTime:startTime * 1000
367+
duration:duration * 1000
368+
gqlQueryName:gqlQueryName
369+
serverErrorMessage:serverErrorMessage]);
370+
}
371+
316372
- (void)testSetFileAttachment {
317373
id mock = OCMClassMock([Instabug class]);
318374
NSString *fileLocation = @"test";

examples/default/ios/Podfile.lock

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,8 @@ PODS:
404404
- React-jsinspector (0.72.3)
405405
- React-logger (0.72.3):
406406
- glog
407+
- react-native-background-timer (2.4.1):
408+
- React-Core
407409
- react-native-config (1.5.1):
408410
- react-native-config/App (= 1.5.1)
409411
- react-native-config/App (1.5.1):
@@ -528,6 +530,8 @@ PODS:
528530
- React-jsi (= 0.72.3)
529531
- React-logger (= 0.72.3)
530532
- React-perflogger (= 0.72.3)
533+
- RNCClipboard (1.5.1):
534+
- React-Core
531535
- RNGestureHandler (2.13.4):
532536
- RCT-Folly (= 2021.07.22.00)
533537
- React-Core
@@ -623,6 +627,7 @@ DEPENDENCIES:
623627
- React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`)
624628
- React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`)
625629
- React-logger (from `../node_modules/react-native/ReactCommon/logger`)
630+
- react-native-background-timer (from `../node_modules/react-native-background-timer`)
626631
- react-native-config (from `../node_modules/react-native-config`)
627632
- react-native-google-maps (from `../node_modules/react-native-maps`)
628633
- react-native-maps (from `../node_modules/react-native-maps`)
@@ -645,6 +650,7 @@ DEPENDENCIES:
645650
- React-runtimescheduler (from `../node_modules/react-native/ReactCommon/react/renderer/runtimescheduler`)
646651
- React-utils (from `../node_modules/react-native/ReactCommon/react/utils`)
647652
- ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`)
653+
- "RNCClipboard (from `../node_modules/@react-native-community/clipboard`)"
648654
- RNGestureHandler (from `../node_modules/react-native-gesture-handler`)
649655
- RNInstabug (from `../node_modules/instabug-reactnative`)
650656
- RNReanimated (from `../node_modules/react-native-reanimated`)
@@ -720,6 +726,8 @@ EXTERNAL SOURCES:
720726
:path: "../node_modules/react-native/ReactCommon/jsinspector"
721727
React-logger:
722728
:path: "../node_modules/react-native/ReactCommon/logger"
729+
react-native-background-timer:
730+
:path: "../node_modules/react-native-background-timer"
723731
react-native-config:
724732
:path: "../node_modules/react-native-config"
725733
react-native-google-maps:
@@ -764,6 +772,8 @@ EXTERNAL SOURCES:
764772
:path: "../node_modules/react-native/ReactCommon/react/utils"
765773
ReactCommon:
766774
:path: "../node_modules/react-native/ReactCommon"
775+
RNCClipboard:
776+
:path: "../node_modules/@react-native-community/clipboard"
767777
RNGestureHandler:
768778
:path: "../node_modules/react-native-gesture-handler"
769779
RNInstabug:
@@ -818,6 +828,7 @@ SPEC CHECKSUMS:
818828
React-jsiexecutor: 59d1eb03af7d30b7d66589c410f13151271e8006
819829
React-jsinspector: b511447170f561157547bc0bef3f169663860be7
820830
React-logger: c5b527272d5f22eaa09bb3c3a690fee8f237ae95
831+
react-native-background-timer: 17ea5e06803401a379ebf1f20505b793ac44d0fe
821832
react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8
822833
react-native-google-maps: 1bcc1f9f13f798fcf230db7fe476f3566d0bc0a3
823834
react-native-maps: 72a8a903f8a1b53e2c777ba79102078ab502e0bf
@@ -840,6 +851,7 @@ SPEC CHECKSUMS:
840851
React-runtimescheduler: 837c1bebd2f84572db17698cd702ceaf585b0d9a
841852
React-utils: bcb57da67eec2711f8b353f6e3d33bd8e4b2efa3
842853
ReactCommon: 3ccb8fb14e6b3277e38c73b0ff5e4a1b8db017a9
854+
RNCClipboard: 41d8d918092ae8e676f18adada19104fa3e68495
843855
RNGestureHandler: 6e46dde1f87e5f018a54fe5d40cd0e0b942b49ee
844856
RNInstabug: 6fa68cd181533f83154df2ebba000d0c47ca7ba3
845857
RNReanimated: ab2e96c6d5591c3dfbb38a464f54c8d17fb34a87

0 commit comments

Comments
 (0)