model/postgres.go
Rama main · réplica de lectura del repositorio original.
package model
import (
"fmt"
"github.com/coroot/coroot/timeseries"
)
type PgConnectionKey struct {
Db string
User string
State string
Query string
WaitEventType string
}
func (k PgConnectionKey) String() string {
return fmt.Sprintf("%s@%s: %s", k.User, k.Db, k.Query)
}
type PgSetting struct {
Samples *timeseries.TimeSeries
Unit string
}
type QueryKey struct {
Db string
User string
Query string
}
func (k QueryKey) String() string {
return fmt.Sprintf("%s@%s: %s", k.User, k.Db, k.Query)
}
type QueryStat struct {
Calls *timeseries.TimeSeries
TotalTime *timeseries.TimeSeries
IoTime *timeseries.TimeSeries
}
type DbTableKey struct {
Db string
Table string
}
func (k DbTableKey) String() string {
return fmt.Sprintf("%s.%s", k.Db, k.Table)
}
type DbIndexKey struct {
Db string
Table string
Index string
}
func (k DbIndexKey) String() string {
return fmt.Sprintf("%s.%s", k.Table, k.Index)
}
type PgReplicationSlot struct {
Active LabelLastValue
WalStatus LabelLastValue
RetainedWal *timeseries.TimeSeries
}
type Postgres struct {
Up *timeseries.TimeSeries
Error LabelLastValue
Warning LabelLastValue
Version LabelLastValue
Connections map[PgConnectionKey]*timeseries.TimeSeries
AwaitingQueriesByLockingQuery map[QueryKey]*timeseries.TimeSeries
Settings map[string]PgSetting
PerQuery map[QueryKey]*QueryStat
QueriesByDB map[string]*timeseries.TimeSeries
Avg *timeseries.TimeSeries
P50 *timeseries.TimeSeries
P95 *timeseries.TimeSeries
P99 *timeseries.TimeSeries
WalCurrentLsn *timeseries.TimeSeries
WalThroughput *timeseries.TimeSeries
WalReceiveLsn *timeseries.TimeSeries
WalReplayLsn *timeseries.TimeSeries
WalReplayPaused *timeseries.TimeSeries
WalReceiverStatus *timeseries.TimeSeries
WalSize *timeseries.TimeSeries
WalArchivedSegments *timeseries.TimeSeries
WalArchiveFailures *timeseries.TimeSeries
WalArchivingStatus *timeseries.TimeSeries
ReplicationSlots map[string]*PgReplicationSlot
XidAge map[string]*timeseries.TimeSeries
MultixactAge map[string]*timeseries.TimeSeries
OldestXminAge map[string]*timeseries.TimeSeries
TransactionSeconds map[QueryKey]*timeseries.TimeSeries
CheckpointsScheduledByType map[string]*timeseries.TimeSeries
Checkpoints *timeseries.TimeSeries
Restartpoints *timeseries.TimeSeries
TimeSinceLastCheckpoint *timeseries.TimeSeries
WalSinceLastCheckpoint *timeseries.TimeSeries
BuffersWrittenBySource map[string]*timeseries.TimeSeries
DatabaseSize map[string]*timeseries.TimeSeries
TableSize map[DbTableKey]*timeseries.TimeSeries
TableSizeGrowth map[DbTableKey]*timeseries.TimeSeries
DatabaseTableBloat map[string]*timeseries.TimeSeries
DatabaseIndexBloat map[string]*timeseries.TimeSeries
TableBloat map[DbTableKey]*timeseries.TimeSeries
IndexBloat map[DbIndexKey]*timeseries.TimeSeries
TableDeadTupleBytes map[DbTableKey]*timeseries.TimeSeries
TableDeadTuples map[DbTableKey]*timeseries.TimeSeries
TableLiveTuples map[DbTableKey]*timeseries.TimeSeries
TableSecondsSinceAutovacuum map[DbTableKey]*timeseries.TimeSeries
TableVacuumInProgress map[DbTableKey]*timeseries.TimeSeries
TableVacuumThrottled map[DbTableKey]*timeseries.TimeSeries
TableModsSinceAnalyze map[DbTableKey]*timeseries.TimeSeries
TableReltuples map[DbTableKey]*timeseries.TimeSeries
TableSecondsSinceAnalyze map[DbTableKey]*timeseries.TimeSeries
TableSettings map[DbTableKey]map[string]float32
AutovacuumWorkers *timeseries.TimeSeries
}
func NewPostgres() *Postgres {
return &Postgres{
Connections: map[PgConnectionKey]*timeseries.TimeSeries{},
AwaitingQueriesByLockingQuery: map[QueryKey]*timeseries.TimeSeries{},
Settings: map[string]PgSetting{},
PerQuery: map[QueryKey]*QueryStat{},
QueriesByDB: map[string]*timeseries.TimeSeries{},
CheckpointsScheduledByType: map[string]*timeseries.TimeSeries{},
ReplicationSlots: map[string]*PgReplicationSlot{},
XidAge: map[string]*timeseries.TimeSeries{},
MultixactAge: map[string]*timeseries.TimeSeries{},
OldestXminAge: map[string]*timeseries.TimeSeries{},
TransactionSeconds: map[QueryKey]*timeseries.TimeSeries{},
BuffersWrittenBySource: map[string]*timeseries.TimeSeries{},
DatabaseSize: map[string]*timeseries.TimeSeries{},
TableSize: map[DbTableKey]*timeseries.TimeSeries{},
TableSizeGrowth: map[DbTableKey]*timeseries.TimeSeries{},
DatabaseTableBloat: map[string]*timeseries.TimeSeries{},
DatabaseIndexBloat: map[string]*timeseries.TimeSeries{},
TableBloat: map[DbTableKey]*timeseries.TimeSeries{},
IndexBloat: map[DbIndexKey]*timeseries.TimeSeries{},
TableDeadTupleBytes: map[DbTableKey]*timeseries.TimeSeries{},
TableDeadTuples: map[DbTableKey]*timeseries.TimeSeries{},
TableLiveTuples: map[DbTableKey]*timeseries.TimeSeries{},
TableSecondsSinceAutovacuum: map[DbTableKey]*timeseries.TimeSeries{},
TableVacuumInProgress: map[DbTableKey]*timeseries.TimeSeries{},
TableVacuumThrottled: map[DbTableKey]*timeseries.TimeSeries{},
TableModsSinceAnalyze: map[DbTableKey]*timeseries.TimeSeries{},
TableReltuples: map[DbTableKey]*timeseries.TimeSeries{},
TableSecondsSinceAnalyze: map[DbTableKey]*timeseries.TimeSeries{},
TableSettings: map[DbTableKey]map[string]float32{},
}
}
func (p *Postgres) IsUp() bool {
return p.Up.Last() > 0
}
func (p *Postgres) Unavailability() *timeseries.TimeSeries {
if p.Up.IsEmpty() {
return nil
}
return p.Up.Map(func(t timeseries.Time, v float32) float32 {
if v != 1 {
return 1
}
return 0
})
}