covid-exporter/main.go

133 lines
2.8 KiB
Go

// vi:ts=4:sts=4:sw=4:noet:tw=72
//
// covid-exporter
//
// Copyright (c) 2021 Andreas Neue <an@dnix.de>
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
"github.com/prometheus/client_golang/prometheus"
)
type CovidRecord struct {
Updated int
Country string
CountryInfo interface{}
Cases int
TodayCases int
Deaths int
TodayDeaths int
Recovered int
TodayRecovered int
Active int
Critical int
CasesPerOneMillion float32
DeathsPerOneMillion float32
Tests int
TestsPerOneMillion int
Population int
Continent string
OneCasePerPeople int
OneDeathPerPeople int
OneTestPerPeople int
ActivePerOneMillion float32
RecoveredPerOneMillion float32
CriticalPerOneMillion float32
}
var (
gaugeCases *prometheus.GaugeVec
gaugeActive *prometheus.GaugeVec
gaugeCritical *prometheus.GaugeVec
gaugePopulation *prometheus.GaugeVec
)
func main() {
url := "https://corona.lmao.ninja/v3/covid-19/countries"
go getCovidStats(url)
serveMetrics()
}
func getCovidStats(url string) {
for {
resp, err := http.Get(url)
if err != nil {
fmt.Printf("%v\n", err)
continue
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Printf("%v\n", err)
continue
}
var cr []CovidRecord
err = json.Unmarshal(data, &cr)
if err != nil {
fmt.Printf("%v\n", err)
continue
}
for i := range cr {
gaugeCases.WithLabelValues(cr[i].Country).Set(float64(cr[i].Cases))
gaugeActive.WithLabelValues(cr[i].Country).Set(float64(cr[i].Active))
gaugeCritical.WithLabelValues(cr[i].Country).Set(float64(cr[i].Critical))
gaugePopulation.WithLabelValues(cr[i].Country).Set(float64(cr[i].Population))
}
time.Sleep(15 * time.Minute)
}
}
func serveMetrics() {
gaugeCases = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "covid_cases",
Help: "Covid-19 cases",
},
[]string{
"country",
},
)
prometheus.MustRegister(gaugeCases)
gaugeActive = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "covid_active",
Help: "Covid-19 active cases",
},
[]string{
"country",
},
)
prometheus.MustRegister(gaugeActive)
gaugeCritical = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "covid_critical",
Help: "Covid-19 critical cases",
},
[]string{
"country",
},
)
prometheus.MustRegister(gaugeCritical)
gaugePopulation = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "covid_population",
Help: "Population",
},
[]string{
"country",
},
)
prometheus.MustRegister(gaugePopulation)
http.Handle("/metrics", prometheus.Handler())
http.ListenAndServe(":9099", nil)
}