- 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
84 lines
2.8 KiB
Go
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)
|
|
}
|
|
}
|
|
}
|