fix: add http tracing so end-to-end tracing is possible
This commit is contained in:
@ -62,9 +62,11 @@ type Serv struct {
|
||||
}
|
||||
|
||||
Tracing struct {
|
||||
Exporter string
|
||||
Endpoint string
|
||||
Sample string
|
||||
Exporter string
|
||||
Endpoint string
|
||||
Sample string
|
||||
IncludeQuery bool `mapstructure:"include_query"`
|
||||
IncludeParams bool `mapstructure:"include_params"`
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -10,6 +10,8 @@ import (
|
||||
"github.com/dosco/super-graph/core"
|
||||
"github.com/dosco/super-graph/internal/serv/internal/auth"
|
||||
"github.com/rs/cors"
|
||||
"go.opencensus.io/plugin/ochttp"
|
||||
"go.opencensus.io/trace"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@ -44,7 +46,7 @@ func apiV1Handler() http.Handler {
|
||||
AllowCredentials: true,
|
||||
Debug: conf.DebugCORS,
|
||||
})
|
||||
h = c.Handler(h)
|
||||
return c.Handler(h)
|
||||
}
|
||||
|
||||
return h
|
||||
@ -78,6 +80,22 @@ func apiV1(w http.ResponseWriter, r *http.Request) {
|
||||
doLog := true
|
||||
res, err := sg.GraphQL(ct, req.Query, req.Vars)
|
||||
|
||||
if conf.telemetryEnabled() {
|
||||
span := trace.FromContext(ct)
|
||||
|
||||
span.AddAttributes(
|
||||
trace.StringAttribute("operation", res.OperationName()),
|
||||
trace.StringAttribute("query_name", res.QueryName()),
|
||||
trace.StringAttribute("role", res.Role()),
|
||||
)
|
||||
|
||||
if err != nil {
|
||||
span.AddAttributes(trace.StringAttribute("error", err.Error()))
|
||||
}
|
||||
|
||||
ochttp.SetRoute(ct, apiRoute)
|
||||
}
|
||||
|
||||
if !conf.Production && res.QueryName() == introspectionQuery {
|
||||
doLog = false
|
||||
}
|
||||
|
@ -215,7 +215,20 @@ func initDB(c *Config, useDB, useTelemetry bool) (*sql.DB, error) {
|
||||
// }
|
||||
|
||||
if useTelemetry && conf.telemetryEnabled() {
|
||||
driverName, err = ocsql.Register(driverName, ocsql.WithAllTraceOptions(), ocsql.WithInstanceName(conf.AppName))
|
||||
opts := ocsql.TraceOptions{
|
||||
AllowRoot: false,
|
||||
Ping: true,
|
||||
RowsNext: true,
|
||||
RowsClose: true,
|
||||
RowsAffected: true,
|
||||
LastInsertID: true,
|
||||
Query: conf.Telemetry.Tracing.IncludeQuery,
|
||||
QueryParams: conf.Telemetry.Tracing.IncludeParams,
|
||||
}
|
||||
opt := ocsql.WithOptions(opts)
|
||||
name := ocsql.WithInstanceName(conf.AppName)
|
||||
|
||||
driverName, err = ocsql.Register(driverName, opt, name)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("unable to register ocsql driver: %v", err)
|
||||
}
|
||||
|
@ -13,6 +13,11 @@ import (
|
||||
rice "github.com/GeertJohan/go.rice"
|
||||
"github.com/NYTimes/gziphandler"
|
||||
"github.com/dosco/super-graph/internal/serv/internal/auth"
|
||||
"go.opencensus.io/plugin/ochttp"
|
||||
)
|
||||
|
||||
var (
|
||||
apiRoute string = "/api/v1/graphql"
|
||||
)
|
||||
|
||||
func initWatcher() {
|
||||
@ -76,6 +81,10 @@ func startHTTP() {
|
||||
MaxHeaderBytes: 1 << 20,
|
||||
}
|
||||
|
||||
if conf.telemetryEnabled() {
|
||||
srv.Handler = &ochttp.Handler{Handler: routes}
|
||||
}
|
||||
|
||||
idleConnsClosed := make(chan struct{})
|
||||
go func() {
|
||||
sigint := make(chan os.Signal, 1)
|
||||
@ -114,8 +123,6 @@ func routeHandler() (http.Handler, error) {
|
||||
return mux, nil
|
||||
}
|
||||
|
||||
apiRoute := "/api/v1/graphql"
|
||||
|
||||
if len(conf.APIPath) != 0 {
|
||||
apiRoute = path.Join("/", conf.APIPath, "/v1/graphql")
|
||||
}
|
||||
@ -178,6 +185,10 @@ func setActionRoutes(routes map[string]http.Handler) error {
|
||||
routes[p] = fn
|
||||
}
|
||||
|
||||
if conf.telemetryEnabled() {
|
||||
routes[p] = ochttp.WithRouteTag(routes[p], p)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -103,7 +103,9 @@ func enableObservability(mux *http.ServeMux) (func(), error) {
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("ERR OpenCensus: %s: %v", conf.Telemetry.Tracing, err)
|
||||
return nil, fmt.Errorf("ERR OpenCensus: %s: %v",
|
||||
conf.Telemetry.Tracing.Exporter,
|
||||
err)
|
||||
}
|
||||
|
||||
if tex != nil {
|
||||
|
Reference in New Issue
Block a user