Files
harukin-expo-dev-env 974c162a9e refactor: migrate from Sentry to custom telemetry for observability
- Replaced Sentry breadcrumbs and context setting with a custom telemetry implementation across various components including Apps, WebView, CarouselBox, and ndView.
- Introduced a new telemetry module to encapsulate observability logic and provide a unified API for logging events, messages, and exceptions.
- Updated documentation to reflect changes in observability architecture, consolidating Sentry initialization and telemetry usage.
- Enhanced error handling and logging in data fetching and application lifecycle management.
2026-09-01 01:11:13 +09:00

121 lines
2.8 KiB
TypeScript

import {
captureTelemetryException,
captureTelemetryMessage,
recordBreadcrumb,
setTelemetryContext,
setTelemetryTag,
startTelemetrySpan,
} from "./sentry";
export type TelemetryLevel =
| "debug"
| "info"
| "warning"
| "error"
| "fatal";
export type TelemetryData = Record<string, unknown>;
export type TelemetryBreadcrumb = {
category: string;
message: string;
level?: TelemetryLevel;
data?: TelemetryData;
};
export type TelemetryScopedBreadcrumb = Omit<TelemetryBreadcrumb, "category">;
export type TelemetryCaptureOptions = {
level?: TelemetryLevel;
tags?: Record<string, string>;
contexts?: Record<string, TelemetryData>;
extra?: TelemetryData;
fingerprint?: string[];
};
export type TelemetrySpanOptions = {
name: string;
description?: string;
op?: string;
attributes?: TelemetryData;
};
export type TelemetryScope = {
breadcrumb: (event: TelemetryScopedBreadcrumb) => void;
debug: (messageText: string, data?: TelemetryData) => void;
info: (messageText: string, data?: TelemetryData) => void;
warning: (messageText: string, data?: TelemetryData) => void;
error: (messageText: string, data?: TelemetryData) => void;
fatal: (messageText: string, data?: TelemetryData) => void;
};
function breadcrumb(event: TelemetryBreadcrumb): void {
recordBreadcrumb({
...event,
level: event.level ?? "info",
});
}
function context(name: string, data: TelemetryData | null): void {
setTelemetryContext(name, data);
}
function tag(name: string, value: string): void {
setTelemetryTag(name, value);
}
function message(
messageText: string,
options: TelemetryCaptureOptions = {},
): void {
captureTelemetryMessage(messageText, options);
}
function exception(
error: unknown,
options: TelemetryCaptureOptions = {},
): void {
captureTelemetryException(error, options);
}
function createScope(category: string): TelemetryScope {
const emit = (
level: TelemetryLevel,
messageText: string,
data?: TelemetryData,
) => {
breadcrumb({
category,
level,
message: messageText,
...(data === undefined ? {} : { data }),
});
};
return {
breadcrumb: (event) => breadcrumb({ category, ...event }),
debug: (messageText, data) => emit("debug", messageText, data),
info: (messageText, data) => emit("info", messageText, data),
warning: (messageText, data) => emit("warning", messageText, data),
error: (messageText, data) => emit("error", messageText, data),
fatal: (messageText, data) => emit("fatal", messageText, data),
};
}
function span<T>(
options: TelemetrySpanOptions,
callback: () => Promise<T>,
): Promise<T> {
return startTelemetrySpan(options, callback);
}
export const telemetry = {
breadcrumb,
context,
tag,
message,
exception,
span,
scope: createScope,
};