denisenkom / go-mssqldb

Microsoft SQL server driver written in go language
BSD 3-Clause "New" or "Revised" License
1.82k stars 499 forks source link

Expose driverInstance and driverInstanceNoProcess or processQueryText for APM tracing #774

Open nacho692 opened 1 year ago

nacho692 commented 1 year ago

I'm enabling dd-trace-go over "mssql" driver.

It works by creating a tracing wrapping over the driver. In order to do this, you have to initialize a Driver and register it in the datadog package.

sqltrace.Register(driverName, &mssql.Driver{})

The issue i'm having is that statements with variables stopped working:

Incorrect syntax near '?'."

I know "?" for placeholder is not mssql standard but it used to work before tracing. After some digging I found that defining processQueryText as true correctly fixes this issue.

As I cannot change every statement in the codebase, I am enabling tracing with the help of reflection:

driver := &mssql.Driver{}
dv := reflect.ValueOf(driver).Elem().FieldByName("processQueryText")
dv = reflect.NewAt(dv.Type(), unsafe.Pointer(dv.UnsafeAddr())).Elem()

if dv.IsValid() && dv.CanSet() {
    dv.SetBool(true)
}
sqltrace.Register("mssql", driver)

Maybe it makes sense to expose the driver instances?

NikitaDef commented 1 year ago

I guess, by that. https://github.com/denisenkom/go-mssqldb#query-parameter-token-replace-driver-mssql

Can you show your query?

nacho692 commented 1 year ago

Yep, that's exactly it! I know I can change the query, but I would like to trace the "mssql" driver instead of the "sqlserver" one