INTEGRITY Документация

Контекст шага

Каждый step.do обратный вызов получает объект контекста (WorkflowStepContext) в качестве первого аргумента. Этот контекст предоставляет коду шага информацию времени выполнения о самом шаге, текущей попытке повтора и итоговой конфигурации этого шага.

WorkflowStepContext

type WorkflowStepContext = {
	step: {
		name: string;
		count: number;
	};
	attempt: number;
	config: WorkflowStepConfig;
};

Свойства

Свойство Тип Описание
step.name string Имя, которое вы передали в step.do.
step.count number Сколько раз step.do был вызван с этим именем в текущем запуске Workflow. Начинается с 1 для первого вызова с данным именем.
attempt number Номер текущей попытки (отсчёт начинается с 1). 1 при первой попытке, 2 при первой повторной попытке, и так далее.
config WorkflowStepConfig Итоговая конфигурация повторных попыток и тайм-аута для этого шага, включая значения по умолчанию, применённые средой выполнения.

Если в конфигурации шага retries.delay является функцией, динамическая задержка не отображается в ctx.config.retries.delay. Функция delay получает собственный объект контекста с текущим контекстом шага и ошибкой, вызвавшей повтор.

Доступ к контексту

Передайте параметр в step.do обратный вызов для получения объекта контекста:

await step.do("my-step", async (ctx) => {
	console.log(ctx.step.name); // "my-step"
	console.log(ctx.step.count); // 1
	console.log(ctx.attempt); // 1 on first try, 2 on first retry, etc.
	console.log(ctx.config); // { retries: { limit: 5, ... }, timeout: "10 minutes" }
});

Контекст также доступен, если вы передаёте собственный WorkflowStepConfig:

await step.do(
	"call an API",
	{
		retries: {
			limit: 10,
			delay: "10 seconds",
			backoff: "exponential",
		},
		timeout: "30 minutes",
	},
	async (ctx) => {
		console.log(ctx.config.retries.limit); // 10
		console.log(ctx.config.timeout); // "30 minutes"
	},
);

Чтобы настроить функции задержки, обратитесь к Настройка динамической задержки повтора.

Примеры

Настройка поведения в зависимости от попытки повтора

Используйте ctx.attempt чтобы изменить поведение шага при повторных попытках. Например, можно использовать резервный эндпоинт после определённого числа повторных попыток:

await step.do(
	"fetch data",
	{ retries: { limit: 5, delay: "5 seconds", backoff: "linear" } },
	async (ctx) => {
		const url =
			ctx.attempt <= 3
				? "https://api.example.com/primary"
				: "https://api.example.com/fallback";

		const response = await fetch(url);
		if (!response.ok) {
			throw new Error(`Request failed with status ${response.status}`);
		}
		return await response.json();
	},
);

Логируйте метаданные шагов для обеспечения наблюдаемости

Используйте ctx.step чтобы добавить структурированные метаданные в журналы:

await step.do("process-order", async (ctx) => {
	console.log(
		JSON.stringify({
			step: ctx.step.name,
			stepCount: ctx.step.count,
			attempt: ctx.attempt,
			retryLimit: ctx.config.retries?.limit,
		}),
	);

	// Your step logic here
});