summaryrefslogtreecommitdiff
path: root/benchmarks/cmd/generate_profile_data
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-08 09:26:04 +0200
committerPaul Buetow <paul@buetow.org>2026-03-08 09:26:04 +0200
commit8b2635cd100cf9dc217ee9b472a02999a7d3fdf4 (patch)
tree9fb77b722b374b14c4d57791e1ca7a931bb3b16f /benchmarks/cmd/generate_profile_data
parentec1504e0cedbfeffc35e50a09633e51e93bf0e2d (diff)
task: fix benchmarks cmd package build collision (task 371)
Diffstat (limited to 'benchmarks/cmd/generate_profile_data')
-rw-r--r--benchmarks/cmd/generate_profile_data/main.go159
1 files changed, 159 insertions, 0 deletions
diff --git a/benchmarks/cmd/generate_profile_data/main.go b/benchmarks/cmd/generate_profile_data/main.go
new file mode 100644
index 0000000..0b34047
--- /dev/null
+++ b/benchmarks/cmd/generate_profile_data/main.go
@@ -0,0 +1,159 @@
+package main
+
+import (
+ "flag"
+ "fmt"
+ "log"
+ "math/rand"
+ "os"
+ "strconv"
+ "strings"
+ "time"
+)
+
+func main() {
+ var (
+ size string
+ output string
+ format string
+ )
+
+ flag.StringVar(&size, "size", "10MB", "Size of the file (e.g., 10MB, 100MB, 1GB)")
+ flag.StringVar(&output, "output", "test.log", "Output file path")
+ flag.StringVar(&format, "format", "log", "Format: log or csv")
+ flag.Parse()
+
+ // Parse size
+ sizeBytes, err := parseSize(size)
+ if err != nil {
+ log.Fatalf("Invalid size: %v", err)
+ }
+
+ // Generate data
+ switch format {
+ case "log":
+ generateLogFile(output, sizeBytes)
+ case "csv":
+ generateCSVFile(output, sizeBytes)
+ default:
+ log.Fatalf("Unknown format: %s", format)
+ }
+
+ fmt.Printf("Generated %s file: %s\n", size, output)
+}
+
+func parseSize(size string) (int64, error) {
+ size = strings.ToUpper(size)
+ multiplier := int64(1)
+
+ if strings.HasSuffix(size, "GB") {
+ multiplier = 1024 * 1024 * 1024
+ size = strings.TrimSuffix(size, "GB")
+ } else if strings.HasSuffix(size, "MB") {
+ multiplier = 1024 * 1024
+ size = strings.TrimSuffix(size, "MB")
+ } else if strings.HasSuffix(size, "KB") {
+ multiplier = 1024
+ size = strings.TrimSuffix(size, "KB")
+ }
+
+ base, err := strconv.ParseInt(size, 10, 64)
+ if err != nil {
+ return 0, err
+ }
+
+ return base * multiplier, nil
+}
+
+func generateLogFile(filename string, targetSize int64) {
+ f, err := os.Create(filename)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer f.Close()
+
+ // Sample log lines
+ logLevels := []string{"INFO", "WARN", "ERROR", "DEBUG"}
+ actions := []string{
+ "Processing request",
+ "Handling connection",
+ "Executing query",
+ "Loading configuration",
+ "Updating cache",
+ "Validating input",
+ "Sending response",
+ "Checking permissions",
+ }
+
+ bytesWritten := int64(0)
+ lineNum := 0
+ startTime := time.Now()
+
+ for bytesWritten < targetSize {
+ lineNum++
+ timestamp := startTime.Add(time.Duration(lineNum) * time.Millisecond).Format("2006-01-02 15:04:05.000")
+ level := logLevels[rand.Intn(len(logLevels))]
+ action := actions[rand.Intn(len(actions))]
+ userID := rand.Intn(1000)
+ requestID := fmt.Sprintf("req-%d", lineNum)
+ duration := rand.Intn(5000)
+
+ line := fmt.Sprintf("[%s] %s - %s for user%d (request: %s, duration: %dms)\n",
+ timestamp, level, action, userID, requestID, duration)
+
+ n, err := f.WriteString(line)
+ if err != nil {
+ log.Fatal(err)
+ }
+ bytesWritten += int64(n)
+
+ // Add some variety with stack traces for errors
+ if level == "ERROR" && rand.Float32() < 0.3 {
+ stackTrace := fmt.Sprintf(" Stack trace:\n at function1() file1.go:123\n at function2() file2.go:456\n at main() main.go:789\n")
+ n, err := f.WriteString(stackTrace)
+ if err != nil {
+ log.Fatal(err)
+ }
+ bytesWritten += int64(n)
+ }
+ }
+}
+
+func generateCSVFile(filename string, targetSize int64) {
+ f, err := os.Create(filename)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer f.Close()
+
+ // Write header
+ header := "timestamp,user,action,duration,status,category\n"
+ f.WriteString(header)
+ bytesWritten := int64(len(header))
+
+ actions := []string{"login", "query", "update", "delete", "logout", "search", "export", "import"}
+ statuses := []string{"success", "failure", "timeout", "pending"}
+ categories := []string{"web", "api", "batch", "admin"}
+
+ lineNum := 0
+ startTime := time.Now()
+
+ for bytesWritten < targetSize {
+ lineNum++
+ timestamp := startTime.Add(time.Duration(lineNum) * time.Second).Format("2006-01-02 15:04:05")
+ user := fmt.Sprintf("user%d", rand.Intn(100))
+ action := actions[rand.Intn(len(actions))]
+ duration := 100 + rand.Intn(9900)
+ status := statuses[rand.Intn(len(statuses))]
+ category := categories[rand.Intn(len(categories))]
+
+ line := fmt.Sprintf("%s,%s,%s,%d,%s,%s\n",
+ timestamp, user, action, duration, status, category)
+
+ n, err := f.WriteString(line)
+ if err != nil {
+ log.Fatal(err)
+ }
+ bytesWritten += int64(n)
+ }
+} \ No newline at end of file