@coralogix/browser
Version:
Official Coralogix SDK for browsers
465 lines (464 loc) • 16.9 kB
TypeScript
import { Attributes } from '@opentelemetry/api';
import { CoralogixDomainsApiUrlMap } from './constants';
import { CoralogixLogSeverity } from './types-external';
import { ErrorSource } from './instrumentations/CoralogixErrorInstrumentation';
import { FetchSource } from './instrumentations/network/CoralogixFetchInstrumentation';
import { XHRSource } from './instrumentations/network/CoralogixXhrInstrumentation';
import { LogSource } from './instrumentations/CoralogixCustomLogInstrumentation';
import { ReadableSpan } from '@opentelemetry/sdk-trace-base';
import { CoralogixUserInteractionInstrumentationConfig } from './instrumentations/user-interaction/CoralogixUserInteractionInstrumentation';
import { Metric } from 'web-vitals/attribution';
import { CoralogixWebVitalsInstrumentationConfig } from './instrumentations/instrumentation.model';
import { SessionConfig, SessionRecordingConfig } from './session/session.model';
import { CoralogixInternalEvent } from './instrumentations/CoralogixInternalInstrumentation';
import { SnapshotContext } from './snapshot/snapshot.model';
import { MetricWithAttribution } from 'web-vitals';
import { MemoryUsageContext } from './instrumentations/memory-usage';
import { MFEMetadata } from './mfe/mfe.types';
import { UrlBasedLabelProvider } from './label-providers/url-based-label-provider';
import { CustomTracer, CustomTracerIgnoredInstruments } from './custom-spans';
export interface CxStackFrame extends Partial<MFEMetadata> {
fileName?: string;
columnNumber?: number;
lineNumber?: number;
functionName?: string;
isShell?: boolean;
}
export interface GlobalTTIHandler {
e: PerformanceEntryList;
o?: PerformanceObserver;
}
export interface CoralogixWindow {
__tti: GlobalTTIHandler;
CoralogixRum: CoralogixOtelWebType;
}
export declare enum CoralogixEventType {
ERROR = "error",
NETWORK_REQUEST = "network-request",
LOG = "log",
USER_INTERACTION = "user-interaction",
WEB_VITALS = "web-vitals",
LONG_TASK = "longtask",
RESOURCES = "resources",
INTERNAL = "internal",
DOM = "dom",
CUSTOM_MEASUREMENT = "custom-measurement",
MEMORY_USAGE = "memory-usage",
SCREENSHOT = "screenshot",
CUSTOM_SPAN = "custom-span"
}
export declare enum PerformanceTypes {
Resource = "resource",
LongTask = "longtask",
Navigation = "navigation",
SoftNavigation = "soft-navigation"
}
export type CustomMeasurementData = number;
export type WebVitalsRating = 'good' | 'needs-improvement' | 'poor';
export type CoralogixDomain = keyof typeof CoralogixDomainsApiUrlMap;
export type CoralogixRumLabels = Record<string, any>;
export interface UserContextConfig {
user_id: string;
user_name: string;
user_email?: string;
user_metadata?: {
[key: string]: any;
};
}
export interface CustomTargetElement extends HTMLElement {
type: string;
value: string;
}
export interface ScreenshotContext {
id: string;
description?: string;
}
export interface ApplicationContextConfig {
application: string;
version: string;
}
export interface TraceHeaderConfiguration {
enabled: boolean;
options?: {
/** urls outside of origin that should also add Traceparent to header */
propagateTraceHeaderCorsUrls?: Array<string | RegExp>;
/** first-party origins urls called by your browser application.
* If array is passed, only urls that match the array will add Traceparent to header.
* */
allowedTracingUrls?: Array<string | RegExp>;
/** provides HTTP header propagation for systems that are using AWS X-Amzn-Trace-Id format. */
propagateAwsXrayTraceHeader?: boolean;
/** provides HTTP header propagation for systems that are using B3 format. */
propagateB3TraceHeader?: {
singleHeader?: boolean;
multiHeader?: boolean;
};
};
}
export interface CoralogixOtelWebOptionsInstrumentations {
errors?: boolean;
fetch?: boolean;
xhr?: boolean;
custom?: boolean;
long_tasks?: boolean;
resources?: boolean;
interactions?: boolean | CoralogixUserInteractionInstrumentationConfig;
web_vitals?: boolean | CoralogixWebVitalsInstrumentationConfig;
}
interface SendLog {
log: (severity: CoralogixLogSeverity, message: string, data?: any) => void;
debug: (message: string, data?: any) => void;
verbose: (message: string, data?: any) => void;
info: (message: string, data?: any) => void;
warn: (message: string, data?: any) => void;
error: (message: string, data?: any) => void;
critical: (message: string, data?: any) => void;
}
export type UrlBlueprinter = (url: string) => string;
export interface UrlBlueprinters {
pageUrlBlueprinters?: UrlBlueprinter[];
networkUrlBlueprinters?: UrlBlueprinter[];
}
export interface MemoryUsageConfig {
enabled: boolean;
interval?: number;
}
export type BeforeSendResult = EditableCxRumEvent | null | undefined;
export interface NetworkExtraConfig {
url: string | RegExp;
reqHeaders?: string[];
resHeaders?: string[];
collectReqPayload?: boolean;
collectResPayload?: boolean;
}
export interface CoralogixBrowserSdkConfig {
/** Publicly-visible `public_key` value */
public_key?: string;
/** Sets a value for the `application` attribute */
application: string;
/** Coralogix account domain */
coralogixDomain: CoralogixDomain;
/** Sets a value for the 'app.version' attribute */
version: string;
/** Configuration for user context. */
user_context?: UserContextConfig;
/** Turns on/off internal debug logging */
debug?: boolean;
/** Sets labels added to every Span. */
labels?: CoralogixRumLabels;
/**
* Applies for XHR and Fetch URLs. URLs that partially match any regex in ignoreUrls will not be traced.
* In addition, URLs that are _exact matches_ of strings in ignoreUrls will also not be traced.
* */
ignoreUrls?: Array<string | RegExp>;
/**
A pattern for error messages which should not be sent to Coralogix. By default, all errors will be sent.
* */
ignoreErrors?: Array<string | RegExp>;
/** Configuration for instrumentation modules. */
instrumentations?: CoralogixOtelWebOptionsInstrumentations;
/** Add trace context propagation in headers across service boundaries */
traceParentInHeader?: TraceHeaderConfiguration;
/** Sets a value for the `environment` attribute */
environment?: string;
/** Stringify custom log data property */
stringifyCustomLogData?: boolean;
/** Modify the event's page or network url based on custom-defined functions */
urlBlueprinters?: UrlBlueprinters;
/** Sets recording config for session replay */
sessionRecordingConfig?: SessionRecordingConfig;
/** Sets session config */
sessionConfig?: SessionConfig;
/** Provide labels based on url or event */
labelProviders?: Array<LabelProvider>;
/**
* @deprecated Use `sessionConfig` instead.
* Percentage of overall sessions being tracked, defaults to 100%
* */
sessionSampleRate?: number;
/** Mask input types, defaults to ['password', 'email', 'tel'] */
maskInputTypes?: InputType[];
/** Class name that will mask elements, string or RegExp. defaults to 'cx-mask' */
maskClass?: string | RegExp;
/** Enable event access and modification before sending to Coralogix, supporting content modification, and event discarding. */
beforeSend?: (event: EditableCxRumEvent) => BeforeSendResult;
/** Send requests through a proxy */
proxyUrl?: string;
/** Collect IP address and geolocation data. Defaults to true. */
collectIPData?: boolean;
/** Track soft navigations such as SPA navigations. Defaults to false */
trackSoftNavigations?: boolean;
/** Measure memory usage
* @prop enabled Enable memory usage measurement. Defaults to false
* @prop interval usage will be measured every `interval` millisecond. Default to 5 minutes.
* */
memoryUsageConfig?: MemoryUsageConfig;
/** networkExtraConfig is an array of rules for capturing and enhancing network request and response data,
* including headers and payloads, from Fetch and XMLHttpRequest. */
networkExtraConfig?: NetworkExtraConfig[];
/** Enable MFE support. Defaults to false */
supportMfe?: boolean;
}
export interface CoralogixOtelWebType extends SendLog {
/**
* Init CoralogixRum.
*/
init: (options: CoralogixBrowserSdkConfig) => void;
/**
* Turn CoralogixRum off.
*/
shutdown: () => void;
/** Sets labels to be added to every log after CoralogixRum initialization. */
setLabels: (labels: CoralogixRumLabels) => void;
/**
* Provides access to computed, final value of global attributes, which are applied to all created logs.
*/
getLabels: () => CoralogixRumLabels;
/** Sets user context to be added to every log after CoralogixRum initialization. */
setUserContext: (userContext: UserContextConfig) => void;
/** Sets application context to be added to every log after CoralogixRum initialization. */
setApplicationContext: (applicationContext: ApplicationContextConfig) => void;
/** Manually capture error. */
captureError: (error: Error, customData?: unknown, labels?: CoralogixRumLabels) => void;
/** Manually send custom measurement. */
sendCustomMeasurement: (name: string, value: CustomMeasurementData) => void;
/** Add extra performance timing. */
addTiming: (name: string, duration?: number) => void;
/** Manually measure user-agent-specific memory. */
measureUserAgentSpecificMemory: () => void;
/**
* Provides access to computed, final value of user context, which applied to all created logs.
*/
getUserContext: () => UserContextConfig | undefined;
/**
* Provides the session id.
*/
getSessionId: () => string | undefined;
/**
* Stop session recording
*/
stopSessionRecording: () => void;
/**
* Start session recording
*/
startSessionRecording: () => void;
/**
* Take screenshot
*/
screenshot: (description?: string) => string | undefined;
/**
* Starts measuring time for a given key. Key should be a unique identifier for the measurement.
*/
startTimeMeasure: (name: string, labels?: CoralogixRumLabels) => void;
/**
* Ends the measurement for a given key.
*/
endTimeMeasure: (name: string) => void;
/**
* Starts a new custom trace.
@param ignoredInstruments - list of instruments to ignore in the trace
*/
getCustomTracer: (ignoredList?: {
ignoredInstruments: CustomTracerIgnoredInstruments[];
}) => CustomTracer | undefined;
readonly isInited: boolean;
}
export interface ErrorContext {
error_type?: string;
error_message?: string;
error_custom_data?: unknown;
original_stacktrace?: CxStackFrame[];
}
export interface LogContext {
message: string;
data?: any;
}
export interface InternalContext {
event: CoralogixInternalEvent;
data?: any;
}
export interface NetworkRequestContext {
method: string;
status_code: number;
url: string;
url_blueprint: string;
fragments: string;
host: string;
schema: string;
status_text: string;
response_content_length: string;
duration: number;
source: EventSource;
request_headers?: Map<string, string>;
response_headers?: Map<string, string>;
response_payload?: string;
request_payload?: string;
}
export interface InteractionContext {
target_element: string;
target_element_inner_text: string;
target_element_type: string;
event_name: string;
element_id: string;
element_classes: string;
}
export interface LongTaskContext extends Omit<PerformanceEntry, 'toJSON'> {
id: string;
}
export interface WebVitalsContext extends Metric {
attribution?: MetricWithAttribution;
}
export interface ResourceContext extends Omit<PerformanceResourceTiming, 'toJSON'> {
responseStatus?: number;
deliveryType?: string;
firstInterimResponseStart?: number;
renderBlockingStatus?: string;
fragments: string;
}
export interface CustomMeasurementContext {
name: string;
value: CustomMeasurementData;
}
export interface EventTypeContext {
error_context?: ErrorContext;
log_context?: LogContext;
internal_context?: InternalContext;
network_request_context?: NetworkRequestContext;
interaction_context?: InteractionContext;
web_vitals_context?: WebVitalsContext;
longtask_context?: LongTaskContext;
resource_context?: ResourceContext;
snapshot_context?: SnapshotContext;
custom_measurement_context?: CustomMeasurementContext;
screenshot_context?: ScreenshotContext;
memory_usage_context?: MemoryUsageContext;
}
export interface UserMetadata {
user_id: string;
user_name?: string;
user_email?: string;
user_metadata?: {
[key: string]: any;
};
}
export interface SessionContext extends UserMetadata {
session_id: string;
session_creation_date: number;
prev_session?: {
session_id: string;
session_creation_date: number;
hasRecording: boolean;
hasScreenshot: boolean;
};
user_agent: string;
browser?: Browser;
browserVersion: string;
os: OS;
osVersion: string;
device: Device;
hasRecording: boolean;
hasScreenshot: boolean;
hasError?: boolean;
onlyWithErrorMode: boolean;
}
export type EventSource = ErrorSource | FetchSource | XHRSource | LogSource;
export interface EventContext {
type: CoralogixEventType;
source: EventSource;
severity: CoralogixLogSeverity;
}
interface SpanContext {
readonly spanId: string;
readonly traceId: string;
sessionId: string;
}
interface OtelResource {
attributes: Attributes;
}
interface InstrumentationData {
otelSpan: Partial<ReadableSpan> & SpanContext;
otelResource: OtelResource;
}
interface VersionMetaData {
app_name: string;
app_version: string;
}
export interface PageContext {
page_url: string;
page_url_blueprint: string;
page_fragments: string;
referrer: string;
}
export interface CxRumEvent extends EventTypeContext {
browser_sdk: {
version: string;
};
platform: 'browser';
version_metadata: VersionMetaData;
session_context: SessionContext;
page_context: PageContext;
event_context: EventContext;
isNavigationEvent: boolean;
labels: CoralogixRumLabels;
spanId?: string;
traceId?: string;
parentSpanId?: string;
environment: string;
timestamp: number;
isSnapshotEvent?: boolean;
screenshot_context?: ScreenshotContext;
screenshotId?: string;
}
export interface CxSpan {
version_metadata: VersionMetaData;
applicationName: string;
subsystemName: string;
timestamp: number;
severity: CoralogixLogSeverity;
isErrorWithStacktrace: boolean;
instrumentation_data?: InstrumentationData;
text: {
cx_rum: CxRumEvent;
};
}
export interface Session {
sessionId: string;
sessionCreationDate: number;
sessionExpirationDate: number;
}
export interface PrevSession extends Session {
hasRecording: boolean;
hasScreenshot: boolean;
}
export declare enum OtelNetworkAttrs {
METHOD = "http.method",
URL = "http.url",
STATUS_CODE = "http.status_code",
HOST = "http.host",
SCHEME = "http.scheme",
STATUS_TEXT = "http.status_text",
RESPONSE_CONTENT_LENGTH = "http.response_content_length"
}
export type Browser = 'Chrome' | 'Edge' | 'Firefox' | 'Safari' | 'Opera' | 'IE' | 'Unknown';
export type OS = 'Windows' | 'MacOS' | 'Linux' | 'iOS' | 'Android' | 'Unknown';
export type Device = 'Mobile' | 'Tablet' | 'Desktop' | 'Unknown';
export type EventName = keyof HTMLElementEventMap;
export interface PatternReplacement {
pattern: RegExp;
replacement: string;
}
export declare enum UrlType {
PAGE = "page",
NETWORK_REQUEST = "network_request"
}
export type LabelProviderLabels = Record<string, string | undefined>;
export interface GenericLabelProvider {
urlType?: UrlType;
providerFunc: (url: string, event: CxRumEvent) => LabelProviderLabels;
}
export type LabelProvider = UrlBasedLabelProvider | GenericLabelProvider;
export type InputType = 'button' | 'checkbox' | 'color' | 'date' | 'datetime-local' | 'email' | 'file' | 'hidden' | 'image' | 'month' | 'number' | 'password' | 'radio' | 'range' | 'reset' | 'search' | 'submit' | 'tel' | 'text' | 'time' | 'url' | 'week';
export interface EditableCxRumEvent extends Omit<CxRumEvent, 'session_context' | 'browser_sdk' | 'timestamp'> {
session_context: Pick<SessionContext, keyof UserMetadata>;
}
export {};