Pep Guardiola’s men are now 11 points clear at the top thanks to an 11-game winning run, but were made to toil until deep into stoppage time by the Gunners.
A 5-0 thrashing to City when the sides last met in August saw Arsenal off to their worst start to a league season in 67 years.
But Mikel Arteta’s men have rallied to rise to fourth in the table and showed why as they deservedly led at half-time through Bukayo Saka’s seventh goal of the season.
Riyad Mahrez levelled from the penalty spot before Gabriel Magalhaes stupidly got himself sent off for two quickfire bookings just before the hour mark.
And the 10 men just failed to hold out for a point when Rodri poked home from close range after Aymeric Laporte’s shot was blocked.
Plastic bottles rained down on the Spanish international as he celebrated with the Arsenal supporters furious as they voiced their frustration at the officiating after seeing a penalty appeal of their own waived away in the first half.
However, it was Gabriel’s indiscipline that cost his side the chance to extend a four-point cushion over the chasing pack for a place in next season’s Champions League.
Arteta was forced to watch the game from home after he tested positive for coronavirus for the second time earlier this week.
However, that did not disrupt the Gunners’ fine form as with assistant Albert Stuivenberg directing operations they ran the champions and runaway leaders ragged in the first half.
The first big decision to go against the home side came on 12 minutes when Martin Odegaard went down as he tried to round City goalkeeper Ederson.
The Brazilian was given the benefit of the doubt by the referee and VAR, but Ederson appeared to have gone through the Norwegian’s foot to get to the ball.
Martinelli’s missed chances
Gabriel Martinelli’s form has played a big part in Arsenal’s resurgence in recent weeks, but it was a day of missed opportunities for the Brazilian.
Martinelli fired powerfully into the body of Ederson and saw two more efforts fly just wide of the target before the break.
But Arsenal did get the half-time lead they deserved when Saka swept home Kieran Tierney’s pass into the bottom corner.
That was just the second Premier League goal City had conceded in the first half all season and Guardiola’s men bounced back in a dramatic second period.
Arsenal were furious when Stuart Attwell was sent to review Granit Xhaka’s pull on Bernardo Silva seven minutes after the break when he had not been for Odegaard’s penalty appeal.
Mahrez made no mistake from the spot in his final City appearance for a while due to his participation in the African Cup of Nations with Algeria.
The game then turned in the course of an incredible 60 seconds.
Firstly, Arsenal somehow did not retake the lead when Nathan Ake rescued Laporte’s wayward header from crossing his own line before Martinelli hit the post with an open goal on the rebound.
From the resulting goal kick, Gabriel Jesus turned onto Ederson’s pass and was hauled down by Gabriel, who had already been booked for scuffing up the penalty spot as Mahrez prepared to take his spot-kick.
City went on to dominate possession without creating many big chances and grabbed the winner in uncharacteristic fashion.
Laporte made the most of a hopeful ball into the box and the ricochet fell kindly for Rodri to prod past the helpless Aaron Ramsdale.