106 lines
2.5 KiB
Go
106 lines
2.5 KiB
Go
package pg
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
|
|
"git.loyso.art/frx/devsim/internal/entities"
|
|
"git.loyso.art/frx/devsim/internal/store/pg/queries"
|
|
)
|
|
|
|
func Dial(ctx context.Context, addr string) (*repository, error) {
|
|
config, err := pgxpool.ParseConfig(addr)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("parsing config: %w", err)
|
|
}
|
|
|
|
pool, err := pgxpool.NewWithConfig(ctx, config)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("connecting to db: %w", err)
|
|
}
|
|
|
|
return &repository{db: pool}, nil
|
|
}
|
|
|
|
type repository struct {
|
|
db *pgxpool.Pool
|
|
}
|
|
|
|
func (r *repository) StatsRepository() statsRepository {
|
|
return statsRepository{
|
|
q: queries.New(r.db),
|
|
}
|
|
}
|
|
|
|
func (r *repository) Close() error {
|
|
r.db.Close()
|
|
return nil
|
|
}
|
|
|
|
type statsRepository struct {
|
|
q *queries.Queries
|
|
}
|
|
|
|
type deviceStatsDB struct {
|
|
UpdatedAt time.Time
|
|
DeviceID string
|
|
IncomingTraffic int
|
|
OutgoingTraffic int
|
|
IncomingRPS int
|
|
ReadRPS int
|
|
WriteRPS int
|
|
}
|
|
|
|
func (s deviceStatsDB) asDomain() entities.DeviceStatistics {
|
|
return entities.DeviceStatistics{
|
|
ID: entities.DeviceID(s.DeviceID),
|
|
IncomingTrafficBytes: s.IncomingTraffic,
|
|
OutgoingTrafficBytes: s.OutgoingTraffic,
|
|
IncomingRPS: s.IncomingRPS,
|
|
ReadRPS: s.ReadRPS,
|
|
WriteRPS: s.WriteRPS,
|
|
UpdatedAt: s.UpdatedAt,
|
|
}
|
|
}
|
|
|
|
func (r statsRepository) Upsert(ctx context.Context, stats entities.DeviceStatistics) error {
|
|
err := r.q.UpsertDeviceMetrics(ctx, queries.UpsertDeviceMetricsParams{
|
|
DeviceID: string(stats.ID),
|
|
IncTraffic: int32(stats.IncomingTrafficBytes),
|
|
OutTraffic: int32(stats.OutgoingTrafficBytes),
|
|
IncRps: int32(stats.IncomingRPS),
|
|
WriteRps: int32(stats.WriteRPS),
|
|
ReadRps: int32(stats.ReadRPS),
|
|
})
|
|
if err != nil {
|
|
return fmt.Errorf("upserting device metrics: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r statsRepository) List(ctx context.Context) (out []entities.DeviceStatistics, err error) {
|
|
stats, err := r.q.ListDeviceStats(ctx)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("listing device stats: %w", err)
|
|
}
|
|
|
|
out = make([]entities.DeviceStatistics, len(stats))
|
|
|
|
for i, stat := range stats {
|
|
out[i] = entities.DeviceStatistics{
|
|
IncomingTrafficBytes: int(stat.IncTraffic),
|
|
OutgoingTrafficBytes: int(stat.OutTraffic),
|
|
IncomingRPS: int(stat.IncRps),
|
|
WriteRPS: int(stat.WriteRps),
|
|
ReadRPS: int(stat.ReadRps),
|
|
UpdatedAt: stat.UpdatedAt.Time,
|
|
}
|
|
}
|
|
|
|
return out, nil
|
|
}
|