Jose Mourinho celebrated a year in charge of Spurs with a second straight win over old rival Guardiola, who was hoping to mark his new contract with a positive result but has now lost all three of his games at Tottenham Hotspur Stadium.
Son converted a Tanguy Ndombele pass after five minutes on Sunday (AEDT) and Mourinho's men, who spent much of the intervening time on the back foot, sealed the triumph when Lo Celso beat Ederson with 25 minutes remaining.
Aymeric Laporte had a first-half goal ruled out for City and it is now eight points behind Spurs, which ended Chelsea's brief stint at the top of the table after is win over Newcastle United.
Spurs made an excellent start when a lofted ball from Ndombele found Son, who beat the offside trap and took one touch with his right foot before sending a cool finish with his left through the legs of an on-rushing Ederson.
Harry Kane had the ball in the net after a superb move involving Son, only to be denied by an offside flag.
Aside from those incidents, City controlled proceedings with Ferran Torres, Rodri and Ruben Dias all forcing routine saves from Spurs goalkeeper Hugo Lloris.
The visitors thought they had levelled the contest after 27 minutes when Laporte fired in, only for referee Mike Dean to overturn the goal after viewing the monitor, having found Gabriel Jesus handled Rodri's cross before passing to the defender.
City continued to probe without creating a notable opportunity before a swift Spurs counter-attack saw Kane thread a pass through to Lo Celso, the substitute hitting a fine left-footed finish beyond Ederson just 35 seconds after replacing Ndombele.
Guardiola threw on England duo Phil Foden and Raheem Sterling with 18 minutes left but Lloris saved from Dias late on as Spurs held on for a memorable victory by the same scoreline as they won this fixture in February.