82 lines
1.5 KiB
Go
82 lines
1.5 KiB
Go
|
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
|
||
|
}
|