From 554a8a44c9d26165cb79ed3fa85dbae5f727aff3 Mon Sep 17 00:00:00 2001 From: Marvin Blum Date: Thu, 25 Jun 2020 20:42:14 +0200 Subject: [PATCH] Added language statistics to tracking page. --- dev.sh | 6 ++++-- go.mod | 2 +- go.sum | 6 ++++++ main.go | 2 ++ template/tracking.html | 28 +++++++++++++++++++++++++--- tpl/template.go | 9 +++++---- tracking/statistics.go | 33 +++++++++++++++++++++++++-------- tracking/tracking.go | 8 ++++++-- 8 files changed, 74 insertions(+), 20 deletions(-) diff --git a/dev.sh b/dev.sh index 8b6e51f..d567057 100755 --- a/dev.sh +++ b/dev.sh @@ -10,10 +10,12 @@ export MB_HOT_RELOAD=true export MB_EMVI_CLIENT_ID=3fBBn144yvSF9R3dPC8l export MB_EMVI_CLIENT_SECRET=dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg export MB_EMVI_ORGA=marvin -export MB_DB_HOST=localhost +#export MB_DB_HOST=localhost +export MB_DB_HOST=78.46.206.21 export MB_DB_PORT=5432 export MB_DB_USER=postgres -export MB_DB_PASSWORD=postgres +#export MB_DB_PASSWORD=postgres +export MB_DB_PASSWORD=D8XEi4BCRoCjFL export MB_DB_SCHEMA=marvinblum export MB_DB_SSLMODE=disable export MB_DB_SSLCERT= diff --git a/go.mod b/go.mod index 8fc11a6..e128ade 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/cenkalti/backoff/v4 v4.0.2 // indirect github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8 github.com/emvi/logbuch v1.1.1 - github.com/emvi/pirsch v0.0.0-20200625132706-9e7bfe9bb4f4 + github.com/emvi/pirsch v0.0.0-20200625182355-75f0aba03718 github.com/gorilla/mux v1.7.4 github.com/gosimple/slug v1.9.0 github.com/jmoiron/sqlx v1.2.0 diff --git a/go.sum b/go.sum index 5d4c26b..f4e7092 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,12 @@ github.com/emvi/pirsch v0.0.0-20200624123353-86381b017755 h1:TdiDC7+IfV6giMtFNvb github.com/emvi/pirsch v0.0.0-20200624123353-86381b017755/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g= github.com/emvi/pirsch v0.0.0-20200625132706-9e7bfe9bb4f4 h1:6C28hkiULQkBHhDqxRHt6PxY16/i8iTVGq5PENd8U3A= github.com/emvi/pirsch v0.0.0-20200625132706-9e7bfe9bb4f4/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g= +github.com/emvi/pirsch v0.0.0-20200625133201-5f03f30da183 h1:61I7Y4aNVZNPbCvzCwdI/vC28jpDlVpV59gwgypXXrg= +github.com/emvi/pirsch v0.0.0-20200625133201-5f03f30da183/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g= +github.com/emvi/pirsch v0.0.0-20200625145826-bf2196e7b9f8 h1:m/3rKmlG0s6nlW+yvND4TRYir7N+6XHWDm0/L4FQyfs= +github.com/emvi/pirsch v0.0.0-20200625145826-bf2196e7b9f8/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g= +github.com/emvi/pirsch v0.0.0-20200625182355-75f0aba03718 h1:FOaeJg2A9rGb5WMZsnW/2SorGesIoVn9doW1Okgt1BU= +github.com/emvi/pirsch v0.0.0-20200625182355-75f0aba03718/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE= diff --git a/main.go b/main.go index 3370dc1..4609b8a 100644 --- a/main.go +++ b/main.go @@ -133,11 +133,13 @@ func serveTracking() http.HandlerFunc { TotalVisitorsLabels template.JS TotalVisitorsDps template.JS PageVisits []tracking.PageVisits + Languages []pirsch.VisitorLanguage }{ start, totalVisitorsLabels, totalVisitorsDps, tracking.GetPageVisits(start), + tracking.GetLanguages(start), }) } } diff --git a/template/tracking.html b/template/tracking.html index 4637308..9c926da 100644 --- a/template/tracking.html +++ b/template/tracking.html @@ -32,11 +32,33 @@ {{end}} +
+

Languages

+

+ Here are the top 10 languages used by my visitors. +

+ + + + + + + + + + {{range $data := .Languages}} + + + + + + {{end}} + +
LanguageAbsoluteRelative
{{if $data.Language}}{{$data.Language}}{{else}}(not set){{end}}{{$data.Visitors}}{{round (multiply $data.RelativeVisitors 100)}} %
+
+ diff --git a/tpl/template.go b/tpl/template.go index a0e7d46..2f19393 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -2,6 +2,7 @@ package tpl import ( "bytes" + "fmt" "github.com/emvi/logbuch" "github.com/gosimple/slug" "html/template" @@ -35,10 +36,10 @@ func NewCache() *Cache { func (cache *Cache) load() { logbuch.Debug("Loading templates") funcMap := template.FuncMap{ - "slug": slug.Make, - "format": func(t time.Time, layout string) string { - return t.Format(layout) - }, + "slug": slug.Make, + "format": func(t time.Time, layout string) string { return t.Format(layout) }, + "multiply": func(f, x float64) float64 { return f * x }, + "round": func(f float64) string { return fmt.Sprintf("%.2f", f) }, } var err error cache.tpl, err = template.New("").Funcs(funcMap).ParseGlob(templateDir) diff --git a/tracking/statistics.go b/tracking/statistics.go index 213ae7a..5a45b80 100644 --- a/tracking/statistics.go +++ b/tracking/statistics.go @@ -2,6 +2,7 @@ package tracking import ( "fmt" + "github.com/emvi/logbuch" "github.com/emvi/pirsch" "html/template" "strings" @@ -19,12 +20,10 @@ type PageVisits struct { } func GetTotalVisitors(start int) (template.JS, template.JS) { - startTime := today() - startTime = startTime.Add(-time.Hour * 24 * time.Duration(start-1)) - analyzer := pirsch.NewAnalyzer(store) - visitors, err := analyzer.Visitors(&pirsch.Filter{From: startTime, To: today()}) + visitors, err := analyzer.Visitors(&pirsch.Filter{From: getStartTime(start), To: today()}) if err != nil { + logbuch.Error("Error reading visitor statistics", logbuch.Fields{"err": err}) return "", "" } @@ -32,12 +31,10 @@ func GetTotalVisitors(start int) (template.JS, template.JS) { } func GetPageVisits(start int) []PageVisits { - startTime := today() - startTime = startTime.Add(-time.Hour * 24 * time.Duration(start-1)) - analyzer := pirsch.NewAnalyzer(store) - visits, err := analyzer.PageVisits(&pirsch.Filter{From: startTime, To: today()}) + visits, err := analyzer.PageVisits(&pirsch.Filter{From: getStartTime(start), To: today()}) if err != nil { + logbuch.Error("Error reading page statistics", logbuch.Fields{"err": err}) return nil } @@ -51,6 +48,26 @@ func GetPageVisits(start int) []PageVisits { return pageVisits } +func GetLanguages(start int) []pirsch.VisitorLanguage { + languages, _, err := analyzer.Languages(&pirsch.Filter{From: getStartTime(start), To: today()}) + + if err != nil { + logbuch.Error("Error reading language statistics", logbuch.Fields{"err": err}) + return nil + } + + if len(languages) > 10 { + return languages[:10] + } + + return languages +} + +func getStartTime(start int) time.Time { + startTime := today() + return startTime.Add(-time.Hour * 24 * time.Duration(start-1)) +} + func getLabelsAndData(visitors []pirsch.VisitorsPerDay) (template.JS, template.JS) { var labels strings.Builder var dp strings.Builder diff --git a/tracking/tracking.go b/tracking/tracking.go index b2256a1..c31463d 100644 --- a/tracking/tracking.go +++ b/tracking/tracking.go @@ -15,8 +15,11 @@ const ( connectionString = `host=%s port=%s user=%s password=%s dbname=%s sslmode=%s sslcert=%s sslkey=%s sslrootcert=%s connectTimeout=%s timezone=%s` ) -var db *sqlx.DB -var store pirsch.Store +var ( + db *sqlx.DB + store pirsch.Store + analyzer *pirsch.Analyzer +) func NewTracker() *pirsch.Tracker { logbuch.Info("Connecting to database...") @@ -48,6 +51,7 @@ func NewTracker() *pirsch.Tracker { db = sqlx.NewDb(conn, "postgres") store = pirsch.NewPostgresStore(conn) tracker := pirsch.NewTracker(store, nil) + analyzer = pirsch.NewAnalyzer(store) processor := pirsch.NewProcessor(store) processTrackingData(processor) pirsch.RunAtMidnight(func() {