Add tracing to user API
Use the trace version in tests so we can just implement the required API functions.
MODIFY
cmd/dendrite-monolith-server/main.go
cmd/dendrite-monolith-server/main.go
@@ -30,6 +30,7 @@ import (
"github.com/matrix-org/dendrite/setup/mscs"
"github.com/matrix-org/dendrite/signingkeyserver"
"github.com/matrix-org/dendrite/userapi"
+ uapi "github.com/matrix-org/dendrite/userapi/api"
"github.com/sirupsen/logrus"
_ "github.com/mattn/go-sqlite3"
@@ -114,6 +115,11 @@ func main() {
keyAPI := keyserver.NewInternalAPI(&base.Cfg.KeyServer, fsAPI)
userAPI := userapi.NewInternalAPI(accountDB, &cfg.UserAPI, cfg.Derived.ApplicationServices, keyAPI)
keyAPI.SetUserAPI(userAPI)
+ if traceInternal {
+ userAPI = &uapi.UserInternalAPITrace{
+ Impl: userAPI,
+ }
+ }
eduInputAPI := eduserver.NewInternalAPI(
base, cache.New(), userAPI,

MODIFY
federationapi/routing/send_test.go
federationapi/routing/send_test.go
@@ -158,32 +158,6 @@ func (t *testRoomserverAPI) QueryEventsByID(
return nil
}
-// Query the membership event for an user for a room.
-func (t *testRoomserverAPI) QueryMembershipForUser(
- ctx context.Context,
- request *api.QueryMembershipForUserRequest,
- response *api.QueryMembershipForUserResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-func (t *testRoomserverAPI) QueryPublishedRooms(
- ctx context.Context,
- request *api.QueryPublishedRoomsRequest,
- response *api.QueryPublishedRoomsResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Query a list of membership events for a room
-func (t *testRoomserverAPI) QueryMembershipsForRoom(
- ctx context.Context,
- request *api.QueryMembershipsForRoomRequest,
- response *api.QueryMembershipsForRoomResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
// Query if a server is joined to a room
func (t *testRoomserverAPI) QueryServerJoinedToRoom(
ctx context.Context,
@@ -195,53 +169,6 @@ func (t *testRoomserverAPI) QueryServerJoinedToRoom(
return nil
}
-// Query whether a server is allowed to see an event
-func (t *testRoomserverAPI) QueryServerAllowedToSeeEvent(
- ctx context.Context,
- request *api.QueryServerAllowedToSeeEventRequest,
- response *api.QueryServerAllowedToSeeEventResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Query missing events for a room from roomserver
-func (t *testRoomserverAPI) QueryMissingEvents(
- ctx context.Context,
- request *api.QueryMissingEventsRequest,
- response *api.QueryMissingEventsResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Query to get state and auth chain for a (potentially hypothetical) event.
-// Takes lists of PrevEventIDs and AuthEventsIDs and uses them to calculate
-// the state and auth chain to return.
-func (t *testRoomserverAPI) QueryStateAndAuthChain(
- ctx context.Context,
- request *api.QueryStateAndAuthChainRequest,
- response *api.QueryStateAndAuthChainResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Query a given amount (or less) of events prior to a given set of events.
-func (t *testRoomserverAPI) PerformBackfill(
- ctx context.Context,
- request *api.PerformBackfillRequest,
- response *api.PerformBackfillResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Asks for the default room version as preferred by the server.
-func (t *testRoomserverAPI) QueryRoomVersionCapabilities(
- ctx context.Context,
- request *api.QueryRoomVersionCapabilitiesRequest,
- response *api.QueryRoomVersionCapabilitiesResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
// Asks for the room version for a given room.
func (t *testRoomserverAPI) QueryRoomVersionForRoom(
ctx context.Context,
@@ -252,72 +179,10 @@ func (t *testRoomserverAPI) QueryRoomVersionForRoom(
return nil
}
-// Set a room alias
-func (t *testRoomserverAPI) SetRoomAlias(
- ctx context.Context,
- req *api.SetRoomAliasRequest,
- response *api.SetRoomAliasResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Get the room ID for an alias
-func (t *testRoomserverAPI) GetRoomIDForAlias(
- ctx context.Context,
- req *api.GetRoomIDForAliasRequest,
- response *api.GetRoomIDForAliasResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Get all known aliases for a room ID
-func (t *testRoomserverAPI) GetAliasesForRoomID(
- ctx context.Context,
- req *api.GetAliasesForRoomIDRequest,
- response *api.GetAliasesForRoomIDResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-// Get the user ID of the creator of an alias
-func (t *testRoomserverAPI) GetCreatorIDForAlias(
- ctx context.Context,
- req *api.GetCreatorIDForAliasRequest,
- response *api.GetCreatorIDForAliasResponse,
+func (t *testRoomserverAPI) QueryServerBannedFromRoom(
+ ctx context.Context, req *api.QueryServerBannedFromRoomRequest, res *api.QueryServerBannedFromRoomResponse,
) error {
- return fmt.Errorf("not implemented")
-}
-
-// Remove a room alias
-func (t *testRoomserverAPI) RemoveRoomAlias(
- ctx context.Context,
- req *api.RemoveRoomAliasRequest,
- response *api.RemoveRoomAliasResponse,
-) error {
- return fmt.Errorf("not implemented")
-}
-
-func (t *testRoomserverAPI) QueryCurrentState(ctx context.Context, req *api.QueryCurrentStateRequest, res *api.QueryCurrentStateResponse) error {
- return nil
-}
-
-func (t *testRoomserverAPI) QueryRoomsForUser(ctx context.Context, req *api.QueryRoomsForUserRequest, res *api.QueryRoomsForUserResponse) error {
- return fmt.Errorf("not implemented")
-}
-
-func (t *testRoomserverAPI) QueryBulkStateContent(ctx context.Context, req *api.QueryBulkStateContentRequest, res *api.QueryBulkStateContentResponse) error {
- return fmt.Errorf("not implemented")
-}
-
-func (t *testRoomserverAPI) QuerySharedUsers(ctx context.Context, req *api.QuerySharedUsersRequest, res *api.QuerySharedUsersResponse) error {
- return fmt.Errorf("not implemented")
-}
-
-func (t *testRoomserverAPI) QueryKnownUsers(ctx context.Context, req *api.QueryKnownUsersRequest, res *api.QueryKnownUsersResponse) error {
- return fmt.Errorf("not implemented")
-}
-
-func (t *testRoomserverAPI) QueryServerBannedFromRoom(ctx context.Context, req *api.QueryServerBannedFromRoomRequest, res *api.QueryServerBannedFromRoomResponse) error {
+ res.Banned = false
return nil
}

MODIFY
setup/mscs/msc2836/msc2836_test.go
setup/mscs/msc2836/msc2836_test.go
@@ -497,39 +497,10 @@ func assertUnsignedChildren(t *testing.T, ev gomatrixserverlib.ClientEvent, relT
}
type testUserAPI struct {
+ userapi.UserInternalAPITrace
accessTokens map[string]userapi.Device
}
-func (u *testUserAPI) InputAccountData(ctx context.Context, req *userapi.InputAccountDataRequest, res *userapi.InputAccountDataResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformAccountCreation(ctx context.Context, req *userapi.PerformAccountCreationRequest, res *userapi.PerformAccountCreationResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformPasswordUpdate(ctx context.Context, req *userapi.PerformPasswordUpdateRequest, res *userapi.PerformPasswordUpdateResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformDeviceCreation(ctx context.Context, req *userapi.PerformDeviceCreationRequest, res *userapi.PerformDeviceCreationResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformDeviceDeletion(ctx context.Context, req *userapi.PerformDeviceDeletionRequest, res *userapi.PerformDeviceDeletionResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformDeviceUpdate(ctx context.Context, req *userapi.PerformDeviceUpdateRequest, res *userapi.PerformDeviceUpdateResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformLastSeenUpdate(ctx context.Context, req *userapi.PerformLastSeenUpdateRequest, res *userapi.PerformLastSeenUpdateResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformAccountDeactivation(ctx context.Context, req *userapi.PerformAccountDeactivationRequest, res *userapi.PerformAccountDeactivationResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformOpenIDTokenCreation(ctx context.Context, req *userapi.PerformOpenIDTokenCreationRequest, res *userapi.PerformOpenIDTokenCreationResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryProfile(ctx context.Context, req *userapi.QueryProfileRequest, res *userapi.QueryProfileResponse) error {
- return nil
-}
func (u *testUserAPI) QueryAccessToken(ctx context.Context, req *userapi.QueryAccessTokenRequest, res *userapi.QueryAccessTokenResponse) error {
dev, ok := u.accessTokens[req.AccessToken]
if !ok {
@@ -539,25 +510,6 @@ func (u *testUserAPI) QueryAccessToken(ctx context.Context, req *userapi.QueryAc
res.Device = &dev
return nil
}
-func (u *testUserAPI) QueryDevices(ctx context.Context, req *userapi.QueryDevicesRequest, res *userapi.QueryDevicesResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryAccountData(ctx context.Context, req *userapi.QueryAccountDataRequest, res *userapi.QueryAccountDataResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryDeviceInfos(ctx context.Context, req *userapi.QueryDeviceInfosRequest, res *userapi.QueryDeviceInfosResponse) error {
- return nil
-}
-func (u *testUserAPI) QuerySearchProfiles(ctx context.Context, req *userapi.QuerySearchProfilesRequest, res *userapi.QuerySearchProfilesResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryOpenIDToken(ctx context.Context, req *userapi.QueryOpenIDTokenRequest, res *userapi.QueryOpenIDTokenResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformKeyBackup(ctx context.Context, req *userapi.PerformKeyBackupRequest, res *userapi.PerformKeyBackupResponse) {
-}
-func (u *testUserAPI) QueryKeyBackup(ctx context.Context, req *userapi.QueryKeyBackupRequest, res *userapi.QueryKeyBackupResponse) {
-}
type testRoomserverAPI struct {
// use a trace API as it implements method stubs so we don't need to have them here.

MODIFY
setup/mscs/msc2946/msc2946_test.go
setup/mscs/msc2946/msc2946_test.go
@@ -340,43 +340,10 @@ func postSpaces(t *testing.T, expectCode int, accessToken, roomID string, req *g
}
type testUserAPI struct {
+ userapi.UserInternalAPITrace
accessTokens map[string]userapi.Device
}
-func (u *testUserAPI) InputAccountData(ctx context.Context, req *userapi.InputAccountDataRequest, res *userapi.InputAccountDataResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformAccountCreation(ctx context.Context, req *userapi.PerformAccountCreationRequest, res *userapi.PerformAccountCreationResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformPasswordUpdate(ctx context.Context, req *userapi.PerformPasswordUpdateRequest, res *userapi.PerformPasswordUpdateResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformDeviceCreation(ctx context.Context, req *userapi.PerformDeviceCreationRequest, res *userapi.PerformDeviceCreationResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformDeviceDeletion(ctx context.Context, req *userapi.PerformDeviceDeletionRequest, res *userapi.PerformDeviceDeletionResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformDeviceUpdate(ctx context.Context, req *userapi.PerformDeviceUpdateRequest, res *userapi.PerformDeviceUpdateResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformLastSeenUpdate(ctx context.Context, req *userapi.PerformLastSeenUpdateRequest, res *userapi.PerformLastSeenUpdateResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformAccountDeactivation(ctx context.Context, req *userapi.PerformAccountDeactivationRequest, res *userapi.PerformAccountDeactivationResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformOpenIDTokenCreation(ctx context.Context, req *userapi.PerformOpenIDTokenCreationRequest, res *userapi.PerformOpenIDTokenCreationResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryProfile(ctx context.Context, req *userapi.QueryProfileRequest, res *userapi.QueryProfileResponse) error {
- return nil
-}
-func (u *testUserAPI) PerformKeyBackup(ctx context.Context, req *userapi.PerformKeyBackupRequest, res *userapi.PerformKeyBackupResponse) {
-}
-func (u *testUserAPI) QueryKeyBackup(ctx context.Context, req *userapi.QueryKeyBackupRequest, res *userapi.QueryKeyBackupResponse) {
-}
func (u *testUserAPI) QueryAccessToken(ctx context.Context, req *userapi.QueryAccessTokenRequest, res *userapi.QueryAccessTokenResponse) error {
dev, ok := u.accessTokens[req.AccessToken]
if !ok {
@@ -386,21 +353,6 @@ func (u *testUserAPI) QueryAccessToken(ctx context.Context, req *userapi.QueryAc
res.Device = &dev
return nil
}
-func (u *testUserAPI) QueryDevices(ctx context.Context, req *userapi.QueryDevicesRequest, res *userapi.QueryDevicesResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryAccountData(ctx context.Context, req *userapi.QueryAccountDataRequest, res *userapi.QueryAccountDataResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryDeviceInfos(ctx context.Context, req *userapi.QueryDeviceInfosRequest, res *userapi.QueryDeviceInfosResponse) error {
- return nil
-}
-func (u *testUserAPI) QuerySearchProfiles(ctx context.Context, req *userapi.QuerySearchProfilesRequest, res *userapi.QuerySearchProfilesResponse) error {
- return nil
-}
-func (u *testUserAPI) QueryOpenIDToken(ctx context.Context, req *userapi.QueryOpenIDTokenRequest, res *userapi.QueryOpenIDTokenResponse) error {
- return nil
-}
type testRoomserverAPI struct {
// use a trace API as it implements method stubs so we don't need to have them here.

ADD
userapi/api/api_trace.go
+// Copyright 2021 The Matrix.org Foundation C.I.C.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package api
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+
+ "github.com/matrix-org/util"
+)
+
+// UserInternalAPITrace wraps a RoomserverInternalAPI and logs the
+// complete request/response/error
+type UserInternalAPITrace struct {
+ Impl UserInternalAPI
+}
+
+func (t *UserInternalAPITrace) InputAccountData(ctx context.Context, req *InputAccountDataRequest, res *InputAccountDataResponse) error {
+ err := t.Impl.InputAccountData(ctx, req, res)
+ util.GetLogger(ctx).Infof("InputAccountData req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformAccountCreation(ctx context.Context, req *PerformAccountCreationRequest, res *PerformAccountCreationResponse) error {
+ err := t.Impl.PerformAccountCreation(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformAccountCreation req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformPasswordUpdate(ctx context.Context, req *PerformPasswordUpdateRequest, res *PerformPasswordUpdateResponse) error {
+ err := t.Impl.PerformPasswordUpdate(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformPasswordUpdate req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func (t *UserInternalAPITrace) PerformDeviceCreation(ctx context.Context, req *PerformDeviceCreationRequest, res *PerformDeviceCreationResponse) error {
+ err := t.Impl.PerformDeviceCreation(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformDeviceCreation req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformDeviceDeletion(ctx context.Context, req *PerformDeviceDeletionRequest, res *PerformDeviceDeletionResponse) error {
+ err := t.Impl.PerformDeviceDeletion(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformDeviceDeletion req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformLastSeenUpdate(ctx context.Context, req *PerformLastSeenUpdateRequest, res *PerformLastSeenUpdateResponse) error {
+ err := t.Impl.PerformLastSeenUpdate(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformLastSeenUpdate req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformDeviceUpdate(ctx context.Context, req *PerformDeviceUpdateRequest, res *PerformDeviceUpdateResponse) error {
+ err := t.Impl.PerformDeviceUpdate(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformDeviceUpdate req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformAccountDeactivation(ctx context.Context, req *PerformAccountDeactivationRequest, res *PerformAccountDeactivationResponse) error {
+ err := t.Impl.PerformAccountDeactivation(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformAccountDeactivation req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformOpenIDTokenCreation(ctx context.Context, req *PerformOpenIDTokenCreationRequest, res *PerformOpenIDTokenCreationResponse) error {
+ err := t.Impl.PerformOpenIDTokenCreation(ctx, req, res)
+ util.GetLogger(ctx).Infof("PerformOpenIDTokenCreation req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) PerformKeyBackup(ctx context.Context, req *PerformKeyBackupRequest, res *PerformKeyBackupResponse) {
+ t.Impl.PerformKeyBackup(ctx, req, res)
+}
+func (t *UserInternalAPITrace) QueryKeyBackup(ctx context.Context, req *QueryKeyBackupRequest, res *QueryKeyBackupResponse) {
+ t.Impl.QueryKeyBackup(ctx, req, res)
+}
+func (t *UserInternalAPITrace) QueryProfile(ctx context.Context, req *QueryProfileRequest, res *QueryProfileResponse) error {
+ err := t.Impl.QueryProfile(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryProfile req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) QueryAccessToken(ctx context.Context, req *QueryAccessTokenRequest, res *QueryAccessTokenResponse) error {
+ err := t.Impl.QueryAccessToken(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryAccessToken req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) QueryDevices(ctx context.Context, req *QueryDevicesRequest, res *QueryDevicesResponse) error {
+ err := t.Impl.QueryDevices(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryDevices req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) QueryAccountData(ctx context.Context, req *QueryAccountDataRequest, res *QueryAccountDataResponse) error {
+ err := t.Impl.QueryAccountData(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryAccountData req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) QueryDeviceInfos(ctx context.Context, req *QueryDeviceInfosRequest, res *QueryDeviceInfosResponse) error {
+ err := t.Impl.QueryDeviceInfos(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryDeviceInfos req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) QuerySearchProfiles(ctx context.Context, req *QuerySearchProfilesRequest, res *QuerySearchProfilesResponse) error {
+ err := t.Impl.QuerySearchProfiles(ctx, req, res)
+ util.GetLogger(ctx).Infof("QuerySearchProfiles req=%+v res=%+v", js(req), js(res))
+ return err
+}
+func (t *UserInternalAPITrace) QueryOpenIDToken(ctx context.Context, req *QueryOpenIDTokenRequest, res *QueryOpenIDTokenResponse) error {
+ err := t.Impl.QueryOpenIDToken(ctx, req, res)
+ util.GetLogger(ctx).Infof("QueryOpenIDToken req=%+v res=%+v", js(req), js(res))
+ return err
+}
+
+func js(thing interface{}) string {
+ b, err := json.Marshal(thing)
+ if err != nil {
+ return fmt.Sprintf("Marshal error:%s", err)
+ }
+ return string(b)
+}

Add tracing to user API (#1948)

Use the trace version in tests so we can just implement the required API functions.