Author: Paolo Lulli <paolo@lulli.net>
Add event endpoint
.gitignore | 1 client/postEventNow | 8 ++++++ client/postMetricNow.sh | 2 schema/schema.cql | 18 ++++++++++++++ server/db/event.go | 18 ++++++++++++++ server/geo/distances.go | 15 ----------- server/geo/distances_test.go | 6 +++- server/rest/rest-event.go | 46 ++++++++++++++++++++++++++++++++++++++ server/service-rest.go | 5 +++ server/yats.go | 17 +++++++++++++
diff --git a/.gitignore b/.gitignore index 56765fd5953b16777bdad7518505669d569a8d0d..e68b7924b97923e1119af047ce2d054c29d14d4e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ server/yats-server .dqt +.vscode/ diff --git a/client/postEventNow b/client/postEventNow new file mode 100755 index 0000000000000000000000000000000000000000..ac6c90d31a2b44e8106b3820de3538bede35b047 --- /dev/null +++ b/client/postEventNow @@ -0,0 +1,8 @@ +#! /bin/bash + +event=$1 +curl \ + -X POST\ + --header "Content-Type: application/json"\ + -d "{\"id_client\":\"cli1\",\"name\":\"${event}\"}"\ + http://127.0.0.1:18081/rt/event diff --git a/client/postMetricNow.sh b/client/postMetricNow.sh index d255123644f4584744ddad742cac219889dba964..1224711169ffcd335f72eb49355c77c39012dae0 100755 --- a/client/postMetricNow.sh +++ b/client/postMetricNow.sh @@ -4,4 +4,4 @@ curl \ -X POST\ --header "Content-Type: application/json"\ -d '{"id_client":"cli1","name":"mone","value":"vone"}'\ - http://127.0.0.1:18081/metric/now + http://127.0.0.1:18081/rt/metric diff --git a/schema/schema.cql b/schema/schema.cql index b0e24291d22408d1f6fc74cd48fa34d177ab8638..723965716188bbb3dec0c5d04064be5e3664944d 100644 --- a/schema/schema.cql +++ b/schema/schema.cql @@ -18,3 +18,21 @@ name text, created timestamp, PRIMARY KEY(id) ); +CREATE TABLE location ( + hash text, + lname text, + lon double, + lat double, + code text, + cdist double, + PRIMARY KEY (code,cdist) +); +CREATE TABLE location_label ( + hash text, + ltype text, + name text, + PRIMARY KEY (ltype,hash) +); + +// select * from location where lat='' and lon='' +// select * from location where ltype='' and code='' order by cdist diff --git a/server/db/event.go b/server/db/event.go new file mode 100644 index 0000000000000000000000000000000000000000..e0fd62e54f67cc558f02406050d74b9184ba290b --- /dev/null +++ b/server/db/event.go @@ -0,0 +1,18 @@ +package db + +import ( + "fmt" + "time" +) + +func SaveEvent(idClient string, eventName string) { + q := fmt.Sprintf("insert into event ( id_client, etime, name) values ('%s',toTimestamp(now()),'%s');", idClient, eventName) + fmt.Printf("q=%s", q) + Session.Query(q).Exec() +} + +func SaveEventAt(idClient string, tstamp time.Time, eventName string) { + timeAsBytes, _ := tstamp.UTC().MarshalText() + q := fmt.Sprintf("insert into event ( id_client, etime, name) values ('%s','%s','%s');", idClient, string(timeAsBytes), eventName) + Session.Query(q).Exec() +} diff --git a/server/geo/distances.go b/server/geo/distances.go index 94f7a0e323f9a42e48f947288d9e6f9e7c9c7dcf..ea64ce2da50e0eb977995789fd3e8f9f62a22d19 100644 --- a/server/geo/distances.go +++ b/server/geo/distances.go @@ -12,27 +12,14 @@ func hsin(theta float64) float64 { return math.Pow(math.Sin(theta/2), 2) } -// Distance function returns the distance (in meters) between two points of -// -// a given longitude and latitude relatively accurately (using a spherical -// approximation of the Earth) through the Haversin Distance Formula for -// great arc distance on a sphere with accuracy for small distances -// -// point coordinates are supplied in degrees and converted into rad. in the func -// -// distance returned is meters -// http://en.wikipedia.org/wiki/Haversine_formula func Distance(coordinate1, coordinate2 coordinate) float64 { - // convert to radians - // must cast radius as float to multiply later - var la1, lo1, la2, lo2, r float64 la1 = coordinate1.lat * math.Pi / 180 lo1 = coordinate1.lon * math.Pi / 180 la2 = coordinate2.lat * math.Pi / 180 lo2 = coordinate2.lon * math.Pi / 180 - r = 6378100 // Earth radius in meters + r = 6378100 // Earth radius // calculate h := hsin(la2-la1) + math.Cos(la1)*math.Cos(la2)*hsin(lo2-lo1) diff --git a/server/geo/distances_test.go b/server/geo/distances_test.go index 87c0ca92733d11c4f77896ebfa79b078ae94ed91..a959ca3d786c0a66eef1359b3b9b255b50bf498e 100644 --- a/server/geo/distances_test.go +++ b/server/geo/distances_test.go @@ -29,11 +29,13 @@ } func TestMaidenHead(t *testing.T) { //winnipeg := coordinate{50.445210, -104.618896} - point := coordinate{50.445210, -104.618896} + //point := coordinate{50.445210, -104.618896} + +point := coordinate{0,0} var p = maidenhead.NewPoint(point.lat, point.lon) - locator, _ := p.Locator(2) + locator, _ := p.Locator(3) fmt.Printf("Locator: %s\n", locator) var centerOfMaidenHead, _ = maidenhead.ParseLocatorCentered(locator) diff --git a/server/rest/rest-event.go b/server/rest/rest-event.go new file mode 100644 index 0000000000000000000000000000000000000000..81622fb57bad4e53e1f3c4c016451249e2264df5 --- /dev/null +++ b/server/rest/rest-event.go @@ -0,0 +1,46 @@ +package rest + +import ( + "fmt" + "net/http" + "time" + "yats-server/db" + + "github.com/gin-gonic/gin" +) + +type EventRequest struct { + ID_client string `json:"id_client"` + Etime int64 `json:"etime"` + Name string `json:"name"` +} + +func WriteEventNow(c *gin.Context) { + var event EventRequest + + if err := c.BindJSON(&event); err != nil { + c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "-1"}) + return + } + + fmt.Printf("%s / %s ", event.ID_client, event.Name) + db.SaveEvent(event.ID_client, event.Name) + + c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "0"}) +} + +func WriteEventcAt(c *gin.Context) { + var event EventRequest + + if err := c.BindJSON(&event); err != nil { + c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "-1"}) + return + } + + fmt.Printf("%s / %s ", event.ID_client, event.Name) + + unixTimeUTC := time.Unix(event.Etime, 0) + db.SaveEventAt(event.ID_client, unixTimeUTC, event.Name) + + c.IndentedJSON(http.StatusAccepted, gin.H{"ret": "OK"}) +} diff --git a/server/service-rest.go b/server/service-rest.go index 46cd7fecdb0d3cea22da283d3847dbeeb5ce66c9..f8c900eda9d40f0056b01d18c60ea0307ed8db0a 100644 --- a/server/service-rest.go +++ b/server/service-rest.go @@ -18,8 +18,11 @@ router.SetTrustedProxies([]string{"127.0.0.1"}) gin.SetMode(gin.ReleaseMode) - router.POST("/metric/now", rest.WriteMetricNow) + router.POST("/rt/metric", rest.WriteMetricNow) router.POST("/metric", rest.WriteMetricAt) + + router.POST("/rt/event", rest.WriteEventNow) + router.POST("/event", rest.WriteEventcAt) router.Run(address) //router.RunTLS(address, c.CertFile, c.KeyFile) diff --git a/server/yats.go b/server/yats.go index b1c96103d02e0b8137e9222c092797a9c297606c..9d6b266cdb8195eae0a4f6c4415375375c932edf 100644 --- a/server/yats.go +++ b/server/yats.go @@ -1,12 +1,28 @@ package main import ( + "fmt" "os" + "time" "yats-server/config" "yats-server/db" ) func main() { + go maintenanceThread() + + startServer() +} + +func maintenanceThread() { + var sleeptime, _ = time.ParseDuration("60s") + for { + time.Sleep(sleeptime) + fmt.Printf("Maintenance Thread\n") + } +} + +func startServer() { configuration := config.GetConfig(os.Getenv("HOME") + "/.yats.json") db.Session = db.InitializeDb(configuration) @@ -24,5 +40,4 @@ db.PrintMetrics(metrics) */ RestService(configuration) - }