Review asynchronous trace and metric instrumentation

src/message-telemetry-types.tsTypeScript
@@ -0,0 +1,46 @@
1+export interface Message {
2+ id: string;
3+ type: string;
4+ customerEmail: string;
5+ tenantId: string;
6+ headers: Readonly<Record<string, string>>;
7+ payload: unknown;
8+}
9+
10+export interface TraceContext {
11+ traceId: string;
12+}
13+
14+export interface Span {
15+ recordException(error: unknown): void;
16+ setStatus(status: "ok" | "error"): void;
17+ end(): void;
18+}
19+
20+export interface Tracer {
21+ extract(headers: Readonly<Record<string, string>>): TraceContext | undefined;
22+ startSpan(name: string, parent?: TraceContext): Span;
23+ runWithSpan<T>(span: Span, work: () => T): T;
24+ activeTraceId(): string | undefined;
25+}
26+
27+export interface Logger {
28+ info(message: string, fields?: Readonly<Record<string, unknown>>): void;
29+}
30+
31+export interface Counter {
32+ add(value: number, labels: Readonly<Record<string, string | boolean>>): void;
33+}
34+
35+export interface MessageTelemetry {
36+ tracer: Tracer;
37+ logger: Logger;
38+ messagesAttempt: Counter;
39+ messagesFinal: Counter;
40+}
41+
42+export type MessageProcessor = (message: Message) => Promise<void>;
43+
44+export type AttemptResult =
45+ | { kind: "succeeded" }
46+ | { kind: "retry"; error: unknown };