96 أسطر
2.3 KiB
Go
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),
|
|
})
|
|
}
|