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)
| Campo | Tipo | Descrição |
|---|---|---|
id | Uuid | Identificador único do evento |
timestamp | DateTime<Utc> | Momento da observação (ingest, não horário do log) |
source | SourceKind | Nginx, HttpProxy, Tcp, CloudflareLogs, Syslog, EdgeTls, Synthetic |
transport | Transport | Tcp, Udp, Quic, Internal |
direction | Direction | Inbound ou Outbound |
client_ip | IpAddr | IP do cliente, sempre canônico (IPv4-mapped vira IPv4 puro) |
client_port / server_port | Option<u16> | Portas de origem e de destino observadas |
geo | Option<GeoInfo> | País/subdivisão/cidade/lat/lon (MaxMindDB, populado pelo ingestor) |
asn | Option<u32> | Número do sistema autônomo do IP |
reputation | Option<ReputationInfo> | Tier + feed que casou (F3.7, populado pelo ingestor) |
bot | Option<BotStatus> | Resultado da verificação rDNS de crawler (F7.7, populado pelo pipeline) |
bytes_in / bytes_out | Option<u64> | Bytes recebidos/enviados |
duration_ms | Option<u64> | Duração request/response quando conhecida |
raw | Option<String> | Registro original (linha de log, syslog) para auditoria |
protocol | ProtocolData | Payload 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)
| Variante | Payload | Descrição |
|---|---|---|
Http(HttpData) | HttpData | Requisição HTTP/1.x ou HTTP/2 (nginx, syslog de proxy, edge inline) |
Tcp(TcpData) | TcpData | Observaçã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) | UdpData | Datagrama UDP; dns_query quando parece DNS |
TlsHandshake(TlsData) | TlsData | ClientHello: sni, ja3, ja4, cipher, version, alpn (F8) |
Syslog(SyslogData) | SyslogData | Mensagem RFC 5424 (fallback RFC 3164): facility, severity, hostname, app-name, message |
Raw(RawData) | RawData | Fallback para protocolos sem variante dedicada |
HttpData (campos principais)
| Campo | Descrição |
|---|---|
method | Option<HttpMethod> — enum tipado (Get, Post, …, Other) |
scheme / host | http/https e valor do header Host |
path / query / fragment | Caminho sem query, query string crua, fragmento |
status | Código de resposta quando observado (edge inline e proxy preenchem) |
user_agent / referer | Headers de identificação |
headers | Todos os headers capturados pela source (tokens http_* do log_format viram chaves kebab-case, habilitando regras DSL header.X) |
body | Bytes do corpo quando a source é inline (body_capture_kb limita) |
cookies | Cookies parseados (populados pela edge) |
uploads | Option<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
- Adicione uma variante a
ProtocolData. - Adicione um helper em
impl Event(ex.:pub fn meu_proto(&self) -> Option<&MeuData>). - Atualize
protocol_kind(). - Não adicione campos soltos no
Eventtop-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.