sycnapi stats queries

This commit is contained in:
Till Faelligen 2022-03-02 16:13:46 +01:00
parent 9897a6e186
commit 2747c9eae2
8 changed files with 85 additions and 17 deletions

View file

@ -141,4 +141,12 @@ type Database interface {
SelectContextEvent(ctx context.Context, roomID, eventID string) (int, gomatrixserverlib.HeaderedEvent, error) SelectContextEvent(ctx context.Context, roomID, eventID string) (int, gomatrixserverlib.HeaderedEvent, error)
SelectContextBeforeEvent(ctx context.Context, id int, roomID string, filter *gomatrixserverlib.RoomEventFilter) ([]*gomatrixserverlib.HeaderedEvent, error) SelectContextBeforeEvent(ctx context.Context, id int, roomID string, filter *gomatrixserverlib.RoomEventFilter) ([]*gomatrixserverlib.HeaderedEvent, error)
SelectContextAfterEvent(ctx context.Context, id int, roomID string, filter *gomatrixserverlib.RoomEventFilter) (int, []*gomatrixserverlib.HeaderedEvent, error) SelectContextAfterEvent(ctx context.Context, id int, roomID string, filter *gomatrixserverlib.RoomEventFilter) (int, []*gomatrixserverlib.HeaderedEvent, error)
DailyE2EEMessages(ctx context.Context, prevID int64) (result int64, err error)
DailySentE2EEMessages(ctx context.Context, prevID int64) (result int64, err error)
DailyMessages(ctx context.Context, prevID int64) (result int64, err error)
DailySentMessages(ctx context.Context, prevID int64) (result int64, err error)
DailyActiveE2EERooms(ctx context.Context, prevID int64) (result int64, err error)
DailyActiveRooms(ctx context.Context, prevID int64) (result int64, err error)
TotalRooms(ctx context.Context) (result int64, err error)
} }

View file

@ -21,29 +21,35 @@ import (
"github.com/matrix-org/dendrite/internal/sqlutil" "github.com/matrix-org/dendrite/internal/sqlutil"
"github.com/matrix-org/dendrite/syncapi/storage/tables" "github.com/matrix-org/dendrite/syncapi/storage/tables"
"github.com/matrix-org/gomatrixserverlib"
) )
const countEventTypesSQL = ""+ const countEventTypesSQL = "" +
"SELECT COUNT(*) FROM syncapi_output_room_events"+ "SELECT COUNT(*) FROM syncapi_output_room_events" +
" WHERE type = $1 AND id > $2 AND sender like $3" " WHERE type = $1 AND id > $2 AND sender like $3"
const countActiveRoomsSQL = ""+ const countActiveRoomsSQL = "" +
"SELECT COUNT(DISTINCT room_id) FROM syncapi_output_room_events"+ "SELECT COUNT(DISTINCT room_id) FROM syncapi_output_room_events" +
" WHERE type = $1 AND id > $2" " WHERE type = $1 AND id > $2"
const countTotalRoomsSQL = "" +
"SELECT COUNT(DISTINCT room_id) FROM syncapi_output_room_events"
type statsStatements struct { type statsStatements struct {
serverName string serverName gomatrixserverlib.ServerName
countTypesStmt *sql.Stmt countTypesStmt *sql.Stmt
countActiveRoomsStmt *sql.Stmt countActiveRoomsStmt *sql.Stmt
countTotalRoomsStmt *sql.Stmt
} }
func PrepareStats(db *sql.DB, serverName string) (tables.Stats, error) { func PrepareStats(db *sql.DB, serverName gomatrixserverlib.ServerName) (tables.Stats, error) {
s := &statsStatements{ s := &statsStatements{
serverName: serverName, serverName: serverName,
} }
return s, sqlutil.StatementList{ return s, sqlutil.StatementList{
{&s.countTypesStmt, countEventTypesSQL}, {&s.countTypesStmt, countEventTypesSQL},
{&s.countActiveRoomsStmt, countActiveRoomsSQL}, {&s.countActiveRoomsStmt, countActiveRoomsSQL},
{&s.countTotalRoomsStmt, countTotalRoomsSQL},
}.Prepare(db) }.Prepare(db)
} }
@ -103,3 +109,9 @@ func (s *statsStatements) DailyActiveRooms(ctx context.Context, txn *sql.Tx, pre
).Scan(&result) ).Scan(&result)
return return
} }
func (s *statsStatements) TotalRooms(ctx context.Context, txn *sql.Tx) (result int64, err error) {
stmt := sqlutil.TxStmt(txn, s.countTotalRoomsStmt)
err = stmt.QueryRowContext(ctx).Scan(&result)
return
}

View file

@ -24,6 +24,7 @@ import (
"github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/syncapi/storage/postgres/deltas" "github.com/matrix-org/dendrite/syncapi/storage/postgres/deltas"
"github.com/matrix-org/dendrite/syncapi/storage/shared" "github.com/matrix-org/dendrite/syncapi/storage/shared"
"github.com/matrix-org/gomatrixserverlib"
) )
// SyncServerDatasource represents a sync server datasource which manages // SyncServerDatasource represents a sync server datasource which manages
@ -33,11 +34,12 @@ type SyncServerDatasource struct {
db *sql.DB db *sql.DB
writer sqlutil.Writer writer sqlutil.Writer
sqlutil.PartitionOffsetStatements sqlutil.PartitionOffsetStatements
serverName gomatrixserverlib.ServerName
} }
// NewDatabase creates a new sync server database // NewDatabase creates a new sync server database
func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, error) { func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (*SyncServerDatasource, error) {
var d SyncServerDatasource d := SyncServerDatasource{serverName: serverName}
var err error var err error
if d.db, err = sqlutil.Open(dbProperties); err != nil { if d.db, err = sqlutil.Open(dbProperties); err != nil {
return nil, err return nil, err
@ -90,6 +92,10 @@ func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, e
if err != nil { if err != nil {
return nil, err return nil, err
} }
stats, err := PrepareStats(d.db, d.serverName)
if err != nil {
return nil, err
}
m := sqlutil.NewMigrations() m := sqlutil.NewMigrations()
deltas.LoadFixSequences(m) deltas.LoadFixSequences(m)
deltas.LoadRemoveSendToDeviceSentColumn(m) deltas.LoadRemoveSendToDeviceSentColumn(m)
@ -110,6 +116,7 @@ func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, e
SendToDevice: sendToDevice, SendToDevice: sendToDevice,
Receipts: receipts, Receipts: receipts,
Memberships: memberships, Memberships: memberships,
Stats: stats,
} }
return &d, nil return &d, nil
} }

View file

@ -48,6 +48,7 @@ type Database struct {
Filter tables.Filter Filter tables.Filter
Receipts tables.Receipts Receipts tables.Receipts
Memberships tables.Memberships Memberships tables.Memberships
Stats tables.Stats
} }
func (d *Database) readOnlySnapshot(ctx context.Context) (*sql.Tx, error) { func (d *Database) readOnlySnapshot(ctx context.Context) (*sql.Tx, error) {
@ -966,3 +967,25 @@ func (s *Database) SelectContextBeforeEvent(ctx context.Context, id int, roomID
func (s *Database) SelectContextAfterEvent(ctx context.Context, id int, roomID string, filter *gomatrixserverlib.RoomEventFilter) (int, []*gomatrixserverlib.HeaderedEvent, error) { func (s *Database) SelectContextAfterEvent(ctx context.Context, id int, roomID string, filter *gomatrixserverlib.RoomEventFilter) (int, []*gomatrixserverlib.HeaderedEvent, error) {
return s.OutputEvents.SelectContextAfterEvent(ctx, nil, id, roomID, filter) return s.OutputEvents.SelectContextAfterEvent(ctx, nil, id, roomID, filter)
} }
func (s *Database) DailyE2EEMessages(ctx context.Context, prevID int64) (result int64, err error) {
return s.Stats.DailyE2EEMessages(ctx, nil, prevID)
}
func (s *Database) DailySentE2EEMessages(ctx context.Context, prevID int64) (result int64, err error) {
return s.Stats.DailySentE2EEMessages(ctx, nil, prevID)
}
func (s *Database) DailyMessages(ctx context.Context, prevID int64) (result int64, err error) {
return s.Stats.DailyMessages(ctx, nil, prevID)
}
func (s *Database) DailySentMessages(ctx context.Context, prevID int64) (result int64, err error) {
return s.Stats.DailySentMessages(ctx, nil, prevID)
}
func (s *Database) DailyActiveE2EERooms(ctx context.Context, prevID int64) (result int64, err error) {
return s.Stats.DailyActiveE2EERooms(ctx, nil, prevID)
}
func (s *Database) DailyActiveRooms(ctx context.Context, prevID int64) (result int64, err error) {
return s.Stats.DailyActiveRooms(ctx, nil, prevID)
}
func (s *Database) TotalRooms(ctx context.Context) (result int64, err error) {
return s.Stats.TotalRooms(ctx, nil)
}

View file

@ -22,6 +22,7 @@ import (
"github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/syncapi/storage/shared" "github.com/matrix-org/dendrite/syncapi/storage/shared"
"github.com/matrix-org/dendrite/syncapi/storage/sqlite3/deltas" "github.com/matrix-org/dendrite/syncapi/storage/sqlite3/deltas"
"github.com/matrix-org/gomatrixserverlib"
) )
// SyncServerDatasource represents a sync server datasource which manages // SyncServerDatasource represents a sync server datasource which manages
@ -32,12 +33,13 @@ type SyncServerDatasource struct {
writer sqlutil.Writer writer sqlutil.Writer
sqlutil.PartitionOffsetStatements sqlutil.PartitionOffsetStatements
streamID streamIDStatements streamID streamIDStatements
serverName gomatrixserverlib.ServerName
} }
// NewDatabase creates a new sync server database // NewDatabase creates a new sync server database
// nolint: gocyclo // nolint: gocyclo
func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, error) { func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (*SyncServerDatasource, error) {
var d SyncServerDatasource d := SyncServerDatasource{serverName: serverName}
var err error var err error
if d.db, err = sqlutil.Open(dbProperties); err != nil { if d.db, err = sqlutil.Open(dbProperties); err != nil {
return nil, err return nil, err
@ -100,6 +102,12 @@ func (d *SyncServerDatasource) prepare(dbProperties *config.DatabaseOptions) (er
if err != nil { if err != nil {
return err return err
} }
stats, err := PrepareStats(d.db, d.serverName)
if err != nil {
return err
}
m := sqlutil.NewMigrations() m := sqlutil.NewMigrations()
deltas.LoadFixSequences(m) deltas.LoadFixSequences(m)
deltas.LoadRemoveSendToDeviceSentColumn(m) deltas.LoadRemoveSendToDeviceSentColumn(m)
@ -120,6 +128,7 @@ func (d *SyncServerDatasource) prepare(dbProperties *config.DatabaseOptions) (er
SendToDevice: sendToDevice, SendToDevice: sendToDevice,
Receipts: receipts, Receipts: receipts,
Memberships: memberships, Memberships: memberships,
Stats: stats,
} }
return nil return nil
} }

View file

@ -23,15 +23,16 @@ import (
"github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/syncapi/storage/postgres" "github.com/matrix-org/dendrite/syncapi/storage/postgres"
"github.com/matrix-org/dendrite/syncapi/storage/sqlite3" "github.com/matrix-org/dendrite/syncapi/storage/sqlite3"
"github.com/matrix-org/gomatrixserverlib"
) )
// NewSyncServerDatasource opens a database connection. // NewSyncServerDatasource opens a database connection.
func NewSyncServerDatasource(dbProperties *config.DatabaseOptions) (Database, error) { func NewSyncServerDatasource(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (Database, error) {
switch { switch {
case dbProperties.ConnectionString.IsSQLite(): case dbProperties.ConnectionString.IsSQLite():
return sqlite3.NewDatabase(dbProperties) return sqlite3.NewDatabase(dbProperties, serverName)
case dbProperties.ConnectionString.IsPostgres(): case dbProperties.ConnectionString.IsPostgres():
return postgres.NewDatabase(dbProperties) return postgres.NewDatabase(dbProperties, serverName)
default: default:
return nil, fmt.Errorf("unexpected database type") return nil, fmt.Errorf("unexpected database type")
} }

View file

@ -19,13 +19,14 @@ import (
"github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/setup/config"
"github.com/matrix-org/dendrite/syncapi/storage/sqlite3" "github.com/matrix-org/dendrite/syncapi/storage/sqlite3"
"github.com/matrix-org/gomatrixserverlib"
) )
// NewPublicRoomsServerDatabase opens a database connection. // NewPublicRoomsServerDatabase opens a database connection.
func NewSyncServerDatasource(dbProperties *config.DatabaseOptions) (Database, error) { func NewSyncServerDatasource(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (Database, error) {
switch { switch {
case dbProperties.ConnectionString.IsSQLite(): case dbProperties.ConnectionString.IsSQLite():
return sqlite3.NewDatabase(dbProperties) return sqlite3.NewDatabase(dbProperties, serverName)
case dbProperties.ConnectionString.IsPostgres(): case dbProperties.ConnectionString.IsPostgres():
return nil, fmt.Errorf("can't use Postgres implementation") return nil, fmt.Errorf("can't use Postgres implementation")
default: default:

View file

@ -173,4 +173,11 @@ type Memberships interface {
} }
type Stats interface { type Stats interface {
DailyE2EEMessages(ctx context.Context, txn *sql.Tx, prevID int64) (result int64, err error)
DailySentE2EEMessages(ctx context.Context, txn *sql.Tx, prevID int64) (result int64, err error)
DailyMessages(ctx context.Context, txn *sql.Tx, prevID int64) (result int64, err error)
DailySentMessages(ctx context.Context, txn *sql.Tx, prevID int64) (result int64, err error)
DailyActiveE2EERooms(ctx context.Context, txn *sql.Tx, prevID int64) (result int64, err error)
DailyActiveRooms(ctx context.Context, txn *sql.Tx, prevID int64) (result int64, err error)
TotalRooms(ctx context.Context, txn *sql.Tx) (result int64, err error)
} }