瀏覽代碼

feat: identify slow file (#1479)

Richard Gomez 10 月之前
父節點
當前提交
88f56d3695
共有 3 個文件被更改,包括 25 次插入0 次删除
  1. 5 0
      detect/detect.go
  2. 9 0
      detect/directory.go
  3. 11 0
      detect/git.go

+ 5 - 0
detect/detect.go

@@ -9,6 +9,7 @@ import (
 	"strings"
 	"sync"
 	"sync/atomic"
+	"time"
 
 	"github.com/zricethezav/gitleaks/v8/config"
 	"github.com/zricethezav/gitleaks/v8/logging"
@@ -25,6 +26,10 @@ import (
 const (
 	gitleaksAllowSignature = "gitleaks:allow"
 	chunkSize              = 100 * 1_000 // 100kb
+
+	// SlowWarningThreshold is the amount of time to wait before logging that a file is slow.
+	// This is useful for identifying problematic files and tuning the allowlist.
+	SlowWarningThreshold = 5 * time.Second
 )
 
 var (

+ 9 - 0
detect/directory.go

@@ -7,6 +7,7 @@ import (
 	"os"
 	"path/filepath"
 	"strings"
+	"time"
 
 	"github.com/h2non/filetype"
 
@@ -90,6 +91,7 @@ func (d *Detector) DetectFiles(paths <-chan sources.ScanTarget) ([]report.Findin
 					if pa.Symlink != "" {
 						fragment.SymlinkFile = pa.Symlink
 					}
+
 					if isWindows {
 						fragment.FilePath = filepath.ToSlash(pa.Path)
 						fragment.SymlinkFile = filepath.ToSlash(fragment.SymlinkFile)
@@ -98,12 +100,19 @@ func (d *Detector) DetectFiles(paths <-chan sources.ScanTarget) ([]report.Findin
 						fragment.FilePath = pa.Path
 					}
 
+					timer := time.AfterFunc(SlowWarningThreshold, func() {
+						logger.Debug().Msgf("Taking longer than %s to inspect fragment", SlowWarningThreshold.String())
+					})
 					for _, finding := range d.Detect(fragment) {
 						// need to add 1 since line counting starts at 1
 						finding.StartLine += (totalLines - linesInChunk) + 1
 						finding.EndLine += (totalLines - linesInChunk) + 1
 						d.AddFinding(finding)
 					}
+					if timer != nil {
+						timer.Stop()
+						timer = nil
+					}
 				}
 
 				if err != nil {

+ 11 - 0
detect/git.go

@@ -8,6 +8,7 @@ import (
 	"os/exec"
 	"regexp"
 	"strings"
+	"time"
 
 	"github.com/gitleaks/go-gitdiff/gitdiff"
 
@@ -63,9 +64,19 @@ func (d *Detector) DetectGit(cmd *sources.GitCmd, remote *RemoteInfo) ([]report.
 						FilePath:  gitdiffFile.NewName,
 					}
 
+					timer := time.AfterFunc(SlowWarningThreshold, func() {
+						logging.Debug().
+							Str("commit", commitSHA[:7]).
+							Str("path", fragment.FilePath).
+							Msgf("Taking longer than %s to inspect fragment", SlowWarningThreshold.String())
+					})
 					for _, finding := range d.Detect(fragment) {
 						d.AddFinding(augmentGitFinding(remote, finding, textFragment, gitdiffFile))
 					}
+					if timer != nil {
+						timer.Stop()
+						timer = nil
+					}
 				}
 				return nil
 			})