9.9 KiB
Lint Remediation & Monitoring Plan
Status: Planning Created: 2026-02-02 Target Completion: 2026-02-03
Executive Summary
This plan addresses 40 Go linting issues (18 errcheck, 22 gosec warnings from full_lint_output.txt), 6 TypeScript warnings, and establishes monitoring for retry attempt frequency to ensure it remains below 5%.
Goals
- Go Linting: Fix all 40 reported issues (18 errcheck, 22 gosec)
- TypeScript: Resolve 6 ESLint warnings (no-explicit-any, no-unused-vars)
- Monitoring: Implement retry attempt frequency tracking (<5% threshold)
Research Findings
1. Go Linting Issues (40 total from full_lint_output.txt)
Source Files:
backend/final_lint.txt(34 issues - subset)backend/full_lint_output.txt(40 issues - complete list)
1.1 Errcheck Issues (18 total)
Category A: Unchecked json.Unmarshal in Tests (6)
| File | Line | Issue |
|---|---|---|
internal/api/handlers/security_handler_audit_test.go |
581 | json.Unmarshal(w.Body.Bytes(), &resp) |
internal/api/handlers/security_handler_coverage_test.go |
525, 589 | json.Unmarshal(w.Body.Bytes(), &resp) (2 locations) |
internal/api/handlers/settings_handler_test.go |
895, 923, 1081 | json.Unmarshal(w.Body.Bytes(), &resp) (3 locations) |
Root Cause: Test code not checking JSON unmarshaling errors
Impact: Tests may pass with invalid JSON responses, false positives
Fix: Add error checking: require.NoError(t, json.Unmarshal(...))
Category B: Unchecked Environment Variable Operations (11)
| File | Line | Issue |
|---|---|---|
internal/caddy/config_test.go |
1794 | os.Unsetenv(v) |
internal/config/config_test.go |
56, 57, 72, 74, 75, 82 | os.Setenv(...) (6 instances) |
internal/config/config_test.go |
157, 158, 159, 175, 196 | os.Unsetenv(...) (5 instances total) |
Root Cause: Environment variable setup/cleanup without error handling
Impact: Test isolation failures, flaky tests
Fix: Wrap with require.NoError(t, os.Setenv/Unsetenv(...))
Category C: Unchecked Database Close Operations (4)
| File | Line | Issue |
|---|---|---|
internal/services/dns_provider_service_test.go |
1446, 1466, 1493, 1531, 1549 | sqlDB.Close() (4 locations) |
internal/database/errors_test.go |
230 | sqlDB.Close() |
Root Cause: Resource cleanup without error handling
Impact: Resource leaks in tests
Fix: defer func() { _ = sqlDB.Close() }() or explicit error check
Category D: Unchecked w.Write in Tests (3)
| File | Line | Issue |
|---|---|---|
internal/caddy/manager_additional_test.go |
1467, 1522 | w.Write([]byte(...)) (2 locations) |
internal/caddy/manager_test.go |
133 | w.Write([]byte(...)) |
Root Cause: HTTP response writing without error handling
Impact: Silent failures in mock HTTP servers
Fix: _, _ = w.Write(...) or check error if critical
Category E: Unchecked db.AutoMigrate in Tests (3)
| File | Line | Issue |
|---|---|---|
internal/api/handlers/notification_coverage_test.go |
22 | db.AutoMigrate(...) |
internal/api/handlers/pr_coverage_test.go |
404, 438 | db.AutoMigrate(...) (2 locations) |
Root Cause: Database schema migration without error handling
Impact: Tests may run with incorrect schema
Fix: require.NoError(t, db.AutoMigrate(...))
1.2 Gosec Security Issues (22 total - unchanged from final_lint.txt)
(Same 22 gosec issues as documented in final_lint.txt)
2. TypeScript Linting Issues (6 warnings - unchanged)
(Same 6 ESLint warnings as documented earlier)
3. Retry Monitoring Analysis
Current State:
Retry Logic Location: backend/internal/services/uptime_service.go
Configuration:
MaxRetriesinUptimeServiceConfig(default: 2)MaxRetriesinmodels.UptimeMonitor(default: 3)
Current Behavior:
for retry := 0; retry <= s.config.MaxRetries && !success; retry++ {
if retry > 0 {
logger.Log().Info("Retrying TCP check")
}
// Try connection...
}
Metrics Gaps:
- No retry frequency tracking
- No alerting on excessive retries
- No historical data for analysis
Requirements:
- Track retry attempts vs first-try successes
- Alert if retry rate >5% over rolling 1000 checks
- Expose Prometheus metrics for dashboarding
Technical Specifications
Phase 1: Backend Go Linting Fixes
1.1 Errcheck Fixes (18 issues)
JSON Unmarshal (6 fixes):
// Pattern to apply across 6 locations
// BEFORE:
json.Unmarshal(w.Body.Bytes(), &resp)
// AFTER:
err := json.Unmarshal(w.Body.Bytes(), &resp)
require.NoError(t, err, "Failed to unmarshal response")
Files:
internal/api/handlers/security_handler_audit_test.go:581internal/api/handlers/security_handler_coverage_test.go:525, 589internal/api/handlers/settings_handler_test.go:895, 923, 1081
Environment Variables (11 fixes):
// BEFORE:
os.Setenv("VAR_NAME", "value")
// AFTER:
require.NoError(t, os.Setenv("VAR_NAME", "value"))
Files:
internal/config/config_test.go:56, 57, 72, 74, 75, 82, 157, 158, 159, 175, 196internal/caddy/config_test.go:1794
Database Close (4 fixes):
// BEFORE:
sqlDB.Close()
// AFTER:
defer func() { _ = sqlDB.Close() }()
Files:
internal/services/dns_provider_service_test.go:1446, 1466, 1493, 1531, 1549internal/database/errors_test.go:230
HTTP Write (3 fixes):
// BEFORE:
w.Write([]byte(`{"data": "value"}`))
// AFTER:
_, _ = w.Write([]byte(`{"data": "value"}`))
Files:
internal/caddy/manager_additional_test.go:1467, 1522internal/caddy/manager_test.go:133
AutoMigrate (3 fixes):
// BEFORE:
db.AutoMigrate(&models.Model{})
// AFTER:
require.NoError(t, db.AutoMigrate(&models.Model{}))
Files:
internal/api/handlers/notification_coverage_test.go:22internal/api/handlers/pr_coverage_test.go:404, 438
1.2 Gosec Security Fixes (22 issues)
(Apply the same 22 gosec fixes as documented in the original plan)
Phase 2: Frontend TypeScript Linting Fixes (6 warnings)
(Apply the same 6 TypeScript fixes as documented in the original plan)
Phase 3: Retry Monitoring Implementation
(Same implementation as documented in the original plan)
Implementation Plan
Phase 1: Backend Go Linting Fixes
Estimated Time: 3-4 hours
Tasks:
-
Errcheck Fixes (60 min)
- Fix 6 JSON unmarshal errors
- Fix 11 environment variable operations
- Fix 4 database close operations
- Fix 3 HTTP write operations
- Fix 3 AutoMigrate calls
-
Gosec Fixes (2-3 hours)
- Fix 8 permission issues
- Fix 3 integer overflow issues
- Fix 3 file inclusion issues
- Fix 1 slice bounds issue
- Fix 2 decompression bomb issues
- Fix 1 file traversal issue
- Fix 2 Slowloris issues
- Fix 1 hardcoded credential (add #nosec comment)
Verification:
cd backend && golangci-lint run ./...
# Expected: 0 issues
Phase 2: Frontend TypeScript Linting Fixes
Estimated Time: 1-2 hours
(Same as original plan)
Phase 3: Retry Monitoring Implementation
Estimated Time: 4-5 hours
(Same as original plan)
Acceptance Criteria
Phase 1 Complete:
- All 40 Go linting issues resolved (18 errcheck + 22 gosec)
golangci-lint run ./...exits with code 0- All unit tests pass
- Code coverage ≥85%
Phase 2 Complete:
- All 6 TypeScript warnings resolved
npm run lintshows 0 warnings- All unit tests pass
- Code coverage ≥85%
Phase 3 Complete:
- Retry rate metric exposed at
/metrics - API endpoint
/api/v1/uptime/statsreturns correct data - Dashboard displays retry rate widget
- Alert logged when retry rate >5%
- E2E test validates monitoring flow
File Changes Summary
Backend Files (21 total)
Errcheck (14 files):
internal/api/handlers/security_handler_audit_test.go(1)internal/api/handlers/security_handler_coverage_test.go(2)internal/api/handlers/settings_handler_test.go(3)internal/config/config_test.go(13)internal/caddy/config_test.go(1)internal/services/dns_provider_service_test.go(5)internal/database/errors_test.go(1)internal/caddy/manager_additional_test.go(2)internal/caddy/manager_test.go(1)internal/api/handlers/notification_coverage_test.go(1)internal/api/handlers/pr_coverage_test.go(2)
Gosec (18 files):
cmd/seed/seed_smoke_test.gointernal/api/handlers/manual_challenge_handler.gointernal/api/handlers/security_handler_rules_decisions_test.gointernal/caddy/config.gointernal/config/config.gointernal/crowdsec/hub_cache.gointernal/crowdsec/hub_sync.gointernal/database/database_test.gointernal/services/backup_service.gointernal/services/backup_service_test.gointernal/services/uptime_service_test.gointernal/util/crypto_test.go
Frontend Files (5 total):
src/components/ImportSitesModal.test.tsxsrc/components/ImportSitesModal.tsxsrc/components/__tests__/DNSProviderForm.test.tsxsrc/context/AuthContext.tsxsrc/hooks/__tests__/useImport.test.ts
New Files (Phase 3):
backend/internal/metrics/uptime_metrics.go(if needed)frontend/src/components/RetryStatsCard.tsxtests/uptime-retry-stats.spec.tsdocs/monitoring.md
References
- Go Lint Output:
backend/final_lint.txt(34 issues),backend/full_lint_output.txt(40 issues) - TypeScript Lint Output:
npm run lintoutput (6 warnings) - Gosec: https://github.com/securego/gosec
- golangci-lint: https://golangci-lint.run/
- Prometheus Best Practices: https://prometheus.io/docs/practices/naming/
Plan Status: ✅ Ready for Implementation Next Step: Begin Phase 1 - Backend Go Linting Fixes (Errcheck first, then Gosec)