Go SDK
Go server-side SDK with middleware for popular frameworks
Go SDK
The entro-go package provides a Go SDK for server-side analytics tracking with middleware support for popular web frameworks.
Installation
go get github.com/entro314labs/entro-goQuick Start
Install Package
go get github.com/entro314labs/entro-goCreate a Client
package main
import (
"log"
entrolytics "github.com/entro314labs/entro-go"
)
func main() {
client := entrolytics.NewClient("ent_xxx")
// Track event
err := client.Track(entrolytics.Event{
WebsiteID: "your-website-id",
Name: "purchase",
Data: map[string]interface{}{
"revenue": 99.99,
"currency": "USD",
},
})
if err != nil {
log.Fatal(err)
}
}Track Events
// Track page view
err := client.PageView(entrolytics.PageView{
WebsiteID: "your-website-id",
URL: "/pricing",
Referrer: "https://google.com",
Title: "Pricing",
})
// Identify user
err := client.Identify(entrolytics.Identify{
WebsiteID: "your-website-id",
UserID: "user_456",
Traits: map[string]interface{}{
"email": "user@example.com",
"plan": "pro",
},
})Configuration
client := entrolytics.NewClientWithOptions(entrolytics.ClientOptions{
APIKey: "ent_xxx",
Host: "https://analytics.yourcompany.com",
Timeout: 15 * time.Second,
UserAgent: "my-app/1.0",
})Framework Integrations
Standard HTTP Middleware
package main
import (
"log"
"net/http"
entrolytics "github.com/entro314labs/entro-go"
)
func trackMiddleware(next http.Handler, client *entrolytics.Client, websiteID string) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Track page view
go func() {
err := client.PageView(entrolytics.PageView{
WebsiteID: websiteID,
URL: r.URL.String(),
Referrer: r.Referer(),
UserAgent: r.UserAgent(),
IPAddress: getClientIP(r),
})
if err != nil {
log.Printf("Failed to track: %v", err)
}
}()
next.ServeHTTP(w, r)
})
}
func getClientIP(r *http.Request) string {
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
return strings.Split(xff, ",")[0]
}
return strings.Split(r.RemoteAddr, ":")[0]
}Gin Middleware
package main
import (
"github.com/gin-gonic/gin"
entrolytics "github.com/entro314labs/entro-go"
)
func EntrolyticsMiddleware(client *entrolytics.Client, websiteID string) gin.HandlerFunc {
return func(c *gin.Context) {
c.Next()
// Track after request completes
go func() {
client.PageView(entrolytics.PageView{
WebsiteID: websiteID,
URL: c.Request.URL.String(),
Referrer: c.Request.Referer(),
UserAgent: c.Request.UserAgent(),
IPAddress: c.ClientIP(),
})
}()
}
}
func main() {
client := entrolytics.NewClient("ent_xxx")
r := gin.Default()
r.Use(EntrolyticsMiddleware(client, "your-website-id"))
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Hello"})
})
r.Run(":8080")
}Echo Middleware
package main
import (
"github.com/labstack/echo/v4"
entrolytics "github.com/entro314labs/entro-go"
)
func EntrolyticsMiddleware(client *entrolytics.Client, websiteID string) echo.MiddlewareFunc {
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
err := next(c)
// Track after request
go func() {
client.PageView(entrolytics.PageView{
WebsiteID: websiteID,
URL: c.Request().URL.String(),
Referrer: c.Request().Referer(),
UserAgent: c.Request().UserAgent(),
IPAddress: c.RealIP(),
})
}()
return err
}
}
}
func main() {
client := entrolytics.New Client("ent_xxx")
e := echo.New()
e.Use(EntrolyticsMiddleware(client, "your-website-id"))
e.GET("/", func(c echo.Context) error {
return c.String(200, "Hello")
})
e.Start(":8080")
}Chi Middleware
package main
import (
"net/http"
"github.com/go-chi/chi/v5"
entrolytics "github.com/entro314labs/entro-go"
)
func EntrolyticsMiddleware(client *entrolytics.Client, websiteID string) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
next.ServeHTTP(w, r)
// Track after request
go func() {
client.PageView(entrolytics.PageView{
WebsiteID: websiteID,
URL: r.URL.String(),
Referrer: r.Referer(),
UserAgent: r.UserAgent(),
})
}()
})
}
}
func main() {
client := entrolytics.NewClient("ent_xxx")
r := chi.NewRouter()
r.Use(EntrolyticsMiddleware(client, "your-website-id"))
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello"))
})
http.ListenAndServe(":8080", r)
}Context Support
All methods support context for cancellation and timeouts:
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
err := client.TrackWithContext(ctx, entrolytics.Event{
WebsiteID: "your-website-id",
Name: "purchase",
Data: map[string]interface{}{
"revenue": 99.99,
},
})Advanced Usage
API Reference
Types
type Event struct {
WebsiteID string
Name string
Data map[string]interface{}
URL string
Referrer string
UserID string
SessionID string
UserAgent string
IPAddress string
Timestamp *time.Time
}
type PageView struct {
WebsiteID string
URL string
Referrer string
Title string
UserID string
SessionID string
UserAgent string
IPAddress string
Timestamp *time.Time
}
type Identify struct {
WebsiteID string
UserID string
Traits map[string]interface{}
Timestamp *time.Time
}Requirements
- Go
>= 1.21
Features
- ✅ Context support for timeouts/cancellation
- ✅ Middleware for popular frameworks
- ✅ Comprehensive error types
- ✅ Custom HTTP client support
- ✅ Concurrent-safe
- ✅ Zero dependencies