@ flowrensic/ 节点
释前. 这个包是一个早期的预览,没有准备好制作. 它的API可以在任何版本中更改.
重放您已制作的工作流程的历史, 对照您的代码 准备出发了.
Flowrensic 保持什么 临时引擎记录。 此软件包获取一个集到 磁盘和报告你重新播放找到的东西。 重播本身还是你的: 给Temperal打电话 直接在你的套房里 使用自己的捆绑机. 下一次部署时 历史记录会僵化 没人能说 仍然可以删除.
服务器 : flowrensic/flowrensic {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}在Docker Hub上 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? Temperal是辅助引擎.
打电话的人是谁
每一次给福弗伦斯克的电话都写着是谁发出的 三个标题:
Flowrensic-Current-Env, (中文(简体) ), Flowrensic-Env-Access-Key 财务报告和审定财务报表
Flowrensic-Current-Ephemeral-Run。这里的每个帮助者都将其作为选项
currentEnv, (中文(简体) ), envAccessKey 财务报告和审定财务报表 currentEphemeralRun,旁边 serverBaseUrl。 。 。 .
软件包没有读取环境变量: 将数值从您自己的
相会. 那种麻风的洞穴 currentEphemeralRun,例如
CI 构建数字,没有一个运行就是默认值.
重播
import { fetchReplaySet, publishVerdicts, readReplaySet } from '@flowrensic/node';
import { historyFromJSON } from '@temporalio/common/lib/proto-utils.js';
import { Worker } from '@temporalio/worker';
await fetchReplaySet({
serverBaseUrl: 'http://flowrensic:8080',
replayHistoryWorkflow: 'OrderWorkflow',
replayHistoryOutDir: 'replay-set',
replayHistoryFromEnvs: ['prod', 'staging'],
currentEnv: 'ci',
envAccessKey: config.envAccessKey,
currentEphemeralRun: config.buildNumber,
});
const set = await readReplaySet('replay-set');
const histories = await Promise.all(
set.histories.map(async (entry) => ({
workflowId: entry.run_id,
history: historyFromJSON(JSON.parse(await readFile(join('replay-set', entry.file), 'utf8'))),
})),
);
const verdicts = [];
for await (const result of Worker.runReplayHistories({ workflowsPath }, histories)) {
verdicts.push({
runId: result.workflowId,
workflowType: set.workflow_type,
passed: result.error === undefined,
error: result.error?.message,
});
}
await publishVerdicts({
serverBaseUrl: 'http://flowrensic:8080',
codeVersion: config.gitSha,
verdicts,
currentEnv: 'ci',
envAccessKey: config.envAccessKey,
currentEphemeralRun: config.buildNumber,
});
该套套装每个被命名的洞的历史,一个又一个的洞,以及
replay-set.json 列出内存,并给出每个历史的内存。 每个坑都命名
在 FLOWRENSIC KNOWN ENVS 中,必须是当前嵌入器或它的一个条目.
水下洞穴必须是一等的:每一取来都属于水下洞穴
运行, 并拒绝一个持续嵌入.
判断结果与运行和版本相对应 所以在 改变导致它.
flowrensic replay fetch 在 CLI 中写着相同的目录和相同的目录
很明显,对于一个管道 宁可一步一步的取出 而不是在测试.
服务器选集:最近的历史,版本仍在某个地方运行, 不同的结果。 健康工作流程类型最新10个完成 而不是一个失败.
活动遥测
import { createAttemptSink, flowrensicInterceptor } from '@flowrensic/node';
const sink = createAttemptSink({ serverBaseUrl: 'http://flowrensic:8080', currentEnv: 'prod', envAccessKey, workerName: 'orders-worker' });
const worker = await Worker.create({
// ...
interceptors: { activity: [flowrensicInterceptor(sink)] },
});
工人的名字,每一份都用同一个名字。 工作流程 类型页显示在工人运行的每一种类型旁边,并附有任务队列,以及 可以通过它过滤。 离开,工人没有名字.
每一次尝试一个事件,而不是每一次活动: 两者的差距是重试 计数。 每一次尝试都带有命名空间 Temperal 给出了活动,并且 服务器将每个环境的命名空间分开。 没有命名空间 设置.
活动只进入,出版失败被吞噬. 遥测必须 永不辜负它测量的活动.
查询和信号计数
Workflow 类型页面计算每个工作流程类型答案的查询. 这个 工人需要工作流程模块和汇:
import { createRequire } from 'node:module';
import { flowrensicQuerySinks } from '@flowrensic/node';
const queries = flowrensicQuerySinks({ serverBaseUrl: 'http://flowrensic:8080', currentEnv: 'prod', envAccessKey });
const worker = await Worker.create({
// ...
interceptors: {
activity: [flowrensicInterceptor(sink)],
workflowModules: [createRequire(import.meta.url).resolve('@flowrensic/node/workflow')],
},
sinks: queries.sinks,
});
// Before the process ends:
await queries.buffer.close();
客户端截取器发送失败或没有的查询和信号 答话 把它放在客户端的插件中,所以它读取了用户端的命名空间 客户端 :
const interceptor = flowrensicClientInterceptor({ serverBaseUrl: 'http://flowrensic:8080', currentEnv: 'prod', envAccessKey });
const client = new Client({ connection, namespace: 'orders', plugins: [interceptor] });
// Before the process ends:
await interceptor.close();
同伴
@temporalio/worker, (中文(简体) ), @temporalio/common, (中文(简体) ), @temporalio/activity, (中文(简体) ),
@temporalio/workflow,1.24或更新, 对于拦截器。 重放运行在你的SDK上,而不是这个
包针.