跳转到内容
搜索文档

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 BindingsDynamic 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 文档了解写入和查询数据的更多详情。

相关资源

这篇文档对您有帮助吗?