internal/worker: classify proxy cache miss errors

For projects not used at all, proxy cache will not return their code. We
classify this as a proxy error for improved monitoring.

Change-Id: I4b3422711caf537d8a4282fb4fe9e6b98a533def
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/523056
Reviewed-by: Maceo Thompson <maceothompson@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Zvonimir Pavlinovic <zpavlinovic@google.com>
diff --git a/internal/worker/analysis.go b/internal/worker/analysis.go
index 6c90b9c..eb52215 100644
--- a/internal/worker/analysis.go
+++ b/internal/worker/analysis.go
@@ -217,6 +217,8 @@
 			err = fmt.Errorf("%v: %w", err, derrors.LoadPackagesImportedLocalError)
 		case isModVendor(err):
 			err = fmt.Errorf("%v: %w", err, derrors.LoadVendorError)
+		case isProxyCacheMiss(err):
+			err = fmt.Errorf("%v: %w", err, derrors.ProxyError)
 		case !hasGoMod:
 			// Classify misc errors on synthetic modules separately.
 			err = fmt.Errorf("%v: %w", err, derrors.ScanSyntheticModuleError)
diff --git a/internal/worker/govulncheck_scan.go b/internal/worker/govulncheck_scan.go
index 29fccd4..d5f5da6 100644
--- a/internal/worker/govulncheck_scan.go
+++ b/internal/worker/govulncheck_scan.go
@@ -343,6 +343,8 @@
 			err = fmt.Errorf("%v: %w", err, derrors.LoadVendorError)
 		case isTooManyFiles(err):
 			err = fmt.Errorf("%v: %w", err, derrors.ScanModuleTooManyOpenFiles)
+		case isProxyCacheMiss(err):
+			err = fmt.Errorf("%v: %w", err, derrors.ProxyError)
 		default:
 			err = fmt.Errorf("%v: %w", err, derrors.ScanModuleGovulncheckError)
 		}
diff --git a/internal/worker/scan.go b/internal/worker/scan.go
index caec509..1d41b05 100644
--- a/internal/worker/scan.go
+++ b/internal/worker/scan.go
@@ -348,3 +348,8 @@
 	matched, err := regexp.MatchString(`replaced by .{0,2}/`, errStr)
 	return err == nil && matched && strings.Contains(errStr, "go.mod: no such file")
 }
+
+func isProxyCacheMiss(err error) bool {
+	errStr := err.Error()
+	return strings.Contains(errStr, "server response") && strings.Contains(errStr, "temporarily unavailable")
+}