Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Features #228

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 31 additions & 33 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,15 @@ var (
queryMethodKey = attribute.Key("method")
)

// SpanNameFormatter supports formatting span names.
// SpanNameFormatter помогает иницилизировать имена для spans.
type SpanNameFormatter func(ctx context.Context, method Method, query string) string

// AttributesGetter provides additional attributes on spans creation.
// AttributesGetter помогает иницилизировать spans при их создании.
type AttributesGetter func(ctx context.Context, method Method, query string, args []driver.NamedValue) []attribute.KeyValue

type SpanFilter func(ctx context.Context, method Method, query string, args []driver.NamedValue) bool

// config структура, содержащее все необходимое для трассировки базы данных.
type config struct {
TracerProvider trace.TracerProvider
Tracer trace.Tracer
Expand All @@ -53,79 +54,76 @@ type config struct {

SpanOptions SpanOptions

// Attributes will be set to each span.
// Attributes, которые будут добавлены во все spans.
Attributes []attribute.KeyValue

// SpanNameFormatter will be called to produce span's name.
// Default use method as span name
// SpanNameFormatter будет вызван для присваивания имени span.
// По умолчанию использует название метод как имя span.
SpanNameFormatter SpanNameFormatter

// SQLCommenterEnabled enables context propagation for database
// by injecting a comment into SQL statements.
// SQLCommenterEnabled включает проброс context для database
// при помощи включения комментария в SQL statements.
//
// Experimental
// Эксперементально!
//
// Notice: This config is EXPERIMENTAL and may be changed or removed in a
// later release.
// Notice: Эта опция ЭКСПЕРЕМЕНТАЛЬНА и, возможно, будет изменена или удалена в
// более поздник релизах.
SQLCommenterEnabled bool
SQLCommenter *commenter

// AttributesGetter will be called to produce additional attributes while creating spans.
// Default returns nil
// AttributesGetter функция, которая будет вызвана для инициализации дополнительных attributes
// во время создания spans.
// По умолчанию возвращает nil
AttributesGetter AttributesGetter
}

// SpanOptions holds configuration of tracing span to decide
// whether to enable some features.
// By default all options are set to false intentionally when creating a wrapped
// driver and provide the most sensible default with both performance and
// security in mind.
// SpanOptions структура, содержащая некоторые опции для тонко настройки tracing spans.
// По умолчанию все опции отключены.
type SpanOptions struct {
// Ping, if set to true, will enable the creation of spans on Ping requests.
// Ping, если выставлено значение true, включит создание spans по Ping requests.
Ping bool

// RowsNext, if set to true, will enable the creation of events in spans on RowsNext
// calls. This can result in many events.
// RowsNext, если высталено значение true, включит создание events в spans на вызов RowsNext
RowsNext bool

// DisableErrSkip, if set to true, will suppress driver.ErrSkip errors in spans.
// DisableErrSkip,если выставлено значение true, будет подавлять driver.ErrSkip errors в spans.
DisableErrSkip bool

// DisableQuery if set to true, will suppress db.statement in spans.
// DisableQuery если выставлено значение true, будет подавлено db.statement в spans.
DisableQuery bool

// RecordError, if set, will be invoked with the current error, and if the func returns true
// the record will be recorded on the current span.
// RecordError, если включено, будет вызвана с текущей ошибкой, если функция возвращает true
// то запись будет записана в текущий span.
//
// If this is not set it will default to record all errors (possible not ErrSkip, see option
// В противном случае будет записывать все ошибки в текущий span (possible not ErrSkip, see option
// DisableErrSkip).
RecordError func(err error) bool

// OmitConnResetSession if set to true will suppress sql.conn.reset_session spans
// OmitConnResetSession, если выставлено значение true, будет подавлять sql.conn.reset_session spans
OmitConnResetSession bool

// OmitConnPrepare if set to true will suppress sql.conn.prepare spans
// OmitConnPrepare, если выставлено true, будет подавлять sql.conn.prepare spans
OmitConnPrepare bool

// OmitConnQuery if set to true will suppress sql.conn.query spans
// OmitConnQuery, если выставлено true, будет подавлять sql.conn.query spans
OmitConnQuery bool

// OmitRows if set to true will suppress sql.rows spans
// OmitRows, если выставлено true, будет подавлять sql.rows spans
OmitRows bool

// OmitConnectorConnect if set to true will suppress sql.connector.connect spans
// OmitConnectorConnect, если выставлено true, будет подавлять sql.connector.connect spans
OmitConnectorConnect bool

// SpanFilter, if set, will be invoked before each call to create a span. If it returns
// false, the span will not be created.
// SpanFilter, функция, которая будет вызвана перед каждым вызовом span. Если функция возвращает
// false, span will не будет создан.
SpanFilter SpanFilter
}

func defaultSpanNameFormatter(_ context.Context, method Method, _ string) string {
return string(method)
}

// newConfig returns a config with all Options set.
// newConfig функция, возвращающая config, иницилизированный переданными опциями options.
func newConfig(options ...Option) config {
cfg := config{
TracerProvider: otel.GetTracerProvider(),
Expand Down
17 changes: 14 additions & 3 deletions connector.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,16 @@ import (
var _ driver.Connector = (*otConnector)(nil)
var _ io.Closer = (*otConnector)(nil)

// otConnector структура, описывающая connector
// для database/sql connector
type otConnector struct {
driver.Connector
otDriver *otDriver
cfg config
}

// newConnector иницилизирует otCollector с переданными настройками cfg,
// и драйвером otDriver.
func newConnector(connector driver.Connector, otDriver *otDriver) *otConnector {
return &otConnector{
Connector: connector,
Expand All @@ -39,6 +43,8 @@ func newConnector(connector driver.Connector, otDriver *otDriver) *otConnector {
}
}

// Connect метод структуры otConnector, осуществляющий подключение
// и возращающий интерфейс driver.Conn и ошибку
func (c *otConnector) Connect(ctx context.Context) (connection driver.Conn, err error) {
method := MethodConnectorConnect
onDefer := recordMetric(ctx, c.cfg.Instruments, c.cfg.Attributes, method)
Expand All @@ -60,29 +66,34 @@ func (c *otConnector) Connect(ctx context.Context) (connection driver.Conn, err
return newConn(connection, c.cfg), nil
}

// метод otConnector Driver возвращает
// поле структуры otConnector otDriver
func (c *otConnector) Driver() driver.Driver {
return c.otDriver
}

func (c *otConnector) Close() error {
// database/sql uses a type assertion to check if connectors implement io.Closer.
// The type assertion does not pass through to otConnector.Connector, so we explicitly implement it here.
// database/sql использует type assertion для проверки удоволетворяет ли connector io.Closer.
if closer, ok := c.Connector.(io.Closer); ok {
return closer.Close()
}
return nil
}

// dsnConnector is copied from sql.dsnConnector.
// dsnConnector сорпирован с sql.dsnConnector.
type dsnConnector struct {
dsn string
driver driver.Driver
}

// Connect метод структуры dsnConnector, осуществленяющий подклчение
// и возвращающий driver.Conn и ошибку.
func (t dsnConnector) Connect(_ context.Context) (driver.Conn, error) {
return t.driver.Open(t.dsn)
}

// Driver метод структуры dsnConnector возвращает
// драйвер, хранящийся в структуре dsnConnector
func (t dsnConnector) Driver() driver.Driver {
return t.driver
}
5 changes: 4 additions & 1 deletion instruments.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,10 +36,12 @@ type dbStatsInstruments struct {
}

type instruments struct {
// The latency of calls in milliseconds
// latency(задержка) вызовов в миллисекундах
latency metric.Float64Histogram
}

// newInstuments возвращает структура insruments с иницилизированным
// полем latency, который считает задрежку в миллисекундах
func newInstruments(meter metric.Meter) (*instruments, error) {
var instruments instruments
var err error
Expand All @@ -54,6 +56,7 @@ func newInstruments(meter metric.Meter) (*instruments, error) {
return &instruments, nil
}

// newDBStatsInstruments возвращает иницилизированную структуру dbStatsInstruments
func newDBStatsInstruments(meter metric.Meter) (*dbStatsInstruments, error) {
var instruments dbStatsInstruments
var err error
Expand Down
4 changes: 2 additions & 2 deletions methods.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@

package otelsql

// Method specifics operation in the database/sql package.
// Method описывает операцию в database/sql package.
type Method string

// Event specifics events in the database/sql package.
// Event описывает событие в database/sql package.
type Event string

const (
Expand Down
Loading
Loading