Enrichers 在事件发出后、到达排放适配器之前,为广泛事件添加派生上下文。使用它们可以自动从请求头中提取有用信息,而不会使应用程序代码变得杂乱。
Enrichers 工作原理
Enrichers 钩入 evlog:enrich 事件,该事件在广泛事件发出后、evlog:drain 钩子之前触发。Enricher 接收事件和请求元数据,并可以修改事件以添加派生字段。
请求 → emit() → evlog:enrich → evlog:drain
↑ enrichers ↑ adapters
添加上下文 发送到服务
server/plugins/evlog-enrich.ts
import { createUserAgentEnricher, createGeoEnricher } from 'evlog/enrichers'
export default defineNitroPlugin((nitroApp) => {
const enrichers = [
createUserAgentEnricher(),
createGeoEnricher(),
]
nitroApp.hooks.hook('evlog:enrich', (ctx) => {
for (const enricher of enrichers) enricher(ctx)
})
})
Enrich Context
每个 enricher 都接收一个包含以下字段的 EnrichContext:
| 字段 | 类型 | 描述 |
|---|---|---|
event | WideEvent | 发出的广泛事件(可变) |
request | object | 请求元数据(method、path、requestId) |
headers | object | 安全的 HTTP 请求头(敏感头会被过滤) |
response | object | 响应元数据(status、headers) |
安全性: 敏感头(如
authorization、cookie、x-api-key 等)会被自动过滤,永远不会传递给 enricher。可用 Enrichers
覆盖行为
默认情况下,enricher 会保留现有字段。如果应用程序代码已经设置了 event.userAgent,enricher 不会覆盖它。传递 { overwrite: true } 可更改此行为:
enricher-factory-options.ts
createUserAgentEnricher({ overwrite: true })
请参阅 Next.js 指南 以了解实际实现。
下一步
- 内置 Enrichers - 所有内置 enricher 的详细参考
- 自定义 Enrichers - 编写你自己的 enricher