Skip to content

add network spans into dev #1360

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 73 commits into from
Apr 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
6d0460f
chore: add the feature flag logic
AndrewAminInstabug Sep 26, 2024
1a542cb
Merge remote-tracking branch 'origin/dev' into feat/network-spans
AndrewAminInstabug Sep 26, 2024
16140ef
chore: add different request types to APM -> NetworkScreen.tsx
AndrewAminInstabug Sep 29, 2024
11f6e54
chore: initial commit
AndrewAminInstabug Sep 29, 2024
82df001
chore: add request filtering & obfuscation react-native logic
AndrewAminInstabug Oct 1, 2024
d679ad6
chore: add NetworkLogger module
AndrewAminInstabug Oct 1, 2024
6021e0a
chore: add iOS feature flag changes
AndrewAminInstabug Oct 3, 2024
4802864
Merge remote-tracking branch 'origin/dev' into feat/network-spans-fea…
AndrewAminInstabug Oct 3, 2024
56410eb
chore: add iOS obfuscation & request filtering
AndrewAminInstabug Oct 6, 2024
8efad38
Support Obfuscation & Filtering
EyadHeikal Oct 6, 2024
393f451
chore: add iOS obfuscation & request filtering RN handlers
AndrewAminInstabug Oct 8, 2024
f0cf691
chore: fix wrong id passed from iOS to RN
AndrewAminInstabug Oct 8, 2024
efae20d
chore: fix request filtering handler in iOS
AndrewAminInstabug Oct 9, 2024
35e9fc9
chore: add iOS unit tests
AndrewAminInstabug Oct 10, 2024
dd97124
chore: fix native android feature flags
AndrewAminInstabug Oct 13, 2024
68a9f4e
Merge remote-tracking branch 'origin/feat/network-spans-feature-flags…
AndrewAminInstabug Oct 13, 2024
f248be7
chore: remove APMNetworkEnabled flag from android
AndrewAminInstabug Oct 14, 2024
e0c7f28
chore: fix NetworkLogger.spec.ts failed tests
AndrewAminInstabug Oct 14, 2024
ca93121
chore: add unit tests and extract log messages
AndrewAminInstabug Oct 16, 2024
1271f4d
chore: add iOS new APIs
AndrewAminInstabug Oct 20, 2024
f64108d
Merge remote-tracking branch 'origin/dev' into feat/network-spans-fea…
AndrewAminInstabug Oct 20, 2024
b23e0a9
chore: apply PR comments
AndrewAminInstabug Oct 20, 2024
db34813
chore: apply PR comments
AndrewAminInstabug Oct 20, 2024
69ca4f6
chore: initial commit
AndrewAminInstabug Sep 29, 2024
acaaaf2
Merge remote-tracking branch 'origin/feat/network-spans' into feat/ne…
AndrewAminInstabug Oct 20, 2024
2af4bdd
Merge remote-tracking branch 'origin/feat/network-spans' into feat/ne…
AndrewAminInstabug Oct 20, 2024
867bfc0
Merge remote-tracking branch 'origin/feat/network-spans-feature-flags…
AndrewAminInstabug Oct 21, 2024
19c1c98
chore: refactor Instabug.ts
AndrewAminInstabug Oct 21, 2024
b7299d9
Merge remote-tracking branch 'origin/feat/network-spans-feature-flags…
AndrewAminInstabug Oct 23, 2024
e7b9551
chore: fix native iOS automatic capturing
AndrewAminInstabug Oct 27, 2024
b8ab1c4
chore: update native iOS snapshot and add the new network logging APIs.
AndrewAminInstabug Oct 27, 2024
a9d0cec
Merge remote-tracking branch 'origin/feat/network-spans-feature-flags…
AndrewAminInstabug Oct 28, 2024
3cb92cc
chore: add network obfuscation and filtering unit tests
AndrewAminInstabug Oct 29, 2024
5b94fef
chore: fix network obfuscation group testing
AndrewAminInstabug Oct 29, 2024
ee4e2d5
chore: add the Android implementation for network obfuscation and fil…
AndrewAminInstabug Oct 29, 2024
fb1b226
chore: upgrade dependencies
a7medev Oct 30, 2024
6cc4edf
Merge branch 'dev' into chore/upgrade-agp
a7medev Oct 30, 2024
4548a06
refactor(example): upgrade to react native 0.75.4
a7medev Oct 30, 2024
0a8d8b9
chore: integrate android sdk v14 snapshot
a7medev Oct 30, 2024
b946f8b
ci: install cocoapods 1.14
a7medev Oct 30, 2024
662ca6f
ci: upgrade xcode to 15.4
a7medev Oct 30, 2024
7ec61e3
chore: remove .xcode.env.local
a7medev Oct 30, 2024
fea72cb
ci: install cocoapods into usr/local/bin
a7medev Oct 30, 2024
383bfbe
refactor: Android implementation and unit tests of obfuscation
AndrewAminInstabug Oct 30, 2024
e66c67a
Merge remote-tracking branch 'origin/refactor/upgrade-example-app' in…
AndrewAminInstabug Oct 30, 2024
de65770
chore: pull the android upgrade changes, update the network log messa…
AndrewAminInstabug Oct 31, 2024
28dace8
Merge remote-tracking branch 'origin/feat/network-spans-feature-flags…
AndrewAminInstabug Oct 31, 2024
c47e337
ci: fix empty jacoco report issue
a7medev Nov 3, 2024
f4b3282
fix: `registerNetworkLogsListener` signature for android
AndrewAminInstabug Nov 3, 2024
bda9db5
Merge remote-tracking branch 'origin/refactor/upgrade-example-app' in…
AndrewAminInstabug Nov 3, 2024
e4ab074
Merge pull request #1298 from Instabug/feat/network-spans-feature-flags
AndrewAminInstabug Nov 3, 2024
7b7828e
Merge remote-tracking branch 'origin/feat/network-spans' into feat/ne…
AndrewAminInstabug Nov 3, 2024
c22cb2a
add: `setOnFeaturesUpdatedListener` android listener and refactor ins…
AndrewAminInstabug Dec 1, 2024
a099eff
add: `setOnFeaturesUpdatedListener` android listener and refactor ins…
AndrewAminInstabug Dec 8, 2024
6dd503d
apply: PR comments
AndrewAminInstabug Dec 12, 2024
bb0df23
apply: PR comments
AndrewAminInstabug Dec 15, 2024
5f42520
Merge pull request #1306 from Instabug/feat/network-spans-filtering
AndrewAminInstabug Dec 15, 2024
4fe4d1a
upgrade: native iOS snapshot to 14.0.0
AndrewAminInstabug Dec 18, 2024
52e5e0e
update: native android & iOS snapshots,
AndrewAminInstabug Dec 23, 2024
e5eddc8
fix: iOS test
AndrewAminInstabug Dec 23, 2024
f61881c
fix: Podfile.lock version
AndrewAminInstabug Jan 9, 2025
5de5fc4
fix: Podfile.lock version
AndrewAminInstabug Jan 9, 2025
46d0746
add: unit tests to InstabugUtils.spec.ts
AndrewAminInstabug Jan 12, 2025
a2818b0
add: unit tests to InstabugUtils.spec.ts,
AndrewAminInstabug Jan 13, 2025
0c06cc0
Merge pull request #1334 from Instabug/feat/network-spans-filtering
AndrewAminInstabug Jan 19, 2025
173097e
Merge remote-tracking branch 'origin/dev' into feat/dev-into-network-…
AndrewAminInstabug Feb 11, 2025
150477a
rebase: network-spans branch with dev branch
AndrewAminInstabug Feb 12, 2025
dc89917
Merge remote-tracking branch 'origin/dev' into feat/dev-into-network-…
AndrewAminInstabug Mar 10, 2025
43e76e8
chore: update CHANGELOG.md and Podfile.lock
AndrewAminInstabug Mar 11, 2025
8fba8a5
chore: apply pr comments
AndrewAminInstabug Mar 18, 2025
6a2d4c4
Merge remote-tracking branch 'origin/dev' into feat/dev-into-network-…
AndrewAminInstabug Apr 7, 2025
7bbd601
Merge remote-tracking branch 'origin/dev' into feat/dev-into-network-…
AndrewAminInstabug Apr 9, 2025
a57d0b2
chore: resolve dev branch conflicts.
AndrewAminInstabug Apr 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@

- Bump Instabug iOS SDK to v14.3.0 ([#1367](https://github.com/Instabug/Instabug-React-Native/pull/1367)). [See release notes](https://github.com/Instabug/Instabug-iOS/releases/tag/14.3.0).

### Added

- Add support for Network Spans in network logging module ([#1360](https://github.com/Instabug/Instabug-React-Native/pull/1360)).

## [14.1.0](https://github.com/Instabug/Instabug-React-Native/compare/v14.0.0...v14.1.0) (January 2, 2025)

### Added
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ final class Constants {
final static String IBG_ON_NEW_MESSAGE_HANDLER = "IBGonNewMessageHandler";
final static String IBG_ON_NEW_REPLY_RECEIVED_CALLBACK = "IBGOnNewReplyReceivedCallback";

final static String IBG_ON_FEATURES_UPDATED_CALLBACK = "IBGOnFeatureUpdatedCallback";
final static String IBG_NETWORK_LOGGER_HANDLER = "IBGNetworkLoggerHandler";

final static String IBG_ON_NEW_W3C_FLAGS_UPDATE_RECEIVED_CALLBACK = "IBGOnNewW3CFlagsUpdateReceivedCallback";

final static String IBG_SESSION_REPLAY_ON_SYNC_CALLBACK_INVOCATION = "IBGSessionReplayOnSyncCallback";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
package com.instabug.reactlibrary;


import static com.instabug.apm.configuration.cp.APMFeature.APM_NETWORK_PLUGIN_INSTALLED;
import static com.instabug.apm.configuration.cp.APMFeature.CP_NATIVE_INTERCEPTION_ENABLED;

import android.util.Log;

import androidx.annotation.NonNull;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.bridge.ReadableMapKeySetIterator;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableNativeMap;
import com.instabug.apm.InternalAPM;
import com.instabug.apm.sanitization.OnCompleteCallback;
import com.instabug.library.logging.listeners.networklogs.NetworkLogSnapshot;
import com.instabug.reactlibrary.utils.EventEmitterModule;
import com.instabug.reactlibrary.utils.MainThreadHandler;

import org.json.JSONException;
import org.json.JSONObject;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


public class RNInstabugNetworkLoggerModule extends EventEmitterModule {

public final ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>> callbackMap = new ConcurrentHashMap<String, OnCompleteCallback<NetworkLogSnapshot>>();

public RNInstabugNetworkLoggerModule(ReactApplicationContext reactContext) {
super(reactContext);
}


@NonNull
@Override
public String getName() {
return "IBGNetworkLogger";
}


@ReactMethod
public void addListener(String event) {
super.addListener(event);
}

@ReactMethod
public void removeListeners(Integer count) {
super.removeListeners(count);
}

private boolean getFlagValue(String key) {
return InternalAPM._isFeatureEnabledCP(key, "");
}

private WritableMap convertFromMapToWritableMap(Map<String, Object> map) {
WritableMap writableMap = new WritableNativeMap();
for (String key : map.keySet()) {
Object value = map.get(key);
writableMap.putString(key, (String) value);
}
return writableMap;
}

private Map<String, Object> convertReadableMapToMap(ReadableMap readableMap) {
Map<String, Object> map = new HashMap<>();
if (readableMap != null) {
ReadableMapKeySetIterator iterator = readableMap.keySetIterator();
while (iterator.hasNextKey()) {
String key = iterator.nextKey();
map.put(key, readableMap.getString(key));
}
}
return map;
}

/**
* Get first time Value of [cp_native_interception_enabled] flag
*/
@ReactMethod
public void isNativeInterceptionEnabled(Promise promise) {
MainThreadHandler.runOnMainThread(new Runnable() {
@Override
public void run() {
try {
promise.resolve(getFlagValue(CP_NATIVE_INTERCEPTION_ENABLED));
} catch (Exception e) {
e.printStackTrace();
promise.resolve(false); // Will rollback to JS interceptor
}

}
});
}

/**
* Indicate if user added APM Network plugin or not
* [true] means user added the APM plugin
* [false] means not
*/
@ReactMethod
public void hasAPMNetworkPlugin(Promise promise) {
MainThreadHandler.runOnMainThread(new Runnable() {
@Override
public void run() {
try {
promise.resolve(getFlagValue(APM_NETWORK_PLUGIN_INSTALLED));
} catch (Exception e) {
e.printStackTrace();
promise.resolve(false); // Will rollback to JS interceptor
}

}
});
}


@ReactMethod
public void registerNetworkLogsListener() {
MainThreadHandler.runOnMainThread(new Runnable() {
@Override
public void run() {
InternalAPM._registerNetworkLogSanitizer((networkLogSnapshot, onCompleteCallback) -> {
final String id = String.valueOf(onCompleteCallback.hashCode());
callbackMap.put(id, onCompleteCallback);

WritableMap networkSnapshotParams = Arguments.createMap();
networkSnapshotParams.putString("id", id);
networkSnapshotParams.putString("url", networkLogSnapshot.getUrl());
networkSnapshotParams.putInt("responseCode", networkLogSnapshot.getResponseCode());
networkSnapshotParams.putString("requestBody", networkLogSnapshot.getRequestBody());
networkSnapshotParams.putString("response", networkLogSnapshot.getResponse());
final Map<String, Object> requestHeaders = networkLogSnapshot.getRequestHeaders();
if (requestHeaders != null) {
networkSnapshotParams.putMap("requestHeader", convertFromMapToWritableMap(requestHeaders));
}
final Map<String, Object> responseHeaders = networkLogSnapshot.getResponseHeaders();
if (responseHeaders != null) {
networkSnapshotParams.putMap("responseHeader", convertFromMapToWritableMap(responseHeaders));
}

sendEvent(Constants.IBG_NETWORK_LOGGER_HANDLER, networkSnapshotParams);
});
}
});
}

@ReactMethod
public void resetNetworkLogsListener() {
MainThreadHandler.runOnMainThread(new Runnable() {
@Override
public void run() {
InternalAPM._registerNetworkLogSanitizer(null);
}
});
}

@ReactMethod
public void updateNetworkLogSnapshot(
String url,
String callbackID,
String requestBody,
String responseBody,
int responseCode,
ReadableMap requestHeaders,
ReadableMap responseHeaders
) {
try {
// Convert ReadableMap to a Java Map for easier handling
Map<String, Object> requestHeadersMap = convertReadableMapToMap(requestHeaders);
Map<String, Object> responseHeadersMap = convertReadableMapToMap(responseHeaders);

NetworkLogSnapshot modifiedSnapshot = null;
if (!url.isEmpty()) {
modifiedSnapshot = new NetworkLogSnapshot(url, requestHeadersMap, requestBody, responseHeadersMap, responseBody, responseCode);
}

final OnCompleteCallback<NetworkLogSnapshot> callback = callbackMap.get(callbackID);
if (callback != null) {
callback.onComplete(modifiedSnapshot);
callbackMap.remove(callbackID);
}
} catch (Exception e) {
// Reject the promise to indicate an error occurred
Log.e("IB-CP-Bridge", "InstabugNetworkLogger.updateNetworkLogSnapshot failed to parse the network snapshot object.");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.instabug.reactlibrary;

import static com.instabug.apm.configuration.cp.APMFeature.APM_NETWORK_PLUGIN_INSTALLED;
import static com.instabug.apm.configuration.cp.APMFeature.CP_NATIVE_INTERCEPTION_ENABLED;
import static com.instabug.reactlibrary.utils.InstabugUtil.getMethod;

import android.app.Application;
Expand Down Expand Up @@ -38,7 +40,8 @@
import com.instabug.library.internal.crossplatform.FeaturesStateListener;
import com.instabug.library.internal.crossplatform.InternalCore;
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
import com.instabug.library.featuresflags.model.IBGFeatureFlag;
import com.instabug.library.internal.crossplatform.InternalCore;
import com.instabug.library.internal.crossplatform.OnFeaturesUpdatedListener;
import com.instabug.library.internal.module.InstabugLocale;
import com.instabug.library.invocation.InstabugInvocationEvent;
import com.instabug.library.logging.InstabugLog;
Expand Down Expand Up @@ -1294,7 +1297,23 @@ public void run() {

});
}
/**

@ReactMethod
public void setOnFeaturesUpdatedListener() {
InternalCore.INSTANCE._setOnFeaturesUpdatedListener(new OnFeaturesUpdatedListener() {
@Override
public void invoke() {
final boolean cpNativeInterceptionEnabled = InternalAPM._isFeatureEnabledCP(CP_NATIVE_INTERCEPTION_ENABLED, "");
final boolean hasAPMPlugin = InternalAPM._isFeatureEnabledCP(APM_NETWORK_PLUGIN_INSTALLED, "");

WritableMap params = Arguments.createMap();
params.putBoolean("cpNativeInterceptionEnabled", cpNativeInterceptionEnabled);
params.putBoolean("hasAPMPlugin", hasAPMPlugin);
sendEvent(Constants.IBG_ON_FEATURES_UPDATED_CALLBACK, params);
}
});
}
/**
* Enables or disables capturing network body.
* @param isEnabled A boolean to enable/disable capturing network body.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext r
modules.add(new RNInstabugRepliesModule(reactContext));
modules.add(new RNInstabugAPMModule(reactContext));
modules.add(new RNInstabugSessionReplayModule(reactContext));
modules.add(new RNInstabugNetworkLoggerModule(reactContext));
return modules;
}

Expand Down
Loading