diff options
Diffstat (limited to 'system/api/analytics')
-rw-r--r-- | system/api/analytics/batch.go | 47 | ||||
-rw-r--r-- | system/api/analytics/init.go | 12 |
2 files changed, 54 insertions, 5 deletions
diff --git a/system/api/analytics/batch.go b/system/api/analytics/batch.go new file mode 100644 index 0000000..1fee247 --- /dev/null +++ b/system/api/analytics/batch.go @@ -0,0 +1,47 @@ +package analytics + +import ( + "encoding/json" + "strconv" + + "github.com/boltdb/bolt" +) + +// batchInsert is effectively a specialized version of SetContentMulti from the +// db package, iterating over a []apiRequest instead of []url.Values +func batchInsert(batch []apiRequest) error { + err := store.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte("requests")) + if err != nil { + return err + } + + for _, apiReq := range batch { + // get the next available ID and convert to string + // also set effectedID to int of ID + id, err := b.NextSequence() + if err != nil { + return err + } + cid := strconv.FormatUint(id, 10) + + j, err := json.Marshal(apiReq) + if err != nil { + return err + } + + err = b.Put([]byte(cid), j) + if err != nil { + return err + } + } + + return nil + + }) + if err != nil { + return err + } + + return nil +} diff --git a/system/api/analytics/init.go b/system/api/analytics/init.go index c351bed..3af1407 100644 --- a/system/api/analytics/init.go +++ b/system/api/analytics/init.go @@ -15,6 +15,7 @@ import ( type apiRequest struct { URL string `json:"url"` Method string `json:"http_method"` + Origin string `json:"origin"` RemoteAddr string `json:"ip_address"` Timestamp int64 `json:"timestamp"` External bool `json:"external"` @@ -32,6 +33,7 @@ func Record(req *http.Request) { r := apiRequest{ URL: req.URL.String(), Method: req.Method, + Origin: req.Header.Get("Origin"), RemoteAddr: req.RemoteAddr, Timestamp: time.Now().Unix() * 1000, External: external, @@ -39,7 +41,6 @@ func Record(req *http.Request) { // put r on buffered recordChan to take advantage of batch insertion in DB recordChan <- r - } // Close exports the abillity to close our db file. Should be called with defer @@ -64,10 +65,6 @@ func Init() { go serve() - err = store.Update(func(tx *bolt.Tx) error { - - return nil - }) if err != nil { log.Fatalln(err) } @@ -93,6 +90,11 @@ func serve() { reqs = append(reqs, <-recordChan) } + err := batchInsert(reqs) + if err != nil { + log.Println(err) + } + case <-pruneDBTimer.C: default: |