@btravstack/可观察性
可观察性
@btravstack/core,从记录开始:a 严格Logger端口——无any,没有打印f,没有可变上下文,没有静态 实例——默认执行,将每行标注在环境中 单位的痕量ID、无依赖的JSON槽、子路径后皮诺和 内核的10个生命周期事件作为同流的日志行.
pnpm add @btravstack/observability @btravstack/core @btravstack/config @btravstack/di unthrown
这四个是同龄人. pino 是一个 选项 端点,仅在导入时需要
@btravstack/observability/pino节点 >=22。 。 。 .
实例
import { runMain, Logger } from "@btravstack/core";
import {
createLogger,
jsonSink,
kernelEvents,
observability,
} from "@btravstack/observability";
import { Module, Provider } from "@btravstack/di";
// The application depends on the port, like any other service.
const placeOrder = Provider(PlaceOrder)({
inject: { orders: OrderRepository, logger: Logger },
sync: ({ orders, logger }) => ({
execute: (id, quantity) =>
orders
.save({ id, quantity })
.tap(() => logger.info("order placed", { id, quantity })),
}),
});
// The starter provides it. `LOG_LEVEL` is read inside the graph and validated
// once — `verbose` is a startup failure naming the variable, not a silent
// fallback to `info`.
const OrderApi = HttpModule("OrderApi")({
router: orderRouter,
imports: [
OrdersSlice,
CustomersSlice,
cache({ adapter: redisCache() }),
observability(),
otel(),
],
});
// The kernel's own events, in the same stream and the same shape. The logger
// here is built by hand because `building` is emitted while the graph still
// is: the sink cannot come from the context it is watching.
await runMain(OrderApi, { onEvent: kernelEvents(createLogger(jsonSink())) });
单位内部的每行都带有 traceId, (中文(简体) ), unitId 财务报告和审定财务报表
tenantId - 伐木机读取 currentUnit() 每个呼叫,所以一个
应用程序瞄准镜对每个没有单一请求正确
参数串通了调用堆栈.
{
"orderId": "0199a1e0-0000-7000-8000-000000000001",
"time": "2026-08-16T09:41:02.113Z",
"level": "info",
"message": "order placed",
"unitId": "u-7",
"traceId": "3f9c…"
}
是什么使接口严格
| 决定 | 为什么 |
|---|---|
| A 类 端口,从一个类或静态 | 测试提供了自己的测试;没有全球性的测试可以达到过去 |
with(attributes) 返回一个日志 | 没有变异:两个瞄准镜不能相互间断上下文 |
Attributes 是一个平平的平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平平 | 日志后端索引的形状;没有 any,没有打印,没有字符串 |
失败了 cause | 一个 Error是因为 message 财务报告和审定财务报表 stack 不可假定的 -- -- JSON.stringify 单凭一己之力 就能减少值得保留的部分 |
| 它不能抛出 | 被打碎的水槽被吞没了:可观察性断层不能变成断层 |
| 六级,固定 | LOG_LEVEL 在启动时验证,以及 isEnabled 是一个比较 |
破坏执行工作
observability({ sink }) 替换目的地; 提供 Logger
自己来代替一切 对于一个需要皮诺吞吐量的部署:
import pino from "pino";
import { pinoSink } from "@btravstack/observability/pino";
observability({ sink: pinoSink(pino()) });
儿童记录员使用 trace 地板和所供应的伐木机保持不变.
关卡过滤器会保留这个软件包的.. LOG_LEVEL,验证一次——所以有
是过程中的一个过滤器,而不是两个可以不同意的过滤器.
JSON和皮诺汇都保留了安全的错误诊断并省略了任意性
错误的有效载荷 。 Pino 的错误序列器安装在儿童日志器上
trace,使提供的日志配置完好无损.
组合生产政策还预测环境单位、痕量和租户 在自定义汇和启动人拥有的跨度之前的关联性可以看到它。 UUIDs 和 非零 W3C 跟踪ID 存活; 免费文本不。 未配置的遗产渲染 并明确敏感地调试 保持他们现有的披露行为.
为尽量减少生产数据,通过共享 diagnosticPolicy() 结束
observability({ diagnostics }), (中文(简体) ), otel({ diagnostics }) 和临时的
installTemporalDiagnostics。没有这一明确政策,错误信息,
堆栈和有界原因链仍然可见。 见
披露政策参考
用于许可列表和单独的敏感调试访问和保留合同.
追踪和计量
包的另一半名字, 后面一个可选的相声子路径
pino 为:
pnpm add @opentelemetry/api @opentelemetry/sdk-node
import { observability } from "@btravstack/observability";
import { UnitSpanModule, otel } from "@btravstack/observability/otel";
// Beside observability() in the root's imports; the SDK is a resource of the
// graph — started with the scope, flushed by release on every exit path.
// Configuration is the OTEL_* environment conventions, read by the SDK itself.
const AppImports = [observability(), otel()];
// A span per unit, correlated with the same ids the logger stamps — bound on
// the starter's own `unit` option and forked by the runtime around each
// request, delivery or activity attempt, e.g.
// http({ unit: { anonymous: UnitSpanModule } })
入境的W3C traceparent 输入单位的微量id @btravstack/http-server 财务报告和审定财务报表
@btravstack/amqp-worker. 自动装置必须预装
(单位:千美元)node --import @opentelemetry/auto-instrumentations-node/register) —— 内容
无法成为提供者, 且软件包不会装作不是 。 满
语义
参考页。 。 。 .
许可证
麻省理工学院 贝诺伊特旅行社