跳转到内容
搜索文档

Tail Workers

最后更新 查看 MarkdownAgent 设置

Tail Worker 接收其他 Worker(称为 producer Worker)执行的信息,例如 HTTP 状态、传递给 console.log() 的数据或未捕获的异常。Tail Workers 可以处理日志以进行告警、调试或分析。

Tail Workers 面向 Workers Paid 和 Enterprise 计划的所有客户。Tail Workers 按 CPU 时间 计费,而非按请求数计费。

Tail Worker 示意图

Tail Worker 在包含应用逻辑的 producer Worker(Tail Worker 将跟踪的 Worker)调用完成后自动调用。它在 producer 执行完成后捕获事件。整个请求生命周期中的事件,包括通过 Service Bindings 和 Dynamic Dispatch 的潜在子请求,都将被包含。你可以过滤、更改数据格式并将事件发送到任何 HTTP 端点。为快速调试,Tail Workers 可用于将日志发送到 KV 或任何数据库。

配置 Tail Workers

要配置 Tail Worker:

  1. 创建 Worker 作为 Tail Worker。
  2. 向 Worker 添加 tail() 处理器。每次调用 Tail Worker 所连接的 producer Worker 时,都会调用 tail() 处理器。以下 Worker 代码是将数据发送到 HTTP 端点的 Tail Worker:
export default {
	async tail(events) {
		fetch("https://example.com/endpoint", {
			method: "POST",
			body: JSON.stringify(events),
		});
	},
};

以下 Worker 代码是 events 对象可能样子的示例:

[
	{
		"scriptName": "Example script",
		"outcome": "exception",
		"eventTimestamp": 1587058642005,
		"event": {
			"request": {
				"url": "https://example.com/some/requested/url",
				"method": "GET",
				"headers": {
					"cf-ray": "57d55f210d7b95f3",
					"x-custom-header-name": "my-header-value"
				},
				"cf": {
					"colo": "SJC"
				}
			}
		},
		"logs": [
			{
				"message": ["string passed to console.log()"],
				"level": "log",
				"timestamp": 1587058642005
			}
		],
		"exceptions": [
			{
				"name": "Error",
				"message": "Threw a sample exception",
				"timestamp": 1587058642005
			}
		],
		"diagnosticsChannelEvents": [
			{
				"channel": "foo",
				"message": "The diagnostic channel message",
				"timestamp": 1587058642005
			}
		]
	}
]
  1. 将以下内容添加到 producer Worker 的 Wrangler 文件:
{
	"tail_consumers": [
		{
			"service": "<TAIL_WORKER_NAME>"
		}
	]
}
[[tail_consumers]]
service = "<TAIL_WORKER_NAME>"

使用 Analytics Engine 获取聚合指标

若需要聚合分析而非单个日志事件,考虑从 Tail Worker 写入 Workers Analytics Engine。Analytics Engine 针对高基数、时间序列数据进行了优化,你可以使用 SQL 查询。

例如,你可以使用 Tail Worker 按端点统计错误、按客户跟踪响应时间或构建使用指标,然后将这些聚合写入 Analytics Engine 进行查询和可视化。

export default {
	async tail(events, env) {
		for (const event of events) {
			env.ANALYTICS.writeDataPoint({
				blobs: [event.scriptName, event.outcome],
				doubles: [1],
				indexes: [event.event?.request?.cf?.colo ?? "unknown"],
			});
		}
	},
};

请参阅 Analytics Engine 文档了解写入和查询数据的更多详情。

相关资源

这篇文档对您有帮助吗?