关于 otel-expo-style
面向 Expo 移动应用的 OpenTelemetry 监控配置技能,强调保留运行时判断,并涵盖 SDK 初始化、自动埋点和业务操作追踪。
主要功能
- 01按运行时条件初始化
- 02配置 OpenTelemetry tracer 和 meter
- 03自动埋点 fetch/XHR
- 04记录业务操作 span 和指标
- 05配置 Superlog 端点与令牌
适用场景
- 01仅在支持的 Expo 构建中初始化监控
- 02无需包装应用代码即可追踪 API 调用
- 03为业务操作记录 span 和计数器
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ superloglabs/ skills --skill otel-expo-style安装后在 Claude Code 中输入/otel-expo-style确认已加载。
详细介绍
OTel Expo 风格
保留现有的运行时保护逻辑。如果应用在 Expo Go 或不支持的运行时分支中避免使用原生 SDK,则仅在受支持的分支中初始化 OTel。
const isExpoGo = process.env.EXPO_PUBLIC_RUNTIME === "expo-go";
if (!isExpoGo) {
initObservability();
Sentry.init({ dsn: process.env.EXPO_PUBLIC_SENTRY_DSN });
}
registerRootComponent(App);
在受支持的构建中,先调用 initObservability(),再初始化 Sentry,并在应用注册或用户代码执行之前完成。
SDK 结构
使用原生 OTel JS API 和兼容浏览器/移动端的提供程序与导出器。不要创建 recordCounter、sendSuperlogSpan 或跟踪专用的辅助文件。
export const tracer = trace.getTracer("mugline.mobile");
export const meter = metrics.getMeter("mugline.mobile");
export const ordersSubmitted = meter.createCounter("mug.orders.submitted");
在兼容时添加自动 fetch/XHR 插桩,让 API 调用自动生成 span,无需包装应用代码。
产品操作
使用原生活动 span 包装低风险业务操作。
await tracer.startActiveSpan("mug.order.submit", async (span) => {
try {
span.setAttribute("tenant.id", tenantId);
ordersSubmitted.add(1, { "tenant.id": tenantId, outcome: "success" });
} catch (error) {
span.recordException(error as Error);
span.setStatus({ code: SpanStatusCode.ERROR });
throw error;
} finally {
span.end();
}
});
配置
将端点和 sl_public_ 令牌直接内联到可观测性模块中。该令牌限定于项目、仅可写入,并且适合安全地放入客户端包中。避免为 Superlog 使用 EXPO_PUBLIC_* 环境变量,这样移动端构建就不依赖部署时配置。
const SUPERLOG_ENDPOINT = "https://intake.superlog.sh";
const SUPERLOG_PUBLIC_TOKEN = "sl_public_...";
const SERVICE_NAME = "mugline-mobile";
// The token MUST be sent as the `x-api-key` header. Ingest only reads
// `x-api-key` or `Authorization: Bearer <token>`; any other header name 401s.
function superlogHeaders(token: string): Record<string, string> {
return { "x-api-key": token };
}
const exporter = new OTLPTraceExporter({
url: `${SUPERLOG_ENDPOINT}/v1/traces`,
headers: superlogHeaders(SUPERLOG_PUBLIC_TOKEN),
});
评论
支持 Markdown