@dynatrace/react-native-plugin 2.285.1 → 2.287.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -5
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/dynatrace/android/agent/DynatraceRNBridgeImpl.java +8 -3
- package/android/src/main/java/com/dynatrace/android/agent/DynatraceReactPackage.java +39 -17
- package/android/src/new/java/com/dynatrace/android/agent/DynatraceRNBridge.java +5 -0
- package/android/src/old/java/com/dynatrace/android/agent/DynatraceRNBridge.java +5 -0
- package/files/plugin.gradle +1 -1
- package/ios/DynatraceRNBridge.m +7 -2
- package/lib/instrumentor/base/DynatraceWebRequestTiming.js +10 -6
- package/lib/instrumentor/base/NullWebRequestTiming.js +3 -0
- package/package.json +2 -2
- package/react-native-dynatrace.podspec +1 -1
- package/src/lib/instrumentor/base/interface/NativeDynatraceBridge.ts +3 -0
package/README.md
CHANGED
|
@@ -29,8 +29,8 @@ If you want to start using this plugin and are not a Dynatrace customer yet, hea
|
|
|
29
29
|
## Agent Versions
|
|
30
30
|
This agent versions are configured in this plugin:
|
|
31
31
|
|
|
32
|
-
* Android Agent: 8.
|
|
33
|
-
* iOS Agent: 8.
|
|
32
|
+
* Android Agent: 8.287.1.1006
|
|
33
|
+
* iOS Agent: 8.287.2.1009
|
|
34
34
|
|
|
35
35
|
## Quick Setup
|
|
36
36
|
|
|
@@ -356,7 +356,11 @@ let timing = new DynatraceWebRequestTiming(url, tag);
|
|
|
356
356
|
|
|
357
357
|
try {
|
|
358
358
|
timing.startWebRequestTiming();
|
|
359
|
-
let axiosResponse = await axios.get(url
|
|
359
|
+
let axiosResponse = await axios.get(url, {
|
|
360
|
+
headers: {
|
|
361
|
+
timing.getRequestTagHeader(): tag
|
|
362
|
+
}
|
|
363
|
+
});
|
|
360
364
|
timing.stopWebRequestTiming(axiosResponse.status, axiosResponse.data);
|
|
361
365
|
} catch (error) {
|
|
362
366
|
timing.stopWebRequestTiming(-1, error);
|
|
@@ -365,6 +369,26 @@ try {
|
|
|
365
369
|
}
|
|
366
370
|
```
|
|
367
371
|
|
|
372
|
+
There is also the option to report values for request and response size:
|
|
373
|
+
|
|
374
|
+
```js
|
|
375
|
+
let url = 'https://www.dynatrace.com';
|
|
376
|
+
// You can also use enterAutoAction if desired
|
|
377
|
+
let action = Dynatrace.enterManualAction("Manual Web Request");
|
|
378
|
+
let tag = await action.getRequestTag(url);
|
|
379
|
+
let timing = new DynatraceWebRequestTiming(url, tag);
|
|
380
|
+
|
|
381
|
+
try {
|
|
382
|
+
timing.startWebRequestTiming();
|
|
383
|
+
let axiosResponse = await axios.get(url);
|
|
384
|
+
timing.stopWebRequestTimingWithSize(axiosResponse.status, axiosResponse.data, 122, 63);
|
|
385
|
+
} catch (error) {
|
|
386
|
+
timing.stopWebRequestTiming(-1, error);
|
|
387
|
+
} finally {
|
|
388
|
+
action.leaveAction();
|
|
389
|
+
}
|
|
390
|
+
```
|
|
391
|
+
|
|
368
392
|
### Report values
|
|
369
393
|
|
|
370
394
|
For any open action you can report certain values. The following API is available for action:
|
|
@@ -1296,9 +1320,14 @@ If you are struggling with a problem, submit a support ticket to Dynatrace (supp
|
|
|
1296
1320
|
<br/><br/>
|
|
1297
1321
|
## Changelog
|
|
1298
1322
|
|
|
1299
|
-
2.
|
|
1323
|
+
2.287.1
|
|
1324
|
+
* Update Android (8.287.1.1006) & iOS Agent (8.287.2.1009)
|
|
1325
|
+
* Added request and response size to [manual web request tagging](#manual-web-request-tagging)
|
|
1326
|
+
|
|
1327
|
+
2.285.2
|
|
1328
|
+
* Fixed bridge module issue for older React Native versions (< 0.65.0)
|
|
1300
1329
|
* Introduced support for @react-native/metro-babel-transformer
|
|
1301
|
-
* Update Android (8.
|
|
1330
|
+
* Update Android (8.287.1.1006) & iOS Agent (8.285.1.1004)
|
|
1302
1331
|
|
|
1303
1332
|
2.283.3
|
|
1304
1333
|
* Added Auto-Instrumentation for React Native Switch
|
package/android/build.gradle
CHANGED
|
@@ -70,7 +70,7 @@ repositories {
|
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
dependencies {
|
|
73
|
-
implementation 'com.dynatrace.agent:agent-android:8.
|
|
73
|
+
implementation 'com.dynatrace.agent:agent-android:8.287.1.1006'
|
|
74
74
|
implementation "com.facebook.react:react-native:${safeExtGet('reactNative', '+')}"
|
|
75
75
|
}
|
|
76
76
|
|
|
@@ -13,7 +13,8 @@ import com.facebook.react.bridge.ReactApplicationContext;
|
|
|
13
13
|
import com.facebook.react.bridge.ReactMethod;
|
|
14
14
|
import com.facebook.react.bridge.ReadableMapKeySetIterator;
|
|
15
15
|
|
|
16
|
-
import java.net.
|
|
16
|
+
import java.net.URI;
|
|
17
|
+
import java.net.URISyntaxException;
|
|
17
18
|
import java.util.Hashtable;
|
|
18
19
|
import java.util.HashMap;
|
|
19
20
|
import java.util.Map;
|
|
@@ -207,13 +208,17 @@ public class DynatraceRNBridgeImpl {
|
|
|
207
208
|
}
|
|
208
209
|
|
|
209
210
|
public void stopWebRequestTiming(String requestTag, String url, int responseCode, String responseMessage) {
|
|
211
|
+
stopWebRequestTimingWithSize(requestTag, url, responseCode, responseMessage, -1, -1);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
public void stopWebRequestTimingWithSize(String requestTag, String url, int responseCode, String responseMessage, long requestSize, long responseSize) {
|
|
210
215
|
if (requestTag != null) {
|
|
211
216
|
WebRequestTiming timing = webTimings.get(requestTag);
|
|
212
217
|
if (timing != null) {
|
|
213
218
|
try {
|
|
214
|
-
timing.stopWebRequestTiming(url, responseCode, responseMessage);
|
|
219
|
+
timing.stopWebRequestTiming(new URI(url), responseCode, responseMessage, requestSize, responseSize);
|
|
215
220
|
webTimings.remove(requestTag);
|
|
216
|
-
} catch (
|
|
221
|
+
} catch (URISyntaxException ex) {
|
|
217
222
|
// do nothing
|
|
218
223
|
}
|
|
219
224
|
}
|
|
@@ -1,34 +1,57 @@
|
|
|
1
1
|
package com.dynatrace.android.agent;
|
|
2
2
|
|
|
3
3
|
import androidx.annotation.Nullable;
|
|
4
|
+
import android.util.Log;
|
|
5
|
+
|
|
6
|
+
import com.facebook.react.ReactPackage;
|
|
4
7
|
import com.facebook.react.TurboReactPackage;
|
|
5
8
|
import com.facebook.react.bridge.NativeModule;
|
|
6
9
|
import com.facebook.react.bridge.ReactApplicationContext;
|
|
7
10
|
import com.facebook.react.module.model.ReactModuleInfo;
|
|
8
11
|
import com.facebook.react.module.model.ReactModuleInfoProvider;
|
|
12
|
+
import com.facebook.react.uimanager.ViewManager;
|
|
9
13
|
|
|
10
14
|
import java.util.HashMap;
|
|
11
15
|
import java.util.Map;
|
|
12
16
|
|
|
13
|
-
|
|
17
|
+
import java.util.Arrays;
|
|
18
|
+
import java.util.Collections;
|
|
19
|
+
import java.util.List;
|
|
20
|
+
|
|
21
|
+
public class DynatraceReactPackage extends TurboReactPackage implements ReactPackage {
|
|
22
|
+
|
|
23
|
+
@Override
|
|
24
|
+
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
|
25
|
+
return Collections.emptyList();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@Override
|
|
29
|
+
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
|
30
|
+
PrivateDTBridge bridge = new PrivateDTBridge(reactContext);
|
|
31
|
+
return Arrays.<NativeModule>asList(new DynatraceRNBridge(reactContext, bridge), bridge);
|
|
32
|
+
}
|
|
14
33
|
|
|
15
34
|
@Override
|
|
16
35
|
public ReactModuleInfoProvider getReactModuleInfoProvider() {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
|
|
37
|
+
boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
|
|
38
|
+
moduleInfos.put(
|
|
39
|
+
DynatraceRNBridgeImpl.NAME,
|
|
40
|
+
new ReactModuleInfo(
|
|
41
|
+
DynatraceRNBridgeImpl.NAME,
|
|
42
|
+
DynatraceRNBridgeImpl.NAME,
|
|
43
|
+
false, // canOverrideExistingModule
|
|
44
|
+
false, // needsEagerInit
|
|
45
|
+
true, // hasConstants
|
|
46
|
+
false, // isCxxModule
|
|
47
|
+
isTurboModule // isTurboModule
|
|
48
|
+
));
|
|
49
|
+
|
|
50
|
+
return new ReactModuleInfoProvider() {
|
|
51
|
+
@Override
|
|
52
|
+
public Map<String, ReactModuleInfo> getReactModuleInfos() {
|
|
53
|
+
return moduleInfos;
|
|
54
|
+
}
|
|
32
55
|
};
|
|
33
56
|
}
|
|
34
57
|
|
|
@@ -41,5 +64,4 @@ public class DynatraceReactPackage extends TurboReactPackage {
|
|
|
41
64
|
return null;
|
|
42
65
|
}
|
|
43
66
|
}
|
|
44
|
-
|
|
45
67
|
}
|
|
@@ -105,6 +105,11 @@ public class DynatraceRNBridge extends NativeDynatraceBridgeSpec {
|
|
|
105
105
|
this.impl.stopWebRequestTiming(requestTag, url, (int) responseCode, responseMessage);
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
@Override
|
|
109
|
+
public void stopWebRequestTimingWithSize(String requestTag, String url, double responseCode, String responseMessage, double requestSize, double responseSize) {
|
|
110
|
+
this.impl.stopWebRequestTimingWithSize(requestTag, url, (int) responseCode, responseMessage, (long) requestSize, (long) responseSize);
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
@Override
|
|
109
114
|
public void identifyUser(String user, String platform) {
|
|
110
115
|
this.impl.identifyUser(user, platform);
|
|
@@ -107,6 +107,11 @@ public class DynatraceRNBridge extends ReactContextBaseJavaModule {
|
|
|
107
107
|
this.impl.stopWebRequestTiming(requestTag, url, responseCode, responseMessage);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
@ReactMethod
|
|
111
|
+
public void stopWebRequestTimingWithSize(String requestTag, String url, int responseCode, String responseMessage, double requestSize, double responseSize) {
|
|
112
|
+
this.impl.stopWebRequestTimingWithSize(requestTag, url, responseCode, responseMessage, (long) requestSize, (long) responseSize);
|
|
113
|
+
}
|
|
114
|
+
|
|
110
115
|
@ReactMethod
|
|
111
116
|
public void identifyUser(String user, String platform) {
|
|
112
117
|
this.impl.identifyUser(user, platform);
|
package/files/plugin.gradle
CHANGED
package/ios/DynatraceRNBridge.m
CHANGED
|
@@ -265,12 +265,17 @@ RCT_EXPORT_METHOD(startWebRequestTiming:(NSString*) requestTag url:(NSString*) u
|
|
|
265
265
|
|
|
266
266
|
}
|
|
267
267
|
|
|
268
|
-
RCT_EXPORT_METHOD(stopWebRequestTiming:(NSString*) requestTag
|
|
268
|
+
RCT_EXPORT_METHOD(stopWebRequestTiming:(NSString*) requestTag responseCode:(nonnull NSNumber*) responseCode responseMessage:(NSString*)responseMessage)
|
|
269
|
+
{
|
|
270
|
+
[self stopWebRequestTimingWithSize:requestTag responseCode:responseCode requestSize:-1 responseSize:-1];
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
RCT_EXPORT_METHOD(stopWebRequestTimingWithSize:(NSString*) requestTag responseCode:(nonnull NSNumber*) responseCode responseMessage:(NSString*)responseMessage requestSize:(nonnull NSNumber*) requestSize responseSize:(nonnull NSNumber*) responseSize)
|
|
269
274
|
{
|
|
270
275
|
if(requestTag != NULL){
|
|
271
276
|
DTXWebRequestTiming* timing = [webTimingsDict objectForKey:requestTag];
|
|
272
277
|
if(timing){
|
|
273
|
-
[timing stopWebRequestTiming:[responseCode stringValue]];
|
|
278
|
+
[timing stopWebRequestTiming:[responseCode stringValue] bytesSent:[requestSize longLongValue] bytesReceived:[responseSize longLongValue]];
|
|
274
279
|
[webTimingsDict removeObjectForKey:requestTag];
|
|
275
280
|
}
|
|
276
281
|
}
|
|
@@ -10,7 +10,7 @@ class DynatraceWebRequestTiming {
|
|
|
10
10
|
this.url = url;
|
|
11
11
|
}
|
|
12
12
|
startWebRequestTiming() {
|
|
13
|
-
if (this.requestTag
|
|
13
|
+
if (!StringUtils_1.StringUtils.isStringNullEmptyOrUndefined(this.requestTag) && !StringUtils_1.StringUtils.isStringNullEmptyOrUndefined(this.url)) {
|
|
14
14
|
DynatraceBridge_1.DynatraceNative.startWebRequestTiming(this.requestTag, this.url);
|
|
15
15
|
}
|
|
16
16
|
else {
|
|
@@ -18,13 +18,17 @@ class DynatraceWebRequestTiming {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
stopWebRequestTiming(responseCode, responseMessage) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
this.stopWebRequestTimingWithSize(responseCode, responseMessage, -1, -1);
|
|
22
|
+
}
|
|
23
|
+
stopWebRequestTimingWithSize(responseCode, responseMessage, requestSize, responseSize) {
|
|
24
|
+
if (!StringUtils_1.StringUtils.isStringNullEmptyOrUndefined(this.requestTag) && !StringUtils_1.StringUtils.isStringNullEmptyOrUndefined(this.url) &&
|
|
25
|
+
responseCode != null && !StringUtils_1.StringUtils.isStringNullOrUndefined(responseMessage)) {
|
|
26
|
+
DynatraceBridge_1.DynatraceNative.stopWebRequestTimingWithSize(this.requestTag, this.url, responseCode, responseMessage, requestSize, responseSize);
|
|
24
27
|
}
|
|
25
28
|
else {
|
|
26
|
-
Logger_1.Logger.logDebug(`Web Request Timing could not be stopped! -
|
|
27
|
-
|
|
29
|
+
Logger_1.Logger.logDebug(`Web Request Timing could not be stopped! - requestTag: ${this.requestTag} ` +
|
|
30
|
+
`url: ${this.url} responseCode: ${responseCode} responseMessage: ${responseMessage} ` +
|
|
31
|
+
`requestSize: ${requestSize} responseSize: ${responseSize}`);
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
34
|
getRequestTag() {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dynatrace/react-native-plugin",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.287.1",
|
|
4
4
|
"description": "This plugin gives you the ability to use the Dynatrace Mobile agent in your react native application.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "typings/react-native-dynatrace.d.ts",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
"author": "Dynatrace",
|
|
72
72
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@babel/runtime": "^7.24.
|
|
74
|
+
"@babel/runtime": "^7.24.1",
|
|
75
75
|
"jscodeshift": "^0.15.2",
|
|
76
76
|
"plist": "^3.1.0",
|
|
77
77
|
"proxy-polyfill": "^0.3.2",
|
|
@@ -111,7 +111,7 @@ Pod::Spec.new do |s|
|
|
|
111
111
|
#
|
|
112
112
|
|
|
113
113
|
s.dependency "React"
|
|
114
|
-
s.dependency 'Dynatrace', '~> 8.
|
|
114
|
+
s.dependency 'Dynatrace', '~> 8.287.2.1009'
|
|
115
115
|
|
|
116
116
|
# Allows for better compatibility for older and newer versions
|
|
117
117
|
if defined?(install_modules_dependencies)
|
|
@@ -79,6 +79,9 @@ export interface Spec extends TurboModule {
|
|
|
79
79
|
startWebRequestTiming(requestTag: string, url: string): void;
|
|
80
80
|
|
|
81
81
|
stopWebRequestTiming(requestTag: string, url: string, responseCode: number, responseMessage: string): void;
|
|
82
|
+
|
|
83
|
+
stopWebRequestTimingWithSize(requestTag: string, url: string, responseCode: number, responseMessage: string,
|
|
84
|
+
requestSize: number, responseSize: number): void;
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|