@coralogix/browser 3.7.0 → 3.8.0
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/CHANGELOG.md +12 -0
- package/README.md +17 -2
- package/index.esm2.js +68 -23
- package/package.json +1 -1
- package/src/index.d.ts +1 -0
- package/src/otel/custom-sampler.d.ts +2 -1
- package/src/session/session.consts.d.ts +2 -0
- package/src/session/session.helper.d.ts +1 -2
- package/src/session/session.model.d.ts +2 -0
- package/src/version.d.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## 3.8.0 (2026-04-27)
|
|
2
|
+
|
|
3
|
+
### 🚀 Features
|
|
4
|
+
|
|
5
|
+
- Add support for excluding specific instrumentations from session sampling
|
|
6
|
+
|
|
7
|
+
## 3.7.1 (2026-04-26)
|
|
8
|
+
|
|
9
|
+
### 🩹 Fixes
|
|
10
|
+
|
|
11
|
+
- Support error logging for non-JSON-serializable error properties
|
|
12
|
+
|
|
1
13
|
## 3.7.0 (2026-04-19)
|
|
2
14
|
|
|
3
15
|
### 🚀 Features
|
package/README.md
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
- [Basic Sampling](#1-basic-sampling---sample--of-all-sessions)
|
|
11
11
|
- [Advanced Sampling](#2-advanced-sampling---sample--of-sessions-but-always-track-sessions-with-errors)
|
|
12
|
-
- [
|
|
12
|
+
- [Exclude Specific Instrumentations from Sampling](#3-exclude-specific-instrumentations-from-sampling)
|
|
13
|
+
- [Only Sessions with Errors](#4-only-sessions-with-errors)
|
|
13
14
|
|
|
14
15
|
6. [Sending Custom Logs](#sending-custom-logs)
|
|
15
16
|
7. [Instrumentations](#instrumentations)
|
|
@@ -162,7 +163,21 @@ CoralogixRum.init({
|
|
|
162
163
|
});
|
|
163
164
|
```
|
|
164
165
|
|
|
165
|
-
#### 3.
|
|
166
|
+
#### 3. Exclude Specific Instrumentations from Sampling
|
|
167
|
+
|
|
168
|
+
Keep specific instrumentations running at 100% even when sessions are sampled out. This is useful when you want to reduce data volume with sampling but still capture all errors or custom logs.
|
|
169
|
+
|
|
170
|
+
```javascript
|
|
171
|
+
CoralogixRum.init({
|
|
172
|
+
// ...
|
|
173
|
+
sessionConfig: {
|
|
174
|
+
sessionSampleRate: 20, // Only 20% of sessions are fully tracked
|
|
175
|
+
excludeFromSampling: ['custom'], // These will run at 100% regardless of sampling
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
#### 4. Only Sessions with Errors
|
|
166
181
|
|
|
167
182
|
Track only sessions with errors, and send specific instrumentation data immediately even if error is not occurred.
|
|
168
183
|
From Session recording perspective, the SDK will record approximately 10–60s(according to maxRecordTime property) before the error occurred.
|
package/index.esm2.js
CHANGED
|
@@ -220,6 +220,7 @@ var DEFAULT_SESSION_CONFIG = {
|
|
|
220
220
|
onlyWithErrorConfig: {
|
|
221
221
|
enable: false,
|
|
222
222
|
},
|
|
223
|
+
excludeFromSampling: [],
|
|
223
224
|
};
|
|
224
225
|
var SESSION_IDLE_TIME = 15 * millisecondsPerMinute;
|
|
225
226
|
var SESSION_EXPIRATION_TIME = MILLISECONDS_PER_HOUR;
|
|
@@ -555,7 +556,12 @@ var CoralogixErrorInstrumentation = (function (_super) {
|
|
|
555
556
|
var _this = _super.call(this, ERROR_INSTRUMENTATION_NAME, ERROR_INSTRUMENTATION_VERSION, config) || this;
|
|
556
557
|
_this.parseErrorObject = function (obj) {
|
|
557
558
|
var _a;
|
|
558
|
-
|
|
559
|
+
try {
|
|
560
|
+
return (_a = obj === null || obj === void 0 ? void 0 : obj.message) !== null && _a !== void 0 ? _a : JSON.stringify(obj, getCircularReplacer());
|
|
561
|
+
}
|
|
562
|
+
catch (_b) {
|
|
563
|
+
return obj === null || obj === void 0 ? void 0 : obj.toString();
|
|
564
|
+
}
|
|
559
565
|
};
|
|
560
566
|
if (getSdkConfig().supportMfe) {
|
|
561
567
|
CxGlobal[CACHED_METADATA_KEY] = new Map();
|
|
@@ -3385,13 +3391,19 @@ var Request = (function () {
|
|
|
3385
3391
|
return Request;
|
|
3386
3392
|
}());
|
|
3387
3393
|
|
|
3394
|
+
var PROPAGATE_ONLY = { decision: SamplingDecision.RECORD };
|
|
3395
|
+
var EXPORT = { decision: SamplingDecision.RECORD_AND_SAMPLED };
|
|
3388
3396
|
var CxCustomSampler = (function () {
|
|
3389
3397
|
function CxCustomSampler() {
|
|
3390
3398
|
}
|
|
3391
|
-
CxCustomSampler.prototype.shouldSample = function () {
|
|
3392
|
-
|
|
3393
|
-
|
|
3394
|
-
|
|
3399
|
+
CxCustomSampler.prototype.shouldSample = function (_context, _traceId, _spanName, _spanKind, attributes) {
|
|
3400
|
+
var _a, _b;
|
|
3401
|
+
var excluded = (_b = (_a = getSdkConfig().sessionConfig) === null || _a === void 0 ? void 0 : _a.excludeFromSampling) !== null && _b !== void 0 ? _b : [];
|
|
3402
|
+
var isHttpSpan = Boolean(attributes['http.method']);
|
|
3403
|
+
if (isHttpSpan) {
|
|
3404
|
+
return excluded.includes('fetch') || excluded.includes('xhr') ? EXPORT : PROPAGATE_ONLY;
|
|
3405
|
+
}
|
|
3406
|
+
return excluded.length > 0 ? EXPORT : PROPAGATE_ONLY;
|
|
3395
3407
|
};
|
|
3396
3408
|
return CxCustomSampler;
|
|
3397
3409
|
}());
|
|
@@ -3441,28 +3453,61 @@ var isSessionWithError = function () {
|
|
|
3441
3453
|
var _a = getSessionManager(), onlySessionWithErrorMode = _a.onlySessionWithErrorMode, cachedLogsSent = _a.cachedLogsSent;
|
|
3442
3454
|
return onlySessionWithErrorMode && !cachedLogsSent;
|
|
3443
3455
|
};
|
|
3444
|
-
function getResolvedSampler(
|
|
3445
|
-
var
|
|
3446
|
-
var sessionSampleRate =
|
|
3456
|
+
function getResolvedSampler() {
|
|
3457
|
+
var config = getSdkConfig();
|
|
3458
|
+
var sessionSampleRate = config.sessionSampleRate, sessionConfig = config.sessionConfig;
|
|
3447
3459
|
var shouldNotTrackSession = !isSamplingOn(sessionSampleRate) ||
|
|
3448
3460
|
!isSamplingOn(sessionConfig.sessionSampleRate);
|
|
3449
3461
|
if (shouldNotTrackSession) {
|
|
3450
|
-
|
|
3451
|
-
|
|
3452
|
-
sessionConfig.onlyWithErrorConfig = __assign(__assign({}, sessionConfig.onlyWithErrorConfig), { enable: true });
|
|
3462
|
+
if (sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.alwaysTrackSessionsWithErrors) {
|
|
3463
|
+
return enableErrorOnlyMode();
|
|
3453
3464
|
}
|
|
3454
|
-
|
|
3455
|
-
|
|
3456
|
-
|
|
3457
|
-
|
|
3458
|
-
|
|
3459
|
-
|
|
3460
|
-
|
|
3461
|
-
|
|
3462
|
-
|
|
3465
|
+
return handleDroppedSession();
|
|
3466
|
+
}
|
|
3467
|
+
return new AlwaysOnSampler();
|
|
3468
|
+
}
|
|
3469
|
+
function enableErrorOnlyMode() {
|
|
3470
|
+
var sessionConfig = getSdkConfig().sessionConfig;
|
|
3471
|
+
if (sessionConfig) {
|
|
3472
|
+
sessionConfig.onlyWithErrorConfig = __assign(__assign({}, sessionConfig.onlyWithErrorConfig), { enable: true });
|
|
3473
|
+
}
|
|
3474
|
+
return new AlwaysOnSampler();
|
|
3475
|
+
}
|
|
3476
|
+
function handleDroppedSession() {
|
|
3477
|
+
var e_1, _a;
|
|
3478
|
+
var _b, _c;
|
|
3479
|
+
var config = getSdkConfig();
|
|
3480
|
+
var sessionRecordingConfig = config.sessionRecordingConfig, sessionConfig = config.sessionConfig, debug = config.debug;
|
|
3481
|
+
if (debug) {
|
|
3482
|
+
console.log('CoralogixRum: Session tracking is disabled due to sampling rate');
|
|
3483
|
+
}
|
|
3484
|
+
if (sessionRecordingConfig) {
|
|
3485
|
+
sessionRecordingConfig.enable = false;
|
|
3486
|
+
}
|
|
3487
|
+
var excluded = (_b = sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.excludeFromSampling) !== null && _b !== void 0 ? _b : [];
|
|
3488
|
+
var nonHttpInstrumentations = [
|
|
3489
|
+
'errors',
|
|
3490
|
+
'custom',
|
|
3491
|
+
'web_vitals',
|
|
3492
|
+
'interactions',
|
|
3493
|
+
'long_tasks',
|
|
3494
|
+
'resources',
|
|
3495
|
+
];
|
|
3496
|
+
(_c = config.instrumentations) !== null && _c !== void 0 ? _c : (config.instrumentations = {});
|
|
3497
|
+
try {
|
|
3498
|
+
for (var nonHttpInstrumentations_1 = __values$1(nonHttpInstrumentations), nonHttpInstrumentations_1_1 = nonHttpInstrumentations_1.next(); !nonHttpInstrumentations_1_1.done; nonHttpInstrumentations_1_1 = nonHttpInstrumentations_1.next()) {
|
|
3499
|
+
var key = nonHttpInstrumentations_1_1.value;
|
|
3500
|
+
config.instrumentations[key] = excluded.includes(key);
|
|
3463
3501
|
}
|
|
3464
3502
|
}
|
|
3465
|
-
|
|
3503
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
3504
|
+
finally {
|
|
3505
|
+
try {
|
|
3506
|
+
if (nonHttpInstrumentations_1_1 && !nonHttpInstrumentations_1_1.done && (_a = nonHttpInstrumentations_1.return)) _a.call(nonHttpInstrumentations_1);
|
|
3507
|
+
}
|
|
3508
|
+
finally { if (e_1) throw e_1.error; }
|
|
3509
|
+
}
|
|
3510
|
+
return new CxCustomSampler();
|
|
3466
3511
|
}
|
|
3467
3512
|
|
|
3468
3513
|
function isProcessorShouldStop(isActive) {
|
|
@@ -4225,7 +4270,7 @@ function resolveUrlBlueprinters(urlBlueprinters) {
|
|
|
4225
4270
|
return resolvedUrlBlueprinters;
|
|
4226
4271
|
}
|
|
4227
4272
|
|
|
4228
|
-
var SDK_VERSION = '3.
|
|
4273
|
+
var SDK_VERSION = '3.8.0';
|
|
4229
4274
|
|
|
4230
4275
|
function shouldDropEvent(cxRumEvent, options) {
|
|
4231
4276
|
if (isDocumentErrorWithoutMessage(cxRumEvent)) {
|
|
@@ -4841,7 +4886,7 @@ var CoralogixRum = {
|
|
|
4841
4886
|
}
|
|
4842
4887
|
CxGlobal[USER_AGENT_KEY] = parseUserAgent(navigator.userAgent);
|
|
4843
4888
|
CxGlobal[SDK_CONFIG_KEY] = resolvedOptions_1;
|
|
4844
|
-
var sampler = getResolvedSampler(
|
|
4889
|
+
var sampler = getResolvedSampler();
|
|
4845
4890
|
if (!resolvedOptions_1.debug && !resolvedOptions_1.public_key) {
|
|
4846
4891
|
console.warn('rumAuth will be required in the future');
|
|
4847
4892
|
}
|
package/package.json
CHANGED
package/src/index.d.ts
CHANGED
|
@@ -3,3 +3,4 @@ export { CoralogixLogSeverity } from './types-external';
|
|
|
3
3
|
export { UrlBasedLabelProvider } from './label-providers/url-based-label-provider';
|
|
4
4
|
export * from './types';
|
|
5
5
|
export { SessionRecordingEventType, type RecordEvent, type RecordPluginEvent, } from './session/session.model';
|
|
6
|
+
export type { ExcludableInstrumentation } from './session/session.consts';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
+
import { Attributes } from '@opentelemetry/api';
|
|
1
2
|
import { Sampler, SamplingResult } from '@opentelemetry/sdk-trace-base';
|
|
2
3
|
export declare class CxCustomSampler implements Sampler {
|
|
3
|
-
shouldSample(): SamplingResult;
|
|
4
|
+
shouldSample(_context: unknown, _traceId: string, _spanName: string, _spanKind: unknown, attributes: Attributes): SamplingResult;
|
|
4
5
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { SessionConfig } from './session.model';
|
|
2
|
+
import { CoralogixOtelWebOptionsInstrumentations } from '../types';
|
|
2
3
|
export declare const MAX_BATCH_TIME_MS: number;
|
|
3
4
|
export declare const SESSION_RECORDING_DEFAULT_HEADERS: Record<string, string>;
|
|
4
5
|
export declare const SESSION_RECORDING_DEFAULT_ERROR_MESSAGE: string;
|
|
@@ -9,6 +10,7 @@ export declare const SESSION_KEY: string;
|
|
|
9
10
|
export declare const PREV_SESSION_KEY: string;
|
|
10
11
|
export declare const MUTATION_LIMIT: number;
|
|
11
12
|
export declare const DEFAULT_SESSION_CONFIG: SessionConfig;
|
|
13
|
+
export type ExcludableInstrumentation = keyof CoralogixOtelWebOptionsInstrumentations;
|
|
12
14
|
export declare const SESSION_IDLE_TIME: number;
|
|
13
15
|
export declare const SESSION_EXPIRATION_TIME: number;
|
|
14
16
|
export declare const SESSION_MANAGER_KEY = "rumSessionManager";
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { SessionConfig, SessionRecordingConfig } from './session.model';
|
|
2
|
-
import { CoralogixBrowserSdkConfig } from '../types';
|
|
3
2
|
import { AlwaysOnSampler, Sampler } from '@opentelemetry/sdk-trace-base';
|
|
4
3
|
export declare function resolveSessionConfig(config: SessionConfig | undefined): SessionConfig;
|
|
5
4
|
export declare function resolveSessionRecordingConfig(config: SessionRecordingConfig | undefined): SessionRecordingConfig | undefined;
|
|
6
5
|
export declare function isSamplingOn(threshold: number): boolean;
|
|
7
6
|
export declare const isSessionWithError: () => boolean;
|
|
8
|
-
export declare function getResolvedSampler(
|
|
7
|
+
export declare function getResolvedSampler(): AlwaysOnSampler | Sampler;
|
|
@@ -2,6 +2,7 @@ import { eventWithTime } from '../cx-rrweb/rrweb-types';
|
|
|
2
2
|
import { SlimDOMOptions } from '../cx-rrweb/rrweb-snapshot';
|
|
3
3
|
import { CoralogixEventType } from '../types';
|
|
4
4
|
import { recordOptions } from '../cx-rrweb/rrweb';
|
|
5
|
+
import type { ExcludableInstrumentation } from './session.consts';
|
|
5
6
|
export interface SessionRecordingConfig extends Omit<recordOptions<eventWithTime>, 'emit' | 'packFn' | 'plugins' | 'hooks' | 'slimDOMOptions'> {
|
|
6
7
|
enable: boolean;
|
|
7
8
|
autoStartSessionRecording: boolean;
|
|
@@ -23,6 +24,7 @@ export interface SessionConfig {
|
|
|
23
24
|
alwaysTrackSessionsWithErrors?: boolean;
|
|
24
25
|
onlyWithErrorConfig?: SessionWithErrorConfig;
|
|
25
26
|
keepSessionAfterReload?: boolean;
|
|
27
|
+
excludeFromSampling?: ExcludableInstrumentation[];
|
|
26
28
|
}
|
|
27
29
|
export type RecordEvent = eventWithTime;
|
|
28
30
|
export type RecordPluginEvent<T = any> = {
|
package/src/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "3.
|
|
1
|
+
export declare const SDK_VERSION = "3.8.0";
|