云端

Axiom 适配器

将广泛事件发送到 Axiom,以进行强大的查询、仪表板和告警。零配置设置,使用环境变量和自动批处理。

Axiom 是一个云原生日志平台,它会为事件的每个字段建立索引,因此无需架构即可查询其中任意字段。evlog Axiom 适配器会将你的广泛事件直接发送到 Axiom 数据集。

添加 Axiom 排水适配器

安装

Axiom 适配器已随 evlog 一起打包提供:

src/index.ts
import { createAxiomDrain } from 'evlog/axiom'

快速开始

1. 获取你的 Axiom 凭证

  1. 创建一个 Axiom 账户
  2. 创建一个用于日志的数据集
  3. 生成一个具有写入权限的 API 令牌

2. 设置环境变量

.env
AXIOM_API_KEY=xaat-your-token-here
AXIOM_DATASET=your-dataset-name
在 Axiom 的仪表板中,这个凭证称为 API 令牌xaat-...)。evlog 将配置字段命名为 apiKey,以便在各个适配器之间保持一致。旧的 token / AXIOM_TOKEN 仍然可用,直到下一个主要版本发布。

3. 将 drain 接入你的框架

// server/plugins/evlog-drain.ts
import { createAxiomDrain } from 'evlog/axiom'

export default defineNitroPlugin((nitroApp) => {
  nitroApp.hooks.hook('evlog:drain', createAxiomDrain())
})

就是这样!你的日志现在会显示在 Axiom 中。

配置

该适配器从多个来源读取配置(优先级从高到低):

  1. 覆盖项 传递给 createAxiomDrain()
  2. 运行时配置 位于 runtimeConfig.axiom(仅限 Nuxt/Nitro)
  3. 环境变量AXIOM_*

环境变量

变量说明
AXIOM_API_KEY具有写入权限的 Axiom API 令牌
AXIOM_DATASET用于导入日志的数据集名称
AXIOM_ORG_ID组织 ID(个人访问令牌必填)
AXIOM_EDGE_URL用于导入/查询的边缘基础 URL(适用于边缘部署)
AXIOM_URLAPI 基础 URL(旧版/默认导入端点)

运行时配置(仅限 Nuxt)

通过 nuxt.config.ts 进行类型安全的配置:

nuxt.config.ts
export default defineNuxtConfig({
  runtimeConfig: {
    axiom: {
      apiKey: '', // 通过 AXIOM_API_KEY 设置
      dataset: '', // 通过 AXIOM_DATASET 设置
    },
  },
})

覆盖选项

直接传递选项以覆盖任何配置:

server/plugins/evlog-drain.ts
const drain = createAxiomDrain({
  dataset: 'production-logs',
  timeout: 10000,
})

完整配置参考

选项类型默认值说明
apiKeystring-Axiom API 令牌(必填)
tokenstring-已弃用。 请改用 apiKey
datasetstring-数据集名称(必填)
orgIdstring-组织 ID(用于 PAT 令牌)
edgeUrlstring-用于导入的边缘 URL。未提供路径时使用 /v1/ingest/{dataset};自定义路径按原样使用(会去除末尾斜杠)。不能与 baseUrl 同时使用
baseUrlstringhttps://api.axiom.coAPI 基础 URL(/v1/datasets/{dataset}/ingest),不能与 edgeUrl 同时使用
timeoutnumber5000请求超时时间,单位为毫秒
retriesnumber2瞬时故障时的重试次数

时间戳

Axiom 的事件时间戳字段是 _time。适配器会通过 timestamp-field 导入参数,将事件自身的 timestamp 字段作为时间戳发送,因此即使事件经过批处理或重试,也能保留其原始时间。基于时间的查询和监控应使用 _time 进行分桶。

在 Axiom 中查询日志

evlog 发送结构化广泛事件,非常适合 Axiom 的 APL 查询语言:

Axiom APL 查询
// 查找慢速请求
['your-dataset']
| where durationMs > 1000
| project _time, path, durationMs, status

// 按端点统计错误率
['your-dataset']
| where level == "error"
| summarize count() by path
| order by count_ desc

// 随时间统计请求量
['your-dataset']
| summarize count() by bin(_time, 1h)
| render timechart

故障排除

缺少数据集或 apiKey 错误

Console
[evlog/axiom] Missing dataset or apiKey. Set AXIOM_API_KEY/AXIOM_DATASET env vars or pass to createAxiomDrain()

请确保已设置环境变量并在添加后重新启动服务器。

401 未授权

你的令牌可能无效或已过期。在 Axiom 仪表板中生成一个具有 写入 权限的新令牌。

403 禁止(使用个人访问令牌)

个人访问令牌需要组织 ID:

.env
AXIOM_ORG_ID=your-org-id

直接 API 使用

对于高级用例,你可以使用更低层级的函数:

server/utils/axiom.ts
import { sendToAxiom, sendBatchToAxiom } from 'evlog/axiom'

// 发送单个事件
await sendToAxiom(event, {
  apiKey: 'xaat-xxx',
  dataset: 'logs',
})

// 批量发送多个事件
await sendBatchToAxiom(events, {
  apiKey: 'xaat-xxx',
  dataset: 'logs',
})

下一步