create-evlog-enricher
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseCreate evlog Enricher
创建 evlog Enricher
Add a new built-in enricher to evlog. Every enricher is built on the public toolkit primitive from , so a community enricher has the same shape as a built-in one.
defineEnricherevlog/toolkit向 evlog 添加一个新的内置 Enricher。每个 Enricher 都基于 提供的公共 toolkit 原语 构建,因此社区 Enricher 与内置 Enricher 具有相同的结构。
evlog/toolkitdefineEnricherPR Title
PR 标题
feat(core): add the {name} enricherEnrichers live in the core package surface (), so use the scope unless a dedicated scope exists.
evlog/enricherscorefeat(core): add the {name} enricherEnricher 位于 core 包的公开接口()中,因此除非存在专用 scope,否则使用 scope。
evlog/enricherscoreTouchpoints Checklist
涉及文件检查清单
| # | File | Action |
|---|---|---|
| 1 | | Add enricher source (one |
| 2 | Same file: | Decide whether the enricher belongs in the default composition (see below) |
| 3 | | Add tests (one |
| 4 | | Add a section for the enricher + update the import list and, if applicable, the "All built-in enrichers" default composition text |
| 5 | | Add the enricher to the |
| 6 | | Add the enricher to the Built-in Enrichers section (root |
| 7 | | Create changeset ( |
Important: Do NOT consider the task complete until all 7 touchpoints have been addressed.
| # | 文件 | 操作 |
|---|---|---|
| 1 | | 添加 Enricher 源代码(一次 |
| 2 | 同一文件中的 | 判断该 Enricher 是否应加入默认组合(见下文) |
| 3 | | 添加测试(每个 Enricher 使用一个 |
| 4 | | 为该 Enricher 添加章节,并更新导入列表;如适用,还要更新 "All built-in enrichers" 的默认组合文本 |
| 5 | | 在 Enrichers 部分的 |
| 6 | | 在 Built-in Enrichers 部分添加该 Enricher(根目录的 |
| 7 | | 创建 changeset( |
重要:在处理完全部 7 个涉及文件之前,不要认为此任务已完成。
Should it join createDefaultEnrichers()
?
createDefaultEnrichers()是否应加入 createDefaultEnrichers()
?
createDefaultEnrichers()createDefaultEnrichers()composeEnrichers../shared/composecreateDefaultEnrichers()createDefaultEnrichers()composeEnrichers../shared/composecreateDefaultEnrichers()Naming Conventions
命名约定
| Placeholder | Example (UserAgent) | Usage |
|---|---|---|
| | camelCase for event field key |
| | PascalCase in function/interface names |
| | Human-readable display name |
| 占位符 | 示例(UserAgent) | 用途 |
|---|---|---|
| | 事件字段键使用 camelCase |
| | 函数和接口名称使用 PascalCase |
| | 人类可读的显示名称 |
Step 1: Enricher Source: built on defineEnricher
defineEnricher第 1 步:Enricher 源代码:基于 defineEnricher
defineEnricherAdd the enricher to . Read references/enricher-template.md for the full annotated template.
packages/evlog/src/enrichers/index.tsThe contract is . You only ship one piece of logic:
defineEnricher<T>({ name, field, compute }, options?)- : return the computed value (typed as
compute(ctx)) orTto skip.undefined
defineEnricher- merging via (respecting
mergeEventField, defaultoptions.overwrite)false - error isolation (throws are caught and logged, never propagated)
- skipping when returns
computeundefined
Key rules:
- Use the toolkit helpers: for case-insensitive header lookup,
getHeader()for numeric strings. Both fromnormalizeNumber()(re-exported by../shared/headers).evlog/toolkit - Single event field: each enricher writes one top-level field on . If the enricher must additionally pin top-level fields (like
ctx.eventdoes forcreateTraceContextEnricher/event.traceId), wrap theevent.parentSpanIdresult in a closure, see that enricher for the pattern.defineEnricher - Factory pattern: returns the result of
create{Name}Enricher(options: EnricherOptions = {}), directly in the normal case, or through the thin closure wrapper when the enricher also pins top-level fields (see the single-event-field rule above).defineEnricher(...) - No side effects: never throw, never log; rely on 's built-in error handling if something goes wrong.
defineEnricher - Export the Info type: describing the field shape, exported alongside the factory.
{Name}Info
将 Enricher 添加到 。阅读 references/enricher-template.md,了解完整的带注释模板。
packages/evlog/src/enrichers/index.tsdefineEnricher<T>({ name, field, compute }, options?)- :返回计算后的值(类型为
compute(ctx)),或返回T以跳过。undefined
defineEnricher- 通过 合并(遵循
mergeEventField,默认值为options.overwrite)false - 错误隔离(捕获并记录抛出的错误,绝不向上传播)
- 当 返回
compute时跳过undefined
关键规则:
- 使用 toolkit helpers:使用 进行不区分大小写的 header 查找,使用
getHeader()转换数字字符串。两者均来自normalizeNumber()(由../shared/headers重新导出)。evlog/toolkit - 单一事件字段:每个 Enricher 向 写入一个顶层字段。如果该 Enricher 还必须固定顶层字段(例如
ctx.event会为createTraceContextEnricher/event.traceId固定字段),则将event.parentSpanId的结果包裹在闭包中;有关该模式,请参阅那个 Enricher。defineEnricher - 工厂模式:返回
create{Name}Enricher(options: EnricherOptions = {})的结果。在常规情况下直接返回;如果该 Enricher 还会固定顶层字段,则通过一个轻量闭包包装器返回(参见上面的单一事件字段规则)。defineEnricher(...) - 无副作用:绝不抛出错误,绝不记录日志;如果出现异常,依赖 的内置错误处理。
defineEnricher - 导出 Info 类型:导出一个描述字段结构的 类型,并与工厂函数一起导出。
{Name}Info
Step 2: Tests
第 2 步:测试
Add tests to , following the existing structure (one block per enricher) and conventions.
packages/evlog/test/toolkit/enrichers.test.tsdescribepackages/evlog/test/README.mdRequired test categories:
- Sets the field from its source: verify the enricher populates the event field correctly, reading whatever it actually reads (,
ctx.request,ctx.response,process.env, or headers)ctx.event - Skips when source data missing: verify no field is set when the required input is absent
- Preserves existing data: verify (default) doesn't replace user-provided fields
overwrite: false - Overwrites when requested: verify replaces existing fields
overwrite: true - Handles edge cases: empty strings and malformed values, plus case-insensitive lookup for a header-based enricher
- Default composition: if the enricher joined , extend that composition's tests
createDefaultEnrichers()
按照现有结构(每个 Enricher 使用一个 块)以及 的约定,将测试添加到 。
describepackages/evlog/test/README.mdpackages/evlog/test/toolkit/enrichers.test.ts必需的测试类别:
- 从来源设置字段:验证 Enricher 能正确填充事件字段,并读取其实际读取的数据(、
ctx.request、ctx.response、process.env或 headers)ctx.event - 来源数据缺失时跳过:验证缺少必需输入时不会设置字段
- 保留已有数据:验证默认的 不会替换用户提供的字段
overwrite: false - 按请求覆盖:验证 会替换已有字段
overwrite: true - 处理边界情况:测试空字符串和格式错误的值;对于基于 header 的 Enricher,还要测试不区分大小写的查找
- 默认组合:如果该 Enricher 已加入 ,则扩展该组合的测试
createDefaultEnrichers()
Step 3: Update the Enrichers Docs Page
第 3 步:更新 Enrichers 文档页面
Edit :
apps/docs/content/5.use-cases/5.enrichers.md- Add the enricher to the import list at the top
- Add a section following the structure of the existing ones:
## {DISPLAY}
markdown
undefined编辑 :
apps/docs/content/5.use-cases/5.enrichers.md- 将该 Enricher 添加到顶部的导入列表
- 按照现有章节的结构,添加一个 章节:
## {DISPLAY}
markdown
undefined{DISPLAY}
{DISPLAY}
[One-sentence description of what the enricher does.]
Sets:
event.{name}```typescript
const enrich = create{Name}Enricher()
```
Output shape:
```typescript
interface {Name}Info {
// fields
}
```
Example output:
```json
{
"{name}": {
// example values
}
}
```
3. If the enricher joined the default composition, update the "All built-in enrichers" section text listing what `createDefaultEnrichers()` composes.
Custom-enricher authoring docs live separately at `apps/docs/content/6.extend/5.custom-enrichers.md`, with no change needed there unless the toolkit contract itself changed.[One-sentence description of what the enricher does.]
Sets:
event.{name}```typescript
const enrich = create{Name}Enricher()
```
Output shape:
```typescript
interface {Name}Info {
// fields
}
```
Example output:
```json
{
"{name}": {
// example values
}
}
```
3. 如果该 Enricher 已加入默认组合,请更新 "All built-in enrichers" 章节中列举 `createDefaultEnrichers()` 所组合内容的文本。
自定义 Enricher 的编写文档单独位于 `apps/docs/content/6.extend/5.custom-enrichers.md`;除非 toolkit 契约本身发生变化,否则无需修改该文档。Step 4: Update the Public Skill
第 4 步:更新公共 Skill
In (published on evlog.dev), find the Enrichers section and add the new enricher to the line.
skills/review-logging-patterns/SKILL.mdBuilt-in:在 (发布于 evlog.dev)中找到 Enrichers 部分,将新 Enricher 添加到 行。
skills/review-logging-patterns/SKILL.mdBuilt-in:Step 5: Update README
第 5 步:更新 README
Add the enricher to the Built-in Enrichers section in (the root is a symlink to it).
packages/evlog/README.mdREADME.md在 的 Built-in Enrichers 部分添加该 Enricher(根目录的 是它的符号链接)。
packages/evlog/README.mdREADME.mdStep 6: Changeset
第 6 步:Changeset
Create with a bump describing what the enricher sets and when to use it. Mention explicitly if the default composition changed.
.changeset/{name}-enricher.mdminor创建 ,使用 版本增量,并描述该 Enricher 设置的内容及其适用场景。如果默认组合发生变化,请明确说明。
.changeset/{name}-enricher.mdminorVerification
验证
bash
cd packages/evlog
pnpm run lint
pnpm run typecheck
pnpm run test
pnpm run buildbash
cd packages/evlog
pnpm run lint
pnpm run typecheck
pnpm run test
pnpm run build