Private
Public Access
1
0
Files
data-api/logscores/history.go
Ask Bjørn Hansen 2dfc355f7c
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
style: format Go code with gofumpt
Apply consistent formatting to Go source files using gofumpt
as required by pre-commit guidelines.
2025-08-03 16:06:59 -07:00

121 lines
3.1 KiB
Go

package logscores
import (
"context"
"database/sql"
"time"
"go.ntppool.org/common/logger"
"go.ntppool.org/common/tracing"
"go.ntppool.org/data-api/chdb"
"go.ntppool.org/data-api/ntpdb"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/trace"
)
type LogScoreHistory struct {
LogScores []ntpdb.LogScore
Monitors map[int]string
// MonitorIDs []uint32
}
func GetHistoryClickHouse(ctx context.Context, ch *chdb.ClickHouse, db *sql.DB, serverID, monitorID uint32, since time.Time, count int, fullHistory bool) (*LogScoreHistory, error) {
log := logger.FromContext(ctx)
ctx, span := tracing.Tracer().Start(ctx, "logscores.GetHistoryClickHouse",
trace.WithAttributes(
attribute.Int("server", int(serverID)),
attribute.Int("monitor", int(monitorID)),
attribute.Bool("full_history", fullHistory),
),
)
defer span.End()
log.DebugContext(ctx, "GetHistoryCH", "server", serverID, "monitor", monitorID, "since", since, "count", count, "full_history", fullHistory)
ls, err := ch.Logscores(ctx, int(serverID), int(monitorID), since, count, fullHistory)
if err != nil {
log.ErrorContext(ctx, "clickhouse logscores", "err", err)
return nil, err
}
q := ntpdb.NewWrappedQuerier(ntpdb.New(db))
monitors, err := getMonitorNames(ctx, ls, q)
if err != nil {
return nil, err
}
return &LogScoreHistory{
LogScores: ls,
Monitors: monitors,
}, nil
}
func GetHistoryMySQL(ctx context.Context, db *sql.DB, serverID, monitorID uint32, since time.Time, count int) (*LogScoreHistory, error) {
log := logger.FromContext(ctx)
ctx, span := tracing.Tracer().Start(ctx, "logscores.GetHistoryMySQL")
defer span.End()
span.SetAttributes(
attribute.Int("server", int(serverID)),
attribute.Int("monitor", int(monitorID)),
)
log.Debug("GetHistoryMySQL", "server", serverID, "monitor", monitorID, "since", since, "count", count)
q := ntpdb.NewWrappedQuerier(ntpdb.New(db))
var ls []ntpdb.LogScore
var err error
if monitorID > 0 {
ls, err = q.GetServerLogScoresByMonitorID(ctx, ntpdb.GetServerLogScoresByMonitorIDParams{
ServerID: serverID,
MonitorID: sql.NullInt32{Int32: int32(monitorID), Valid: true},
Limit: int32(count),
})
} else {
ls, err = q.GetServerLogScores(ctx, ntpdb.GetServerLogScoresParams{
ServerID: serverID,
Limit: int32(count),
})
}
if err != nil {
return nil, err
}
monitors, err := getMonitorNames(ctx, ls, q)
if err != nil {
return nil, err
}
return &LogScoreHistory{
LogScores: ls,
Monitors: monitors,
// MonitorIDs: monitorIDs,
}, nil
}
func getMonitorNames(ctx context.Context, ls []ntpdb.LogScore, q ntpdb.QuerierTx) (map[int]string, error) {
monitors := map[int]string{}
monitorIDs := []uint32{}
for _, l := range ls {
if !l.MonitorID.Valid {
continue
}
mID := uint32(l.MonitorID.Int32)
if _, ok := monitors[int(mID)]; !ok {
monitors[int(mID)] = ""
monitorIDs = append(monitorIDs, mID)
}
}
dbmons, err := q.GetMonitorsByID(ctx, monitorIDs)
if err != nil {
return nil, err
}
for _, m := range dbmons {
monitors[int(m.ID)] = m.DisplayName()
}
return monitors, nil
}