diff --git a/driver.go b/driver.go index 7f4bb16e..e2a38bfe 100644 --- a/driver.go +++ b/driver.go @@ -57,6 +57,8 @@ const userAgent = "go-sql-spanner/1.0.2" // - disableRouteToLeader: Boolean that indicates if all the requests of type read-write and PDML // need to be routed to the leader region. // The default is false +// - enableEndToEndTracing: Boolean that indicates if end-to-end tracing is enabled +// The default is false // - minSessions: The minimum number of sessions in the backing session pool. The default is 100. // - maxSessions: The maximum number of sessions in the backing session pool. The default is 400. // - numChannels: The number of gRPC channels to use to communicate with Cloud Spanner. The default is 4. @@ -64,7 +66,7 @@ const userAgent = "go-sql-spanner/1.0.2" // - optimizerStatisticsPackage: Sets the default query optimizer statistic package to use for this connection. // - rpcPriority: Sets the priority for all RPC invocations from this connection (HIGH/MEDIUM/LOW). The default is HIGH. // -// Example: `localhost:9010/projects/test-project/instances/test-instance/databases/test-database;usePlainText=true;disableRouteToLeader=true` +// Example: `localhost:9010/projects/test-project/instances/test-instance/databases/test-database;usePlainText=true;disableRouteToLeader=true;enableEndToEndTracing=true` var dsnRegExp = regexp.MustCompile(`((?P[\w.-]+(?:\.[\w\.-]+)*[\w\-\._~:/?#\[\]@!\$&'\(\)\*\+,;=.]+)/)?projects/(?P(([a-z]|[-.:]|[0-9])+|(DEFAULT_PROJECT_ID)))(/instances/(?P([a-z]|[-]|[0-9])+)(/databases/(?P([a-z]|[-]|[_]|[0-9])+))?)?(([\?|;])(?P.*))?`) var _ driver.DriverContext = &Driver{} @@ -268,6 +270,11 @@ func newConnector(d *Driver, dsn string) (*connector, error) { config.DisableRouteToLeader = val } } + if strval, ok := connectorConfig.params["enableendtoendtracing"]; ok { + if val, err := strconv.ParseBool(strval); err == nil { + config.EnableEndToEndTracing = val + } + } config.UserAgent = userAgent c := &connector{ @@ -1143,8 +1150,8 @@ var valuerReflectType = reflect.TypeOf((*driver.Valuer)(nil)).Elem() // to those types to mean nil/NULL, just like the Go database/sql package. func callValuerValue(vr driver.Valuer) (v driver.Value, err error) { if rv := reflect.ValueOf(vr); rv.Kind() == reflect.Ptr && - rv.IsNil() && - rv.Type().Elem().Implements(valuerReflectType) { + rv.IsNil() && + rv.Type().Elem().Implements(valuerReflectType) { return nil, nil } return vr.Value() diff --git a/driver_test.go b/driver_test.go index b9d5dacd..5b6d2313 100644 --- a/driver_test.go +++ b/driver_test.go @@ -154,7 +154,7 @@ func TestExtractDnsParts(t *testing.T) { }, }, { - input: "spanner.googleapis.com/projects/p/instances/i/databases/d?minSessions=200;maxSessions=1000;numChannels=10;disableRouteToLeader=true;rpcPriority=Medium;optimizerVersion=1;optimizerStatisticsPackage=latest;databaseRole=child", + input: "spanner.googleapis.com/projects/p/instances/i/databases/d?minSessions=200;maxSessions=1000;numChannels=10;disableRouteToLeader=true;enableEndToEndTracing=true;rpcPriority=Medium;optimizerVersion=1;optimizerStatisticsPackage=latest;databaseRole=child", wantConnectorConfig: connectorConfig{ host: "spanner.googleapis.com", project: "p", @@ -165,6 +165,7 @@ func TestExtractDnsParts(t *testing.T) { "maxsessions": "1000", "numchannels": "10", "disableroutetoleader": "true", + "enableendtoendtracing": "true", "rpcpriority": "Medium", "optimizerversion": "1", "optimizerstatisticspackage": "latest", @@ -183,13 +184,14 @@ func TestExtractDnsParts(t *testing.T) { TrackSessionHandles: spanner.DefaultSessionPoolConfig.TrackSessionHandles, InactiveTransactionRemovalOptions: spanner.DefaultSessionPoolConfig.InactiveTransactionRemovalOptions, }, - NumChannels: 10, - UserAgent: userAgent, - DisableRouteToLeader: true, - QueryOptions: spanner.QueryOptions{Priority: spannerpb.RequestOptions_PRIORITY_MEDIUM, Options: &spannerpb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: "latest"}}, - ReadOptions: spanner.ReadOptions{Priority: spannerpb.RequestOptions_PRIORITY_MEDIUM}, - TransactionOptions: spanner.TransactionOptions{CommitPriority: spannerpb.RequestOptions_PRIORITY_MEDIUM}, - DatabaseRole: "child", + NumChannels: 10, + UserAgent: userAgent, + DisableRouteToLeader: true, + EnableEndToEndTracing: true, + QueryOptions: spanner.QueryOptions{Priority: spannerpb.RequestOptions_PRIORITY_MEDIUM, Options: &spannerpb.ExecuteSqlRequest_QueryOptions{OptimizerVersion: "1", OptimizerStatisticsPackage: "latest"}}, + ReadOptions: spanner.ReadOptions{Priority: spannerpb.RequestOptions_PRIORITY_MEDIUM}, + TransactionOptions: spanner.TransactionOptions{CommitPriority: spannerpb.RequestOptions_PRIORITY_MEDIUM}, + DatabaseRole: "child", }, }, {