PHOENIX -- Chad Tracy has added respect for how tough it is to pinch hit, now that it's his usual role.
"It's the toughest way to make a living in the game, in my opinion," he said.
Justin Upton drove in three runs with a homer and a triple for the Diamondbacks, who were eliminated from playoff contention with a loss in St. Louis on Thursday. Stephen Drew hit a solo homer for Arizona.
Arizona's Dan Haren failed in his bid for his 17th victory but surpassed 200 strikeouts in a season for the first time in his career.
"My stuff was actually really good today," Haren said, "better than it's been the last couple of times. My control was there and I found a rhythm."
The right-hander entered the seventh inning with a 4-3 lead but the Rockies tied it on consecutive doubles by Clint Barmes and pinch-hitter Joe Koshansky.
Colorado's Jason Grilli (3-2) retired the first two hitters in the eighth, then Miguel Montero lined a double off the wall in left. Jeff Salazar walked on four pitches to bring up Tracy, who doubled down the right field line.
"It seems like he's acclimating to a pinch-hit role over the past couple of years," Arizona manager Bob Melvin said. "He really gives you a battle at-bat. I thought it was a really good at-bat, to square one up down the line after seeing quite a few pitches."
Haren gave up four runs, three in the first inning, and eight hits, striking out nine in seven innings.
"Other than just a wacky first inning, I thought he pitched very well," Melvin said. "I think he's had an exceptional year, especially when at the beginning he was kind of the hard-luck guy. He easily could have had a couple more wins."
Colorado manager Clint Hurdle was ejected by umpire Ron Kulpa in the seventh. Hurdle, tossed for the second time this season, was upset that Troy Tulowitzki was called out trying to steal second.
"With the information that Ron shared with me, I didn't see any way he could call him out," Hurdle said. "He said that's what he had, that was the call, and I wasn't buying it."
Juan Cruz (4-0) pitched a scoreless eighth to get the victory. Chad Qualls threw a perfect ninth for his sixth straight save since being named Arizona's full-time closer.
The last of the Rockies' first-inning runs came under curious circumstances.
Tulowitzki and Brad Hawpe had RBI doubles off Haren in the first, then Garrett Atkins bunted. Montero, the catcher, threw out Atkins at first, but Haren failed to cover home, allowing Hawpe -- on second when the play began -- to score.
Upton's 430-foot homer off the batter's eye in straightaway center cut it to 3-1 in the fourth, then Drew's 426-footer onto the porch in left-center made it 3-2 in the fifth.
David Eckstein followed Drew's homer with a double down the left field line.
Matt Herges relieved starter Jason Hirsh and gave up a single to Conor Jackson that advanced Eckstein to third. Adam Dunn popped out to bring up Upton, who lined a shot to the left-center gap for a standup triple.
Hirsh allowed three runs and five hits in 4 1/3 innings in his first major league start off the season.
"It went OK," Hirsh said. "I fell behind a lot of counts, threw a lot of pitches early, and that's not a very effective way to pitch."