mirror of
https://github.com/uptrace/go-clickhouse.git
synced 2025-06-06 23:16:18 +02:00
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
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
|
|
}
|