From a6c66568c8b59563b64f3ad3d2d4f4a36ec53004 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Mon, 19 Aug 2019 13:48:21 -0400 Subject: Pageview times experiment (#69) * experiment: track pageview times * strictly respect do not track * oops * asdfasdfasdf * add blogpost * fix typos oops --- cmd/site/main.go | 1 + cmd/site/pageview.go | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 cmd/site/pageview.go (limited to 'cmd') diff --git a/cmd/site/main.go b/cmd/site/main.go index b7774b1..04d8bc4 100644 --- a/cmd/site/main.go +++ b/cmd/site/main.go @@ -223,6 +223,7 @@ func Build() (*Site, error) { w.Header().Set("Content-Type", "application/xml") _, _ = smi.WriteTo(w) }))) + s.mux.HandleFunc("/api/pageview-timer", handlePageViewTimer) return s, nil } diff --git a/cmd/site/pageview.go b/cmd/site/pageview.go new file mode 100644 index 0000000..5154659 --- /dev/null +++ b/cmd/site/pageview.go @@ -0,0 +1,53 @@ +package main + +import ( + "encoding/json" + "io/ioutil" + "net/http" + "time" + + "github.com/prometheus/client_golang/prometheus" + "within.website/ln" +) + +var ( + readTimes = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + Name: "blogpage_read_times", + Help: "This tracks how much time people spend reading articles on my blog", + }, []string{"path"}) +) + +func init() { + _ = prometheus.Register(readTimes) +} + +func handlePageViewTimer(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("DNT") == "1" { + http.NotFound(w, r) + return + } + + data, err := ioutil.ReadAll(r.Body) + if err != nil { + ln.Error(r.Context(), err, ln.Info("while reading data")) + http.Error(w, "oopsie whoopsie uwu", http.StatusInternalServerError) + return + } + r.Body.Close() + + type metricsData struct { + Path string `json:"path"` + StartTime time.Time `json:"start_time"` + EndTime time.Time `json:"end_time"` + } + var md metricsData + err = json.Unmarshal(data, &md) + if err != nil { + http.NotFound(w, r) + return + } + + diff := md.EndTime.Sub(md.StartTime).Seconds() + + readTimes.WithLabelValues(md.Path).Observe(float64(diff)) +} -- cgit v1.2.3