Add initial golang code tracing and logging
This commit is contained in:
parent
24c2c39d9b
commit
a96a8466cb
16 changed files with 240 additions and 80 deletions
|
@ -16,13 +16,16 @@ package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
"github.com/abcum/surreal/util/item"
|
"github.com/abcum/surreal/util/item"
|
||||||
"github.com/abcum/surreal/util/keys"
|
"github.com/abcum/surreal/util/keys"
|
||||||
"github.com/abcum/surreal/util/uuid"
|
"github.com/abcum/surreal/util/uuid"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeCreateStatement(ast *sql.CreateStatement) (out []interface{}, err error) {
|
func (e *executor) executeCreateStatement(ctx context.Context, ast *sql.CreateStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
for k, w := range ast.What {
|
for k, w := range ast.What {
|
||||||
if what, ok := w.(*sql.Param); ok {
|
if what, ok := w.(*sql.Param); ok {
|
||||||
|
|
81
db/db.go
81
db/db.go
|
@ -15,6 +15,7 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
@ -30,6 +31,8 @@ import (
|
||||||
"github.com/abcum/surreal/mem"
|
"github.com/abcum/surreal/mem"
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
|
|
||||||
|
"cloud.google.com/go/trace"
|
||||||
|
|
||||||
_ "github.com/abcum/surreal/kvs/rixxdb"
|
_ "github.com/abcum/surreal/kvs/rixxdb"
|
||||||
// _ "github.com/abcum/surreal/kvs/dendro"
|
// _ "github.com/abcum/surreal/kvs/dendro"
|
||||||
)
|
)
|
||||||
|
@ -91,6 +94,11 @@ func Begin(rw bool) (txn kvs.TX, err error) {
|
||||||
// the underlying data layer.
|
// the underlying data layer.
|
||||||
func Execute(ctx *fibre.Context, txt interface{}, vars map[string]interface{}) (out []*Response, err error) {
|
func Execute(ctx *fibre.Context, txt interface{}, vars map[string]interface{}) (out []*Response, err error) {
|
||||||
|
|
||||||
|
span := trace.FromContext(ctx.Context()).NewChild("db.Execute")
|
||||||
|
nctx := trace.NewContext(ctx.Context(), span)
|
||||||
|
ctx = ctx.WithContext(nctx)
|
||||||
|
defer span.Finish()
|
||||||
|
|
||||||
// If no preset variables have been defined
|
// If no preset variables have been defined
|
||||||
// then ensure that the variables is
|
// then ensure that the variables is
|
||||||
// instantiated for future use.
|
// instantiated for future use.
|
||||||
|
@ -123,11 +131,16 @@ func Execute(ctx *fibre.Context, txt interface{}, vars map[string]interface{}) (
|
||||||
// data layer.
|
// data layer.
|
||||||
func Process(ctx *fibre.Context, ast *sql.Query, vars map[string]interface{}) (out []*Response, err error) {
|
func Process(ctx *fibre.Context, ast *sql.Query, vars map[string]interface{}) (out []*Response, err error) {
|
||||||
|
|
||||||
|
span := trace.FromContext(ctx.Context()).NewChild("db.Process")
|
||||||
|
nctx := trace.NewContext(ctx.Context(), span)
|
||||||
|
ctx = ctx.WithContext(nctx)
|
||||||
|
defer span.Finish()
|
||||||
|
|
||||||
// Create 2 channels, one for force quitting
|
// Create 2 channels, one for force quitting
|
||||||
// the query processor, and the other for
|
// the query processor, and the other for
|
||||||
// receiving and buffering any query results.
|
// receiving and buffering any query results.
|
||||||
|
|
||||||
quit := make(chan bool, 1)
|
quit := make(chan bool)
|
||||||
recv := make(chan *Response)
|
recv := make(chan *Response)
|
||||||
|
|
||||||
// Ensure that the force quit channel is auto
|
// Ensure that the force quit channel is auto
|
||||||
|
@ -164,7 +177,7 @@ func Process(ctx *fibre.Context, ast *sql.Query, vars map[string]interface{}) (o
|
||||||
|
|
||||||
defer exec.done()
|
defer exec.done()
|
||||||
|
|
||||||
go exec.execute(quit, recv)
|
go exec.execute(ctx.Context(), quit, recv)
|
||||||
|
|
||||||
// Wait for all of the processed queries to
|
// Wait for all of the processed queries to
|
||||||
// return results, buffer the output, and
|
// return results, buffer the output, and
|
||||||
|
@ -178,7 +191,7 @@ func Process(ctx *fibre.Context, ast *sql.Query, vars map[string]interface{}) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) execute(quit <-chan bool, send chan<- *Response) {
|
func (e *executor) execute(ctx context.Context, quit <-chan bool, send chan<- *Response) {
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
var now time.Time
|
var now time.Time
|
||||||
|
@ -228,6 +241,9 @@ func (e *executor) execute(quit <-chan bool, send chan<- *Response) {
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
|
trc := trace.FromContext(ctx).NewChild(fmt.Sprint(stm))
|
||||||
|
ctx := trace.NewContext(ctx, trc)
|
||||||
|
|
||||||
// If we are not inside a global transaction
|
// If we are not inside a global transaction
|
||||||
// then reset the error to nil so that the
|
// then reset the error to nil so that the
|
||||||
// next statement is not ignored.
|
// next statement is not ignored.
|
||||||
|
@ -253,12 +269,15 @@ func (e *executor) execute(quit <-chan bool, send chan<- *Response) {
|
||||||
switch stm.(type) {
|
switch stm.(type) {
|
||||||
case *sql.BeginStatement:
|
case *sql.BeginStatement:
|
||||||
err = e.begin(true)
|
err = e.begin(true)
|
||||||
|
trc.Finish()
|
||||||
continue
|
continue
|
||||||
case *sql.CancelStatement:
|
case *sql.CancelStatement:
|
||||||
err, buf = e.cancel(buf, err, send)
|
err, buf = e.cancel(buf, err, send)
|
||||||
|
trc.Finish()
|
||||||
continue
|
continue
|
||||||
case *sql.CommitStatement:
|
case *sql.CommitStatement:
|
||||||
err, buf = e.commit(buf, err, send)
|
err, buf = e.commit(buf, err, send)
|
||||||
|
trc.Finish()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,7 +286,7 @@ func (e *executor) execute(quit <-chan bool, send chan<- *Response) {
|
||||||
// subsequent statements in the transaction.
|
// subsequent statements in the transaction.
|
||||||
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
res, err = e.operate(stm)
|
res, err = e.operate(ctx, stm)
|
||||||
} else {
|
} else {
|
||||||
res, err = []interface{}{}, QueryNotExecuted
|
res, err = []interface{}{}, QueryNotExecuted
|
||||||
}
|
}
|
||||||
|
@ -285,7 +304,6 @@ func (e *executor) execute(quit <-chan bool, send chan<- *Response) {
|
||||||
|
|
||||||
if e.txn == nil {
|
if e.txn == nil {
|
||||||
send <- rsp
|
send <- rsp
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we are inside a global transaction we
|
// If we are inside a global transaction we
|
||||||
|
@ -299,16 +317,17 @@ func (e *executor) execute(quit <-chan bool, send chan<- *Response) {
|
||||||
default:
|
default:
|
||||||
buf = append(buf, rsp)
|
buf = append(buf, rsp)
|
||||||
}
|
}
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trc.Finish()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) operate(ast sql.Statement) (res []interface{}, err error) {
|
func (e *executor) operate(ctx context.Context, ast sql.Statement) (res []interface{}, err error) {
|
||||||
|
|
||||||
var loc bool
|
var loc bool
|
||||||
var trw bool
|
var trw bool
|
||||||
|
@ -353,63 +372,63 @@ func (e *executor) operate(ast sql.Statement) (res []interface{}, err error) {
|
||||||
switch stm := ast.(type) {
|
switch stm := ast.(type) {
|
||||||
|
|
||||||
case *sql.InfoStatement:
|
case *sql.InfoStatement:
|
||||||
res, err = e.executeInfoStatement(stm)
|
res, err = e.executeInfoStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.LetStatement:
|
case *sql.LetStatement:
|
||||||
res, err = e.executeLetStatement(stm)
|
res, err = e.executeLetStatement(ctx, stm)
|
||||||
case *sql.ReturnStatement:
|
case *sql.ReturnStatement:
|
||||||
res, err = e.executeReturnStatement(stm)
|
res, err = e.executeReturnStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.SelectStatement:
|
case *sql.SelectStatement:
|
||||||
res, err = e.executeSelectStatement(stm)
|
res, err = e.executeSelectStatement(ctx, stm)
|
||||||
case *sql.CreateStatement:
|
case *sql.CreateStatement:
|
||||||
res, err = e.executeCreateStatement(stm)
|
res, err = e.executeCreateStatement(ctx, stm)
|
||||||
case *sql.UpdateStatement:
|
case *sql.UpdateStatement:
|
||||||
res, err = e.executeUpdateStatement(stm)
|
res, err = e.executeUpdateStatement(ctx, stm)
|
||||||
case *sql.DeleteStatement:
|
case *sql.DeleteStatement:
|
||||||
res, err = e.executeDeleteStatement(stm)
|
res, err = e.executeDeleteStatement(ctx, stm)
|
||||||
case *sql.RelateStatement:
|
case *sql.RelateStatement:
|
||||||
res, err = e.executeRelateStatement(stm)
|
res, err = e.executeRelateStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineNamespaceStatement:
|
case *sql.DefineNamespaceStatement:
|
||||||
res, err = e.executeDefineNamespaceStatement(stm)
|
res, err = e.executeDefineNamespaceStatement(ctx, stm)
|
||||||
case *sql.RemoveNamespaceStatement:
|
case *sql.RemoveNamespaceStatement:
|
||||||
res, err = e.executeRemoveNamespaceStatement(stm)
|
res, err = e.executeRemoveNamespaceStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineDatabaseStatement:
|
case *sql.DefineDatabaseStatement:
|
||||||
res, err = e.executeDefineDatabaseStatement(stm)
|
res, err = e.executeDefineDatabaseStatement(ctx, stm)
|
||||||
case *sql.RemoveDatabaseStatement:
|
case *sql.RemoveDatabaseStatement:
|
||||||
res, err = e.executeRemoveDatabaseStatement(stm)
|
res, err = e.executeRemoveDatabaseStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineLoginStatement:
|
case *sql.DefineLoginStatement:
|
||||||
res, err = e.executeDefineLoginStatement(stm)
|
res, err = e.executeDefineLoginStatement(ctx, stm)
|
||||||
case *sql.RemoveLoginStatement:
|
case *sql.RemoveLoginStatement:
|
||||||
res, err = e.executeRemoveLoginStatement(stm)
|
res, err = e.executeRemoveLoginStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineTokenStatement:
|
case *sql.DefineTokenStatement:
|
||||||
res, err = e.executeDefineTokenStatement(stm)
|
res, err = e.executeDefineTokenStatement(ctx, stm)
|
||||||
case *sql.RemoveTokenStatement:
|
case *sql.RemoveTokenStatement:
|
||||||
res, err = e.executeRemoveTokenStatement(stm)
|
res, err = e.executeRemoveTokenStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineScopeStatement:
|
case *sql.DefineScopeStatement:
|
||||||
res, err = e.executeDefineScopeStatement(stm)
|
res, err = e.executeDefineScopeStatement(ctx, stm)
|
||||||
case *sql.RemoveScopeStatement:
|
case *sql.RemoveScopeStatement:
|
||||||
res, err = e.executeRemoveScopeStatement(stm)
|
res, err = e.executeRemoveScopeStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineTableStatement:
|
case *sql.DefineTableStatement:
|
||||||
res, err = e.executeDefineTableStatement(stm)
|
res, err = e.executeDefineTableStatement(ctx, stm)
|
||||||
case *sql.RemoveTableStatement:
|
case *sql.RemoveTableStatement:
|
||||||
res, err = e.executeRemoveTableStatement(stm)
|
res, err = e.executeRemoveTableStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineFieldStatement:
|
case *sql.DefineFieldStatement:
|
||||||
res, err = e.executeDefineFieldStatement(stm)
|
res, err = e.executeDefineFieldStatement(ctx, stm)
|
||||||
case *sql.RemoveFieldStatement:
|
case *sql.RemoveFieldStatement:
|
||||||
res, err = e.executeRemoveFieldStatement(stm)
|
res, err = e.executeRemoveFieldStatement(ctx, stm)
|
||||||
|
|
||||||
case *sql.DefineIndexStatement:
|
case *sql.DefineIndexStatement:
|
||||||
res, err = e.executeDefineIndexStatement(stm)
|
res, err = e.executeDefineIndexStatement(ctx, stm)
|
||||||
case *sql.RemoveIndexStatement:
|
case *sql.RemoveIndexStatement:
|
||||||
res, err = e.executeRemoveIndexStatement(stm)
|
res, err = e.executeRemoveIndexStatement(ctx, stm)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
18
db/define.go
18
db/define.go
|
@ -15,6 +15,8 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
|
@ -24,7 +26,7 @@ import (
|
||||||
"github.com/abcum/surreal/util/rand"
|
"github.com/abcum/surreal/util/rand"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeDefineNamespaceStatement(ast *sql.DefineNamespaceStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineNamespaceStatement(ctx context.Context, ast *sql.DefineNamespaceStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Set the namespace
|
// Set the namespace
|
||||||
nkey := &keys.NS{KV: ast.KV, NS: ast.Name.ID}
|
nkey := &keys.NS{KV: ast.KV, NS: ast.Name.ID}
|
||||||
|
@ -34,7 +36,7 @@ func (e *executor) executeDefineNamespaceStatement(ast *sql.DefineNamespaceState
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeDefineDatabaseStatement(ast *sql.DefineDatabaseStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineDatabaseStatement(ctx context.Context, ast *sql.DefineDatabaseStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Set the namespace
|
// Set the namespace
|
||||||
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
||||||
|
@ -49,7 +51,7 @@ func (e *executor) executeDefineDatabaseStatement(ast *sql.DefineDatabaseStateme
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeDefineLoginStatement(ast *sql.DefineLoginStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineLoginStatement(ctx context.Context, ast *sql.DefineLoginStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
ast.Code = rand.New(128)
|
ast.Code = rand.New(128)
|
||||||
|
|
||||||
|
@ -90,7 +92,7 @@ func (e *executor) executeDefineLoginStatement(ast *sql.DefineLoginStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeDefineTokenStatement(ast *sql.DefineTokenStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineTokenStatement(ctx context.Context, ast *sql.DefineTokenStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
if ast.Kind == sql.NAMESPACE {
|
if ast.Kind == sql.NAMESPACE {
|
||||||
|
|
||||||
|
@ -127,7 +129,7 @@ func (e *executor) executeDefineTokenStatement(ast *sql.DefineTokenStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeDefineScopeStatement(ast *sql.DefineScopeStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineScopeStatement(ctx context.Context, ast *sql.DefineScopeStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
ast.Code = rand.New(128)
|
ast.Code = rand.New(128)
|
||||||
|
|
||||||
|
@ -149,7 +151,7 @@ func (e *executor) executeDefineScopeStatement(ast *sql.DefineScopeStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeDefineTableStatement(ast *sql.DefineTableStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineTableStatement(ctx context.Context, ast *sql.DefineTableStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Set the namespace
|
// Set the namespace
|
||||||
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
||||||
|
@ -175,7 +177,7 @@ func (e *executor) executeDefineTableStatement(ast *sql.DefineTableStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeDefineFieldStatement(ast *sql.DefineFieldStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineFieldStatement(ctx context.Context, ast *sql.DefineFieldStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Set the namespace
|
// Set the namespace
|
||||||
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
||||||
|
@ -206,7 +208,7 @@ func (e *executor) executeDefineFieldStatement(ast *sql.DefineFieldStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeDefineIndexStatement(ast *sql.DefineIndexStatement) (out []interface{}, err error) {
|
func (e *executor) executeDefineIndexStatement(ctx context.Context, ast *sql.DefineIndexStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Set the namespace
|
// Set the namespace
|
||||||
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
nkey := &keys.NS{KV: ast.KV, NS: ast.NS}
|
||||||
|
|
|
@ -16,12 +16,15 @@ package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
"github.com/abcum/surreal/util/item"
|
"github.com/abcum/surreal/util/item"
|
||||||
"github.com/abcum/surreal/util/keys"
|
"github.com/abcum/surreal/util/keys"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeDeleteStatement(ast *sql.DeleteStatement) (out []interface{}, err error) {
|
func (e *executor) executeDeleteStatement(ctx context.Context, ast *sql.DeleteStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
for k, w := range ast.What {
|
for k, w := range ast.What {
|
||||||
if what, ok := w.(*sql.Param); ok {
|
if what, ok := w.(*sql.Param); ok {
|
||||||
|
|
16
db/info.go
16
db/info.go
|
@ -15,26 +15,28 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
"github.com/abcum/surreal/util/data"
|
"github.com/abcum/surreal/util/data"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeInfoStatement(ast *sql.InfoStatement) (out []interface{}, err error) {
|
func (e *executor) executeInfoStatement(ctx context.Context, ast *sql.InfoStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
switch ast.Kind {
|
switch ast.Kind {
|
||||||
case sql.NAMESPACE:
|
case sql.NAMESPACE:
|
||||||
return e.executeInfoNSStatement(ast)
|
return e.executeInfoNSStatement(ctx, ast)
|
||||||
case sql.DATABASE:
|
case sql.DATABASE:
|
||||||
return e.executeInfoDBStatement(ast)
|
return e.executeInfoDBStatement(ctx, ast)
|
||||||
case sql.TABLE:
|
case sql.TABLE:
|
||||||
return e.executeInfoTBStatement(ast)
|
return e.executeInfoTBStatement(ctx, ast)
|
||||||
}
|
}
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeInfoNSStatement(ast *sql.InfoStatement) (out []interface{}, err error) {
|
func (e *executor) executeInfoNSStatement(ctx context.Context, ast *sql.InfoStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
db, err := e.mem.AllDB(ast.NS)
|
db, err := e.mem.AllDB(ast.NS)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -74,7 +76,7 @@ func (e *executor) executeInfoNSStatement(ast *sql.InfoStatement) (out []interfa
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeInfoDBStatement(ast *sql.InfoStatement) (out []interface{}, err error) {
|
func (e *executor) executeInfoDBStatement(ctx context.Context, ast *sql.InfoStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
tb, err := e.mem.AllTB(ast.NS, ast.DB)
|
tb, err := e.mem.AllTB(ast.NS, ast.DB)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -114,7 +116,7 @@ func (e *executor) executeInfoDBStatement(ast *sql.InfoStatement) (out []interfa
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeInfoTBStatement(ast *sql.InfoStatement) (out []interface{}, err error) {
|
func (e *executor) executeInfoTBStatement(ctx context.Context, ast *sql.InfoStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
tb, err := e.mem.GetTB(ast.NS, ast.DB, ast.What.TB)
|
tb, err := e.mem.GetTB(ast.NS, ast.DB, ast.What.TB)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -15,10 +15,12 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeLetStatement(ast *sql.LetStatement) (out []interface{}, err error) {
|
func (e *executor) executeLetStatement(ctx context.Context, ast *sql.LetStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
switch what := ast.What.(type) {
|
switch what := ast.What.(type) {
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -15,10 +15,12 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeRelateStatement(ast *sql.RelateStatement) (out []interface{}, err error) {
|
func (e *executor) executeRelateStatement(ctx context.Context, ast *sql.RelateStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
|
||||||
|
|
18
db/remove.go
18
db/remove.go
|
@ -15,11 +15,13 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
"github.com/abcum/surreal/util/keys"
|
"github.com/abcum/surreal/util/keys"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeRemoveNamespaceStatement(ast *sql.RemoveNamespaceStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveNamespaceStatement(ctx context.Context, ast *sql.RemoveNamespaceStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Remove the namespace
|
// Remove the namespace
|
||||||
nkey := &keys.NS{KV: ast.KV, NS: ast.Name.ID}
|
nkey := &keys.NS{KV: ast.KV, NS: ast.Name.ID}
|
||||||
|
@ -29,7 +31,7 @@ func (e *executor) executeRemoveNamespaceStatement(ast *sql.RemoveNamespaceState
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeRemoveDatabaseStatement(ast *sql.RemoveDatabaseStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveDatabaseStatement(ctx context.Context, ast *sql.RemoveDatabaseStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Remove the database
|
// Remove the database
|
||||||
dkey := &keys.DB{KV: ast.KV, NS: ast.NS, DB: ast.Name.ID}
|
dkey := &keys.DB{KV: ast.KV, NS: ast.NS, DB: ast.Name.ID}
|
||||||
|
@ -39,7 +41,7 @@ func (e *executor) executeRemoveDatabaseStatement(ast *sql.RemoveDatabaseStateme
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeRemoveLoginStatement(ast *sql.RemoveLoginStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveLoginStatement(ctx context.Context, ast *sql.RemoveLoginStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
if ast.Kind == sql.NAMESPACE {
|
if ast.Kind == sql.NAMESPACE {
|
||||||
|
|
||||||
|
@ -61,7 +63,7 @@ func (e *executor) executeRemoveLoginStatement(ast *sql.RemoveLoginStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeRemoveTokenStatement(ast *sql.RemoveTokenStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveTokenStatement(ctx context.Context, ast *sql.RemoveTokenStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
if ast.Kind == sql.NAMESPACE {
|
if ast.Kind == sql.NAMESPACE {
|
||||||
|
|
||||||
|
@ -83,7 +85,7 @@ func (e *executor) executeRemoveTokenStatement(ast *sql.RemoveTokenStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeRemoveScopeStatement(ast *sql.RemoveScopeStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveScopeStatement(ctx context.Context, ast *sql.RemoveScopeStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
// Remove the scope
|
// Remove the scope
|
||||||
skey := &keys.SC{KV: ast.KV, NS: ast.NS, DB: ast.DB, SC: ast.Name.ID}
|
skey := &keys.SC{KV: ast.KV, NS: ast.NS, DB: ast.DB, SC: ast.Name.ID}
|
||||||
|
@ -93,7 +95,7 @@ func (e *executor) executeRemoveScopeStatement(ast *sql.RemoveScopeStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeRemoveTableStatement(ast *sql.RemoveTableStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveTableStatement(ctx context.Context, ast *sql.RemoveTableStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
for _, TB := range ast.What {
|
for _, TB := range ast.What {
|
||||||
|
|
||||||
|
@ -107,7 +109,7 @@ func (e *executor) executeRemoveTableStatement(ast *sql.RemoveTableStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeRemoveFieldStatement(ast *sql.RemoveFieldStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveFieldStatement(ctx context.Context, ast *sql.RemoveFieldStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
for _, TB := range ast.What {
|
for _, TB := range ast.What {
|
||||||
|
|
||||||
|
@ -121,7 +123,7 @@ func (e *executor) executeRemoveFieldStatement(ast *sql.RemoveFieldStatement) (o
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *executor) executeRemoveIndexStatement(ast *sql.RemoveIndexStatement) (out []interface{}, err error) {
|
func (e *executor) executeRemoveIndexStatement(ctx context.Context, ast *sql.RemoveIndexStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
for _, TB := range ast.What {
|
for _, TB := range ast.What {
|
||||||
|
|
||||||
|
|
|
@ -15,10 +15,12 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeReturnStatement(ast *sql.ReturnStatement) (out []interface{}, err error) {
|
func (e *executor) executeReturnStatement(ctx context.Context, ast *sql.ReturnStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
switch what := ast.What.(type) {
|
switch what := ast.What.(type) {
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -15,12 +15,14 @@
|
||||||
package db
|
package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
"github.com/abcum/surreal/util/item"
|
"github.com/abcum/surreal/util/item"
|
||||||
"github.com/abcum/surreal/util/keys"
|
"github.com/abcum/surreal/util/keys"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeSelectStatement(ast *sql.SelectStatement) (out []interface{}, err error) {
|
func (e *executor) executeSelectStatement(ctx context.Context, ast *sql.SelectStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
for k, w := range ast.What {
|
for k, w := range ast.What {
|
||||||
if what, ok := w.(*sql.Param); ok {
|
if what, ok := w.(*sql.Param); ok {
|
||||||
|
|
|
@ -16,12 +16,15 @@ package db
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
"context"
|
||||||
|
|
||||||
"github.com/abcum/surreal/sql"
|
"github.com/abcum/surreal/sql"
|
||||||
"github.com/abcum/surreal/util/item"
|
"github.com/abcum/surreal/util/item"
|
||||||
"github.com/abcum/surreal/util/keys"
|
"github.com/abcum/surreal/util/keys"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (e *executor) executeUpdateStatement(ast *sql.UpdateStatement) (out []interface{}, err error) {
|
func (e *executor) executeUpdateStatement(ctx context.Context, ast *sql.UpdateStatement) (out []interface{}, err error) {
|
||||||
|
|
||||||
for k, w := range ast.What {
|
for k, w := range ast.What {
|
||||||
if what, ok := w.(*sql.Param); ok {
|
if what, ok := w.(*sql.Param); ok {
|
||||||
|
|
41
glide.lock
generated
41
glide.lock
generated
|
@ -1,5 +1,5 @@
|
||||||
hash: 323da77f9dc4a58b21e5b955a28edf6d4489cc74d3d6e61a4b2a60bdfe373b70
|
hash: 323da77f9dc4a58b21e5b955a28edf6d4489cc74d3d6e61a4b2a60bdfe373b70
|
||||||
updated: 2017-02-24T00:48:37.913219964Z
|
updated: 2017-03-03T21:38:13.520578616Z
|
||||||
imports:
|
imports:
|
||||||
- name: cloud.google.com/go
|
- name: cloud.google.com/go
|
||||||
version: 9b68cf4865e93f379a337b7e957f33de60397a48
|
version: 9b68cf4865e93f379a337b7e957f33de60397a48
|
||||||
|
@ -12,12 +12,13 @@ imports:
|
||||||
- logging
|
- logging
|
||||||
- logging/apiv2
|
- logging/apiv2
|
||||||
- logging/internal
|
- logging/internal
|
||||||
|
- trace
|
||||||
- name: github.com/abcum/cork
|
- name: github.com/abcum/cork
|
||||||
version: 023d8293ed77a01ba325b0232e11e5f8bacea59c
|
version: 023d8293ed77a01ba325b0232e11e5f8bacea59c
|
||||||
- name: github.com/abcum/emitr
|
- name: github.com/abcum/emitr
|
||||||
version: 67359a63b282c8056e52cf25488937aaddbc2a8b
|
version: 67359a63b282c8056e52cf25488937aaddbc2a8b
|
||||||
- name: github.com/abcum/fibre
|
- name: github.com/abcum/fibre
|
||||||
version: cfe61e4d3b8a1085f93e82e2fa5f04cac5b0a6f2
|
version: f00fdced46786a5a0a78ad417649e1b0977e21b6
|
||||||
subpackages:
|
subpackages:
|
||||||
- mw
|
- mw
|
||||||
- name: github.com/abcum/ptree
|
- name: github.com/abcum/ptree
|
||||||
|
@ -99,7 +100,7 @@ imports:
|
||||||
- name: github.com/mgutz/ansi
|
- name: github.com/mgutz/ansi
|
||||||
version: 9520e82c474b0a04dd04f8a40959027271bab992
|
version: 9520e82c474b0a04dd04f8a40959027271bab992
|
||||||
- name: github.com/miekg/dns
|
- name: github.com/miekg/dns
|
||||||
version: 0b729df06cb29cf7a3ff59b876e9a2ecb7fac2b1
|
version: eda6b320244f0700772bb765282381d17495e7d3
|
||||||
- name: github.com/mitchellh/mapstructure
|
- name: github.com/mitchellh/mapstructure
|
||||||
version: db1efb556f84b25a0a13a04aad883943538ad2e0
|
version: db1efb556f84b25a0a13a04aad883943538ad2e0
|
||||||
- name: github.com/newrelic/go-agent
|
- name: github.com/newrelic/go-agent
|
||||||
|
@ -121,9 +122,9 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- diffmatchpatch
|
- diffmatchpatch
|
||||||
- name: github.com/Sirupsen/logrus
|
- name: github.com/Sirupsen/logrus
|
||||||
version: c078b1e43f58d563c74cebe63c85789e76ddb627
|
version: 0208149b40d863d2c1a2f8fe5753096a9cf2cc8b
|
||||||
- name: github.com/spf13/cobra
|
- name: github.com/spf13/cobra
|
||||||
version: 92ea23a837e66f46ac9e7d04fa826602b7b0a42d
|
version: fcd0c5a1df88f5d6784cb4feead962c3f3d0b66c
|
||||||
- name: github.com/spf13/pflag
|
- name: github.com/spf13/pflag
|
||||||
version: 9ff6c6923cfffbcd502984b8e0c80539a94968b7
|
version: 9ff6c6923cfffbcd502984b8e0c80539a94968b7
|
||||||
- name: github.com/ugorji/go
|
- name: github.com/ugorji/go
|
||||||
|
@ -131,18 +132,18 @@ imports:
|
||||||
subpackages:
|
subpackages:
|
||||||
- codec
|
- codec
|
||||||
- name: github.com/yuin/gopher-lua
|
- name: github.com/yuin/gopher-lua
|
||||||
version: eed1c7917d2f4a7bbed5e9bf6a0ce64cbd2918c5
|
version: 65fb8eeb2aa6d29a7b654d61afd1a07ce3897cc9
|
||||||
subpackages:
|
subpackages:
|
||||||
- ast
|
- ast
|
||||||
- parse
|
- parse
|
||||||
- pm
|
- pm
|
||||||
- name: golang.org/x/crypto
|
- name: golang.org/x/crypto
|
||||||
version: 453249f01cfeb54c3d549ddb75ff152ca243f9d8
|
version: 40541ccb1c6e64c947ed6f606b8a6cb4b67d7436
|
||||||
subpackages:
|
subpackages:
|
||||||
- bcrypt
|
- bcrypt
|
||||||
- blowfish
|
- blowfish
|
||||||
- name: golang.org/x/net
|
- name: golang.org/x/net
|
||||||
version: dd2d9a67c97da0afa00d5726e28086007a0acce5
|
version: 906cda9512f77671ab44f8c8563b13a8e707b230
|
||||||
subpackages:
|
subpackages:
|
||||||
- context
|
- context
|
||||||
- context/ctxhttp
|
- context/ctxhttp
|
||||||
|
@ -153,19 +154,27 @@ imports:
|
||||||
- lex/httplex
|
- lex/httplex
|
||||||
- trace
|
- trace
|
||||||
- name: golang.org/x/oauth2
|
- name: golang.org/x/oauth2
|
||||||
version: b9780ec78894ab900c062d58ee3076cd9b2a4501
|
version: efb10a30610e617dbb17fc243f4cc61a8cfa2903
|
||||||
subpackages:
|
subpackages:
|
||||||
- google
|
- google
|
||||||
- internal
|
- internal
|
||||||
- jws
|
- jws
|
||||||
- jwt
|
- jwt
|
||||||
- name: golang.org/x/sys
|
- name: golang.org/x/sys
|
||||||
version: e4594059fe4cde2daf423055a596c2cd1e6c9adf
|
version: e48874b42435b4347fc52bdee0424a52abc974d7
|
||||||
subpackages:
|
subpackages:
|
||||||
- unix
|
- unix
|
||||||
- name: google.golang.org/api
|
- name: golang.org/x/time
|
||||||
version: 64485db7e8c8be51e572801d06cdbcfadd3546c1
|
version: f51c12702a4d776e4c1fa9b0fabab841babae631
|
||||||
subpackages:
|
subpackages:
|
||||||
|
- rate
|
||||||
|
- name: google.golang.org/api
|
||||||
|
version: f786854525c2e5b0b49c2a301b0ff076d2ae20df
|
||||||
|
subpackages:
|
||||||
|
- cloudtrace/v1
|
||||||
|
- gensupport
|
||||||
|
- googleapi
|
||||||
|
- googleapi/internal/uritemplates
|
||||||
- googleapi/transport
|
- googleapi/transport
|
||||||
- internal
|
- internal
|
||||||
- iterator
|
- iterator
|
||||||
|
@ -173,7 +182,7 @@ imports:
|
||||||
- support/bundler
|
- support/bundler
|
||||||
- transport
|
- transport
|
||||||
- name: google.golang.org/appengine
|
- name: google.golang.org/appengine
|
||||||
version: 3a452f9e00122ead39586d68ffdb9c6e1326af3c
|
version: 5403c08c6e8fb3b2dc1209d2d833d8e8ac8240de
|
||||||
subpackages:
|
subpackages:
|
||||||
- internal
|
- internal
|
||||||
- internal/app_identity
|
- internal/app_identity
|
||||||
|
@ -187,7 +196,7 @@ imports:
|
||||||
- socket
|
- socket
|
||||||
- urlfetch
|
- urlfetch
|
||||||
- name: google.golang.org/genproto
|
- name: google.golang.org/genproto
|
||||||
version: dee11a626cb8e7ff045ac9413dcd8a92e72f5863
|
version: 1e95789587db7d93ebbaa5eb65da17d3dbf8ab64
|
||||||
subpackages:
|
subpackages:
|
||||||
- googleapis/api/annotations
|
- googleapis/api/annotations
|
||||||
- googleapis/api/label
|
- googleapis/api/label
|
||||||
|
@ -197,7 +206,7 @@ imports:
|
||||||
- googleapis/logging/v2
|
- googleapis/logging/v2
|
||||||
- googleapis/rpc/status
|
- googleapis/rpc/status
|
||||||
- name: google.golang.org/grpc
|
- name: google.golang.org/grpc
|
||||||
version: 34384f34de585705f1a6783a158d2ec8af29f618
|
version: 1dab93372523195731c738b0f0cb4e452228e959
|
||||||
subpackages:
|
subpackages:
|
||||||
- codes
|
- codes
|
||||||
- credentials
|
- credentials
|
||||||
|
@ -214,7 +223,7 @@ imports:
|
||||||
version: 4654dfbb6ad53cb5e27f37d99b02e16c1872fbbb
|
version: 4654dfbb6ad53cb5e27f37d99b02e16c1872fbbb
|
||||||
testImports:
|
testImports:
|
||||||
- name: github.com/gopherjs/gopherjs
|
- name: github.com/gopherjs/gopherjs
|
||||||
version: b9bcb1da229a59cc1e1d168401662cb6450aae08
|
version: 7d94d732be268c4904141f8b8604eb2d6d6544a1
|
||||||
subpackages:
|
subpackages:
|
||||||
- js
|
- js
|
||||||
- name: github.com/jtolds/gls
|
- name: github.com/jtolds/gls
|
||||||
|
|
|
@ -20,6 +20,8 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/abcum/fibre"
|
"github.com/abcum/fibre"
|
||||||
|
|
||||||
|
"cloud.google.com/go/trace"
|
||||||
)
|
)
|
||||||
|
|
||||||
// parser represents a parser.
|
// parser represents a parser.
|
||||||
|
@ -40,6 +42,8 @@ type parser struct {
|
||||||
// Parse parses sql from a []byte, string, or io.Reader.
|
// Parse parses sql from a []byte, string, or io.Reader.
|
||||||
func Parse(c *fibre.Context, i interface{}, v map[string]interface{}) (*Query, error) {
|
func Parse(c *fibre.Context, i interface{}, v map[string]interface{}) (*Query, error) {
|
||||||
|
|
||||||
|
defer trace.FromContext(c.Context()).NewChild("sql.Parse").Finish()
|
||||||
|
|
||||||
if v == nil {
|
if v == nil {
|
||||||
v = make(map[string]interface{})
|
v = make(map[string]interface{})
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ func start(c *fibre.Context, i int64) int64 {
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
|
|
||||||
func trace(c *fibre.Context, i time.Time) time.Time {
|
func versn(c *fibre.Context, i time.Time) time.Time {
|
||||||
if s := c.Query("version"); len(s) > 0 {
|
if s := c.Query("version"); len(s) > 0 {
|
||||||
if x, err := time.Parse(sql.RFCNano, s); err == nil {
|
if x, err := time.Parse(sql.RFCNano, s); err == nil {
|
||||||
return x
|
return x
|
||||||
|
@ -244,11 +244,11 @@ func routes(s *fibre.Fibre) {
|
||||||
|
|
||||||
s.Get("/key/:class/:id", func(c *fibre.Context) error {
|
s.Get("/key/:class/:id", func(c *fibre.Context) error {
|
||||||
|
|
||||||
txt := "SELECT * FROM $thing VERSION $trace"
|
txt := "SELECT * FROM $thing VERSION $versn"
|
||||||
|
|
||||||
res, err := db.Execute(c, txt, map[string]interface{}{
|
res, err := db.Execute(c, txt, map[string]interface{}{
|
||||||
"thing": sql.NewThing(c.Param("class"), c.Param("id")),
|
"thing": sql.NewThing(c.Param("class"), c.Param("id")),
|
||||||
"trace": trace(c, time.Now()),
|
"versn": versn(c, time.Now()),
|
||||||
})
|
})
|
||||||
|
|
||||||
return show.Output(c, c.Param("class"), show.One, show.Select, res, err)
|
return show.Output(c, c.Param("class"), show.One, show.Select, res, err)
|
||||||
|
|
101
web/trace.go
Normal file
101
web/trace.go
Normal file
|
@ -0,0 +1,101 @@
|
||||||
|
// Copyright © 2016 Abcum Ltd
|
||||||
|
//
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/abcum/fibre"
|
||||||
|
"github.com/abcum/surreal/cnf"
|
||||||
|
|
||||||
|
"cloud.google.com/go/compute/metadata"
|
||||||
|
"cloud.google.com/go/trace"
|
||||||
|
"google.golang.org/api/option"
|
||||||
|
)
|
||||||
|
|
||||||
|
var client *trace.Client
|
||||||
|
|
||||||
|
// tracer returns a middleware function for stackdriver trace monitoring.
|
||||||
|
func tracer() fibre.MiddlewareFunc {
|
||||||
|
|
||||||
|
var e error
|
||||||
|
var s trace.SamplingPolicy
|
||||||
|
var p string = cnf.Settings.Logging.Google.Project
|
||||||
|
var c string = cnf.Settings.Logging.Google.Credentials
|
||||||
|
|
||||||
|
// If no project id has been set
|
||||||
|
// then attempt to pull this from
|
||||||
|
// machine metadata if on GCE.
|
||||||
|
|
||||||
|
if p == "" {
|
||||||
|
if p, e = metadata.ProjectID(); e != nil {
|
||||||
|
return fibre.MiddlewareSkip
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Connect to Stackdriver using a
|
||||||
|
// credentials file if one has been
|
||||||
|
// specified, or metadata if not.
|
||||||
|
|
||||||
|
switch c {
|
||||||
|
case "":
|
||||||
|
client, e = trace.NewClient(
|
||||||
|
context.Background(),
|
||||||
|
p,
|
||||||
|
)
|
||||||
|
default:
|
||||||
|
client, e = trace.NewClient(
|
||||||
|
context.Background(),
|
||||||
|
p,
|
||||||
|
option.WithServiceAccountFile(c),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if e != nil {
|
||||||
|
return fibre.MiddlewareSkip
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attempt to setup the Stackdriver
|
||||||
|
// client policy so that a fraction
|
||||||
|
// of requests are sent to google.
|
||||||
|
|
||||||
|
if s, e = trace.NewLimitedSampler(1, 5); e != nil {
|
||||||
|
return fibre.MiddlewareSkip
|
||||||
|
}
|
||||||
|
|
||||||
|
client.SetSamplingPolicy(s)
|
||||||
|
|
||||||
|
return func(h fibre.HandlerFunc) fibre.HandlerFunc {
|
||||||
|
return func(c *fibre.Context) error {
|
||||||
|
|
||||||
|
if c.Request().Header().Get("Upgrade") == "websocket" {
|
||||||
|
return h(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
span := client.SpanFromRequest(c.Request().Request)
|
||||||
|
|
||||||
|
span.SetLabel("http/id", c.Get("id").(string))
|
||||||
|
|
||||||
|
ctx := trace.NewContext(c.Context(), span)
|
||||||
|
|
||||||
|
c = c.WithContext(ctx)
|
||||||
|
|
||||||
|
defer span.Finish()
|
||||||
|
|
||||||
|
return h(c)
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -47,6 +47,10 @@ func Setup(opts *cnf.Options) (err error) {
|
||||||
s.Use(mw.Gzip()) // Gzip responses
|
s.Use(mw.Gzip()) // Gzip responses
|
||||||
s.Use(mw.Cors()) // Add cors headers
|
s.Use(mw.Cors()) // Add cors headers
|
||||||
|
|
||||||
|
// Add trace information
|
||||||
|
|
||||||
|
s.Use(tracer())
|
||||||
|
|
||||||
// Setup authentication
|
// Setup authentication
|
||||||
|
|
||||||
s.Use(auth())
|
s.Use(auth())
|
||||||
|
|
Loading…
Reference in a new issue