Gabriel Martinelli provided the breakthrough on an evening that saw two title rivals exchange tense blows in a fascinating battle in north London.
Arsenal were lucky not to be a goal down after as little as four minutes, with Josko Gvardiol's header cleared off the line by Declan Rice at the last minute.
Mateo Kovacic was lucky not to have been given his marching orders after two robust challenges on Martin Odegaard and Declan Rice.
Martinelli's introduction at the break brought greater attacking impetus to proceedings, before sealing the three points in the 87th minute with a deflected strike off of Nathan Ake to seal a memorable win for the Gunners.
0' The match is about to start!
4' MISS! Ake's shot over the bar
26' CHANCE! Nketiah's shot wide out
28' Yellow Card! Kovacic booked
50' CHANCE! Martinelli's shot saved
84' Jesus goes down in the box but ref says no penalty!
86' GOAL! Arsenal 1-0 Man City (Martinelli)
Arsenal XI: Trossard, Jorginho, Zinchenko, David Raya, Martin Ødegaard, Jesus, Rice, Gabriel, Ben White, Nketiah, William Saliba
Subs: Partey, Tomiyasu, Nelson, Havertz, Ramsdale, Smith Rowe, Martinelli, Jakub Kiwior, Fábio Vieira
Man City XI: Walker, Kovacic, Ake, Ederson, Ruben Dias, Bernardo, Haaland, Foden, Julián Álvarez, Josko Gvardiol, Rico Lewis
Subs: Stefan Ortega, Stones, Grealish, Akanji, Kalvin Phillips, Sergio Gómez, Matheus Nunes, Jérémy Doku, Oscar Bobb
Read on m.allfootballapp.com