diff options
Diffstat (limited to 'internal/praefect/router.go')
-rw-r--r-- | internal/praefect/router.go | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/internal/praefect/router.go b/internal/praefect/router.go index da9dbd36f..139bd62f9 100644 --- a/internal/praefect/router.go +++ b/internal/praefect/router.go @@ -3,9 +3,32 @@ package praefect import ( "context" + "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus/ctxlogrus" + "github.com/sirupsen/logrus" "google.golang.org/grpc" ) +const ( + logFieldRepositoryID = "repository_id" + logFieldReplicaPath = "replica_path" + logFieldAdditionalReplicaPath = "additional_replica_path" + logFieldPrimary = "primary" + logFieldSecondaries = "secondaries" + logFieldStorage = "storage" +) + +func addRouteLogField(ctx context.Context, fields logrus.Fields) { + ctxlogrus.AddFields(ctx, logrus.Fields{"route": fields}) +} + +func routerNodeStorages(secondaries []RouterNode) []string { + storages := make([]string, len(secondaries)) + for i := range secondaries { + storages[i] = secondaries[i].Storage + } + return storages +} + // RepositoryAccessorRoute describes how to route a repository scoped accessor call. type RepositoryAccessorRoute struct { // ReplicaPath is the disk path where the replicas are stored. @@ -14,6 +37,13 @@ type RepositoryAccessorRoute struct { Node RouterNode } +func (r RepositoryAccessorRoute) addLogFields(ctx context.Context) { + addRouteLogField(ctx, logrus.Fields{ + logFieldReplicaPath: r.ReplicaPath, + logFieldStorage: r.Node.Storage, + }) +} + // RouterNode is a subset of a node's configuration needed to perform // request routing. type RouterNode struct { @@ -23,6 +53,12 @@ type RouterNode struct { Connection *grpc.ClientConn } +func (r RouterNode) addLogFields(ctx context.Context) { + addRouteLogField(ctx, logrus.Fields{ + logFieldStorage: r.Storage, + }) +} + // StorageMutatorRoute describes how to route a storage scoped mutator call. type StorageMutatorRoute struct { // Primary is the primary node of the routing decision. @@ -31,6 +67,13 @@ type StorageMutatorRoute struct { Secondaries []RouterNode } +func (r StorageMutatorRoute) addLogFields(ctx context.Context) { + addRouteLogField(ctx, logrus.Fields{ + logFieldPrimary: r.Primary, + logFieldSecondaries: routerNodeStorages(r.Secondaries), + }) +} + // RepositoryMutatorRoute describes how to route a repository scoped mutator call. type RepositoryMutatorRoute struct { // RepositoryID is the repository's ID as Praefect identifies it. @@ -49,6 +92,17 @@ type RepositoryMutatorRoute struct { ReplicationTargets []string } +func (r RepositoryMutatorRoute) addLogFields(ctx context.Context) { + addRouteLogField(ctx, logrus.Fields{ + logFieldRepositoryID: r.RepositoryID, + logFieldReplicaPath: r.ReplicaPath, + logFieldAdditionalReplicaPath: r.AdditionalReplicaPath, + logFieldPrimary: r.Primary, + logFieldSecondaries: routerNodeStorages(r.Secondaries), + "replication_targets": r.ReplicationTargets, + }) +} + // RepositoryMaintenanceRoute describes how to route a repository scoped maintenance call. type RepositoryMaintenanceRoute struct { // RepositoryID is the repository's ID as Praefect identifies it. @@ -59,6 +113,14 @@ type RepositoryMaintenanceRoute struct { Nodes []RouterNode } +func (r RepositoryMaintenanceRoute) addLogFields(ctx context.Context) { + addRouteLogField(ctx, logrus.Fields{ + logFieldRepositoryID: r.RepositoryID, + logFieldReplicaPath: r.ReplicaPath, + "storages": routerNodeStorages(r.Nodes), + }) +} + // Router decides which nodes to direct accessor and mutator RPCs to. type Router interface { // RouteStorageAccessor returns the node which should serve the storage accessor request. |