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_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
2
go.mod
@@ -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
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-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=
|
||||||
|
|||||||
2
main.go
2
main.go
@@ -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),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>-->
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user