trashlog/dal/clickhouse/clickhouse.go

82 lines
1.5 KiB
Go
Raw Normal View History

2021-02-20 16:15:31 +00:00
package clickhouse
import (
"context"
"database/sql"
"github.com/ClickHouse/clickhouse-go"
"github.com/themakers/hlog"
)
type DAL struct {
logger hlog.Logger
db *sql.DB
}
type ErrorPingException struct {
Code int32
Message string
StackTrace string
}
func New(ctx context.Context, log hlog.Logger, credentials string) (*DAL, error) {
connect, err := sql.Open(
"clickhouse",
credentials,
)
if err != nil {
return nil, err
}
if err := connect.PingContext(ctx); err != nil {
if exception, ok := err.(*clickhouse.Exception); ok {
log.Emit(ErrorPingException{
Code: exception.Code,
Message: exception.Message,
StackTrace: exception.StackTrace,
})
}
return nil, err
}
return &DAL{
db: connect,
logger: log.Module("clickhouse"),
}, nil
}
type ErrorCreateTable struct {
Err error
Query string
}
func (d *DAL) Init(ctx context.Context) error {
query := `
CREATE TABLE IF NOT EXISTS statistics ENGINE (
event_level Enum('Info' = 0, 'Warn' = 1, 'Error' = 2, 'Debug' = 3),
message String,
stacktrace String,
svc_build_time DateTime,
svc_version String,
svc_commit String,
svc_file String,
svc_line UInt64,
svc_module Array(String),
event_time DateTime,
create_time DateTime
) = MergeTree()
ORDER BY event_time
PARTITION BY toStartOfDay(event_time)
PRIMARY KEY (create_time, svc_module, svc_version, level, svc_build_time)
`
if _, err := d.db.ExecContext(ctx,query); err != nil {
d.logger.Emit(ErrorCreateTable{
Err: err,
Query: query,
})
return err
}
return nil
}