# Traces từ Vercel và Next.js: từ app hoặc bằng Trace Drain

> SDK Node của OpenTelemetry trong instrumentation.ts, Trace Drains cho gói Pro và Enterprise, và vì sao Log Drains cần Collector.

Có hai cách đưa traces từ app trên Vercel tới Belvador: để app tự xuất (mọi gói), hoặc để Vercel chuyển tiếp traces của chính nó bằng Trace Drain (gói Pro và Enterprise). Logs cần cách thứ nhất — Log Drains của Vercel không dùng OTLP.

> **Chưa kiểm:** cách cài này theo tài liệu của nhà cung cấp; Belvador chưa chạy trọn đường gửi.

## Từ app của bạn (Next.js)

Next.js nạp `instrumentation.ts` lúc khởi động. Xuất bằng SDK OpenTelemetry chuẩn cho Node, chỉ trong runtime Node.js — nó không chạy trong runtime Edge:

```ts
// instrumentation.ts
export async function register() {
  if (process.env.NEXT_RUNTIME === "nodejs") {
    await import("./instrumentation.node");
  }
}
```

```ts
// instrumentation.node.ts
import { getNodeAutoInstrumentations } from "@opentelemetry/auto-instrumentations-node";
import { NodeSDK } from "@opentelemetry/sdk-node";

new NodeSDK({ instrumentations: [getNodeAutoInstrumentations()] }).start();
```

Cài `@opentelemetry/sdk-node` và `@opentelemetry/auto-instrumentations-node`, rồi đặt [bộ biến chuẩn](https://belvador.dev/vi/docs/otel/quickstart#2-dat-cac-bien-chuan) ở **Project Settings → Environment Variables** — khoá là biến nhạy cảm, không bao giờ là biến `NEXT_PUBLIC_`. SDK đọc endpoint, header, tên dịch vụ và môi trường từ đó, và gửi log của Pino, Bunyan hay Winston như ở trang [Node.js](https://belvador.dev/vi/docs/otel/node#logs).

`@vercel/otel` (`registerOTel`) cũng dùng được nếu bạn muốn; hãy đưa cho nó một exporter OTLP cụ thể để nó không chọn exporter do Vercel cấu hình.

Hàm serverless bị đóng băng khi response đã gửi, nên một lô có thể chờ tới request sau hoặc bị mất. Belvador chưa đo mức độ trên Vercel.

## Bằng Trace Drain (Pro, Enterprise)

Vercel chuyển tiếp các trace nó ghi cho deployment của bạn — không cần code. Ở **Team Settings → Drains → Add Drain**:

| Trường | Giá trị |
|---|---|
| Data | Traces |
| Projects | Các project cần chuyển tiếp |
| Endpoint | `https://ingest.belvador.dev/otlp/<project-id>/v1/traces` |
| Format | Protobuf |
| Custom header | `Authorization: Bearer <khoá ingest>` |

Dùng khoá ingest có **Traces**. Vercel còn thêm header `x-vercel-signature` riêng; Belvador xác thực bằng khoá bearer và bỏ qua header đó. Quy tắc lấy mẫu chạy từ trên xuống và bỏ request không khớp quy tắc nào; không có quy tắc thì mọi trace được chuyển. Thuộc tính resource gồm `vercel.projectId` và `vercel.deploymentId`.

## Logs từ Log Drains của Vercel

Log Drains gửi JSON hoặc NDJSON của Vercel, không phải OTLP, nên endpoint logs của Belvador không đọc trực tiếp được. Hãy gửi logs từ app như ở trên, hoặc đặt một [Collector](https://belvador.dev/vi/docs/otel/collector) ở giữa với receiver đọc được định dạng của Vercel.

## Trạng thái

Cả hai cách làm theo tài liệu của Vercel và OpenTelemetry; Belvador chưa chạy chúng trên Vercel, nên được ghi là chưa kiểm. Sau khi cài, chạy [phép kiểm kết nối](https://belvador.dev/vi/docs/otel/verify) và tìm dịch vụ của bạn trong **Dịch vụ đã thấy**.
