From b1b6a16fc6e92f71588ce7a9d5faf9ac8a50d398 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 | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/main.go b/main.go index 3173abc..a92425e 100644 --- a/main.go +++ b/main.go @@ -14,15 +14,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 +36,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, ok := r.URL.Query()["screen_name"] + if !ok { 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 screenNames { + if success := probeTwitterFollowers(ctx, screenName, followersGauge); !success { + log.Error("Probe for screenname %s failed!", screenName) + } } h := promhttp.HandlerFor(reg, promhttp.HandlerOpts{})