feat(exporter): add prometheus exporter for cache, database & webserver stats

This commit is contained in:
Tom Neuber 2024-11-28 11:53:40 +01:00
parent 95a3a16fdc
commit 4bbda96dc7
Signed by: tom
GPG key ID: F17EFE4272D89FF6
8 changed files with 405 additions and 18 deletions

54
main.go
View file

@ -8,18 +8,22 @@ import (
"syscall"
apiv1 "git.ar21.de/yolokube/country-geo-locations/api/v1"
"git.ar21.de/yolokube/country-geo-locations/cfg"
"git.ar21.de/yolokube/country-geo-locations/internal/cache"
"git.ar21.de/yolokube/country-geo-locations/internal/cmd"
csvimporter "git.ar21.de/yolokube/country-geo-locations/internal/csv_importer"
"git.ar21.de/yolokube/country-geo-locations/internal/database"
"git.ar21.de/yolokube/country-geo-locations/internal/downloader"
"git.ar21.de/yolokube/country-geo-locations/internal/exporter"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/render"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
func main() {
cli := cfg.CLI{}
cli := cmd.CLI{}
queue := exporter.NewRequestDataQueue()
appSettings, err := cli.Parse()
if err != nil {
log.Fatal(err)
@ -27,6 +31,14 @@ func main() {
handleGracefulShutdown()
exporterMiddleware := exporter.NewMiddleware(queue)
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Use(exporterMiddleware)
r.Use(render.SetContentType(render.ContentTypeJSON))
ctx := downloader.NewContext(appSettings.DataFile, appSettings.DataURL)
if !ctx.FileExists() {
if downloadErr := ctx.Download(); downloadErr != nil {
@ -35,11 +47,22 @@ func main() {
log.Printf("saved file to %s\n", ctx.Filename)
}
db, err := database.NewDatabase()
cache := cache.NewCache(appSettings.CacheTTL)
db, err := database.NewDatabase(appSettings)
if err != nil {
log.Fatal("database creation failed", err)
}
if appSettings.EnableExporter {
go func() {
err = enableExporter(appSettings, cache, db, queue)
if err != nil {
log.Panic(err)
}
}()
log.Println("prometheus exporter started at", appSettings.ExporterAddress)
}
log.Println("importing data from file", appSettings.DataFile)
err = csvimporter.ImportCSV(appSettings.DataFile, db)
if err != nil {
@ -47,15 +70,7 @@ func main() {
}
log.Println("imported data from file successful")
cache := cache.NewCache(appSettings.CacheTTL)
lh := apiv1.NewLocationHandler(cache, db)
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
r.Use(render.SetContentType(render.ContentTypeJSON))
r.Mount("/api/v1", apiv1.NewRouter(lh))
server := &http.Server{
@ -70,6 +85,23 @@ func main() {
}
}
func enableExporter(
settings *cmd.AppSettings,
cache *cache.Cache,
db *database.Database,
queue *exporter.RequestDataQueue,
) error {
prometheus.MustRegister(exporter.NewCollector(settings, cache, db, queue))
metricsServer := &http.Server{
Addr: settings.ExporterAddress,
Handler: promhttp.Handler(),
ReadHeaderTimeout: settings.ReadHeaderTimeout,
}
return metricsServer.ListenAndServe()
}
func handleGracefulShutdown() {
var signals = make(chan os.Signal, 1)