Private
Public Access
1
0
Files
data-api/chdb/logscores.go
Ask Bjørn Hansen 6df51fc19f
All checks were successful
continuous-integration/drone/push Build is passing
scores: clickhouse support
2024-01-20 19:41:02 -07:00

87 lines
1.9 KiB
Go

package chdb
import (
"context"
"fmt"
"time"
"github.com/ClickHouse/clickhouse-go/v2"
"go.ntppool.org/common/logger"
"go.ntppool.org/common/tracing"
"go.ntppool.org/data-api/ntpdb"
)
func (d *ClickHouse) Logscores(ctx context.Context, serverID, monitorID int, since time.Time, limit int) ([]ntpdb.LogScore, error) {
log := logger.Setup()
ctx, span := tracing.Tracer().Start(ctx, "CH Logscores")
defer span.End()
if since.IsZero() {
since = time.Now().Add(4 * -24 * time.Hour)
}
args := []interface{}{serverID, since, limit}
query := `select id,monitor_id,server_id,ts,
toFloat64(score),toFloat64(step),offset,
rtt,leap,warning,error
from log_scores
where
server_id = ?
and ts > ?
order by ts desc
limit ?;`
if monitorID > 0 {
query = `select id,monitor_id,server_id,ts,
toFloat64(score),toFloat64(step),offset,
rtt,leap,warning,error
from log_scores
where
server_id = ?
and monitor_id = ?
and ts > ?
order by ts desc
limit ?;`
args = []interface{}{serverID, monitorID, since, limit}
}
rows, err := d.Scores.Query(clickhouse.Context(ctx, clickhouse.WithSpan(span.SpanContext())),
query, args...,
)
if err != nil {
log.ErrorContext(ctx, "query error", "err", err)
return nil, fmt.Errorf("database error")
}
rv := []ntpdb.LogScore{}
for rows.Next() {
row := ntpdb.LogScore{}
if err := rows.Scan(
&row.ID,
&row.MonitorID,
&row.ServerID,
&row.Ts,
&row.Score,
&row.Step,
&row.Offset,
&row.Rtt,
&row.Attributes.Leap,
&row.Attributes.Warning,
&row.Attributes.Error,
); err != nil {
log.Error("could not parse row", "err", err)
continue
}
rv = append(rv, row)
}
// log.InfoContext(ctx, "returning data", "rv", rv)
return rv, nil
}