1
0
mirror of https://github.com/uptrace/go-clickhouse.git synced 2025-06-06 23:16:18 +02:00

72 lines
1.5 KiB
Go
Raw Permalink Normal View History

2022-01-23 09:36:24 +02:00
package main
import (
"context"
"math/rand"
"time"
"github.com/brianvoe/gofakeit/v5"
"github.com/uptrace/go-clickhouse/ch"
"github.com/uptrace/go-clickhouse/chotel"
"github.com/uptrace/opentelemetry-go-extra/otelplay"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/codes"
)
var tracer = otel.Tracer("github.com/uptrace/go-clickhouse/example/opentelemetry")
func main() {
ctx := context.Background()
shutdown := otelplay.ConfigureOpentelemetry(ctx)
defer shutdown()
db := ch.Connect(ch.WithDatabase("test"))
db.AddQueryHook(chotel.NewQueryHook())
// db.AddQueryHook(chdebug.NewQueryHook(chdebug.WithVerbose(true)))
if err := db.Ping(ctx); err != nil {
panic(err)
}
if err := db.ResetModel(ctx, (*Model)(nil)); err != nil {
panic(err)
}
ctx, span := tracer.Start(ctx, "handleRequest")
defer span.End()
if err := handleRequest(ctx, db); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
}
otelplay.PrintTraceID(ctx)
}
type Model struct {
ch.CHModel `ch:"partition:toYYYYMM(time)"`
ID uint64
Name string `ch:",lc"`
Time time.Time `ch:",pk"`
}
func handleRequest(ctx context.Context, db *ch.DB) error {
model := &Model{
ID: rand.Uint64(),
Name: gofakeit.Name(),
Time: time.Now(),
}
if _, err := db.NewInsert().Model(model).Exec(ctx); err != nil {
return err
}
// Check that data can be selected without any errors.
if err := db.NewSelect().Model(model).Limit(1).Scan(ctx); err != nil {
return err
}
return nil
}