PII e privacidade: LGPD/GDPR no client, scrubbing, consentimento, data minimization
7 min de leitura
Voce instalou Sentry, OTel, e feature flags. Tudo funcionando. Ate que o DPO (Data Protection Officer) da empresa pergunta: "esse Sentry coleta dados de usuarios brasileiros? Voce pediu consentimento? Ta' em conformidade com LGPD?". Esse no cobre PII e privacidade: o que observabilidade pode infringir em LGPD/GDPR, como fazer scrubbing de dados sensiveis antes de enviar, consentimento do usuario, e data minimization (recolher minimo necessario).
A linha de fundo: **observabilidade coleta MUITO dado (user ID, IP, user agent, comportamento, geolocalizacao) que pode ser PII (Personally Identifiable Information). Sem cuidado, voce viola LGPD/GDPR, gera multa, e perde confianca do user. Nao e' "sentry, nao precisa se preocupar". Sim precisa.
Voce sai de "instalei e esqueci" pra "instalei, configurei privacy, e documentei".
O essencial 🟢
O que e' PII. Personally Identifiable Information = qualquer dado que identifica uma pessoa: direto (nome, email, CPF, IP) ou indireto (user ID + cookies + geolocalizacao). Em LGPD/GDPR, tratar PII (recolher, armazenar, processar) tem regras estritas.
PII comum em observabilidade.
- Direto: email, nome, telefone, CPF, endereco.
- Indireto: IP, user ID, user agent, cookies, geolocalizacao (lat/long), device ID.
- Comportamental: cliques, navegacao, tempo em pagina.
Sentry/OTel coletam MUITO disso por default. Voce precisa scrub.
LGPD vs GDPR - diferencas praticas.
- LGPD (Brasil, 2020): similar a GDPR. ANPD e' a autoridade. Multa maxima: 2% do faturamento (cap R$ 50M por infracao).
- GDPR (Europa, 2018): ICO (UK), CNIL (FR), etc. Multa maxima: 4% do faturamento global (cap €20M).
Em 2026, LGPD e GDPR sao praticamente equivalente em frontend. Implementar LGPD-compliant = GDPR-compliant (e vice-versa).
Os 5 principios da LGPD pra observabilidade.
- Finalidade: coletar dado com proposito especifico ("medir performance" e' OK; "analisar comportamento" sem consentimento, nao).
- Necessidade (data minimization): recolher minimo necessario. IP do user nao e' necessario pra "medir LCP" - anonimize.
- Transparencia: user sabe o que esta' sendo coletado (privacy policy, cookie banner).
- Seguranca: proteger dado coletado (encryption at rest, in transit). Sentry HTTPS e' obrigatorio.
- Direito do titular: user pode
pedir acesso, correcao, exclusao
dos dados. Sentry tem API de
delete (
/api/0/projects/{org}/{proj}/users/{user_hash}/).
Pipeline de PII em observabilidade.
Sentry scrubbing - beforeSend.
Sentry.init({
dsn: "...",
sendDefaultPii: false, // NAO envia PII por default
beforeSend: (event) => {
// 1. Remove user.email
if (event.user) {
delete event.user.email;
delete event.user.ip_address;
delete event.user.geo;
}
// 2. Scrub breadcrumbs (URLs com query params)
if (event.breadcrumbs) {
event.breadcrumbs = event.breadcrumbs.map((b) => {
if (b.data?.url) {
const url = new URL(b.data.url);
url.search = ""; // remove query params
b.data.url = url.toString();
}
return b;
});
}
// 3. Remove exception values com PII
if (event.exception?.values) {
event.exception.values = event.exception.values.map((e) => {
if (e.value?.includes("@")) {
e.value = e.value.replace(
/[\w.-]+@[\w.-]+\.\w+/g,
"[REDACTED]"
);
}
return e;
});
}
return event;
},
});
sendDefaultPii: false e' critico
- por default e'
true(envia IP, user agent, cookies). Setfalsee explicitamente adicione o que voce precisa.
OTel scrubbing. OTel nao tem
beforeSend nativo, mas da' pra
adicionar um processor:
import { SpanProcessor } from "@opentelemetry/sdk-trace-web";
class PIISpanProcessor implements SpanProcessor {
onStart(span, parentContext) {}
onEnd(span) {
// Remove PII attributes
const attrs = span.attributes;
if (attrs["user.email"]) {
delete attrs["user.email"];
}
if (attrs["http.url"]) {
const url = new URL(String(attrs["http.url"]));
url.search = "";
attrs["http.url"] = url.toString();
}
}
shutdown() {}
forceFlush() {}
}
provider.addSpanProcessor(new PIISpanProcessor());
Consentimento - "user tem que aceitar". Em LGPD/GDPR, cookie banner ou opt-in e' obrigatorio pra coleta nao essencial. Sentry, RUM, e feature flags sao nao essenciais - precisam consent:
// Consent mode
function trackEvent(event) {
if (!hasAnalyticsConsent()) return; // user recusou
Sentry.captureMessage(event);
}
// Ou via tag
Sentry.setTag("consent.analytics", "granted");
Google Consent Mode v2. Padrao do
Google pra gerenciar consent em
Google Analytics, Google Ads, e
ferramentas de ads. Adotado por
Sentry e outros. 2 modos:
granted (analytics permitido),
denied (analytics bloqueado).
gtag("consent", "update", {
ad_storage: "granted",
analytics_storage: "granted",
});
Data minimization - "recolher minimo". Pergunte: "eu realmente preciso desse dado?". Exemplos:
- IP - precisa pra geolocation
(Sentry mostra "user de SP"). Mas
da' pra usar CDN header
(
cf-ipcountry) em vez de IP completo. Sentry tem opcao de drop IP. - User agent - util pra debug
("so' Safari 14 tem esse bug").
Truncar se nao precisar
completo (
Safari/14em vez deMozilla/5.0 (...)Safari/14...). - Geolocation precisa (lat/long) - raramente necessario. Country-only basta pra maioria dos casos.
sendDefaultPii: false em Sentry =
sem IP, sem cookies, sem user agent
completo. Sentry ainda tem
tracesSampler que faz geo via
Cloudflare/Vercel headers (sem
IP completo).
Feature flags e privacidade. LaunchDarkly envia user attributes (country, email, plan) pro SaaS. Targeting = "10% dos users em BR ve nova feature". Em LGPD, targeting por atributo pessoal (email, pais) pode ser tratamento de dado pessoal. Mitigacoes:
- Hash de user identifier (envie hash, nao email).
- Opt-in explicito.
- Privacy policy declara uso de feature flags.
Sessao de replay e LGPD. Sentry Session Replay grava DOM. Sem cuidado, texto digitado em input (que pode ser senha, CPF, email) e' capturado. Mitigacoes:
Sentry.init({
replays: {
maskAllText: true, // texto vira ***
blockAllMedia: true, // imagens/video nao gravados
},
});
// Específico: mascara inputs
document.querySelectorAll("input[type='password']").forEach((el) => {
el.setAttribute("data-sentry-mask", "true");
});
Retencao - "quanto tempo guardar?". LGPD/GDPR nao dao numero exato, mas "necessario pra finalidade" se aplica. Recomendacoes:
- Sentry: 30-90 dias de retencao.
- OTel traces: 7-30 dias (volume alto).
- Logs: 30-90 dias.
- Session replay: 7-30 dias (sensiveis).
Sentry API delete (LGPD "right to be forgotten"):
# Deletar user do Sentry
curl -X DELETE \
-H "Authorization: Bearer YOUR_TOKEN" \
https://sentry.io/api/0/projects/{org}/{proj}/users/{user_hash}/
Documente no privacy policy como user pode pedir exclusao de dados de observabilidade.
Aprofundamento 🟡
Cross-border data transfer. LGPD proibe transferencia de dados pessoais pra paises sem nivel adequado de protecao. Sentry, Datadog tem data centers em US e EU. GDPR (europeu) requer que dados de EU citizens fiquem em EU (ou paises adequacy). Sentry SaaS US viola GDPR pra users europeus (a menos que use Sentry EU region).
Sentry EU Region: de.sentry.io
(Germany), us.sentry.io (US).
Configure DSN pra apontar pra
regiao correta:
Sentry.init({
dsn: "https://...@de.sentry.io/123", // EU
});
Data Processing Agreement (DPA). LGPD/GDPR exigem que voce (controlador) e Sentry (operador) tenham DPA formal. Sentry tem DPA pronto em sentry.io/legal/dpa. Assine antes de usar Sentry em prod.
Subprocessors. Sentry usa subprocessors (Cloudflare, AWS, etc). Documente no privacy policy. Sentry publica lista em sentry.io/legal/subprocessors.
OpenTelemetry Collector + PII filtering. Em prod, OTel Collector pode filtrar PII antes de enviar pro backend:
processors:
attributes/pii:
actions:
- key: user.email
action: delete
- key: http.url
action: update
value: "%{url.scheme}://%{url.host}%{url.path}"
- key: client.address
action: hash
Stronger privacy com differential privacy. Em casos extremos, adiciona "ruido" aos dados (differential privacy). Apple faz isso em telemetria - coleta "X users fizeram Y" mas com ±5% ruido. User individual nao e' identificavel. Overkill pra maioria dos apps, util em regulacao pesada (saude, financas).
Consent management platforms (CMP). SaaS que gerenciam consent de milhares de vendors (OneTrust, Cookiebot, Osano). Integram com Google Consent Mode v2, IAB TCF v2.1, e propagam consent pra todas as tags (GTM, Sentry, etc). Use em apps com muitos vendors.
PII em logs - automatic
redaction. Em Node/JS, use libs
como pino com redact: { paths: ['*.password', '*.token'] } ou
@logtail/redaction. Sentry tem
server-side scrubbing tambem
(config no dashboard).
Privacy by design. LGPD/GDPR favorecem "privacy by design" - trate PII desde o design, nao como "depois eu vejo". Concreto:
- Schema de evento: defina quais campos sao PII e sempre redacte.
- Data flow diagram: documente onde PII entra e para onde vai.
- DPIA (Data Protection Impact Assessment): analise de impacto, obrigatoria pra alto risco.
Anonimizacao vs pseudonimizacao.
- Anonimizacao: remove toda possibilidade de re-identificar. Irreversivel. LGPD/GDPR nao aplicam (dado nao e' mais pessoal).
- Pseudonimizacao: substitui identifier por hash/token. Reversivel (com a chave). LGPD/GDPR aplicam (ainda e' dado pessoal).
Hash SHA-256 do userId e' pseudonimizacao (reversivel se voce tem o userId original). Anonimizacao seria drop completo do userId.
Pra quem quer ir mais assim 🔴
HIPAA, PCI-DSS, SOC2. Alem de LGPD/GDPR, saude (HIPAA) e financas (PCI-DSS) tem regulacoes mais estritas. HIPAA proibe Sentry SaaS sem BAA (Business Associate Agreement)
- Sentry nao oferece. Self-host Sentry ou use alternativa HIPAA-compliant (New Relic, Datadog com BAA).
Privacy enhancing technologies (PETs). Federated learning, secure multi-party computation, homomorphic encryption - nao enviam dado bruto pra servidor. Pesquisa ativa, nao prod-ready em 2026.
GDPR Cookie Compliance em SPAs.
SPA tem desafio: page nao recarrega,
entao cookie banner precisa
re-checar consent a cada navigation.
Vue/React/Angular tem libs (e.g.,
@vue-cookie-accept-decline).
LGPD enforcement 2024-2026. ANPD aplicou primeiras multas em 2023- 2024. Casos publicos: Telecom (2023), varejista (2024). Valor medio: R$ 5-15M. Crescente - LGPD sendo enforced.
DPIA template. Em LGPD, DPIA obrigatoria para tratamento de dado sensivel (saude, raca, religiao) ou alto risco. Template gratis em https://www.gov.br/anpd/pt-br.
Leitura recomendada:
- LGPD - Portal do Governo - texto legal, FAQ, orientacoes.
- GDPR - EU Portal - texto legal, guia pratico, checklist.
- Sentry - Data Scrubbing - como configurar scrubbing, DPA, sub-processors.
Dica: o erro mais comum em observabilidade + LGPD e' "Sentry ja' e' LGPD-compliant". Nao e'. Sentry tem ferramentas (scrubbing, DPA, EU region), mas voce precisa configurar (
sendDefaultPii: false,beforeSend, region, etc). Default Sentry coleta IP, user agent completo, cookies - tudo PII. Sem configuracao, voce viola LGPD. 5 minutos de setup (sendDefaultPii + beforeSend) cobrem 80% dos casos. Documente no privacy policy. DPA assinado antes de prod.
No proximo no (ultimo), vamos projeto final: app completo com Sentry integrado, RUM com Web Vitals, OpenTelemetry com traces distribuidos, feature flag pra rollout progressivo, e PII scrubbing em conformidade com LGPD. O "hello world" de apps observaveis em producao.
// Quiz
Por que `sendDefaultPii: false` em Sentry e' o primeiro passo obrigatorio pra conformidade com LGPD/GDPR?