diff --git a/syncapi/storage/interface.go b/syncapi/storage/interface.go index 126bc8658..49ce7ddc6 100644 --- a/syncapi/storage/interface.go +++ b/syncapi/storage/interface.go @@ -141,4 +141,12 @@ type Database interface { 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) 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) } diff --git a/syncapi/storage/postgres/stats.go b/syncapi/storage/postgres/stats.go index a18b776da..04ebd0a8f 100644 --- a/syncapi/storage/postgres/stats.go +++ b/syncapi/storage/postgres/stats.go @@ -21,29 +21,35 @@ import ( "github.com/matrix-org/dendrite/internal/sqlutil" "github.com/matrix-org/dendrite/syncapi/storage/tables" + "github.com/matrix-org/gomatrixserverlib" ) -const countEventTypesSQL = ""+ - "SELECT COUNT(*) FROM syncapi_output_room_events"+ +const countEventTypesSQL = "" + + "SELECT COUNT(*) FROM syncapi_output_room_events" + " WHERE type = $1 AND id > $2 AND sender like $3" -const countActiveRoomsSQL = ""+ - "SELECT COUNT(DISTINCT room_id) FROM syncapi_output_room_events"+ +const countActiveRoomsSQL = "" + + "SELECT COUNT(DISTINCT room_id) FROM syncapi_output_room_events" + " WHERE type = $1 AND id > $2" +const countTotalRoomsSQL = "" + + "SELECT COUNT(DISTINCT room_id) FROM syncapi_output_room_events" + type statsStatements struct { - serverName string - countTypesStmt *sql.Stmt + serverName gomatrixserverlib.ServerName + countTypesStmt *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{ serverName: serverName, } return s, sqlutil.StatementList{ {&s.countTypesStmt, countEventTypesSQL}, {&s.countActiveRoomsStmt, countActiveRoomsSQL}, + {&s.countTotalRoomsStmt, countTotalRoomsSQL}, }.Prepare(db) } @@ -102,4 +108,10 @@ func (s *statsStatements) DailyActiveRooms(ctx context.Context, txn *sql.Tx, pre prevID, ).Scan(&result) 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 } \ No newline at end of file diff --git a/syncapi/storage/postgres/syncserver.go b/syncapi/storage/postgres/syncserver.go index 6f4e7749d..dfb8e7ef2 100644 --- a/syncapi/storage/postgres/syncserver.go +++ b/syncapi/storage/postgres/syncserver.go @@ -24,6 +24,7 @@ import ( "github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/syncapi/storage/postgres/deltas" "github.com/matrix-org/dendrite/syncapi/storage/shared" + "github.com/matrix-org/gomatrixserverlib" ) // SyncServerDatasource represents a sync server datasource which manages @@ -33,11 +34,12 @@ type SyncServerDatasource struct { db *sql.DB writer sqlutil.Writer sqlutil.PartitionOffsetStatements + serverName gomatrixserverlib.ServerName } // NewDatabase creates a new sync server database -func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, error) { - var d SyncServerDatasource +func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (*SyncServerDatasource, error) { + d := SyncServerDatasource{serverName: serverName} var err error if d.db, err = sqlutil.Open(dbProperties); err != nil { return nil, err @@ -90,6 +92,10 @@ func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, e if err != nil { return nil, err } + stats, err := PrepareStats(d.db, d.serverName) + if err != nil { + return nil, err + } m := sqlutil.NewMigrations() deltas.LoadFixSequences(m) deltas.LoadRemoveSendToDeviceSentColumn(m) @@ -110,6 +116,7 @@ func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, e SendToDevice: sendToDevice, Receipts: receipts, Memberships: memberships, + Stats: stats, } return &d, nil } diff --git a/syncapi/storage/shared/syncserver.go b/syncapi/storage/shared/syncserver.go index 819851b33..34e24f6cc 100644 --- a/syncapi/storage/shared/syncserver.go +++ b/syncapi/storage/shared/syncserver.go @@ -48,6 +48,7 @@ type Database struct { Filter tables.Filter Receipts tables.Receipts Memberships tables.Memberships + Stats tables.Stats } 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) { 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) +} \ No newline at end of file diff --git a/syncapi/storage/sqlite3/syncserver.go b/syncapi/storage/sqlite3/syncserver.go index 706d43f81..8877fb1bc 100644 --- a/syncapi/storage/sqlite3/syncserver.go +++ b/syncapi/storage/sqlite3/syncserver.go @@ -22,6 +22,7 @@ import ( "github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/syncapi/storage/shared" "github.com/matrix-org/dendrite/syncapi/storage/sqlite3/deltas" + "github.com/matrix-org/gomatrixserverlib" ) // SyncServerDatasource represents a sync server datasource which manages @@ -31,13 +32,14 @@ type SyncServerDatasource struct { db *sql.DB writer sqlutil.Writer sqlutil.PartitionOffsetStatements - streamID streamIDStatements + streamID streamIDStatements + serverName gomatrixserverlib.ServerName } // NewDatabase creates a new sync server database // nolint: gocyclo -func NewDatabase(dbProperties *config.DatabaseOptions) (*SyncServerDatasource, error) { - var d SyncServerDatasource +func NewDatabase(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (*SyncServerDatasource, error) { + d := SyncServerDatasource{serverName: serverName} var err error if d.db, err = sqlutil.Open(dbProperties); err != nil { return nil, err @@ -100,6 +102,12 @@ func (d *SyncServerDatasource) prepare(dbProperties *config.DatabaseOptions) (er if err != nil { return err } + + stats, err := PrepareStats(d.db, d.serverName) + if err != nil { + return err + } + m := sqlutil.NewMigrations() deltas.LoadFixSequences(m) deltas.LoadRemoveSendToDeviceSentColumn(m) @@ -120,6 +128,7 @@ func (d *SyncServerDatasource) prepare(dbProperties *config.DatabaseOptions) (er SendToDevice: sendToDevice, Receipts: receipts, Memberships: memberships, + Stats: stats, } return nil } diff --git a/syncapi/storage/storage.go b/syncapi/storage/storage.go index 7f9c28e9d..b61c64aad 100644 --- a/syncapi/storage/storage.go +++ b/syncapi/storage/storage.go @@ -23,15 +23,16 @@ import ( "github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/syncapi/storage/postgres" "github.com/matrix-org/dendrite/syncapi/storage/sqlite3" + "github.com/matrix-org/gomatrixserverlib" ) // NewSyncServerDatasource opens a database connection. -func NewSyncServerDatasource(dbProperties *config.DatabaseOptions) (Database, error) { +func NewSyncServerDatasource(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (Database, error) { switch { case dbProperties.ConnectionString.IsSQLite(): - return sqlite3.NewDatabase(dbProperties) + return sqlite3.NewDatabase(dbProperties, serverName) case dbProperties.ConnectionString.IsPostgres(): - return postgres.NewDatabase(dbProperties) + return postgres.NewDatabase(dbProperties, serverName) default: return nil, fmt.Errorf("unexpected database type") } diff --git a/syncapi/storage/storage_wasm.go b/syncapi/storage/storage_wasm.go index f7fef962b..90ce4c862 100644 --- a/syncapi/storage/storage_wasm.go +++ b/syncapi/storage/storage_wasm.go @@ -19,13 +19,14 @@ import ( "github.com/matrix-org/dendrite/setup/config" "github.com/matrix-org/dendrite/syncapi/storage/sqlite3" + "github.com/matrix-org/gomatrixserverlib" ) // NewPublicRoomsServerDatabase opens a database connection. -func NewSyncServerDatasource(dbProperties *config.DatabaseOptions) (Database, error) { +func NewSyncServerDatasource(dbProperties *config.DatabaseOptions, serverName gomatrixserverlib.ServerName) (Database, error) { switch { case dbProperties.ConnectionString.IsSQLite(): - return sqlite3.NewDatabase(dbProperties) + return sqlite3.NewDatabase(dbProperties, serverName) case dbProperties.ConnectionString.IsPostgres(): return nil, fmt.Errorf("can't use Postgres implementation") default: diff --git a/syncapi/storage/tables/interface.go b/syncapi/storage/tables/interface.go index 2c3cbf82f..ef383fc42 100644 --- a/syncapi/storage/tables/interface.go +++ b/syncapi/storage/tables/interface.go @@ -173,4 +173,11 @@ type Memberships 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) } \ No newline at end of file