hugo-log-sdk
Version:
全链路日志SDK
418 lines (378 loc) • 8.97 kB
TypeScript
declare global {
var $trace: IBaseTrace;
var $traceInit: (options: TraceOptions) => void | IBaseTrace;
}
/** 一下是错误 (data) 类型 */
// 问题级别
export enum TraceDataSeverity {
// 其他
Else = "else",
// 错误级别
Error = "error",
// 告警级别
Warning = "warning",
// 日志级别
Info = "info",
// 调试级别
Debug = "debug",
// 低危级别
Low = "low",
// 普通级别
Normal = "normal",
// 高危级别
High = "high",
// 极其严重
Critical = "critical",
}
// 错误日志类型
export enum TraceDataTypes {
// 未知
UNKNOWN = "UNKNOWN",
// 未知函数
UNKNOWN_FUNCTION = "UNKNOWN_FUNCTION",
// js 脚本
JAVASCRIPT = "JAVASCRIPT",
// 打印信息
LOG = "LOG",
// 网络请求
HTTP = "HTTP",
// 资源
RESOURCE = "RESOURCE",
// 异步
PROMISE = "PROMISE",
// 路由
ROUTE = "ROUTE",
// 性能
PERF = "PERF",
// UI 框架
VUE = "VUE",
REACT = "REACT",
// ...更多框架
}
// 异常通用接口
export interface ITraceBaseData {
// id
dataId: number;
// 日志信息名称
name?: string;
// 问题类型
type: TraceDataTypes;
// 问题级别
level: TraceDataSeverity;
// 异常信息
message: string;
// 发生时间
time: number;
}
// 代码异常错误信息
export interface TractDataCodeError extends ITraceBaseData {
// 行数
lineNumber: number;
// 列数
column: number;
// 文件地址
source: string;
}
// 请求类型接口
export interface TraceDataFetch extends ITraceBaseData {
// 执行时间,用于统计耗时
elapsedTime: number;
// 请求方法
method: string;
// 请求类型
httpType: "fetch" | "xhr";
// 请求地址
url: string;
// 请求参数
body: string;
// 响应状态
status: number;
}
// Promise类型接口
export interface TraceDataPromise extends ITraceBaseData {}
// 资源类型接口
export interface TraceDataResource extends ITraceBaseData {
// 请求地址
url?: string;
}
// 普通日志接口
export interface TraceDataLog extends ITraceBaseData {
// 标签
tag?: string;
}
// PV/UV 接口
export interface TraceDataPageView extends ITraceBaseData {
// 路由
route?: string;
}
/** 以下是性能 (pref) 类型 */
// webVitals性能收集信息接口
export enum TracePerfRating {
GOOD = "good",
NEEDS_IMPROVEMENT = "needs improvement",
POOR = "poor",
}
export interface TracePerf {
id: string;
// 指标值
LCP?: number;
// 指标衡量值
LCPRating?: TracePerfRating;
FID?: number;
FIDRating?: TracePerfRating;
FCP?: number;
FCPRating?: TracePerfRating;
TTFB?: number;
TTFBRating?: TracePerfRating;
CLS?: number;
CLSRating?: TracePerfRating;
INP?: number;
INPRating?: TracePerfRating;
}
/** 以下是行为 (breadcrumbs) 类型 */
// 行为分类
export enum BreadcrumbsCategorys {
// 网络请求
Http = "http",
// 用户操作
User = "user",
// 调试
Debug = "debug",
// 抛异常
Exception = "exception",
// 生命周期
Lifecycle = "lifecycle",
}
// 日志类型
export enum BreadcrumbTypes {
// 路由跳转
ROUTE = "Route",
// 用户点击
CLICK = "UI.Click",
// 控制台打印
CONSOLE = "Console",
// 网络请求
FETCH = "Fetch",
// 未处理异常
UNHANDLEDREJECTION = "Unhandledrejection",
// 资源
RESOURCE = "Resource",
// 代码错误
CODE_ERROR = "Code Error",
// 其他
CUSTOMER = "Customer",
}
interface ITraceBaseAction {
// 动作名称
name?: string;
// 动作参数
level: TraceDataSeverity;
// 动作时间
time: number;
// 日志类型
type: BreadcrumbTypes;
// 行为分类
category: BreadcrumbsCategorys;
}
// 行为日志
export interface TraceAction extends ITraceBaseAction {
// 行为动作相关的信息,可以是DOM,可以是错误信息,可以是自定义信息
message?: string;
// 请求参数
request?: any;
// 请求结果内容
response?: any;
// 错误堆栈信息
stack?: string;
}
/** 以下是基本日志信息集合 */
// 日志类型
export enum TraceTypes {
// PV/UV
PAGE_VIEW = "PageView",
// 事件
EVENT = "EVENT",
// 性能
PERF = "Performance",
// 资源
RESOURCE = "Resource",
// 动作、行为类型
ACTION = "Action",
// 请求类型
FETCH = "Fetch",
// 代码错误
CODE_ERROR = "CodeError",
// 日志
CONSOLE = "Console",
// 其它
CUSTOMER = "Customer",
}
// 浏览器类型
export enum BrowserType {
// 手机端浏览器
MOBILE = "mobile",
// PC浏览器
PC = "pc",
// webview
WEBVIEW = "webview",
// 小程序
MINI_PROGRAM = "miniProgram",
// 未知
UNKNOWN = "unknown",
}
// 日志级别
export enum TraceLevelType {
// 告警级别
error = "error",
// 预警级别
warn = "warn",
// 普通日志
info = "info",
// 调试日志
debug = "debug",
}
// 客户端类型
export enum TraceClientTypes {
// 安卓
ANDROID_H5 = "android",
// iOS
IOS_H5 = "ios",
// PC端
PC_H5 = "pc",
// 浏览器
BROWSER_H5 = "browser",
}
// 全链路日志基类
export interface ITraceBase {
// 唯一ID,用户侧生成
traceId: string;
// 日志类型
type: TraceTypes;
// 日志产生时间
createdAt: number;
// 日志最后更新时间
updatedAt: number;
}
// 浏览器相关字段基类
export interface IBaseBrowserTrace {
// 当前浏览器的UserAgent
ua: string;
// 浏览器类型
browserType: BrowserType;
}
// 页面相关字段基类
export interface IBasePageTrace {
// 页面ID
pid: string;
// 页面标题
title?: string;
// 当前页面URL
url: string;
}
// 用户相关字段基类
export interface IBaseUserTrace {
// 指纹ID,fingerprintId
fpId: string;
// 用户ID
uid?: string | number;
// 用户名称
userName?: string;
// 用户邮箱
email?: string;
// 用户手机号
phone?: string;
}
// 业务相关字段基类
export type BaseAppTrace = {
// 业务ID
appId: string;
// 业务名称
appName?: string;
// 客户端类型
clientType: TraceClientTypes;
// 日志级别
level: TraceLevelType;
};
// 日志基本类型
export interface IBaseTraceInfo extends ITraceBase, IBaseBrowserTrace, IBaseUserTrace, IBasePageTrace, BaseAppTrace {}
// 一份错误信息的类型集合
export type TraceTypeData =
| TraceDataFetch
| TractDataCodeError
| TraceDataPromise
| TraceDataResource
| TraceDataLog
| TraceDataPageView;
// 操作行为日志集合
export type TraceBreadcrumbs = TraceAction[];
// 性能
export type TracePerfs = TracePerf[];
// 完整日志类型
export interface TraceData extends IBaseTraceInfo {
// 记录错误信息
data?: TraceTypeData;
// 记录操作行为
breadcrumbs?: TraceBreadcrumbs;
// 记录性能信息
perf?: TracePerf;
}
/** 以下是 sdk 使用类型 */
export interface IBaseTrace {
// 浏览器信息
userAgent: string;
// 浏览器类型
browserType: string;
// 客户端类型
clientType: string;
// fingerprintId
fpId: string | undefined;
// 页面ID
pageId: string;
// 应用ID
appId: string;
// 是否开启debug
debug: boolean;
// 记录用户行为
breadcrumb: TraceBreadcrumbs;
// 最大存储用户行为
maxBreadcrumbs: number;
// 待发送日志队列
readonly traceQueue: TraceData[];
onGlobalError(callback?: (e: Event) => {}): void;
onGlobalClick(callback?: (bc: TraceAction) => {}): void;
saveBreadcrumb(data: TraceAction): void;
saveError(data: ErrorEvent): void;
// 生成日志数据
setTraceData(data: TraceTypeData | TracePerf): TraceData;
// 添加日志到队列
pushTraceQueue(data: TraceData): void;
// 清空队列
clearQueue(): void;
// 配置用户信息
setUserInfo(data: Omit<IBaseUserTrace, "fpId">): void;
// 清空用户信息
clearUserInfo(): void;
// 发送日志
send(data: TraceData): Promise<unknown> | undefined;
// 日志打印
log(log: TraceDataLog): void;
// 普通日志
info(message: string, tag?: string): void;
// 警告日志
warn(message: string, tag?: string): void;
// 错误日志
error(message: string, tag?: string): void;
// 页面访问日志
pageView(route: string, title?: string): void;
}
export type SendType = "xhr" | "fetch" | "beacon" | "img";
export type TraceOptions = {
perfOnSend?: () => void;
perfBeforeSend?: (data?: TracePerf) => void;
maxBreadcrumbs?: number;
debug?: boolean;
dsn?: string;
appId: string;
sendType?: SendType;
};
export const init: (options: TraceOptions) => IBaseTrace;