first test
This commit is contained in:
		
							parent
							
								
									1f6aba0e74
								
							
						
					
					
						commit
						4b7ae0ef92
					
				
					 1 changed files with 132 additions and 0 deletions
				
			
		
							
								
								
									
										132
									
								
								main.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								main.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,132 @@
 | 
			
		|||
// 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)
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue