@absourutejs/errors-postgres (英语)
后发后发后发, 效应本土 IssueStore 页:1
@absolutejs/errors —— 说
耐用"问题"表面(哨兵的产品核心),自发寄托在您身上
拥有Postgres.
长期分类 问题 + 仅一个附件 事件时间表,与 新的回归 探测在单一原子CTE上升中得到解析—— 一个往返,没有交易, 所以它工作过尼昂的HTTP驱动器.
安装
bun add @absolutejs/errors-postgres
# plus your driver + peers:
bun add @absolutejs/errors effect postgres # or @neondatabase/serverless
postgres 财务报告和审定财务报表 @neondatabase/serverless 为: 选项 同伴——安装
随便你用哪个司机.
使用量
滴水龙头
从您的应用程序中再导出软件包表格, 用 您的正常迁移工作流程 :
export { errorEvents, errorIssues } from "@absolutejs/errors-postgres";
import { createDrizzleIssueStore } from "@absolutejs/errors-postgres";
const store = createDrizzleIssueStore({ db });
Drizzle 商店使用交易进行原子事件/组更新, 便携式 本地 JSONB 用于标记和额外的上下文,行锁定用于回归检测, 和与被标记的模板适配器相同的效果出错通道. JSONB 值作为本地对象传递给 Drizzle 驱动程序(而不是 预序列化字符串,防止被 Bun SQL 存储为 JSON 字符串.
标记模板相容性
import postgres from "postgres";
import { createErrorTracker } from "@absolutejs/errors";
import { createPostgresIssueStore } from "@absolutejs/errors-postgres";
const sql = postgres(process.env.DATABASE_URL!);
const errors = createErrorTracker({
project: "acme",
release: process.env.RELEASE,
store: createPostgresIssueStore({ sql }), // schema auto-created, lazy
onIssue: (r) => alert(r.issue), // only on new / regression
});
await errors.captureException(err, { traceId, replayId });
作品与 @neondatabase/serverless数字 :
import { neon } from "@neondatabase/serverless";
const sql = neon(process.env.DATABASE_URL!);
createPostgresIssueStore({ sql });
执行什么
每个方法返回一个 Effect 输入 IssueStoreError 频道
(单位:千美元)IssueStoreSchemaError 编号 : IssueStoreQueryError 编号 :
IssueStoreSerializationError)——失败是价值,而不是抛出.
| 方法 | 效果 |
|---|---|
record(event) | 原子升高(一个事件) □ { issue, isNew, isRegression } |
recordCoalesced(group) | 计数上升+大宗 unnest 插入——每群一次往返旅行 |
listIssues(filter?) | 仪表板列表(项目/环境/状态/ILIKE标题),最新首发 |
getIssue(project, fingerprint) | Option<IssueRecord> |
setState(project, fingerprint, state) | 解析/ 忽略/ 未解析 |
assign(project, fingerprint, who | null) | 分数 |
listEvents(project, fingerprint, limit?) | 发生时间,最新第一次 |
组合语义( 镜像) createMemoryIssueStore 确切的说)
- 新的回归 在一个语句中检测到:
xmax = 0⇒行 插入( 新); CTE 抓取更新前的日期state,所以一个resolved再次看到的问题是一个 回归 转回unresolved。 。 。 .ignored问题保持沉默. - 严重性不断升级,从未降级 —— 说
fatal > error > warning > info。 。 。 . - 第一次/最后一次释放 追踪到的
first_release)). 后补. lastSeen用途GREATEST——出事事件永不倒计时.
斯克马 (懒惰,同能)
在第一次使用时创建( 设置) ensureSchema: false 通过移民管理.
tablePrefix 默认为 error → error_issues + 键 error_events。 。 。 .
error_issues PK (project, fingerprint) -- one row per grouped issue
error_events bigserial id -- append-only occurrences (jsonb tags/extra)
索引 : (project, last_seen DESC) 财务报告和审定财务报表 (project, state) 关于问题;
(project, fingerprint, at DESC) 活动.
trace_id 编号 : span_id (-) @absolutejs/telemetry和 replay_id
(-) @absolutejs/replay) 存储每个事件,这样一个仪表板可以交叉链接
一个问题 准确的追踪 和DOM重放.
error_issues 还载有决议线索—— resolved_at, (中文(简体) ),
resolved_by, (中文(简体) ), resolved_release, (中文(简体) ), resolution_note ——分块板
当一个问题结束的时候写. ensureSchema 将它们添加到现有的表格中;
通过迁移拥有其计划的申请必须自己加入
在升级之前,因为商店会写它知道的每一个专栏.
选择来自 Drizzle 的系统存储, 用于应用程序管理的数据库或 用于轻量级和尼昂HTTP的原始标记-模板相容性商店 一体化.
曲线
商店回答"什么破了,多久破了". 上面的一块板子必须
回答一个人在它面前实际问到的问题: 什么是现在打破,谁是
在它上,完成了固定, 释放引入了这一点. createIssueTriage
是那些询问, 绑在一个项目上 .
import { createIssueTriage } from "@absolutejs/errors-postgres";
const triage = createIssueTriage({ db, project: "acme" });
await triage.list({ severity: "error", state: "unresolved" });
await triage.get(fingerprint); // issue + recent events
await triage.occurrences(fingerprint, 14); // zero-filled daily sparkline
await triage.stateCounts(); // numbers for the filter chips
await triage.setState(fingerprint, "resolved", { by, note, release });
await triage.assign(fingerprint, "alex");
await triage.releaseStats(["sha1", "sha2"]);
A 类 回归 被导出, 不存储 : 摄入上浮翻转解
发回 unresolved 当它复发而离去的时候 resolved_at 已经到位,所以
未解决 + 解析印章 + 活动 后表示修补没有被持有 .
setState 清除重开的线索, 因为手动重开是决定
而不是一个失败的修复, 和幸存的邮票会成为下一个
重现看起来像一个.
releaseStats 需要的部署分类账:
发布,其中提出了多少问题,从它之前,
或被宣布为固定在其中
3个警告的部署与1个不同
引入了三个错误。 每放出一桶,每桶一桶.
许可证
阿帕奇2.0 (英语).