A method comprising: monitoring one or more network performance metrics for a first path to a destination through a network and a second path to the destination through the network; storing historical performance data of the network performance metrics of the first path and the second path; receiving a data flow directed to the destination, the data flow subject to a network performance agreement based on at least one of the network performance metrics; determining whether the first path and the second path satisfy the network performance agreement; if one of the first path or the second path satisfies the network performance agreement, routing the data flow along that path; and if either: both the first path and the second path satisfy the network performance agreement, or if both the first path and the second path do not satisfy the network performance agreement: determining that a first aggregate historical performance is higher than a second aggregate historical performance, the first aggregate historical performance based on the stored historical performance data of the first path and the second aggregate historical performance based on the stored historical performance data of the second path; and based on the first aggregate historical performance being higher than the second aggregate historical performance, routing the data flow along the first path. monitoring one or more network performance metrics for a first path to a destination through a network and a second path to the destination through the network; storing historical performance data of the network performance metrics of the first path and the second path; receiving a data flow directed to the destination, the data flow subject to a network performance agreement based on at least one of the network performance metrics; determining whether the first path and the second path satisfy the network performance agreement; if one of the first path or the second path satisfies the network performance agreement, routing the data flow along that path; and if either: both the first path and the second path satisfy the network performance agreement, or if both the first path and the second path do not satisfy the network performance agreement: determining that a first aggregate historical performance is higher than a second aggregate historical performance, the first aggregate historical performance based on the stored historical performance data of the first path and the second aggregate historical performance based on the stored historical performance data of the second path; and based on the first aggregate historical performance being higher than the second aggregate historical performance, routing the data flow along the first path. determining that a first aggregate historical performance is higher than a second aggregate historical performance, the first aggregate historical performance based on the stored historical performance data of the first path and the second aggregate historical performance based on the stored historical performance data of the second path; and based on the first aggregate historical performance being higher than the second aggregate historical performance, routing the data flow along the first path.