feat(db): migrate from MySQL to PostgreSQL
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
Replace MySQL driver with pgx/v5 and pgxpool: - Update sqlc to use postgresql engine - Convert query.sql to PostgreSQL syntax ($1 params, CASE WHEN, ANY() arrays) - Replace sql.DB with pgxpool.Pool throughout - Change nullable types from sql.Null* to pgtype.* - Update ID types from uint32 to int64 for PostgreSQL compatibility - Delete MySQL-specific dynamic_connect.go - Add opentelemetry.gowrap template for tracing
This commit is contained in:
55
ntpdb/opentelemetry.gowrap
Normal file
55
ntpdb/opentelemetry.gowrap
Normal file
@@ -0,0 +1,55 @@
|
||||
import (
|
||||
"context"
|
||||
|
||||
_codes "go.opentelemetry.io/otel/codes"
|
||||
"go.opentelemetry.io/otel"
|
||||
"go.opentelemetry.io/otel/attribute"
|
||||
)
|
||||
|
||||
{{ $decorator := (or .Vars.DecoratorName (printf "%sWithTracing" .Interface.Name)) }}
|
||||
{{ $spanNameType := (or .Vars.SpanNamePrefix .Interface.Name) }}
|
||||
|
||||
// {{$decorator}} implements {{.Interface.Name}} interface instrumented with open telemetry spans
|
||||
type {{$decorator}} struct {
|
||||
{{.Interface.Type}}
|
||||
_instance string
|
||||
_spanDecorator func(span trace.Span, params, results map[string]interface{})
|
||||
}
|
||||
|
||||
// New{{$decorator}} returns {{$decorator}}
|
||||
func New{{$decorator}} (base {{.Interface.Type}}, instance string, spanDecorator ...func(span trace.Span, params, results map[string]interface{})) {{$decorator}} {
|
||||
d := {{$decorator}} {
|
||||
{{.Interface.Name}}: base,
|
||||
_instance: instance,
|
||||
}
|
||||
|
||||
if len(spanDecorator) > 0 && spanDecorator[0] != nil {
|
||||
d._spanDecorator = spanDecorator[0]
|
||||
}
|
||||
|
||||
return d
|
||||
}
|
||||
|
||||
{{range $method := .Interface.Methods}}
|
||||
{{if $method.AcceptsContext}}
|
||||
// {{$method.Name}} implements {{$.Interface.Name}}
|
||||
func (_d {{$decorator}}) {{$method.Declaration}} {
|
||||
ctx, _span := otel.Tracer(_d._instance).Start(ctx, "{{$spanNameType}}.{{$method.Name}}")
|
||||
defer func() {
|
||||
if _d._spanDecorator != nil {
|
||||
_d._spanDecorator(_span, {{$method.ParamsMap}}, {{$method.ResultsMap}})
|
||||
}{{- if $method.ReturnsError}} else if err != nil {
|
||||
_span.RecordError(err)
|
||||
_span.SetStatus(_codes.Error, err.Error())
|
||||
_span.SetAttributes(
|
||||
attribute.String("event", "error"),
|
||||
attribute.String("message", err.Error()),
|
||||
)
|
||||
}
|
||||
{{end}}
|
||||
_span.End()
|
||||
}()
|
||||
{{$method.Pass (printf "_d.%s." $.Interface.Name) }}
|
||||
}
|
||||
{{end}}
|
||||
{{end}}
|
||||
Reference in New Issue
Block a user