Skip to content

Commit f72ba3d

Browse files
committed
Merge remote-tracking branch 'origin/dev' into feat/enabling-network-automasking
2 parents 96af2e6 + 87522e9 commit f72ba3d

28 files changed

+838
-34
lines changed

CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## [Unreleased](https://github.com/Instabug/Instabug-React-Native/compare/v14.0.0...dev)
4+
5+
### Added
6+
7+
- Add support for tracing network requests from Instabug to services like Datadog and New Relic ([#1288](https://github.com/Instabug/Instabug-React-Native/pull/1288))
8+
39
## [14.0.0](https://github.com/Instabug/Instabug-React-Native/compare/v13.4.0...14.0.0) (November 19, 2024)
410

511
### Added

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

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ final class Constants {
99

1010
final static String IBG_ON_NEW_MESSAGE_HANDLER = "IBGonNewMessageHandler";
1111
final static String IBG_ON_NEW_REPLY_RECEIVED_CALLBACK = "IBGOnNewReplyReceivedCallback";
12+
13+
final static String IBG_ON_NEW_W3C_FLAGS_UPDATE_RECEIVED_CALLBACK = "IBGOnNewW3CFlagsUpdateReceivedCallback";
14+
1215
final static String IBG_SESSION_REPLAY_ON_SYNC_CALLBACK_INVOCATION = "IBGSessionReplayOnSyncCallback";
1316

1417
}

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

+33-7
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,16 @@
99

1010
import com.facebook.react.bridge.Promise;
1111
import com.facebook.react.bridge.ReactApplicationContext;
12-
import com.facebook.react.bridge.ReactContextBaseJavaModule;
1312
import com.facebook.react.bridge.ReactMethod;
13+
import com.facebook.react.bridge.ReadableMap;
1414
import com.instabug.apm.APM;
1515
import com.instabug.apm.model.ExecutionTrace;
1616
import com.instabug.apm.networking.APMNetworkLogger;
1717
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
18+
import com.instabug.reactlibrary.utils.EventEmitterModule;
19+
import com.instabug.apm.networkinterception.cp.APMCPNetworkLog;
1820
import com.instabug.reactlibrary.utils.MainThreadHandler;
1921

20-
import org.json.JSONException;
21-
import org.json.JSONObject;
22-
import java.lang.reflect.InvocationTargetException;
2322
import java.lang.reflect.Method;
2423

2524
import java.util.HashMap;
@@ -28,7 +27,7 @@
2827

2928
import static com.instabug.reactlibrary.utils.InstabugUtil.getMethod;
3029

31-
public class RNInstabugAPMModule extends ReactContextBaseJavaModule {
30+
public class RNInstabugAPMModule extends EventEmitterModule {
3231

3332
public RNInstabugAPMModule(ReactApplicationContext reactApplicationContext) {
3433
super(reactApplicationContext);
@@ -330,14 +329,41 @@ private void networkLogAndroid(final double requestStartTime,
330329
final double statusCode,
331330
final String responseContentType,
332331
@Nullable final String errorDomain,
332+
@Nullable final ReadableMap w3cAttributes,
333333
@Nullable final String gqlQueryName,
334-
@Nullable final String serverErrorMessage) {
334+
@Nullable final String serverErrorMessage
335+
) {
335336
try {
336337
APMNetworkLogger networkLogger = new APMNetworkLogger();
337338

338339
final boolean hasError = errorDomain != null && !errorDomain.isEmpty();
339340
final String errorMessage = hasError ? errorDomain : null;
341+
Boolean isW3cHeaderFound=false;
342+
Long partialId=null;
343+
Long networkStartTimeInSeconds=null;
344+
345+
346+
try {
347+
if (!w3cAttributes.isNull("isW3cHeaderFound")) {
348+
isW3cHeaderFound = w3cAttributes.getBoolean("isW3cHeaderFound");
349+
}
340350

351+
if (!w3cAttributes.isNull("partialId")) {
352+
partialId =(long) w3cAttributes.getDouble("partialId");
353+
networkStartTimeInSeconds = (long) w3cAttributes.getDouble("networkStartTimeInSeconds");
354+
}
355+
356+
} catch (Exception e) {
357+
e.printStackTrace();
358+
}
359+
APMCPNetworkLog.W3CExternalTraceAttributes w3cExternalTraceAttributes =
360+
new APMCPNetworkLog.W3CExternalTraceAttributes(
361+
isW3cHeaderFound,
362+
partialId,
363+
networkStartTimeInSeconds,
364+
w3cAttributes.getString("w3cGeneratedHeader"),
365+
w3cAttributes.getString("w3cCaughtHeader")
366+
);
341367
try {
342368
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);
343369
if (method != null) {
@@ -359,7 +385,7 @@ private void networkLogAndroid(final double requestStartTime,
359385
errorMessage,
360386
gqlQueryName,
361387
serverErrorMessage,
362-
null
388+
w3cExternalTraceAttributes
363389
);
364390
} else {
365391
Log.e("IB-CP-Bridge", "APMNetworkLogger.log was not found by reflection");

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

+108
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import android.util.Log;
99
import android.view.View;
1010

11+
import androidx.annotation.NonNull;
1112
import androidx.annotation.UiThread;
1213

1314
import com.facebook.react.bridge.Arguments;
@@ -22,6 +23,8 @@
2223
import com.facebook.react.bridge.WritableNativeArray;
2324
import com.facebook.react.bridge.WritableNativeMap;
2425
import com.facebook.react.uimanager.UIManagerModule;
26+
import com.instabug.apm.InternalAPM;
27+
import com.instabug.apm.configuration.cp.APMFeature;
2528
import com.instabug.library.Feature;
2629
import com.instabug.library.Instabug;
2730
import com.instabug.library.InstabugColorTheme;
@@ -30,6 +33,11 @@
3033
import com.instabug.library.LogLevel;
3134
import com.instabug.library.ReproConfigurations;
3235
import com.instabug.library.core.InstabugCore;
36+
import com.instabug.library.internal.crossplatform.CoreFeature;
37+
import com.instabug.library.internal.crossplatform.CoreFeaturesState;
38+
import com.instabug.library.internal.crossplatform.FeaturesStateListener;
39+
import com.instabug.library.internal.crossplatform.InternalCore;
40+
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
3341
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
3442
import com.instabug.library.internal.module.InstabugLocale;
3543
import com.instabug.library.invocation.InstabugInvocationEvent;
@@ -1168,6 +1176,106 @@ public void run() {
11681176
}
11691177
});
11701178
}
1179+
1180+
/**
1181+
* Register a listener for W3C flags value change
1182+
*/
1183+
@ReactMethod
1184+
public void registerW3CFlagsChangeListener(){
1185+
1186+
MainThreadHandler.runOnMainThread(new Runnable() {
1187+
@Override
1188+
public void run() {
1189+
try {
1190+
InternalCore.INSTANCE._setFeaturesStateListener(new FeaturesStateListener() {
1191+
@Override
1192+
public void invoke(@NonNull CoreFeaturesState featuresState) {
1193+
WritableMap params = Arguments.createMap();
1194+
params.putBoolean("isW3ExternalTraceIDEnabled", featuresState.isW3CExternalTraceIdEnabled());
1195+
params.putBoolean("isW3ExternalGeneratedHeaderEnabled", featuresState.isAttachingGeneratedHeaderEnabled());
1196+
params.putBoolean("isW3CaughtHeaderEnabled", featuresState.isAttachingCapturedHeaderEnabled());
1197+
1198+
sendEvent(Constants.IBG_ON_NEW_W3C_FLAGS_UPDATE_RECEIVED_CALLBACK, params);
1199+
}
1200+
});
1201+
}
1202+
catch (Exception e) {
1203+
e.printStackTrace();
1204+
}
1205+
1206+
}
1207+
1208+
});
1209+
}
1210+
1211+
/**
1212+
* Get first time Value of W3ExternalTraceID flag
1213+
*/
1214+
@ReactMethod
1215+
public void isW3ExternalTraceIDEnabled(Promise promise){
1216+
1217+
MainThreadHandler.runOnMainThread(new Runnable() {
1218+
@Override
1219+
public void run() {
1220+
try {
1221+
promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID));
1222+
}
1223+
catch (Exception e) {
1224+
e.printStackTrace();
1225+
promise.resolve(false);
1226+
}
1227+
1228+
}
1229+
1230+
});
1231+
}
1232+
1233+
1234+
/**
1235+
* Get first time Value of W3ExternalGeneratedHeader flag
1236+
*/
1237+
@ReactMethod
1238+
public void isW3ExternalGeneratedHeaderEnabled(Promise promise){
1239+
1240+
MainThreadHandler.runOnMainThread(new Runnable() {
1241+
@Override
1242+
public void run() {
1243+
try {
1244+
promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER));
1245+
}
1246+
catch (Exception e) {
1247+
e.printStackTrace();
1248+
promise.resolve(false);
1249+
}
1250+
1251+
}
1252+
1253+
});
1254+
}
1255+
1256+
/**
1257+
* Get first time Value of W3CaughtHeader flag
1258+
*/
1259+
@ReactMethod
1260+
public void isW3CaughtHeaderEnabled(Promise promise){
1261+
1262+
MainThreadHandler.runOnMainThread(new Runnable() {
1263+
@Override
1264+
public void run() {
1265+
try {
1266+
promise.resolve(InternalCore.INSTANCE._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER));
1267+
}
1268+
catch (Exception e) {
1269+
e.printStackTrace();
1270+
promise.resolve(false);
1271+
}
1272+
1273+
}
1274+
1275+
});
1276+
}
1277+
1278+
11711279
/**
11721280
* Map between the exported JS constant and the arg key in {@link ArgsRegistry}.
11731281
* The constant name and the arg key should match to be able to resolve the

android/src/test/java/com/instabug/reactlibrary/RNInstabugAPMModuleTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -204,4 +204,6 @@ public void testSetFlowAttribute() {
204204
verify(APM.class, times(1));
205205
APM.endUITrace();
206206
}
207+
208+
207209
}

android/src/test/java/com/instabug/reactlibrary/RNInstabugReactnativeModuleTest.java

+27
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import com.instabug.library.IssueType;
1919
import com.instabug.library.ReproConfigurations;
2020
import com.instabug.library.ReproMode;
21+
import com.instabug.library.internal.crossplatform.CoreFeature;
22+
import com.instabug.library.internal.crossplatform.InternalCore;
23+
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
2124
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
2225
import com.instabug.library.internal.module.InstabugLocale;
2326
import com.instabug.library.ui.onboarding.WelcomeMessage;
@@ -654,4 +657,28 @@ public void testDisableAutoMasking() {
654657
mockInstabug.verify(() -> Instabug.setNetworkAutoMaskingState(Feature.State.DISABLED));
655658
}
656659

660+
@Test
661+
public void testW3CExternalTraceIDFlag(){
662+
Promise promise = mock(Promise.class);
663+
InternalCore internalAPM = mock(InternalCore.class);
664+
rnModule.isW3ExternalTraceIDEnabled(promise);
665+
boolean expected=internalAPM._isFeatureEnabled(CoreFeature.W3C_EXTERNAL_TRACE_ID);
666+
verify(promise).resolve(expected);
667+
}
668+
@Test
669+
public void testW3CExternalGeneratedHeaderFlag(){
670+
Promise promise = mock(Promise.class);
671+
InternalCore internalAPM = mock(InternalCore.class);
672+
rnModule.isW3ExternalGeneratedHeaderEnabled(promise);
673+
boolean expected=internalAPM._isFeatureEnabled(CoreFeature.W3C_ATTACHING_GENERATED_HEADER);
674+
verify(promise).resolve(expected);
675+
}
676+
@Test
677+
public void testW3CCaughtHeaderFlag(){
678+
Promise promise = mock(Promise.class);
679+
InternalCore internalAPM = mock(InternalCore.class);
680+
rnModule.isW3CaughtHeaderEnabled(promise);
681+
boolean expected=internalAPM._isFeatureEnabled(CoreFeature.W3C_ATTACHING_CAPTURED_HEADER);
682+
verify(promise).resolve(expected);
683+
}
657684
}

examples/default/ios/InstabugTests/InstabugAPMTests.m

+3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#import <Instabug/IBGAPM.h>
1414
#import "Instabug/Instabug.h"
1515
#import "IBGConstants.h"
16+
#import "RNInstabug/IBGAPM+PrivateAPIs.h"
1617

1718
@interface InstabugAPMTests : XCTestCase
1819
@property (nonatomic, retain) InstabugAPMBridge *instabugBridge;
@@ -176,4 +177,6 @@ - (void) testEndUITrace {
176177
OCMVerify([mock endUITrace]);
177178
}
178179

180+
181+
179182
@end

examples/default/ios/InstabugTests/InstabugCrashReportingTests.m

+4-2
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ - (void)setUp {
1919
}
2020

2121
- (void)testSetEnabled {
22+
23+
[self.bridge setEnabled:NO];
24+
XCTAssertFalse(IBGCrashReporting.enabled);
25+
2226
[self.bridge setEnabled:YES];
2327
XCTAssertTrue(IBGCrashReporting.enabled);
2428

25-
[self.bridge setEnabled:NO];
26-
XCTAssertFalse(IBGCrashReporting.enabled);
2729
}
2830

2931
- (void)testSendJSCrash {

0 commit comments

Comments
 (0)