From 69dfbca7b29dfa72052d6af4c84a279809f0f423 Mon Sep 17 00:00:00 2001 From: Sam Willcocks Date: Thu, 4 Aug 2022 14:43:06 +0300 Subject: [PATCH] Add support for multiple screen_names --- main.go | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/main.go b/main.go index 3173abc..814c0de 100644 --- a/main.go +++ b/main.go @@ -7,6 +7,7 @@ import ( "fmt" "net/http" "net/url" + "strings" "time" "github.com/prometheus/client_golang/prometheus" @@ -14,15 +15,7 @@ import ( log "github.com/sirupsen/logrus" ) -func probeTwitter(ctx context.Context, target string, registry *prometheus.Registry) (success bool) { - followersGauge := prometheus.NewGaugeVec(prometheus.GaugeOpts{ - Name: "twitter_followers", - Help: "The number of followers of the twitter account.", - }, - []string{"screen_name"}) - - registry.MustRegister(followersGauge) - +func probeTwitterFollowers(ctx context.Context, target string, gauge *prometheus.GaugeVec) (success bool) { res, err := http.Get(fmt.Sprintf("https://cdn.syndication.twimg.com/widgets/followbutton/info.json?screen_names=%s", url.QueryEscape(target))) if err != nil { log.Errorf("fetching url: %s", err) @@ -44,24 +37,35 @@ func probeTwitter(ctx context.Context, target string, registry *prometheus.Regis log.Errorf("Unexpected (>1) results returned. WTF twitter??") return false } - followersGauge.With(prometheus.Labels{"screen_name": target}).Set(float64(data[0].FollowersCount)) + gauge.With(prometheus.Labels{"screen_name": target}).Set(float64(data[0].FollowersCount)) return true } func twitterHandler(w http.ResponseWriter, r *http.Request) { - screenName := r.URL.Query().Get("screen_name") - if screenName == "" { + reg := prometheus.NewRegistry() + followersGauge := prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "twitter_followers", + Help: "The number of followers of the twitter account.", + }, + []string{"screen_name"}, + ) + + reg.MustRegister(followersGauge) + + screenNames := r.URL.Query().Get("screen_name") + if screenNames == "" { http.Error(w, "screen_name parameter is missing", http.StatusBadRequest) return } - reg := prometheus.NewRegistry() - ctx, cancel := context.WithTimeout(r.Context(), time.Duration(5*time.Second)) defer cancel() - if success := probeTwitter(ctx, screenName, reg); !success { - log.Error("Probe failed!") + for _, screenName := range strings.Split(screenNames, ",") { + if success := probeTwitterFollowers(ctx, screenName, followersGauge); !success { + log.Error("Probe for screenname %s failed!", screenName) + } } h := promhttp.HandlerFor(reg, promhttp.HandlerOpts{})