SentrySentry
Arquitetura

Modelo de Dados

Event, ProtocolData, HttpData e uploads — o contrato central do Sentry

Modelo de Dados

O Event é modular por design: campos comuns a qualquer origem vivem no top-level; o que é específico de protocolo fica no enum ProtocolData. Heurísticas, regras e o scorer fazem pattern match nos helpers de acesso e retornam cedo para variantes que não tratam — nenhum estágio do pipeline pode assumir que um evento é HTTP.

Event (top-level)

CampoTipoDescrição
idUuidIdentificador único do evento
timestampDateTime<Utc>Momento da observação (ingest, não horário do log)
sourceSourceKindNginx, HttpProxy, Tcp, CloudflareLogs, Syslog, EdgeTls, Synthetic
transportTransportTcp, Udp, Quic, Internal
directionDirectionInbound ou Outbound
client_ipIpAddrIP do cliente, sempre canônico (IPv4-mapped vira IPv4 puro)
client_port / server_portOption<u16>Portas de origem e de destino observadas
geoOption<GeoInfo>País/subdivisão/cidade/lat/lon (MaxMindDB, populado pelo ingestor)
asnOption<u32>Número do sistema autônomo do IP
reputationOption<ReputationInfo>Tier + feed que casou (F3.7, populado pelo ingestor)
botOption<BotStatus>Resultado da verificação rDNS de crawler (F7.7, populado pelo pipeline)
bytes_in / bytes_outOption<u64>Bytes recebidos/enviados
duration_msOption<u64>Duração request/response quando conhecida
rawOption<String>Registro original (linha de log, syslog) para auditoria
protocolProtocolDataPayload específico do protocolo

A source produz um RawEvent "magro"; o ingestor promove para Event e preenche geo/ASN/reputação.

ProtocolData (enum de protocolos)

VariantePayloadDescrição
Http(HttpData)HttpDataRequisição HTTP/1.x ou HTTP/2 (nginx, syslog de proxy, edge inline)
Tcp(TcpData)TcpDataObservação de stream TCP não-HTTP: flags, payload reassemblado, stream_id, estágio, fingerprint SYN (window:options:MSS:wscale) e syn_count (agregação de rajada, F5)
Udp(UdpData)UdpDataDatagrama UDP; dns_query quando parece DNS
TlsHandshake(TlsData)TlsDataClientHello: sni, ja3, ja4, cipher, version, alpn (F8)
Syslog(SyslogData)SyslogDataMensagem RFC 5424 (fallback RFC 3164): facility, severity, hostname, app-name, message
Raw(RawData)RawDataFallback para protocolos sem variante dedicada

HttpData (campos principais)

CampoDescrição
methodOption<HttpMethod> — enum tipado (Get, Post, …, Other)
scheme / hosthttp/https e valor do header Host
path / query / fragmentCaminho sem query, query string crua, fragmento
statusCódigo de resposta quando observado (edge inline e proxy preenchem)
user_agent / refererHeaders de identificação
headersTodos os headers capturados pela source (tokens http_* do log_format viram chaves kebab-case, habilitando regras DSL header.X)
bodyBytes do corpo quando a source é inline (body_capture_kb limita)
cookiesCookies parseados (populados pela edge)
uploadsOption<Vec<UploadInfo>> — metadados de arquivos enviados (F10); conteúdo nunca persiste
upstream_time_ms$upstream_response_time (F12, primeiro valor de listas)

UploadInfo / UploadKind (F10)

UploadInfo carrega field_name, filename, content_type, size e kind. O UploadKind classifica por magic bytes (declaração do cliente é só dica): Text, Image (PNG/JPEG/GIF/WebP/BMP), Archive (ZIP/gzip/bzip2), Executable (MZ/ELF/Mach-O/shebang), Pdf, Unknown.

Helpers de acesso

impl Event {
    pub fn http(&self) -> Option<&HttpData>
    pub fn tcp(&self) -> Option<&TcpData>
    pub fn tls(&self) -> Option<&TlsData>
    pub fn syslog(&self) -> Option<&SyslogData>
    pub fn protocol_kind(&self) -> ProtocolKind
}

Regras DSL usam protocol_kind() para condições de protocolo (ProtocolKind: Http, Http3, Tcp, Udp, Tls, Other).

Regra de ouro: adicionando um novo protocolo

  1. Adicione uma variante a ProtocolData.
  2. Adicione um helper em impl Event (ex.: pub fn meu_proto(&self) -> Option<&MeuData>).
  3. Atualize protocol_kind().
  4. Não adicione campos soltos no Event top-level — coloque no enum.

Assim consumidores antigos continuam compilando (só ignoram a variante nova) e o mesmo pipeline serve nginx hoje e TCP/TLS amanhã.

Normalização de encoding (heurísticas)

Heurísticas (SQLi, XSS, path traversal, etc.) rodam sobre a forma URL-decodificada do path/query (heuristics::http_text), para que payloads encodados (%27 = ', + ou %20 = espaço) não façam bypass. Ao escrever novas heurísticas, sempre use http_text(http) em vez de ler http.path / http.query diretamente.

On this page