Added language statistics to tracking page.

This commit is contained in:
Marvin Blum
2020-06-25 20:42:14 +02:00
committed by Marvin Blum
parent 65d19fdf51
commit 554a8a44c9
8 changed files with 74 additions and 20 deletions

6
dev.sh
View File

@@ -10,10 +10,12 @@ export MB_HOT_RELOAD=true
export MB_EMVI_CLIENT_ID=3fBBn144yvSF9R3dPC8l export MB_EMVI_CLIENT_ID=3fBBn144yvSF9R3dPC8l
export MB_EMVI_CLIENT_SECRET=dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg export MB_EMVI_CLIENT_SECRET=dw3FeshelTgdf1Gj13J7uF5FfdPDi40sQvvwqeFVKTTyIDuCdlAHhRY72csFL6yg
export MB_EMVI_ORGA=marvin 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_PORT=5432
export MB_DB_USER=postgres 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_SCHEMA=marvinblum
export MB_DB_SSLMODE=disable export MB_DB_SSLMODE=disable
export MB_DB_SSLCERT= export MB_DB_SSLCERT=

2
go.mod
View File

@@ -8,7 +8,7 @@ require (
github.com/cenkalti/backoff/v4 v4.0.2 // indirect github.com/cenkalti/backoff/v4 v4.0.2 // indirect
github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8 github.com/emvi/api-go v0.0.0-20191210194347-0a945446f6a8
github.com/emvi/logbuch v1.1.1 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/gorilla/mux v1.7.4
github.com/gosimple/slug v1.9.0 github.com/gosimple/slug v1.9.0
github.com/jmoiron/sqlx v1.2.0 github.com/jmoiron/sqlx v1.2.0

6
go.sum
View File

@@ -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-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 h1:6C28hkiULQkBHhDqxRHt6PxY16/i8iTVGq5PENd8U3A=
github.com/emvi/pirsch v0.0.0-20200625132706-9e7bfe9bb4f4/go.mod h1:+YmBbltJ3feZz9L/QQyqwywltYvQKBfzrGD51TPKl5g= 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/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/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= github.com/exoscale/egoscale v0.18.1/go.mod h1:Z7OOdzzTOz1Q1PjQXumlz9Wn/CddH0zSYdCF3rnBKXE=

View File

@@ -133,11 +133,13 @@ func serveTracking() http.HandlerFunc {
TotalVisitorsLabels template.JS TotalVisitorsLabels template.JS
TotalVisitorsDps template.JS TotalVisitorsDps template.JS
PageVisits []tracking.PageVisits PageVisits []tracking.PageVisits
Languages []pirsch.VisitorLanguage
}{ }{
start, start,
totalVisitorsLabels, totalVisitorsLabels,
totalVisitorsDps, totalVisitorsDps,
tracking.GetPageVisits(start), tracking.GetPageVisits(start),
tracking.GetLanguages(start),
}) })
} }
} }

View File

@@ -32,11 +32,33 @@
</section> </section>
{{end}} {{end}}
<section>
<h2>Languages</h2>
<p>
Here are the top 10 languages used by my visitors.
</p>
<table>
<thead>
<tr>
<th>Language</th>
<th>Absolute</th>
<th>Relative</th>
</tr>
</thead>
<tbody>
{{range $data := .Languages}}
<tr>
<td>{{if $data.Language}}{{$data.Language}}{{else}}(not set){{end}}</td>
<td>{{$data.Visitors}}</td>
<td>{{round (multiply $data.RelativeVisitors 100)}} %</td>
</tr>
{{end}}
</tbody>
</table>
</section>
<!-- TODO --> <!-- TODO -->
<!--<section> <!--<section>
<h2>Languages</h2>
</section>
<section>
<h2>Visitors Per Hour</h2> <h2>Visitors Per Hour</h2>
</section>--> </section>-->

View File

@@ -2,6 +2,7 @@ package tpl
import ( import (
"bytes" "bytes"
"fmt"
"github.com/emvi/logbuch" "github.com/emvi/logbuch"
"github.com/gosimple/slug" "github.com/gosimple/slug"
"html/template" "html/template"
@@ -36,9 +37,9 @@ func (cache *Cache) load() {
logbuch.Debug("Loading templates") logbuch.Debug("Loading templates")
funcMap := template.FuncMap{ funcMap := template.FuncMap{
"slug": slug.Make, "slug": slug.Make,
"format": func(t time.Time, layout string) string { "format": func(t time.Time, layout string) string { return t.Format(layout) },
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 var err error
cache.tpl, err = template.New("").Funcs(funcMap).ParseGlob(templateDir) cache.tpl, err = template.New("").Funcs(funcMap).ParseGlob(templateDir)

View File

@@ -2,6 +2,7 @@ package tracking
import ( import (
"fmt" "fmt"
"github.com/emvi/logbuch"
"github.com/emvi/pirsch" "github.com/emvi/pirsch"
"html/template" "html/template"
"strings" "strings"
@@ -19,12 +20,10 @@ type PageVisits struct {
} }
func GetTotalVisitors(start int) (template.JS, template.JS) { func GetTotalVisitors(start int) (template.JS, template.JS) {
startTime := today() visitors, err := analyzer.Visitors(&pirsch.Filter{From: getStartTime(start), To: 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()})
if err != nil { if err != nil {
logbuch.Error("Error reading visitor statistics", logbuch.Fields{"err": err})
return "", "" return "", ""
} }
@@ -32,12 +31,10 @@ func GetTotalVisitors(start int) (template.JS, template.JS) {
} }
func GetPageVisits(start int) []PageVisits { func GetPageVisits(start int) []PageVisits {
startTime := today() visits, err := analyzer.PageVisits(&pirsch.Filter{From: getStartTime(start), To: 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()})
if err != nil { if err != nil {
logbuch.Error("Error reading page statistics", logbuch.Fields{"err": err})
return nil return nil
} }
@@ -51,6 +48,26 @@ func GetPageVisits(start int) []PageVisits {
return 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) { func getLabelsAndData(visitors []pirsch.VisitorsPerDay) (template.JS, template.JS) {
var labels strings.Builder var labels strings.Builder
var dp strings.Builder var dp strings.Builder

View File

@@ -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` 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 (
var store pirsch.Store db *sqlx.DB
store pirsch.Store
analyzer *pirsch.Analyzer
)
func NewTracker() *pirsch.Tracker { func NewTracker() *pirsch.Tracker {
logbuch.Info("Connecting to database...") logbuch.Info("Connecting to database...")
@@ -48,6 +51,7 @@ func NewTracker() *pirsch.Tracker {
db = sqlx.NewDb(conn, "postgres") db = sqlx.NewDb(conn, "postgres")
store = pirsch.NewPostgresStore(conn) store = pirsch.NewPostgresStore(conn)
tracker := pirsch.NewTracker(store, nil) tracker := pirsch.NewTracker(store, nil)
analyzer = pirsch.NewAnalyzer(store)
processor := pirsch.NewProcessor(store) processor := pirsch.NewProcessor(store)
processTrackingData(processor) processTrackingData(processor)
pirsch.RunAtMidnight(func() { pirsch.RunAtMidnight(func() {