mirror of
https://github.com/Kugelschieber/marvinblum.git
synced 2026-01-18 14:50:27 +00:00
Added language statistics to tracking page.
This commit is contained in:
6
dev.sh
6
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=
|
||||
|
||||
2
go.mod
2
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
|
||||
|
||||
6
go.sum
6
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=
|
||||
|
||||
2
main.go
2
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),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,11 +32,33 @@
|
||||
</section>
|
||||
{{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 -->
|
||||
<!--<section>
|
||||
<h2>Languages</h2>
|
||||
</section>
|
||||
<section>
|
||||
<h2>Visitors Per Hour</h2>
|
||||
</section>-->
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ package tpl
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"fmt"
|
||||
"github.com/emvi/logbuch"
|
||||
"github.com/gosimple/slug"
|
||||
"html/template"
|
||||
@@ -36,9 +37,9 @@ 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)
|
||||
},
|
||||
"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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user