fetch_ml/tests/benchmarks/log_sanitize_bench_test.go
Jeremie Fraeys 7305e2bc21
test: add comprehensive test coverage and command improvements
- Add logs and debug end-to-end tests
- Add test helper utilities
- Improve test fixtures and templates
- Update API server and config lint commands
- Add multi-user database initialization
2026-02-16 20:38:15 -05:00

84 lines
2.8 KiB
Go

package benchmarks
import (
"testing"
"github.com/jfraeys/fetch_ml/internal/logging"
)
// BenchmarkLogSanitizeMessage profiles log message sanitization.
// This is a Tier 1 C++ candidate because:
// - Regex matching is CPU-intensive
// - High volume log pipelines process thousands of messages/sec
// - C++ can use Hyperscan/RE2 for parallel regex matching
// Expected speedup: 3-5x for high-volume logging
func BenchmarkLogSanitizeMessage(b *testing.B) {
// Test messages with various sensitive data patterns
messages := []string{
"User login successful with api_key=abc123def45678901234567890abcdef",
"JWT token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0C12LVE",
"Redis connection: redis://:secretpassword123@localhost:6379/0",
"User admin password=supersecret123 trying to access resource",
"Normal log message without any sensitive data to process",
"API call with key=fedcba9876543210fedcba9876543210 and secret=shh123",
"Connection string: redis://:another_secret@redis.example.com:6380",
"Authentication token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.test.signature",
}
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
msg := messages[i%len(messages)]
_ = logging.SanitizeLogMessage(msg)
}
}
// BenchmarkLogSanitizeArgs profiles structured log argument sanitization.
// This processes key-value pairs looking for sensitive field names.
func BenchmarkLogSanitizeArgs(b *testing.B) {
// Simulate typical structured log arguments
args := []any{
"user_id", "user123",
"password", "secret123",
"api_key", "abcdef1234567890",
"action", "login",
"secret_token", "eyJhbGci...",
"request_id", "req-12345",
"database_url", "redis://:password@localhost:6379",
"timestamp", "2024-01-01T00:00:00Z",
}
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
_ = logging.SanitizeArgs(args)
}
}
// BenchmarkLogSanitizeHighVolume simulates high-throughput logging scenario
// with many messages per second (e.g., 10K+ messages/sec).
func BenchmarkLogSanitizeHighVolume(b *testing.B) {
// Mix of message types
testMessages := []string{
"API request: POST /api/v1/jobs with api_key=abcdef1234567890abcdef1234567890",
"User user123 authenticated with token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.payload.signature",
"Database connection established to redis://:redact_me@localhost:6379",
"Job execution started for job_name=test_job",
"Error processing request: password=wrong_secret provided",
"Metrics: cpu=45%, memory=2.5GB, gpu=0%",
"Config loaded: secret_key=hidden_value123",
"Webhook received with authorization=Bearer eyJ0eXAiOiJKV1Qi.test.sig",
}
b.ResetTimer()
b.ReportAllocs()
for i := 0; i < b.N; i++ {
// Simulate batch processing of multiple messages
for _, msg := range testMessages {
_ = logging.SanitizeLogMessage(msg)
}
}
}