improve tracing feture for package glog/gdb/gredis

This commit is contained in:
jianchenma
2021-01-26 01:19:55 +08:00
parent 99dd889ff0
commit 4c6d9f5eff
17 changed files with 186 additions and 95 deletions

View File

@ -121,7 +121,11 @@ func (c *Core) DoQuery(link Link, sql string, args ...interface{}) (rows *sql.Ro
}
func (c *Core) addSqlToTracing(ctx context.Context, sql *Sql) {
if !c.DB.GetConfig().Tracing {
if ctx == nil {
return
}
spanCtx := trace.SpanContextFromContext(ctx)
if traceId := spanCtx.TraceID; !traceId.IsValid() {
return
}

View File

@ -51,7 +51,6 @@ type ConfigNode struct {
UpdatedAt string `json:"updatedAt"` // (Optional) The filed name of table for automatic-filled updated datetime.
DeletedAt string `json:"deletedAt"` // (Optional) The filed name of table for automatic-filled updated datetime.
TimeMaintainDisabled bool `json:"timeMaintainDisabled"` // (Optional) Disable the automatic time maintaining feature.
Tracing bool `json:"tracing"` // (Optional) Tracing enable the tracing feature for database.
}
// configs is internal used configuration object.
@ -205,7 +204,7 @@ func (c *Core) SetDryRun(enabled bool) {
// GetDryRun returns the DryRun value.
// Deprecated, use GetConfig instead.
func (c *Core) GetDryRun() bool {
return c.config.DryRun
return c.config.DryRun || allDryRun
}
// GetPrefix returns the table prefix string configured.

View File

@ -402,7 +402,7 @@ func (m *Model) FindValue(fieldsAndWhere ...interface{}) (Value, error) {
}
// FindArray queries and returns data values as slice from database.
// Note that if there're multiple columns in the result, it returns just one column values randomly.
// Note that if there are multiple columns in the result, it returns just one column values randomly.
// Also see Model.WherePri and Model.Value.
func (m *Model) FindArray(fieldsAndWhere ...interface{}) ([]Value, error) {
if len(fieldsAndWhere) >= 2 {

View File

@ -63,7 +63,7 @@ func Test_DB_Exec(t *testing.T) {
func Test_DB_Prepare(t *testing.T) {
gtest.C(t, func(t *gtest.T) {
st, err := db.Prepare("SELECT 100")
st, err := db.Prepare("SELECT 1")
t.Assert(err, nil)
rows, err := st.Query()
@ -71,10 +71,10 @@ func Test_DB_Prepare(t *testing.T) {
array, err := rows.Columns()
t.Assert(err, nil)
t.Assert(array[0], "100")
t.Assert(array[0], "1")
err = rows.Close()
t.Assert(err, nil)
//err = rows.Close()
//t.Assert(err, nil)
})
}

View File

@ -368,7 +368,7 @@ CREATE TABLE %s (
t.Assert(oneUpdate["name"].String(), "name_1000")
t.Assert(oneUpdate["deleted_at"].String(), "")
t.Assert(oneUpdate["created_at"].GTime().Timestamp(), oneInsert["created_at"].GTime().Timestamp())
t.AssertGE(oneUpdate["updated_at"].GTime().Timestamp(), gtime.Timestamp()-2)
t.AssertGE(oneUpdate["updated_at"].GTime().Timestamp(), gtime.Timestamp()-4)
// Replace
dataReplace := User{

View File

@ -51,7 +51,6 @@ type Config struct {
ConnectTimeout time.Duration `json:"connectTimeout"` // Dial connection timeout.
TLS bool `json:"tls"` // Specifies the config to use when a TLS connection is dialed.
TLSSkipVerify bool `json:"tlsSkipVerify"` // Disables server name verification when connecting over TLS.
Tracing bool `json:"tracing"` // Tracing enable the tracing feature for redis.
}
// Pool statistics.

View File

@ -7,10 +7,8 @@
package gredis
import (
"github.com/gogf/gf/internal/intlog"
"time"
"github.com/gogf/gf/errors/gerror"
"github.com/gogf/gf/internal/intlog"
"github.com/gogf/gf/container/gmap"
"github.com/gogf/gf/text/gregex"
@ -98,26 +96,8 @@ func ConfigFromStr(str string) (config *Config, err error) {
if config.Port == 0 {
config.Port = DefaultRedisPort
}
if v, ok := parse["maxIdle"]; ok {
config.MaxIdle = gconv.Int(v)
}
if v, ok := parse["maxActive"]; ok {
config.MaxActive = gconv.Int(v)
}
if v, ok := parse["idleTimeout"]; ok {
config.IdleTimeout = gconv.Duration(v) * time.Second
}
if v, ok := parse["maxConnLifetime"]; ok {
config.MaxConnLifetime = gconv.Duration(v) * time.Second
}
if v, ok := parse["tls"]; ok {
config.TLS = gconv.Bool(v)
}
if v, ok := parse["skipVerify"]; ok {
config.TLSSkipVerify = gconv.Bool(v)
}
if v, ok := parse["tracing"]; ok {
config.Tracing = gconv.Bool(v)
if err = gconv.Struct(parse, config); err != nil {
return nil, err
}
return
}

View File

@ -63,15 +63,24 @@ func (c *Conn) do(timeout time.Duration, commandName string, args ...interface{}
timestampMilli1 := gtime.TimestampMilli()
reply, err = c.Conn.Do(commandName, args...)
timestampMilli2 := gtime.TimestampMilli()
// Tracing.
if !c.redis.config.Tracing {
if c.ctx == nil {
return
}
spanCtx := trace.SpanContextFromContext(c.ctx)
if traceId := spanCtx.TraceID; !traceId.IsValid() {
return
}
tr := otel.GetTracerProvider().Tracer(
"github.com/gogf/gf/database/gredis",
trace.WithInstrumentationVersion(fmt.Sprintf(`%s`, gf.VERSION)),
)
_, span := tr.Start(c.ctx, commandName)
ctx := c.ctx
if ctx == nil {
ctx = context.Background()
}
_, span := tr.Start(ctx, commandName)
defer span.End()
if err != nil {
span.SetStatus(codes.Error, fmt.Sprintf(`%+v`, err))