zeroshade commented on code in PR #2729:
URL: https://github.com/apache/arrow-adbc/pull/2729#discussion_r2073903519


##########
go/adbc/driver/internal/driverbase/database.go:
##########
@@ -136,4 +201,218 @@ func (db *database) SetLogger(logger *slog.Logger) {
        }
 }
 
+func (base *database) InitTracing(ctx context.Context, driverName string, 
driverVersion string) error {
+       return base.Base().InitTracing(ctx, driverName, driverVersion)
+}
+
+func (base *DatabaseImplBase) InitTracing(ctx context.Context, driverName 
string, driverVersion string) (err error) {
+       fullyQualifiedDriverName := driverNamespace + "." + driverName
+
+       getExporterName := sync.OnceValue(func() string {
+               return os.Getenv(otelTracesExporter)
+       })
+       exporterName := getExporterName()
+
+       // Empty exporter
+       if exporterName == "" {
+               base.Tracer = otel.Tracer(fullyQualifiedDriverName)
+               return
+       }
+
+       var (
+               exporterType traceExporterType
+               exporters    []sdktrace.SpanExporter
+       )
+
+       exporters, exporterType, err = getExporters(
+               ctx,
+               exporterName,
+               base,
+               driverName,
+       )
+       if err != nil {
+               return
+       }
+
+       if len(exporters) < 1 {
+               // This should not normally happen after a successful call to 
getExporters,
+               // but here for completeness
+               err = base.ErrorHelper.Errorf(
+                       adbc.StatusInvalidState,
+                       "%s '%s'",
+                       DatabaseMessageNoOtelTracesExporters,
+                       exporterType.String(),
+               )
+               return
+       }
+
+       base.Tracer, err = newTracer(exporters, base, fullyQualifiedDriverName, 
driverVersion)
+       if err != nil {
+               return
+       }
+
+       return
+}
+
+func getExporters(
+       ctx context.Context,
+       exporterName string,
+       base *DatabaseImplBase,
+       driverName string,
+) (exporters []sdktrace.SpanExporter, exporterType traceExporterType, err 
error) {
+       var exporter sdktrace.SpanExporter
+       exporterType, ok := tryParseTraceExporterType(exporterName)
+       if !ok {
+               err = base.ErrorHelper.Errorf(
+                       adbc.StatusInvalidArgument,
+                       "%s '%s'",
+                       DatabaseMessageOtelTracesExporterOptionUnknown,
+                       exporterName,
+               )
+               return
+       }
+       switch exporterType {
+       case TraceExporterNone:
+               break
+       case TraceExporterConsole:
+               exporter, err = stdouttrace.New()
+               if err != nil {
+                       return
+               }
+               exporters = append(exporters, exporter)
+       case TraceExporterOtlp:
+               exporters, err = newOtlpTraceExporters(ctx)
+               if err != nil {
+                       return
+               }
+       case TraceExporterAdbcFile:
+               exporter, err = newAdbcFileExporter(driverName)
+               if err != nil {
+                       return
+               }
+               exporters = append(exporters, exporter)
+       default:
+               err = base.ErrorHelper.Errorf(
+                       adbc.StatusNotImplemented,
+                       "%s '%s'",
+                       DatabaseMessageOtelTracesExporterOptionUnknown,
+                       exporterType.String(),
+               )
+               return
+       }
+       return
+}
+
+func newTracer(
+       exporters []sdktrace.SpanExporter,
+       base *DatabaseImplBase,
+       fullyQualifiedDriverName string,
+       driverVersion string,
+) (tracer trace.Tracer, err error) {
+       var tracerProvider *sdktrace.TracerProvider
+       tracerProvider, err = newTracerProvider(exporters...)
+       if err != nil {
+               return
+       }
+       base.Base().tracerShutdownFunc = tracerProvider.Shutdown
+       tracer = tracerProvider.Tracer(
+               fullyQualifiedDriverName,
+               trace.WithInstrumentationVersion(driverVersion),
+               trace.WithSchemaURL(semconv.SchemaURL),
+       )
+       return
+}
+
+func tryParseTraceExporterType(value string) (traceExporterType, bool) {
+       if te, ok := traceExporterNames[value]; ok {
+               return te, true
+       }
+       return TraceExporterNone, false
+}
+
+func getDriverVersion(driverInfo *DriverInfo) string {
+       const unknownDriverVersion = "unknown"
+       value, ok := driverInfo.GetInfoForInfoCode(adbc.InfoDriverVersion)
+       if !ok {
+               return unknownDriverVersion
+       }
+       if driverVersion, ok := value.(string); ok {
+               return driverVersion
+       }
+       return unknownDriverVersion
+}
+
+func newOtlpTraceExporters(ctx context.Context) (exporters 
[]sdktrace.SpanExporter, err error) {
+       // Configure these exporters using environment variables
+       // see: 
https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/
+       // see: https://opentelemetry.io/docs/specs/otel/protocol/exporter/
+       // see: 
https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
+       // see: 
https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
+
+       // Create the gRPC exporter
+       var grpcExporter sdktrace.SpanExporter
+       grpcExporter, err = otlptracegrpc.New(

Review Comment:
   don't bother with the named return params, just use the `:=` here instead of 
having to separately define the variables beforehand.



##########
go/adbc/driver/internal/driverbase/database.go:
##########
@@ -136,4 +201,218 @@ func (db *database) SetLogger(logger *slog.Logger) {
        }
 }
 
+func (base *database) InitTracing(ctx context.Context, driverName string, 
driverVersion string) error {
+       return base.Base().InitTracing(ctx, driverName, driverVersion)
+}
+
+func (base *DatabaseImplBase) InitTracing(ctx context.Context, driverName 
string, driverVersion string) (err error) {
+       fullyQualifiedDriverName := driverNamespace + "." + driverName
+
+       getExporterName := sync.OnceValue(func() string {
+               return os.Getenv(otelTracesExporter)
+       })
+       exporterName := getExporterName()
+
+       // Empty exporter
+       if exporterName == "" {
+               base.Tracer = otel.Tracer(fullyQualifiedDriverName)
+               return
+       }
+
+       var (
+               exporterType traceExporterType
+               exporters    []sdktrace.SpanExporter
+       )
+
+       exporters, exporterType, err = getExporters(
+               ctx,
+               exporterName,
+               base,
+               driverName,
+       )
+       if err != nil {
+               return
+       }
+
+       if len(exporters) < 1 {
+               // This should not normally happen after a successful call to 
getExporters,
+               // but here for completeness
+               err = base.ErrorHelper.Errorf(
+                       adbc.StatusInvalidState,
+                       "%s '%s'",
+                       DatabaseMessageNoOtelTracesExporters,
+                       exporterType.String(),
+               )
+               return
+       }
+
+       base.Tracer, err = newTracer(exporters, base, fullyQualifiedDriverName, 
driverVersion)
+       if err != nil {
+               return
+       }
+
+       return
+}
+
+func getExporters(
+       ctx context.Context,
+       exporterName string,
+       base *DatabaseImplBase,
+       driverName string,
+) (exporters []sdktrace.SpanExporter, exporterType traceExporterType, err 
error) {
+       var exporter sdktrace.SpanExporter
+       exporterType, ok := tryParseTraceExporterType(exporterName)
+       if !ok {
+               err = base.ErrorHelper.Errorf(
+                       adbc.StatusInvalidArgument,
+                       "%s '%s'",
+                       DatabaseMessageOtelTracesExporterOptionUnknown,
+                       exporterName,
+               )
+               return
+       }
+       switch exporterType {
+       case TraceExporterNone:
+               break
+       case TraceExporterConsole:
+               exporter, err = stdouttrace.New()
+               if err != nil {
+                       return
+               }
+               exporters = append(exporters, exporter)
+       case TraceExporterOtlp:
+               exporters, err = newOtlpTraceExporters(ctx)
+               if err != nil {
+                       return
+               }
+       case TraceExporterAdbcFile:
+               exporter, err = newAdbcFileExporter(driverName)
+               if err != nil {
+                       return
+               }
+               exporters = append(exporters, exporter)
+       default:
+               err = base.ErrorHelper.Errorf(
+                       adbc.StatusNotImplemented,
+                       "%s '%s'",
+                       DatabaseMessageOtelTracesExporterOptionUnknown,
+                       exporterType.String(),
+               )
+               return
+       }
+       return
+}
+
+func newTracer(
+       exporters []sdktrace.SpanExporter,
+       base *DatabaseImplBase,
+       fullyQualifiedDriverName string,
+       driverVersion string,
+) (tracer trace.Tracer, err error) {
+       var tracerProvider *sdktrace.TracerProvider
+       tracerProvider, err = newTracerProvider(exporters...)
+       if err != nil {
+               return
+       }
+       base.Base().tracerShutdownFunc = tracerProvider.Shutdown
+       tracer = tracerProvider.Tracer(
+               fullyQualifiedDriverName,
+               trace.WithInstrumentationVersion(driverVersion),
+               trace.WithSchemaURL(semconv.SchemaURL),
+       )
+       return
+}
+
+func tryParseTraceExporterType(value string) (traceExporterType, bool) {
+       if te, ok := traceExporterNames[value]; ok {
+               return te, true
+       }
+       return TraceExporterNone, false
+}
+
+func getDriverVersion(driverInfo *DriverInfo) string {
+       const unknownDriverVersion = "unknown"
+       value, ok := driverInfo.GetInfoForInfoCode(adbc.InfoDriverVersion)
+       if !ok {
+               return unknownDriverVersion
+       }
+       if driverVersion, ok := value.(string); ok {
+               return driverVersion
+       }
+       return unknownDriverVersion
+}
+
+func newOtlpTraceExporters(ctx context.Context) (exporters 
[]sdktrace.SpanExporter, err error) {
+       // Configure these exporters using environment variables
+       // see: 
https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/
+       // see: https://opentelemetry.io/docs/specs/otel/protocol/exporter/
+       // see: 
https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
+       // see: 
https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
+
+       // Create the gRPC exporter
+       var grpcExporter sdktrace.SpanExporter
+       grpcExporter, err = otlptracegrpc.New(
+               ctx,
+               otlptracegrpc.WithRetry(otlptracegrpc.RetryConfig{
+                       Enabled:         true,
+                       InitialInterval: 5 * time.Second,
+                       MaxInterval:     30 * time.Second,
+               }),
+       )
+       if err != nil {
+               return
+       }
+       // Create the http/protobuf exporter
+       var httpExporter sdktrace.SpanExporter
+       httpExporter, err = otlptracehttp.New(

Review Comment:
   same as above



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: github-unsubscr...@arrow.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to