diff --git a/go.mod b/go.mod index bc978a0..7ef5766 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/emvi/api-go v0.2.2 github.com/emvi/logbuch v1.1.1 - github.com/emvi/pirsch v1.3.0 + github.com/emvi/pirsch v1.3.1 github.com/go-sql-driver/mysql v1.5.0 // indirect github.com/gorilla/mux v1.7.4 github.com/gosimple/slug v1.9.0 diff --git a/go.sum b/go.sum index 7f4b392..c191aeb 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,8 @@ github.com/emvi/pirsch v1.2.0 h1:k5OJwgE8/Zdq7raQNRF4aNHxWxPq7En51gWMMEFzinA= github.com/emvi/pirsch v1.2.0/go.mod h1:GDijqLHM331iWtmDmc7th19RxDrZadRkKoNvd9/kDX8= github.com/emvi/pirsch v1.3.0 h1:csgIvQKMMWF9EG4Dkfd4dFux6kfzOFC8PuNPWvsj7zM= github.com/emvi/pirsch v1.3.0/go.mod h1:GDijqLHM331iWtmDmc7th19RxDrZadRkKoNvd9/kDX8= +github.com/emvi/pirsch v1.3.1 h1:K4+VonszJvZqtM7bQz8ZFZJJjQ8jlH/h6S/JiBpNQE8= +github.com/emvi/pirsch v1.3.1/go.mod h1:GDijqLHM331iWtmDmc7th19RxDrZadRkKoNvd9/kDX8= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= diff --git a/main.go b/main.go index e299457..f6790f7 100644 --- a/main.go +++ b/main.go @@ -154,12 +154,15 @@ func serveTracking() http.HandlerFunc { TotalVisitorsLabels template.JS TotalVisitorsDps template.JS PageVisits []tracking.PageVisits + Pages []pirsch.VisitorPage Languages []pirsch.VisitorLanguage + Referer []pirsch.VisitorReferer HourlyVisitorsLabels template.JS HourlyVisitorsDps template.JS HourlyVisitorsTodayLabels template.JS HourlyVisitorsTodayDps template.JS ActiveVisitors int + ActiveVisitorPages []pirsch.PageVisitors }{ start, startDate, @@ -167,12 +170,15 @@ func serveTracking() http.HandlerFunc { totalVisitorsLabels, totalVisitorsDps, tracking.GetPageVisits(startDate, endDate), + tracking.GetPages(startDate, endDate), tracking.GetLanguages(startDate, endDate), + tracking.GetReferer(startDate, endDate), hourlyVisitorsLabels, hourlyVisitorsDps, hourlyVisitorsTodayLabels, hourlyVisitorsTodayDps, tracking.GetActiveVisitors(), + tracking.GetActiveVisitorPages(), }) } } diff --git a/template/tracking.html b/template/tracking.html index 7a2756e..c9a7d0f 100644 --- a/template/tracking.html +++ b/template/tracking.html @@ -28,6 +28,25 @@ The next diagram shows active visitors for each hour of today.

+

+ The next table shows where the active visitors are for the past 30 seconds. Visitors switching between pages fast do create duplicate entries in the table. +

+ + + + + + + + + {{range $data := .ActiveVisitorPages}} + + + + + {{end}} + +
PathVisitors
{{$data.Path}}{{$data.Visitors}}

Total Visitors

@@ -40,6 +59,28 @@

+
+

Pages

+

+ Here are the top 10 visited pages. +

+ + + + + + + + + {{range $data := .Pages}} + + + + + {{end}} + +
PathVisitors
{{$data.Path}}{{$data.Visitors}}
+

Languages

@@ -47,20 +88,42 @@

- - - - - + + + + + - {{range $data := .Languages}} + {{range $data := .Languages}} + + + + + + {{end}} + +
LanguageAbsoluteRelative
LanguageAbsoluteRelative
{{if $data.Language}}{{$data.Language}}{{else}}(not set){{end}}{{$data.Visitors}}{{round (multiply $data.RelativeVisitors 100)}} %
+
+
+

Referer

+

+ Here are the top 10 referer. +

+ + - - - + + - {{end}} + + + {{range $data := .Referer}} + + + + + {{end}}
{{if $data.Language}}{{$data.Language}}{{else}}(not set){{end}}{{$data.Visitors}}{{round (multiply $data.RelativeVisitors 100)}} %RefererVisitors
{{if $data.Referer}}{{$data.Referer}}{{else}}(unknown){{end}}{{$data.Visitors}}
diff --git a/tracking/statistics.go b/tracking/statistics.go index 1f9286c..7ad1ec8 100644 --- a/tracking/statistics.go +++ b/tracking/statistics.go @@ -48,6 +48,21 @@ func GetPageVisits(startDate, endDate time.Time) []PageVisits { return pageVisits } +func GetPages(startDate, endDate time.Time) []pirsch.VisitorPage { + pages, err := analyzer.Pages(&pirsch.Filter{From: startDate, To: endDate}) + + if err != nil { + logbuch.Error("Error reading page statistics", logbuch.Fields{"err": err}) + return nil + } + + if len(pages) > 10 { + return pages[:10] + } + + return pages +} + func GetLanguages(startDate, endDate time.Time) []pirsch.VisitorLanguage { languages, _, err := analyzer.Languages(&pirsch.Filter{From: startDate, To: endDate}) @@ -63,6 +78,21 @@ func GetLanguages(startDate, endDate time.Time) []pirsch.VisitorLanguage { return languages } +func GetReferer(startDate, endDate time.Time) []pirsch.VisitorReferer { + referer, err := analyzer.Referer(&pirsch.Filter{From: startDate, To: endDate}) + + if err != nil { + logbuch.Error("Error reading referer statistics", logbuch.Fields{"err": err}) + return nil + } + + if len(referer) > 10 { + return referer[:10] + } + + return referer +} + func GetHourlyVisitors(startDate, endDate time.Time) (template.JS, template.JS) { visitors, err := analyzer.HourlyVisitors(&pirsch.Filter{From: startDate, To: endDate}) @@ -96,6 +126,17 @@ func GetActiveVisitors() int { return visitors } +func GetActiveVisitorPages() []pirsch.PageVisitors { + pages, err := analyzer.ActiveVisitorsPages(pirsch.NullTenant, time.Second*30) + + if err != nil { + logbuch.Error("Error reading active visitor pages", logbuch.Fields{"err": err}) + return nil + } + + return pages +} + 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 bf8cf28..cfa5b26 100644 --- a/tracking/tracking.go +++ b/tracking/tracking.go @@ -56,7 +56,6 @@ func NewTracker() (*pirsch.Tracker, context.CancelFunc) { }) analyzer = pirsch.NewAnalyzer(store) processor := pirsch.NewProcessor(store, nil) - processTrackingData(processor) cancel := pirsch.RunAtMidnight(func() { processTrackingData(processor) })