Match ends, Manchester City 1, Chelsea 2.
Sergio Aguero made a mess of a Panenka penalty as Chelsea ensured Manchester City must wait a little longer to wrap up the Premier League title by fighting back to earn a dramatic win at Etihad Stadium.
City, needing three points to become champions of England for the seventh time, took the lead just before half-time through Raheem Sterling's close-range strike.
Aguero had a glorious chance to make it 2-0 from the spot moments later when Billy Gilmour fouled Gabriel Jesus, but the Argentina striker opted for a dinked effort that was easily saved by Edouard Mendy.
It proved a costly miss, as Chelsea improved after the break and equalised when Cesar Azpilicueta set up Hakim Ziyech to fire home from the edge of the area.
The visitors had two more efforts ruled out for offside before Marcus Alonso won it for them in injury time, meeting Timo Werner's pull-back and sending the ball looping over Ederson.
This was Chelsea's second win over City in the space of three weeks, following their victory in the FA Cup semi-final at Wembley in April.
The two sides will meet again in the Champions League final in Istanbul at the end of this month.
This result can only give Chelsea extra confidence for that game, as well as providing a big boost to their hopes of a top-four finish, but in truth this encounter offered few clues to how their next meeting will be decided.
Both managers made numerous changes to the sides they put out for their respective Champions League semi-final second-leg matches in midweek - City boss Pep Guardiola made nine to the side that beat Paris St-Germain here on Tuesday, while his Chelsea counterpart Thomas Tuchel made five to the team that defeated Real Madrid on Wednesday - and the result was a disjointed performance from both sides.
No celebrations for City this time
Hundreds of City fans had gathered before kick-off to greet their players with fireworks and flares when they arrived at the stadium but their plans to celebrate a third title in four seasons in the same way are on hold after this result.
They could still be crowned champions before they play their next game, at Newcastle on Friday, if Manchester United drop three points over their next three matches in the next five days - but three United wins would reduce City's lead at the top to four points.
Even with the title so close, Guardiola was expected to make changes to his line-up after the PSG game, but he also tinkered with his team's formation and playing style.
Instead of their usual 4-3-3, and trademark patient passing and possession-based game, City lined up in a strange 5-1-3-1 formation and tried to get the ball forward as quickly as possible.
They failed to spark until a breathless spell just before the break, when Sterling put them ahead and Aguero should have doubled their lead from the penalty spot.
Gabriel Jesus was involved in both incidents, first brushing Andreas Christensen off the ball and sending over a low cross that Aguero mis-controlled into the path of Sterling, who passed the ball into the net.
Soon after, with Christensen off the field receiving treatment, Gimour held back the Brazilian forward in the box to concede a penalty, and Aguero - City's record goalscorer, who is leaving the club at the end of the season after an illustrious decade in Manchester - stepped up, only to fluff his lines horribly.
Guardiola's frustration at that miss turned to fury in the second half, firstly when Chelsea equalised and then when his side were denied a second penalty with the score at 1-1 late on.
Sterling went down in the box after a clumsy challenge from Chelsea substitute Kurt Zouma, but referee Anthony Taylor waved play on.
Tuchel's Chelsea impress again
While City and their fans were left to wonder what might have been, Chelsea offered more evidence of the improvements they have made since Thomas Tuchel took charge at the start of the year.
The visitors visibly lacked imagination for the first hour or so, and seemed to be badly missing the creative nous of the absent Mason Mount in midfield, but they were well-organised, apart from that madcap spell before the break, and always in the game at 1-0 down.
They came to life in the second half, again demonstrating their threat to City on the break and could easily have had more than just two goals.
Timo Werner and Callum Hudson-Odoi both found the net at 1-1, only to be denied by the linesman's flag, in decisions that were a good deal tighter than when Werner's effort was ruled out for a clear offside early on.
It was an impressive all-round performance, that bodes well for Chelsea's attempts to win the FA Cup next weekend and secure a top-four finish before they can turn their focus to the Champions League final.
What next? City head to Newcastle
Chelsea host Arsenal on Wednesday (20:15 BST) while City will have another chance to wrap up the title when they travel to Newcastle on Friday (20:00 BST).
City's home woes continue - the stats
- Manchester City have dropped eight points from winning positions in home Premier League games this season, last dropping more at home in the competition in 2008-09 (12).
- Chelsea's Thomas Tuchel is the fifth manager to avoid defeat in each of their first eight away games in the Premier League after Kenny Dalglish, John Gregory, Felipe Scolari and Chris Wilder.
- After losing his first three managerial meetings with Pep Guardiola in all competitions, Chelsea boss Thomas Tuchel is unbeaten in his last four encounters with the Spaniard (W2 D2).
- Pep Guardiola has lost four home league games this season, twice as many as he'd lost in any other campaign in his managerial career.
- Manchester City have lost consecutive Premier League home games thanks to a goal scored in the 90th minute - as many as they had in their previous 235 Premier League games at the Etihad Stadium.
- At 91 minutes and 54 seconds, Marcos Alonso's winner was the latest winning goal scored in an away Premier League game against Manchester City since Paul Scholes for Man Utd in April 2010 (92:41).
- Manchester City have conceded at least twice in four consecutive top-flight home games for the first time since December 1978.
- 3Rúben Dias
- 21TorresSubstituted forGündoganat 71'minutes
- 7SterlingBooked at 12mins
- 22MendySubstituted forZinchenkoat 80'minutes
- 9Gabriel JesusBooked at 90mins
- 10AgüeroSubstituted forFodenat 70'minutes
- 20Bernardo Silva
- 4ChristensenSubstituted forZoumaat 45+3'minutes
- 7KantéSubstituted forJorginhoat 68'minutes
- 22ZiyechSubstituted forHudson-Odoiat 76'minutes
- Anthony Taylor
- Shots on Target
Second Half ends, Manchester City 1, Chelsea 2.
Goal! Manchester City 1, Chelsea 2. Marcos Alonso (Chelsea) right footed shot from the centre of the box to the top left corner. Assisted by Timo Werner.
Gabriel Jesus (Manchester City) is shown the yellow card for a bad foul.
Foul by Gabriel Jesus (Manchester City).
Christian Pulisic (Chelsea) wins a free kick on the left wing.
Corner, Chelsea. Conceded by Ederson.
Attempt saved. Marcos Alonso (Chelsea) left footed shot from the left side of the box is saved in the top left corner.
Attempt blocked. Ilkay Gündogan (Manchester City) right footed shot from the centre of the box is blocked. Assisted by Gabriel Jesus with a headed pass.
Attempt missed. Phil Foden (Manchester City) left footed shot from the centre of the box misses to the right. Assisted by Ilkay Gündogan with a cross.
Attempt missed. João Cancelo (Manchester City) left footed shot from the right side of the box is high and wide to the left. Assisted by Rodrigo.
Foul by Callum Hudson-Odoi (Chelsea).
Rúben Dias (Manchester City) wins a free kick in the defensive half.
Attempt blocked. Raheem Sterling (Manchester City) right footed shot from the right side of the box is blocked. Assisted by João Cancelo.
VAR Decision: No Goal Manchester City 1-1 Chelsea.
Offside, Chelsea. Reece James tries a through ball, but Callum Hudson-Odoi is caught offside.
Foul by Raheem Sterling (Manchester City).
César Azpilicueta (Chelsea) wins a free kick in the defensive half.
Substitution, Manchester City. Oleksandr Zinchenko replaces Benjamin Mendy.
Offside, Chelsea. Jorginho tries a through ball, but Timo Werner is caught offside.
- The Northern Bank Job: The biggest bank heist in British and Irish history is revisited
- Life Changing: What's it like to lose all your memories overnight?