112 lines
2.6 KiB
Go
112 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"domogeek/calendar"
|
|
"encoding/json"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/promauto"
|
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
|
)
|
|
|
|
var (
|
|
cal calendar.Calendar
|
|
calCounter *prometheus.CounterVec
|
|
calSummary *prometheus.SummaryVec
|
|
calHistogram *prometheus.HistogramVec
|
|
)
|
|
|
|
func init() {
|
|
loc, err := time.LoadLocation("Europe/Paris")
|
|
if err != nil {
|
|
log.Fatalf("unable to load time location: %v", err)
|
|
}
|
|
cal = calendar.Calendar{Location: loc}
|
|
|
|
calCounter = promauto.NewCounterVec(prometheus.CounterOpts{
|
|
Namespace: "domogeek",
|
|
Subsystem: "calendar",
|
|
Name: "request_total",
|
|
Help: "Total request to calendar service",
|
|
},
|
|
[]string{
|
|
"code",
|
|
"method",
|
|
})
|
|
|
|
calSummary = promauto.NewSummaryVec(prometheus.SummaryOpts{
|
|
Namespace: "domogeek",
|
|
Subsystem: "calendar",
|
|
Name: "summary",
|
|
Help: "Calendar request summary",
|
|
},
|
|
nil)
|
|
calHistogram = promauto.NewHistogramVec(prometheus.HistogramOpts{
|
|
Namespace: "domogeek",
|
|
Subsystem: "calendar",
|
|
Name: "histogram",
|
|
Help: "Request duration histogram",
|
|
},
|
|
nil)
|
|
}
|
|
|
|
type CalendarDay struct {
|
|
Day time.Time `json:"day"`
|
|
WorkingDay bool `json:"working_day"`
|
|
Ferie bool `json:"ferie"`
|
|
Holiday bool `json:"holiday"`
|
|
Weekday bool `json:"weekday"`
|
|
}
|
|
|
|
type CalendarHandler struct{}
|
|
|
|
func (c *CalendarHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
now := time.Now()
|
|
cd := CalendarDay{
|
|
Day: now,
|
|
WorkingDay: cal.IsWorkingDay(now),
|
|
Ferie: cal.IsHoliday(now),
|
|
Holiday: cal.IsHoliday(now),
|
|
Weekday: cal.IsWeekDay(now),
|
|
}
|
|
|
|
content, err := json.Marshal(cd)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
log.Printf("unable to marshall response %v, %v", content, err)
|
|
} else {
|
|
_, err = w.Write(content)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
log.Printf("unable to marshall response %v, :%v", content, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
var port int
|
|
var host string
|
|
|
|
flag.StringVar(&host, "host", "", "host to listen, default all addresses")
|
|
flag.IntVar(&port, "port", 8080, "port to listen")
|
|
flag.Parse()
|
|
|
|
addr := fmt.Sprintf("%s:%d", host, port)
|
|
log.Printf("start server on %s", addr)
|
|
|
|
h := promhttp.InstrumentHandlerDuration(
|
|
calHistogram,
|
|
promhttp.InstrumentHandlerDuration(
|
|
calSummary,
|
|
promhttp.InstrumentHandlerCounter(
|
|
calCounter,
|
|
&CalendarHandler{})))
|
|
http.Handle("/calendar", &h)
|
|
http.Handle("/metrics", promhttp.Handler())
|
|
log.Fatal(http.ListenAndServe(addr, nil))
|
|
}
|