Skip to content

Commit e008155

Browse files
authored
Merge pull request #150 from DataDog/xgouchet/RUMM-2050/add_verbosity
RUMM-2050 Add verbosity
2 parents 05552c5 + b5d2172 commit e008155

File tree

15 files changed

+598
-109
lines changed

15 files changed

+598
-109
lines changed

README.md

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ yarn add @datadog/mobile-react-native
2828

2929
{{< img src="real_user_monitoring/react_native/image_reactnative.png" alt="Create a RUM application in Datadog workflow" style="width:90%;">}}
3030

31-
To ensure the safety of your data, you must use a client token. If you used only [Datadog API keys][3] to configure the `@datadog/mobile-react-native` library, they would be exposed client-side in the React Native application's code.
31+
To ensure the safety of your data, you must use a client token. If you used only [Datadog API keys][3] to configure the `@datadog/mobile-react-native` library, they would be exposed client-side in the React Native application's code.
3232

3333
For more information about setting up a client token, see the [Client Token documentation][4].
3434

@@ -40,8 +40,8 @@ import { DdSdkReactNative, DdSdkReactNativeConfiguration } from '@datadog/mobile
4040

4141

4242
const config = new DdSdkReactNativeConfiguration(
43-
"<CLIENT_TOKEN>",
44-
"<ENVIRONMENT_NAME>",
43+
"<CLIENT_TOKEN>",
44+
"<ENVIRONMENT_NAME>",
4545
"<RUM_APPLICATION_ID>",
4646
true, // track User interactions (e.g.: Tap on buttons).
4747
true, // track XHR Resources
@@ -52,6 +52,10 @@ config.site = "US1"
5252
config.nativeCrashReportEnabled = true
5353
// Optional: sample RUM sessions (here, 80% of session will be sent to Datadog. Default = 100%)
5454
config.sampleRate = 80
55+
// Optional: set the reported service name (by default, it'll use the package name / bundleIdentifier of your Android / iOS app respectively)
56+
config.serviceName = "com.example.reactnative"
57+
// Optional: let the SDK print internal logs (above or equal to the provided level. Default = undefined (meaning no logs))
58+
config.verbosity = SdkVerbosity.WARN
5559

5660
await DdSdkReactNative.initialize(config)
5761

@@ -65,8 +69,8 @@ import { DdSdkReactNative, DdSdkReactNativeConfiguration } from '@datadog/mobile
6569

6670

6771
const config = new DdSdkReactNativeConfiguration(
68-
"<CLIENT_TOKEN>",
69-
"<ENVIRONMENT_NAME>",
72+
"<CLIENT_TOKEN>",
73+
"<ENVIRONMENT_NAME>",
7074
"<RUM_APPLICATION_ID>",
7175
true, // track User interactions (e.g.: Tap on buttons).
7276
true, // track XHR Resources
@@ -90,8 +94,8 @@ import { DdSdkReactNative, DdSdkReactNativeConfiguration } from '@datadog/mobile
9094

9195

9296
const config = new DdSdkReactNativeConfiguration(
93-
"<CLIENT_TOKEN>",
94-
"<ENVIRONMENT_NAME>",
97+
"<CLIENT_TOKEN>",
98+
"<ENVIRONMENT_NAME>",
9599
"<RUM_APPLICATION_ID>",
96100
true, // track User interactions (e.g.: Tap on buttons).
97101
true, // track XHR Resources
@@ -115,8 +119,8 @@ import { DdSdkReactNative, DdSdkReactNativeConfiguration } from '@datadog/mobile
115119

116120

117121
const config = new DdSdkReactNativeConfiguration(
118-
"<CLIENT_TOKEN>",
119-
"<ENVIRONMENT_NAME>",
122+
"<CLIENT_TOKEN>",
123+
"<ENVIRONMENT_NAME>",
120124
"<RUM_APPLICATION_ID>",
121125
true, // track User interactions (e.g.: Tap on buttons).
122126
true, // track XHR Resources
@@ -140,8 +144,8 @@ import { DdSdkReactNative, DdSdkReactNativeConfiguration } from '@datadog/mobile
140144

141145

142146
const config = new DdSdkReactNativeConfiguration(
143-
"<CLIENT_TOKEN>",
144-
"<ENVIRONMENT_NAME>",
147+
"<CLIENT_TOKEN>",
148+
"<ENVIRONMENT_NAME>",
145149
"<RUM_APPLICATION_ID>",
146150
true, // track User interactions (e.g.: Tap on buttons).
147151
true, // track XHR Resources
@@ -190,17 +194,17 @@ Use one of Datadog's integrations to automatically track views for the following
190194

191195
## Track custom attributes
192196

193-
You can attach user information to all RUM events to get more detailed information from your RUM sessions.
197+
You can attach user information to all RUM events to get more detailed information from your RUM sessions.
194198

195199
### User information
196200

197201
For user-specific information, use the following code wherever you want in your app (after the SDK has been initialized). The `id`, `name`, and `email` attributes are built into Datadog, and you can add other attributes that makes sense for your app.
198202

199203
```js
200204
DdSdkReactNative.setUser({
201-
id: "1337",
202-
name: "John Smith",
203-
email: "[email protected]",
205+
id: "1337",
206+
name: "John Smith",
207+
204208
type: "premium"
205209
})
206210
```

example/src/ddUtils.tsx

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import {
2+
DdLogs,
23
DdSdkReactNative,
34
DdSdkReactNativeConfiguration,
4-
DdLogs,
5+
SdkVerbosity,
56
TrackingConsent
67
} from '@datadog/mobile-react-native';
78

8-
import { CLIENT_TOKEN, ENVIRONMENT, APPLICATION_ID } from './ddCredentials';
9-
import { getTrackingConsent } from './utils';
9+
import {APPLICATION_ID, CLIENT_TOKEN, ENVIRONMENT} from './ddCredentials';
1010

1111
export function initializeDatadog(trackingConsent: TrackingConsent) {
1212

@@ -22,6 +22,7 @@ export function initializeDatadog(trackingConsent: TrackingConsent) {
2222
config.nativeCrashReportEnabled = true
2323
config.sampleRate = 100
2424
config.serviceName = "com.datadoghq.reactnative.sample"
25+
config.verbosity = SdkVerbosity.DEBUG;
2526

2627
DdSdkReactNative.initialize(config).then(() => {
2728
DdLogs.info('The RN Sdk was properly initialized')

packages/core/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ import { DdSdkReactNative, DdSdkReactNativeConfiguration } from '@datadog/mobile
3535

3636

3737
const config = new DdSdkReactNativeConfiguration(
38-
"<CLIENT_TOKEN>",
39-
"<ENVIRONMENT_NAME>",
38+
"<CLIENT_TOKEN>",
39+
"<ENVIRONMENT_NAME>",
4040
"<RUM_APPLICATION_ID>",
4141
true, // track User interactions (e.g.: Tap on buttons. You can use 'accessibilityLabel' element property to give tap action the name, otherwise element type will be reported)
4242
true, // track XHR Resources
@@ -50,6 +50,8 @@ config.nativeCrashReportEnabled = true
5050
config.sampleRate = 80
5151
// Optional: set the reported service name (by default, it'll use the package name / bundleIdentifier of your Android / iOS app respectively)
5252
config.serviceName = "com.example.reactnative"
53+
// Optional: let the SDK print internal logs (above or equal to the provided level. Default = undefined (meaning no logs))
54+
config.verbosity = SdkVerbosity.WARN
5355

5456
await DdSdkReactNative.initialize(config)
5557

packages/core/src/DdSdkReactNative.tsx

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,17 @@
44
* Copyright 2016-Present Datadog, Inc.
55
*/
66

7-
import type { DdSdkReactNativeConfiguration } from "./DdSdkReactNativeConfiguration"
8-
import { DdSdkConfiguration } from "./types"
9-
import { DdSdk } from "./foundation"
10-
import { DdRumUserInteractionTracking } from './rum/instrumentation/DdRumUserInteractionTracking'
11-
import { DdRumErrorTracking } from './rum/instrumentation/DdRumErrorTracking'
12-
import { DdRumResourceTracking } from './rum/instrumentation/DdRumResourceTracking'
13-
import type { TrackingConsent } from "./TrackingConsent"
14-
import { ProxyType } from "./ProxyConfiguration"
15-
16-
import {version as sdkVersion } from './version';
7+
import type {DdSdkReactNativeConfiguration} from "./DdSdkReactNativeConfiguration"
8+
import {DdSdkConfiguration} from "./types"
9+
import {DdSdk} from "./foundation"
10+
import {DdRumUserInteractionTracking} from './rum/instrumentation/DdRumUserInteractionTracking'
11+
import {DdRumErrorTracking} from './rum/instrumentation/DdRumErrorTracking'
12+
import {DdRumResourceTracking} from './rum/instrumentation/DdRumResourceTracking'
13+
import type {TrackingConsent} from "./TrackingConsent"
14+
import {ProxyType} from "./ProxyConfiguration"
15+
import {version as sdkVersion} from './version';
16+
import {InternalLog} from "./InternalLog"
17+
import {SdkVerbosity} from "./SdkVerbosity";
1718

1819
/**
1920
* This class initializes the Datadog SDK, and sets up communication with the server.
@@ -47,10 +48,13 @@ export class DdSdkReactNative {
4748
static initialize(configuration: DdSdkReactNativeConfiguration): Promise<void> {
4849
return new Promise<void>((resolve, reject) => {
4950
if (DdSdkReactNative.wasInitialized) {
51+
InternalLog.log("Can't initialize Datadog, SDK was already initialized", SdkVerbosity.WARN);
5052
resolve()
5153
return
5254
}
5355

56+
InternalLog.verbosity = configuration.verbosity
57+
5458
configuration.additionalConfig[DdSdkReactNative.DD_SOURCE_KEY] = 'react-native';
5559
configuration.additionalConfig[DdSdkReactNative.DD_SDK_VERSION] = sdkVersion;
5660
configuration.additionalConfig[DdSdkReactNative.DD_NATIVE_VIEW_TRACKING_KEY] = configuration.nativeViewTracking;
@@ -94,6 +98,7 @@ export class DdSdkReactNative {
9498
configuration.additionalConfig
9599
)
96100
).then(() => {
101+
InternalLog.log("Datadog SDK was initialized", SdkVerbosity.INFO);
97102
DdSdkReactNative.enableFeatures(configuration)
98103
DdSdkReactNative.wasInitialized = true
99104
resolve()
@@ -110,6 +115,7 @@ export class DdSdkReactNative {
110115
*/
111116
// eslint-disable-next-line @typescript-eslint/ban-types
112117
static setAttributes(attributes: object): Promise<void> {
118+
InternalLog.log("Setting attributes " + JSON.stringify(attributes), SdkVerbosity.DEBUG);
113119
return DdSdk.setAttributes(attributes)
114120
}
115121

@@ -120,6 +126,7 @@ export class DdSdkReactNative {
120126
*/
121127
// eslint-disable-next-line @typescript-eslint/ban-types
122128
static setUser(user: object): Promise<void> {
129+
InternalLog.log("Setting user " + JSON.stringify(user), SdkVerbosity.DEBUG);
123130
return DdSdk.setUser(user)
124131
}
125132

@@ -129,6 +136,7 @@ export class DdSdkReactNative {
129136
* @returns a Promise.
130137
*/
131138
static setTrackingConsent(consent: TrackingConsent): Promise<void> {
139+
InternalLog.log("Setting consent " + consent, SdkVerbosity.DEBUG);
132140
return DdSdk.setTrackingConsent(consent)
133141
}
134142

packages/core/src/DdSdkReactNativeConfiguration.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66

77
import { TrackingConsent } from './TrackingConsent'
8-
import type { NativeSdkVerbosity } from './NativeSdkVerbosity'
8+
import type { SdkVerbosity } from './SdkVerbosity'
99
import type { ProxyConfiguration } from './ProxyConfiguration';
1010

1111
/**
@@ -17,11 +17,11 @@ export class DdSdkReactNativeConfiguration {
1717
public nativeCrashReportEnabled: boolean = false;
1818
public sampleRate: number = 100.0;
1919
public site: string = "US"
20-
public verbosity: NativeSdkVerbosity|undefined = undefined
20+
public verbosity: SdkVerbosity|undefined = undefined
2121
public nativeViewTracking: boolean = false
2222
public proxyConfig?: ProxyConfiguration = undefined
2323
public serviceName?: string = undefined
24-
24+
2525
public additionalConfig: {[k: string]: any} = {};
2626

2727
constructor(

packages/core/src/InternalLog.tsx

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
3+
* This product includes software developed at Datadog (https://www.datadoghq.com/).
4+
* Copyright 2016-Present Datadog, Inc.
5+
*/
6+
7+
import {SdkVerbosity} from './SdkVerbosity'
8+
9+
export class InternalLog {
10+
11+
private static levelMap = new Map<SdkVerbosity, number>([
12+
[SdkVerbosity.DEBUG, 1],
13+
[SdkVerbosity.INFO, 2],
14+
[SdkVerbosity.WARN, 3],
15+
[SdkVerbosity.ERROR, 4]
16+
]);
17+
18+
public static verbosity: SdkVerbosity|undefined = undefined
19+
20+
public static log (message: string, verbosity: SdkVerbosity): void {
21+
if (InternalLog.verbosity === undefined) {
22+
return;
23+
}
24+
const requiredLevel = InternalLog.levelMap.get(verbosity);
25+
const allowedLevel = InternalLog.levelMap.get(InternalLog.verbosity);
26+
if (allowedLevel === undefined || requiredLevel === undefined) {
27+
return;
28+
}
29+
const prefixedMessage = "DATADOG: " + message
30+
if (verbosity == SdkVerbosity.ERROR && (requiredLevel >= allowedLevel)) {
31+
console.error(prefixedMessage)
32+
}
33+
34+
if (verbosity == SdkVerbosity.WARN && (requiredLevel >= allowedLevel)) {
35+
console.warn(prefixedMessage)
36+
}
37+
38+
if (verbosity == SdkVerbosity.INFO && (requiredLevel >= allowedLevel)) {
39+
console.info(prefixedMessage)
40+
}
41+
42+
if (verbosity == SdkVerbosity.DEBUG && (requiredLevel >= allowedLevel)) {
43+
console.debug(prefixedMessage)
44+
}
45+
}
46+
47+
48+
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55
*/
66

77
/**
8-
* Enum specifying possible consent options for DD SDK.
8+
* Enum specifying possible log levels for DD SDK.
99
*/
10-
export enum NativeSdkVerbosity {
10+
export enum SdkVerbosity {
1111
DEBUG = "debug",
1212
INFO = "info",
1313
WARN = "warn",

packages/core/src/__tests__/DdSdkReactNative.test.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { DdRumUserInteractionTracking } from '../rum/instrumentation/DdRumUserIn
1313
import { DdRumResourceTracking } from '../rum/instrumentation/DdRumResourceTracking'
1414
import { DdRumErrorTracking } from '../rum/instrumentation/DdRumErrorTracking'
1515
import { TrackingConsent } from '../TrackingConsent'
16-
import { NativeSdkVerbosity } from '../NativeSdkVerbosity'
16+
import { SdkVerbosity } from '../SdkVerbosity'
1717
import { ProxyType } from '../ProxyConfiguration'
1818

1919
import { version as sdkVersion } from '../version';
@@ -301,7 +301,7 @@ it('M enable sdk verbosity W initialize { sdk verbosity }', async () => {
301301
const fakeClientToken = "2"
302302
const fakeEnvName = "env"
303303
const configuration = new DdSdkReactNativeConfiguration(fakeClientToken, fakeEnvName, fakeAppId, false, false, true)
304-
configuration.verbosity = NativeSdkVerbosity.DEBUG
304+
configuration.verbosity = SdkVerbosity.DEBUG
305305

306306
NativeModules.DdSdk.initialize.mockResolvedValue(null)
307307

@@ -317,7 +317,7 @@ it('M enable sdk verbosity W initialize { sdk verbosity }', async () => {
317317
expect(ddSdkConfiguration.additionalConfig).toStrictEqual({
318318
'_dd.source': 'react-native',
319319
'_dd.sdk_version': sdkVersion,
320-
'_dd.sdk_verbosity': NativeSdkVerbosity.DEBUG,
320+
'_dd.sdk_verbosity': SdkVerbosity.DEBUG,
321321
'_dd.native_view_tracking': false,
322322
'_dd.long_task.threshold': 200
323323
})

0 commit comments

Comments
 (0)