204 lines
5.2 KiB
Go
204 lines
5.2 KiB
Go
package handlers
|
|
|
|
import (
|
|
"math/rand"
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
|
|
"gitea.d3m0k1d.ru/d3m0k1d/HellreigN/backend/internal/storage"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// GetMockLogs returns 100 mock log entries for frontend development
|
|
// @Summary Get mock logs
|
|
// @Description Returns 100 mock log entries for frontend development (no ClickHouse required)
|
|
// @Tags logs
|
|
// @Produce json
|
|
// @Param level query string false "Filter by level"
|
|
// @Param service query string false "Filter by service"
|
|
// @Param agent query string false "Filter by agent"
|
|
// @Param limit query int false "Limit results" default(100)
|
|
// @Param offset query int false "Offset results" default(0)
|
|
// @Success 200 {array} storage.LogEntry
|
|
// @Security Bearer
|
|
// @Router /logs/mock [get]
|
|
func (lh *LogHandlers) GetMockLogs(c *gin.Context) {
|
|
levelFilter := c.Query("level")
|
|
serviceFilter := c.Query("service")
|
|
agentFilter := c.Query("agent")
|
|
|
|
limit := 100
|
|
offset := 0
|
|
|
|
if l := c.Query("limit"); l != "" {
|
|
if parsed, err := strconv.Atoi(l); err == nil && parsed > 0 {
|
|
limit = parsed
|
|
}
|
|
}
|
|
if o := c.Query("offset"); o != "" {
|
|
if parsed, err := strconv.Atoi(o); err == nil && parsed >= 0 {
|
|
offset = parsed
|
|
}
|
|
}
|
|
|
|
logs := generateMockLogs(100)
|
|
|
|
// Apply filters
|
|
var filtered []storage.LogEntry
|
|
for _, log := range logs {
|
|
if levelFilter != "" && log.Level != levelFilter {
|
|
continue
|
|
}
|
|
if serviceFilter != "" && log.Service != serviceFilter {
|
|
continue
|
|
}
|
|
if agentFilter != "" && log.Agent != agentFilter {
|
|
continue
|
|
}
|
|
filtered = append(filtered, log)
|
|
}
|
|
|
|
// Apply pagination
|
|
end := offset + limit
|
|
if end > len(filtered) {
|
|
end = len(filtered)
|
|
}
|
|
if offset > len(filtered) {
|
|
filtered = []storage.LogEntry{}
|
|
} else {
|
|
filtered = filtered[offset:end]
|
|
}
|
|
|
|
c.JSON(http.StatusOK, filtered)
|
|
}
|
|
|
|
func generateMockLogs(count int) []storage.LogEntry {
|
|
services := []string{
|
|
"auth-service",
|
|
"user-service",
|
|
"agent-service",
|
|
"gateway",
|
|
"scheduler",
|
|
"notification-service",
|
|
"metrics-collector",
|
|
"deployment-service",
|
|
}
|
|
|
|
agents := []string{
|
|
"agent-prod-01",
|
|
"agent-prod-02",
|
|
"agent-staging-01",
|
|
"agent-dev-01",
|
|
"agent-dev-02",
|
|
"agent-monitoring-01",
|
|
"agent-backup-01",
|
|
"agent-ci-runner-01",
|
|
}
|
|
|
|
levels := []string{"INFO", "WARNING", "ERROR", "FATAL", "DEBUG"}
|
|
levelWeights := []int{50, 20, 15, 5, 10} // weighted distribution
|
|
|
|
messages := map[string][]string{
|
|
"INFO": {
|
|
"Service started successfully",
|
|
"Health check passed",
|
|
"Configuration loaded",
|
|
"Connection established to database",
|
|
"Cache refreshed successfully",
|
|
"Request processed in 45ms",
|
|
"User login successful",
|
|
"Agent registered successfully",
|
|
"Deployment completed for 3 servers",
|
|
"Metrics exported to storage",
|
|
"Backup completed successfully",
|
|
"SSL certificate valid for 89 days",
|
|
"Task scheduled: cleanup-temp-files",
|
|
"Webhook delivered successfully",
|
|
"Session created for user admin",
|
|
},
|
|
"WARNING": {
|
|
"High memory usage detected: 85%",
|
|
"Slow query detected: 2.3s",
|
|
"Rate limit approaching for client 192.168.1.50",
|
|
"Certificate expires in 7 days",
|
|
"Retry attempt 2/3 for request",
|
|
"Disk usage above threshold: 78%",
|
|
"Connection pool nearly exhausted: 45/50",
|
|
"Deprecated API endpoint called: /api/v1/legacy",
|
|
"Response time exceeded SLA: 1.2s > 1s",
|
|
"Agent heartbeat delayed by 5s",
|
|
},
|
|
"ERROR": {
|
|
"Failed to connect to database: timeout after 30s",
|
|
"Authentication failed for user test_user",
|
|
"Agent deployment failed: SSH connection refused",
|
|
"Failed to send notification: SMTP server unavailable",
|
|
"Request failed with status 500",
|
|
"File not found: /etc/hellreign/config.yml",
|
|
"Invalid token provided",
|
|
"Permission denied for user viewer",
|
|
"Failed to parse configuration: invalid YAML",
|
|
"Agent unreachable: connection timeout",
|
|
},
|
|
"FATAL": {
|
|
"Out of memory: cannot allocate 512MB",
|
|
"Database connection lost, all retries exhausted",
|
|
"Critical: SSL certificate expired",
|
|
"Unrecoverable error: data corruption detected",
|
|
"Service crashed: segmentation fault",
|
|
},
|
|
"DEBUG": {
|
|
"Processing request payload: 2.3KB",
|
|
"Cache hit ratio: 78%",
|
|
"Executing query: SELECT * FROM logs WHERE...",
|
|
"HTTP request headers: {Content-Type: application/json}",
|
|
"Agent status check: 8 agents online",
|
|
"Memory allocation: 256MB used of 1024MB",
|
|
"Thread pool size: 12 active, 4 idle",
|
|
"GC pause: 15ms",
|
|
},
|
|
}
|
|
|
|
r := rand.New(rand.NewSource(42)) // fixed seed for reproducibility
|
|
|
|
var logs []storage.LogEntry
|
|
now := time.Now()
|
|
|
|
for i := 0; i < count; i++ {
|
|
level := weightedRandom(r, levels, levelWeights)
|
|
service := services[r.Intn(len(services))]
|
|
agent := agents[r.Intn(len(agents))]
|
|
msgs := messages[level]
|
|
message := msgs[r.Intn(len(msgs))]
|
|
|
|
// Spread logs over the last 24 hours
|
|
timestamp := now.Add(-time.Duration(count-i) * time.Minute * 15)
|
|
|
|
logs = append(logs, storage.LogEntry{
|
|
Timestamp: timestamp,
|
|
Level: level,
|
|
Service: service,
|
|
Agent: agent,
|
|
Message: message,
|
|
})
|
|
}
|
|
|
|
return logs
|
|
}
|
|
|
|
func weightedRandom(r *rand.Rand, items []string, weights []int) string {
|
|
total := 0
|
|
for _, w := range weights {
|
|
total += w
|
|
}
|
|
n := r.Intn(total)
|
|
for i, w := range weights {
|
|
n -= w
|
|
if n < 0 {
|
|
return items[i]
|
|
}
|
|
}
|
|
return items[len(items)-1]
|
|
}
|