getSession() 每次请求都会产生一次数据库查询。该集成会为你测量这一过程,并将耗时暴露为 auth.resolvedIn,这样你就能在用户察觉之前发现性能回归。
监控会话解析时间
宽事件 — 会话解析缓慢
{
"auth": { "resolvedIn": 245, "identified": true },
"duration": "312ms"
}
当 auth.resolvedIn 相对于 duration 较高时,说明你的认证后端是性能瓶颈。
针对高流量进行调优
- 在 Better Auth 中启用 cookie 缓存,这样会话查找就不会每次都访问数据库。
- 在
createAuthMiddleware上使用exclude,跳过不需要用户上下文的公开路由。 - 使用
include将解析范围限制到特定的路由模式,而不是整个应用。
缓存后的常见 P95 目标:auth.resolvedIn < 5ms。
独立 Nitro
createAuthIdentifier 是一个工厂函数,用于创建 Nitro 的 request 钩子。它专为 独立 Nitro 应用设计,其中 evlog Nitro 模块负责处理钩子顺序。
对于 Nuxt,请改为在 server middleware 中使用
createAuthMiddleware —— Nitro 插件的钩子顺序可能会导致在 request 钩子中日志器尚未可用。server/plugins/evlog-auth.ts
import { createAuthIdentifier } from 'evlog/better-auth'
import { auth } from './lib/auth'
export default defineNitroPlugin((nitroApp) => {
nitroApp.hooks.hook('request', createAuthIdentifier(auth, {
exclude: ['/api/auth/**', '/api/public/**'],
}))
})
它接受与 createAuthMiddleware 相同的选项。
与 AI SDK 结合使用
当你也使用 evlog/ai 时,你的宽事件会将用户身份 和 AI 指标合并到同一个事件中:
宽事件 — AI + 用户
{
"method": "POST",
"path": "/api/chat",
"status": 200,
"duration": "4.5s",
"userId": "QBX9tPjJQExWawAbNll75",
"user": {
"id": "QBX9tPjJQExWawAbNll75",
"name": "Hugo Richard",
"email": "hugo@example.com"
},
"auth": { "resolvedIn": 8, "identified": true },
"ai": {
"calls": 1,
"model": "claude-sonnet-4.6",
"provider": "anthropic",
"inputTokens": 3312,
"outputTokens": 814,
"totalTokens": 4126,
"msToFirstChunk": 234,
"msToFinish": 4500,
"tokensPerSecond": 180
}
}
这就是宽事件的强大之处——每个请求一个事件,所有上下文都集中在一处:谁发起了请求、他们做了什么、AI 如何响应,以及它的表现如何。