Rudi Garcia's Lyon extended their unbeaten run to 10 Ligue 1 matches as they made the most of an early penalty miss by Metz midfielder Farid Boulaya.
Hosts Metz wasted a golden opportunity to take a seventh-minute lead when Algerian Boulaya's spot-kick was comfortably saved by Anthony Lopes.
Lyon took the lead 10 minutes later as Memphis Depay fired into the corner from Karl Toko Ekambi's pullback.
Cameroonian international Ekambi drilled in his sixth goal in as many matches less than two minutes after the break, before adding a penalty on the hour mark.
A four-goal victory would have taken Lyon above Lille, but those hopes were dashed when Boulaya netted a consolation with 14 minutes to play for Metz, who had John Boye sent off late on.
Lyon also had Rayan Cherki dismissed in injury time in a scrappy end to the game.