[feat] add prometheus metrics for country master
authorkali kaneko (leap communications) <kali@leap.se>
Wed, 25 Mar 2020 17:57:41 +0000 (18:57 +0100)
committerkali kaneko (leap communications) <kali@leap.se>
Thu, 26 Mar 2020 16:09:43 +0000 (17:09 +0100)
README.rst
main.go
metrics.go [new file with mode: 0644]

index 5c95617..d978019 100644 (file)
@@ -14,6 +14,8 @@ You can use ``geoipupdate`` to download MaxMind's City database::
     sudo cp /usr/share/doc/geoipupdate/examples/GeoIP.conf.default /etc/GeoIP.conf
     sudo geoipupdate -v
 
+(note: this service now requires a license key)
+
 Usage
 -----------------------
 
diff --git a/main.go b/main.go
index ad69312..aa57c86 100644 (file)
--- a/main.go
+++ b/main.go
@@ -32,6 +32,8 @@ import (
        "github.com/StefanSchroeder/Golang-Ellipsoid/ellipsoid"
        "github.com/hongshibao/go-kdtree"
        "github.com/oschwald/geoip2-golang"
+       "github.com/prometheus/client_golang/prometheus"
+       "github.com/prometheus/client_golang/prometheus/promhttp"
        "github.com/tidwall/cities"
 )
 
@@ -178,6 +180,8 @@ func (jh *jsonHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
        record := jh.geoipdb.getRecordForIP(ipstr)
        sortedGateways := jh.geoipdb.sortGateways(record.Location.Latitude, record.Location.Longitude)
 
+       hitsPerCountry.With(prometheus.Labels{"country": record.Country.IsoCode}).Inc()
+
        data := &GeolocationJSON{
                ipstr,
                record.Country.IsoCode,
@@ -210,6 +214,7 @@ func (th *txtHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
 func main() {
        rand.Seed(time.Now().UnixNano())
        var port = flag.Int("port", 9001, "port where the service listens on")
+       var metricsPort = flag.Int("metricsPort", 9002, "port where the metrics server listens on")
        var dbpath = flag.String("geodb", "/var/lib/GeoIP/GeoLite2-City.mmdb", "path to the GeoLite2-City database")
        var notls = flag.Bool("notls", false, "disable TLS on the service")
        var key = flag.String("server_key", "", "path to the key file for TLS")
@@ -255,6 +260,17 @@ func main() {
        th := &txtHandler{&geoipdb}
        mux.Handle("/", th)
 
+       mtr := http.NewServeMux()
+       mtr.Handle("/metrics", promhttp.Handler())
+
+       /* prometheus metrics */
+       go func() {
+               pstr := ":" + strconv.Itoa(*metricsPort)
+               log.Println("/metrics endpoint listening in port", *metricsPort)
+               log.Fatal(http.ListenAndServe(pstr, mtr))
+       }()
+
+       /* geolocation api */
        log.Println("Started Geolocation Service")
        log.Printf("Listening on port %v...\n", *port)
 
diff --git a/metrics.go b/metrics.go
new file mode 100644 (file)
index 0000000..2c581ba
--- /dev/null
@@ -0,0 +1,13 @@
+package main
+
+import (
+       "github.com/prometheus/client_golang/prometheus"
+       "github.com/prometheus/client_golang/prometheus/promauto"
+)
+
+var hitsPerCountry = promauto.NewCounterVec(prometheus.CounterOpts{
+       Name: "getmyip_hits",
+       Help: "Number of hits in the geolocation service",
+},
+       []string{"country"},
+)