Spaces:
Sleeping
Sleeping
| package exporter | |
| import ( | |
| "log" | |
| "sync" | |
| "time" | |
| "context" | |
| "net/http" | |
| "github.com/gofiber/fiber/v2" | |
| ) | |
| /* | |
| * --- Node Exporter Metric Handler --- | |
| */ | |
| func ExporterMetricsHandler(service ExporterService) fiber.Handler { | |
| return func(c *fiber.Ctx) error { | |
| ctx, cancel := context.WithTimeout(c.Context(), 120 * time.Second) | |
| defer cancel() | |
| ch := make(chan string, 1) | |
| var wg sync.WaitGroup | |
| wg.Add(1) | |
| go func() { | |
| defer wg.Done() | |
| apiResponse, err := service.ExporterMetricsService(ctx) | |
| if err != nil { | |
| log.Printf("[%s] %v", time.Now().Format("2006-01-02 15:04:05"), err) | |
| ch <- apiResponse | |
| return | |
| } | |
| ch <- apiResponse | |
| }() | |
| go func() { | |
| wg.Wait() | |
| close(ch) | |
| }() | |
| select { | |
| case apiResponse, ok := <-ch: | |
| if !ok { | |
| return c.Status(http.StatusInternalServerError).JSON(fiber.Map{ | |
| "error": "Failed to get a response from the server", | |
| }) | |
| } | |
| return c.SendString(apiResponse) | |
| case <-ctx.Done(): | |
| log.Printf("[%s] Timeout: %v", time.Now().Format("2006-01-02 15:04:05"), ctx.Err()) | |
| return c.Status(http.StatusRequestTimeout).JSON(fiber.Map{ | |
| "error": "Request timeout", | |
| }) | |
| } | |
| } | |
| } | |