Files
domogeek/cmd/domogeek/domogeek.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))
}