summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/clients/dgrep_bench_test.go143
-rw-r--r--internal/io/fs/cat_bench_test.go68
2 files changed, 211 insertions, 0 deletions
diff --git a/internal/clients/dgrep_bench_test.go b/internal/clients/dgrep_bench_test.go
new file mode 100644
index 0000000..994ec10
--- /dev/null
+++ b/internal/clients/dgrep_bench_test.go
@@ -0,0 +1,143 @@
+package clients
+
+import (
+ "context"
+ "os"
+ "sync"
+ "testing"
+
+ "github.com/mimecast/dtail/internal/config"
+ "github.com/mimecast/dtail/internal/io/dlog"
+ "github.com/mimecast/dtail/internal/io/signal"
+ "github.com/mimecast/dtail/internal/source"
+ "github.com/mimecast/dtail/internal/user"
+)
+
+func ensureTestFile10MBForDgrep(b *testing.B, filename string) {
+ const line = "2023-01-01 12:00:00 INFO [service] Processing request id=12345 user=john.doe@example.com action=login status=success duration=150ms\n"
+ const targetSize = 10 * 1024 * 1024 // 10MB
+ if fi, err := os.Stat(filename); err == nil && fi.Size() >= targetSize {
+ return // File already exists and is large enough
+ }
+ f, err := os.Create(filename)
+ if err != nil {
+ b.Fatalf("failed to create test file: %v", err)
+ }
+ defer f.Close()
+ written := int64(0)
+ for written < targetSize {
+ n, err := f.WriteString(line)
+ if err != nil {
+ b.Fatalf("failed to write to test file: %v", err)
+ }
+ written += int64(n)
+ }
+}
+
+func BenchmarkDGrepFile10MBNoMatch(b *testing.B) {
+ const filename = "testfile_10mb_dgrep.log"
+ b.Log("Ensuring test file exists...")
+ ensureTestFile10MBForDgrep(b, filename)
+ b.Log("Test file ensured.")
+
+ // Setup args similar to dgrep main
+ args := config.Args{
+ RegexStr: "NONEXISTENTPATTERN12345", // Pattern that won't match anything
+ What: filename,
+ NoColor: true,
+ Plain: true,
+ Quiet: true,
+ ConnectionsPerCPU: config.DefaultConnectionsPerCPU,
+ SSHPort: config.DefaultSSHPort,
+ Logger: "none", // Use none logger to suppress output
+ LogLevel: "TRACE",
+ UserName: user.Name(),
+ ConfigFile: "none",
+ }
+
+ // Initialize config first
+ config.Setup(source.Client, &args, []string{})
+
+ // Initialize logging context only if not already started
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+ var wg sync.WaitGroup
+
+ // Only start dlog if it hasn't been started already
+ if dlog.Client == nil {
+ wg.Add(1)
+ dlog.Start(ctx, &wg, source.Client)
+ }
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ client, err := NewGrepClient(args)
+ if err != nil {
+ b.Fatalf("failed to create grep client: %v", err)
+ }
+
+ // Run the grep operation
+ client.Start(ctx, signal.InterruptCh(ctx))
+ }
+ b.StopTimer()
+
+ cancel()
+ wg.Wait()
+
+ // Cleanup
+ os.Remove(filename)
+}
+
+func BenchmarkDGrepFile10MBWithMatches(b *testing.B) {
+ const filename = "testfile_10mb_dgrep.log"
+ b.Log("Ensuring test file exists...")
+ ensureTestFile10MBForDgrep(b, filename)
+ b.Log("Test file ensured.")
+
+ // Setup args similar to dgrep main
+ args := config.Args{
+ RegexStr: "user=john.doe", // Pattern that will match every line
+ What: filename,
+ NoColor: true,
+ Plain: true,
+ Quiet: true,
+ ConnectionsPerCPU: config.DefaultConnectionsPerCPU,
+ SSHPort: config.DefaultSSHPort,
+ Logger: "none", // Use none logger to suppress output
+ LogLevel: "TRACE",
+ UserName: user.Name(),
+ ConfigFile: "none",
+ }
+
+ // Initialize config first
+ config.Setup(source.Client, &args, []string{})
+
+ // Initialize logging context only if not already started
+ ctx, cancel := context.WithCancel(context.Background())
+ defer cancel()
+ var wg sync.WaitGroup
+
+ // Only start dlog if it hasn't been started already
+ if dlog.Client == nil {
+ wg.Add(1)
+ dlog.Start(ctx, &wg, source.Client)
+ }
+
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ client, err := NewGrepClient(args)
+ if err != nil {
+ b.Fatalf("failed to create grep client: %v", err)
+ }
+
+ // Run the grep operation
+ client.Start(ctx, signal.InterruptCh(ctx))
+ }
+ b.StopTimer()
+
+ cancel()
+ wg.Wait()
+
+ // Cleanup
+ os.Remove(filename)
+} \ No newline at end of file
diff --git a/internal/io/fs/cat_bench_test.go b/internal/io/fs/cat_bench_test.go
new file mode 100644
index 0000000..ce485bb
--- /dev/null
+++ b/internal/io/fs/cat_bench_test.go
@@ -0,0 +1,68 @@
+package fs
+
+import (
+ "context"
+ "os"
+ "testing"
+
+ "github.com/mimecast/dtail/internal/config"
+ "github.com/mimecast/dtail/internal/lcontext"
+ "github.com/mimecast/dtail/internal/regex"
+)
+
+func ensureTestFile100MBForCat(b *testing.B, filename string) {
+ const line = "test line 1\n"
+ const targetSize = 100 * 1024 * 1024 // 100MB
+ if fi, err := os.Stat(filename); err == nil && fi.Size() >= targetSize {
+ return // File already exists and is large enough
+ }
+ f, err := os.Create(filename)
+ if err != nil {
+ b.Fatalf("failed to create test file: %v", err)
+ }
+ defer f.Close()
+ written := int64(0)
+ for written < targetSize {
+ n, err := f.WriteString(line)
+ if err != nil {
+ b.Fatalf("failed to write to test file: %v", err)
+ }
+ written += int64(n)
+ }
+}
+
+func BenchmarkCatFile100MB(b *testing.B) {
+ const filename = "testfile_100mb.log"
+ const globID = "test"
+ b.Log("Ensuring test file exists...")
+ ensureTestFile100MBForCat(b, filename)
+ b.Log("Test file ensured.")
+ serverMessages := make(chan string, 100)
+
+ b.Log("Created serverMessages channel.")
+ catFile := NewCatFile(filename, globID, serverMessages)
+ b.Log("Created CatFile instance.")
+ ltx := lcontext.LContext{}
+ noopRegex, _ := regex.New("", regex.Noop)
+ ctx := context.Background()
+ config.Server = &config.ServerConfig{} // Initialize config.Server
+ b.Log("Initialized context and config.Server.")
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ b.Logf("Starting iteration %d...", i)
+ go func() {
+ b.Log("Goroutine started to read messages.")
+ for msg := range serverMessages {
+ b.Logf("Received message: %s", msg)
+ }
+ b.Log("Goroutine finished reading messages.")
+ }()
+ b.Log("Started goroutine to read messages.")
+ b.Log("Calling catFile.Start...")
+ catFile.Start(ctx, ltx, nil, noopRegex)
+ b.Log("catFile.Start completed.")
+ }
+ b.StopTimer()
+ close(serverMessages)
+ b.Log("Benchmark completed.")
+}