@awarns/tracing
由awarns编写 | v1.0.0
AwarNS 框架包,简化复杂任务执行流程的跟踪和调试
npm i --save @awarns/tracing

@awarns/tracing

npm (scoped) npm

在使用AwarNS 框架时,后台执行流程可能会变得非常复杂,但这并不一定是坏事。该模块通过一组装饰器和任务帮助调试此类工作流程,这些装饰器和任务允许跟踪任务执行和某些事件的触发。记录的跟踪信息可以稍后查询并导出为本地文件。可选地,可以将记录的跟踪信息自动存储在外部数据存储中(例如,后端)。

使用以下命令行指令安装插件

ns plugin add @awarns/tracing

用法

安装和配置此插件后,您将获得两种交互机制来使用它

  1. 插件API。通过它,您可以“装饰”现有任务,跟踪它们的执行。然后,您可以查询记录的执行跟踪并使用最常见的信息交换格式导出它们。
  2. 跟踪特定事件的任务。有时,任务本身的执行并不重要,但只是它产生的一个(或多个)事件。或者,事件生成器可能不是任务,而是某些UI代码在非常特定的情况下发出事件。如果这些事件的触发对您的应用程序很重要,您可以使用这些任务跟踪它们。

设置

此插件要求您在框架初始化期间注册其加载器,如下所示

// ... platform imports
import { awarns } from '@awarns/core';
import { demoTasks } from '../tasks';
import { demoTaskGraph } from '../graph';
import { registerTracingPlugin } from '@awarns/tracing';

import { externalTracesStore } from './external-store';

awarns
.init(
demoTasks,
demoTaskGraph,
[
registerTracingPlugin({
externalTracesStore: externalTracesStore,
oldTracesMaxAgeHours: 7 * 24 // 1 week
}),
]
)
// ... handle initialization promise

插件加载器配置参数选项

属性 类型 描述
externalTracesStore TracesStore (可选) 注入外部跟踪存储的适配器并启用记录跟踪的自动上传。下表描述了此适配器需要实现的方法
oldTracesMaxAgeHours 数字 (可选) 告诉插件定期清理旧本地跟踪。默认情况下,保留所有跟踪

TracesStore (外部)

方法 返回类型 描述
insert(trace: Trace) Promise<void> 持久化给定的跟踪。如果出现问题,则抛出错误。下一次应用程序初始化期间将重试写入

因此,目前,此插件仅支持单向同步,其余方法旨在供将来使用,目前无需实现。您可以在其中抛出未实现错误,以便更容易识别它们在未来版本中的使用。

API

此插件的API可以分为三组:任务装饰器、跟踪存储和数据导出器。

任务装饰器

makeTraceable

在任务装饰器组中,有一个makeTraceable函数,允许装饰一个或多个任务以跟踪它们的执行,以下参数(请参阅完整示例用法这里

参数 类型 描述
tasksToTrace Array<Task> 一个数组,包含所有将被装饰以跟踪其执行的任务
config TracerConfig (可选) 允许调整追踪器的某些配置选项。有关更多信息,请参阅 TracerConfig 属性

makeTraceable 函数返回一个装饰过的任务数组。

TracerConfig
属性 类型 描述
outputsSensitiveData 布尔值 指示追踪器,正在跟踪的任务输出敏感信息,这些信息不应被记录。默认值为 false

追踪存储

tracesStore

在追踪存储组中,有一个 tracesStore 单例对象,具有以下方法

方法 返回类型 描述
insert(record: Record) Promise<void> 持久化给定的追踪。如果成功,并在插件初始化时提供,它将尝试自动将新的追踪写入外部存储
getAll(reverseOrder?: boolean, limitSize?: number) Promise 允许检索当前最新的(默认)或最早的追踪,可选地限制结果列表的大小
list(size?: number) Observable 允许观察“n”个最近的追踪,其中“n”由大小参数的值确定。默认大小为 100
clear() Promise<void> 允许从本地数据库中清除所有存储的追踪。 注意:仅删除旧追踪,请在插件初始化时配置 oldTracesMaxAgeHours 选项
changes (属性) Observable 监听此可观察属性以了解何时创建了一个追踪。它传播最近存储的追踪的id更新

注意:建议安装 RxJS,以操作返回 Observable 的方法。

追踪
属性 类型 描述
id 字符串 追踪的唯一id
chainId 字符串 追踪所属链的id。链是一系列事件上升和任务执行,它们源于同一起始事件
type TraceType 可以是 taskevent,具体取决于什么触发了追踪
name 字符串 触发追踪的任务或事件的名称
result TraceResult 可以是 OKerror。对于事件追踪,此值始终为 OK,因为如果出现问题,事件根本不会上升
timestamp Date 追踪创建的日期和时间
content 对象 任务追踪和事件追踪在其内容属性中的结构不同。事件追踪将在这里包含事件的负载,除非已声明事件包含敏感数据,在这种情况下,它将保留一个空({})对象。任务追踪的内容具有固定的结构,如下所示
追踪内容(任务)
属性 类型 描述
emitted 字符串 任务发出的事件的名称
outcome 字符串 事件发出的负载。如果追踪器配置中的 outputsSensitiveData 设置为 true,则此属性将保留一个空对象({}
message 字符串 如果在任务的执行过程中抛出错误,其堆栈跟踪将在这里显示
took 数字 任务执行时间,以毫秒为单位

导出数据

createRecordsExporter

在最后一个组中,数据导出器组中,有一个 createRecordsExporter() 函数,具有以下参数

参数 类型 描述
folder 文件夹 系统文件夹对象。使用 NativeScript FileSystem API 定义导出文件将保存的位置
format 'csv' | 'json' 选择要使用的交换信息格式。默认为 csv
fileName 字符串 (可选) 指定要用于导出文件的文件名(不带扩展名)。默认为当前日期和时间

createRecordsExporter() 返回一个具有以下API的 Exporter 对象

导出器

方法 返回类型 描述
export() Promise 告诉导出器导出追踪信息,并将它们保存到配置的导出文件中。完成后返回一个 ExportResult

ExportResult

属性 返回类型 描述
exportCount 数字 已导出的追踪信息数量
fileName 字符串 已保存的导出文件名称

任务

任务名称 描述
trackEvent 生成包含触发执行事件信息的事件追踪
trackSensitiveEvent 生成包含触发执行事件信息的事件追踪。由于它被认为包含敏感信息,因此将忽略事件的负载

追踪常规事件

要为此任务注册使用,您只需将其导入,并在您应用程序的任务列表中调用其生成函数

import { Task } from '@awarns/core/tasks';
import { trackEventTask } from '@awarns/tracing';

export const demoTasks: Array<Task> = [
trackEventTask(),
];

任务生成器参数

任务生成器不接收任何参数。

任务输出事件

  • trackEventFinished (默认,无内容)

在应用程序任务图中的示例用法

on('startEvent', run('trackEvent')); // Include some payload data in your start event, 
// to see how it becomes recorded too

追踪包含敏感信息的事件

要为此任务注册使用,您只需将其导入,并在您应用程序的任务列表中调用其生成函数

import { Task } from '@awarns/core/tasks';
import { trackSensitiveEventTask } from '@awarns/tracing';

export const demoTasks: Array<Task> = [
trackSensitiveEventTask(),
];

任务生成器参数

任务生成器不接收任何参数。

任务输出事件

  • trackSensitiveEventFinished (默认,无内容)

在应用程序任务图中的示例用法

on('startEvent', run('trackSensitiveEvent')); // Include some payload data in your start event, 
// to see how it does not appear in the event trace

许可证

Apache License 版本 2.0