# Traces, logs và dữ liệu nhạy cảm

> Node lọc khoá bí mật, header, query, IP, SQL và mã hoá id người dùng trước khi lưu; những gì bạn không nên bật trong instrumentation.

Span và log có thể mang nhiều hơn bạn định gửi: một token trong URL, một header bị instrumentation chép vào, một email trong dòng log. Belvador lọc trên node của bạn trước khi lưu, nhưng dữ liệu an toàn nhất là dữ liệu app không bao giờ gửi đi.

## Node lọc gì trước khi lưu

Node chạy cùng bộ lọc như với lỗi (xem [Quyền riêng tư](https://belvador.dev/vi/docs/privacy#lop-2-node-cua-ban-truoc-khi-luu)) trên mọi resource, span, event, link và bản ghi log:

- **Bí mật theo tên** — thuộc tính như `password`, `token`, `api_key`, `authorization` hay `secret`, ở mọi độ sâu, thành `[Filtered]`.
- **Header HTTP** — thuộc tính header (`http.request.header.*`, `http.response.header.*`) bị bỏ trừ các header vô hại: `content-type`, `content-length`, `content-encoding`, `accept`, `accept-encoding`, `accept-language`, `user-agent`, `cache-control`, `x-request-id`, `traceparent`.
- **URL** — tên người dùng và mật khẩu bị gỡ khỏi `url.full` và các thuộc tính tương tự, tham số query có tên nhạy cảm bị lọc; `url.query` được lọc theo cùng cách.
- **Địa chỉ IP** — địa chỉ client và peer bị che (phần cuối IPv4 về 0, IPv6 chỉ giữ 48 bit đầu); IPv4 công khai nằm trong nội dung log và văn bản khác cũng bị che như vậy, còn địa chỉ nội bộ và loopback được giữ nguyên.
- **ID người dùng** — `user.id` và `enduser.id` được thay bằng mã băm có muối, nên vẫn đếm và gom theo người dùng được.
- **SQL** — chuỗi và số trong `db.query.text` (và `db.statement` kiểu cũ) thành `?`.
- **Độ dài** — giá trị quá dài bị cắt và kết thúc bằng `…[truncated]`; [giới hạn](https://belvador.dev/vi/docs/reference/otlp#gioi-han) ghi rõ ở đâu.

Các nhóm này theo cài đặt **Bảo vệ dữ liệu** của project: nếu owner tắt một nhóm ở đó, loại giá trị đó được lưu đúng như khi gửi.

## Đừng bật những thứ này

Instrumentation OpenTelemetry mặc định thu rất ít. Hãy để các mục sau tắt, trừ khi có lý do và đã kiểm dữ liệu:

- **header** của request và response (`OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_*`, `OTEL_INSTRUMENTATION_HTTP_*_HEADERS` và tương tự),
- **thân** request và response,
- **giá trị tham số** truy vấn cơ sở dữ liệu,
- **nội dung prompt và câu trả lời GenAI** (`OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT` và tương tự),
- detector resource **`process`** của Node.js, vốn chép nguyên dòng lệnh vào từng span — [cách cài Node.js](https://belvador.dev/vi/docs/otel/node#cac-bien-o-tren-lam-gi) đã bỏ nó ra.

## Dòng log

Thân log là chữ tự do. Node lọc giá trị trông như bí mật trong thuộc tính có cấu trúc và các mẫu token đã biết, nhưng không thể biết một câu có chứa địa chỉ của khách hàng. Hãy ghi log mã định danh, không ghi dữ liệu cá nhân, và ưu tiên trường có cấu trúc (`logger.info({ orderId }, "paid")`) để quy tắc lọc nhìn thấy tên.

## Dữ liệu nằm ở đâu

Span và bản ghi log chỉ được lưu trên node của bạn và giữ theo thời gian bạn đặt (xem [Lấy mẫu và chi phí](https://belvador.dev/vi/docs/otel/sampling-and-cost)). Edge của Belvador xử lý từng request khi đang truyền và, trong lúc node tắt, giữ nó ở dạng mã hoá bằng khoá của node; cơ sở dữ liệu của Belvador chỉ nhận metadata như tên dịch vụ, tên SDK và số lượng.
