الملفات
ghaymah-exam-amirkasseb-sre/q1-deploy-monitor/app/main.go
2026-07-26 19:57:48 +03:00

96 أسطر
2.3 KiB
Go

package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"sync/atomic"
)
// Stores the total number of API requests.
var requestCount uint64
func main() {
// Register API endpoints
http.HandleFunc("/", requestCounter(helloHandler))
http.HandleFunc("/health", requestCounter(healthHandler))
http.HandleFunc("/metrics", metricsHandler)
// Start server on port 8080
fmt.Println("Server is running on port 8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
// Middleware that counts API requests.
// The /metrics endpoint is not wrapped with this middleware,
// so requests to /metrics are not included in the counter.
func requestCounter(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
atomic.AddUint64(&requestCount, 1)
next(w, r)
}
}
// Adds CORS headers to allow the dashboard to access the API.
func enableCORS(w http.ResponseWriter) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "GET, OPTIONS")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
}
// Root endpoint
func helloHandler(w http.ResponseWriter, r *http.Request) {
enableCORS(w)
// Handle browser CORS preflight requests
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusNoContent)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(map[string]string{
"message": "Hello, World!",
})
}
// Health check endpoint
func healthHandler(w http.ResponseWriter, r *http.Request) {
enableCORS(w)
// Handle browser CORS preflight requests
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusNoContent)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(map[string]string{
"status": "healthy",
})
}
// Metrics endpoint
// This endpoint does NOT increment the request counter.
func metricsHandler(w http.ResponseWriter, r *http.Request) {
enableCORS(w)
// Handle browser CORS preflight requests
if r.Method == http.MethodOptions {
w.WriteHeader(http.StatusNoContent)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(map[string]uint64{
"requests": atomic.LoadUint64(&requestCount),
})
}