What a Healthy Capture Looks Like

This guide shows what successful Qtap captures look like for different binaries and scenarios. Use these patterns as a reference when troubleshooting capture issues.

Understanding Healthy Captures

A healthy Qtap capture successfully:

  1. ✅ Detects the TLS handshake (SNI, TLS version)

  2. ✅ Identifies the HTTP protocol (http1, http2, http3)

  3. ✅ Captures process metadata (PID, binary path)

  4. ✅ Parses HTTP request/response headers and body

  5. ✅ Reports accurate byte counts and duration

Key indicator: "l7Protocol": "http1" or "http2" (NOT "other")


Quick Reference: Healthy Capture Checklist

When reviewing Qtap logs, a healthy capture shows:

If ANY of these are missing, investigate further with --bpf-trace.


curl: HTTP/2 over HTTPS

Complete HTTP Transaction JSON

Debug Log Indicators (curl)

TLS Handshake Detection:

Protocol Detection:

Connection Metadata:

Connection Report:


wget: HTTP/1.1 over HTTPS

Debug Log Indicators (wget)

TLS Handshake:

Protocol Detection:

HTTP Request Captured:

HTTP Response Captured:


Python requests: HTTP/1.1 over HTTPS

Debug Log Indicators (Python)

TLS Handshake:

Protocol Detection:

HTTP Transaction:


Debug Log Patterns

Healthy Capture Sequence

  1. Socket Connection

  2. TLS Detection (for HTTPS)

  3. Protocol Detection

  4. HTTP Capture

  5. Connection Finalization

Key Fields to Check

✅ Success Indicators

  • "l7Protocol": "http1" or "http2" (NOT "other")

  • "tlsProbeTypesDetected": ["openssl", ...] for HTTPS

  • "gotTLSClientHelloEvent": true for HTTPS

  • "gotProtocolEvent": true

  • "dataEventCount": > 0

  • "bytesSent": > 0 and "bytesReceived": > 0

❌ Failure Indicators

  • "l7Protocol": "other" - HTTP parsing failed

  • "gotProtocolEvent": false - Protocol not detected

  • "dataEventCount": 0 - No data captured

  • "write_bytes": 0, "read_bytes": 0 - No traffic seen


BPF Trace Patterns

When to Use BPF Trace

Use --bpf-trace for deep troubleshooting of capture issues. See BPF Trace - Advanced Debugging for complete details.

What it shows:

  • Individual syscall invocations (read, write, writev)

  • File descriptor (FD) numbers per operation

  • Data transfer sizes per syscall

  • TLS/SSL detection decisions per-FD

Healthy BPF Trace Example (curl)

Connection Metadata

HTTP Transaction Artifact


Troubleshooting: What to Look For

Problem: HTTP Parsing Fails (l7Protocol: "other")

Check:

  1. Was TLS detected? Look for tlsProbeTypesDetected

  2. Was protocol detected? Check gotProtocolEvent: true

  3. Was data captured? Check dataEventCount > 0

Common causes:

  • Non-standard HTTP libraries (custom TLS wrappers)

  • Binary not using OpenSSL/BoringSSL (see tlsProbeTypesDetected)

  • Compression or encryption before TLS layer

Problem: No Capture at All

Check:

  1. Is process filtered? Look for filter matches in debug logs

  2. Is Qtap running? Check for eBPF program loaded and listening

  3. Is traffic direction captured? Verify direction config matches traffic

Debug command:

Problem: Missing Headers or Body

Check capture level:

  • none: No capture

  • summary: Basic info only (no headers/body)

  • details: Headers included (no body)

  • full: Everything (headers + body)

Verify plugin config:

Problem: Zero Bytes Captured

Check:

  1. Connection report: write_bytes and read_bytes should be > 0

  2. Socket close event: Should show non-zero byte counts

  3. BPF trace: Look for syscall data transfer events

Common causes:

  • Qtap started after traffic (must start before)

  • Connection reused from before Qtap started

  • Traffic on different network interface


Additional Resources

Last updated