Tidewater Muse
Why not just login to Pingdom?
Good question! My answer – because it’s slow & tedious. It takes me minutes to get the information I’m looking for – namely, the average response time of a few critical pages from yesterday and today. To not have to click through the various cities every day deselecting all the [European|American] sites in order to get a more accurate measurement – this alone is worth its weight in gold!
Don’t get me wrong. The graphs are wonderful for spotting trends, but I don’t need to look at these every day. I want to be able to tell within a second or two if my site is performant.
There’s a reason they made an API
The good folks at Pingdom are number crunchers at heart – they probably also avoid logging into the site when possible because they developed a nice API with which you can access all the info you need.
After requesting an API key, you’re just a few curl commands away from this :
And here’s the corresponding code:
<?php define('SERVER_URL', 'https://ws.pingdom.com/soap/PingdomAPI.wsdl'); define('USERNAME', '<username>'); define('PASSWORD', '<password>'); define('PINGDOM_API_KEY', '<api_key>'); define('PINGDOM_API_STATUS_OK', 0); define('RESOLUTION', 'DAILY'); define('GOOD_TIMING', 500); define('POOR_TIMING', 800); $client = new SoapClient(SERVER_URL, array( 'trace' => 1,'exceptions' => 0 )); $sessionId = loginPingdom($client); $responses = fetchPages($client, $sessionId); writeResponse($responses); logout($client, $sessionId); function loginPingdom($client) { // Login $login_data->username = USERNAME; $login_data->password = PASSWORD; $sessionId = null; // Pingdom API function, see details on http://www.pingdom.com/services/api-documentation/ $login_response = $client->Auth_login(PINGDOM_API_KEY, $login_data); // Check if everything is OK if (PINGDOM_API_STATUS_OK != $login_response->status) { echo'Unable to login to Pingdom'; } else { // Without this value you wont be able to call any other Pingdom API function $sessionId = $login_response->sessionId; } return $sessionId; } function fetchPages($client, $sessionId) { $locs = array("Amsterdam, Holland","London, UK","Paris, France","Stockholm, Sweden"); // Today - up through CURRENT_TIME $get_times_today->from = mktime("00", "00", "00", date("m"), date("d"), date("Y")); $get_times_today->to = CURRENT_TIME; $get_times_today->resolution = RESOLUTION; $get_times_today->locations = $locs; //Yesterday $get_times_yesterday->from = mktime("00", "00", "00", date("m") , date("d") - 1, date("Y")); $get_times_yesterday->to = mktime("23", "59", "59", date("m") , date("d") - 1, date("Y")); $get_times_yesterday->resolution = RESOLUTION; $get_times_yesterday->locations = $locs; // page names taken from how you entered them in Pingdom $pages_to_query = array('Homepage', 'Krankheiten', 'Asthma article'); $responses = array(); foreach ($pages_to_query as $checkName) { $response = null; $get_times_today->checkName = $checkName; $get_times_yesterday->checkName = $checkName; $times_today = $client->Report_getResponseTimes(PINGDOM_API_KEY, $sessionId, $get_times_today); $times_yesterday = $client->Report_getResponseTimes(PINGDOM_API_KEY, $sessionId, $get_times_yesterday); if (PINGDOM_API_STATUS_OK != $times_today->status || PINGDOM_API_STATUS_OK != $times_yesterday->status) { echo('Error occurred while trying to get list of responsetimes'); } else { $list_times_today = $times_today->responseTimesArray; $list_times_yesterday = $times_yesterday->responseTimesArray; $response->page = $checkName; $response->today = round($list_times_today[0]->responseTime); $response->yesterday = round($list_times_yesterday[0]->responseTime); $response->y_threshold = $response->yesterday < GOOD_TIMING ? 'green' : ($response->yesterday < POOR_TIMING ? 'orange' : 'red'); $response->t_threshold = $response->today < GOOD_TIMING ? 'green' : ($response->today < POOR_TIMING ? 'orange' : 'red'); $responses[] = $response; } } return $responses; } function writeResponse($responses) { $yesterday = date('d.m.Y', mktime(0, 0, 0, date("m") , date("d") - 1, date("Y"))); $current = date('d.m.Y', CURRENT_TIME); echo "<br/><br/>"; echo "<table class='responses' title='Response time (ms)' border='1'>"; echo " <tr>"; echo " <th> Response Times </th>"; echo " <th> $yesterday </th>"; echo " <th> $current </th>"; echo " </tr>"; foreach ($responses as $response) { $response_page = $response->page; $response_yest_thresh = $response->y_threshold; $response_toda_thresh = $response->t_threshold; $response_yesterday = $response->yesterday; $response_today = $response->today; echo " <tr>"; echo " <td>$response_page</td>"; echo " <td><span style='color:$response_yest_thresh;'>$response_yesterday ms</span></td>"; echo " <td><span style='color:$response_toda_thresh;'>$response_today ms</span></td>"; echo " </tr>"; } echo "</table>"; } function logout($client, $sessionId) { $logout_response = $client->Auth_logout(PINGDOM_API_KEY, $sessionId); if (PINGDOM_API_STATUS_OK != $logout_response->status) { echo('Error occurred while closing connection'); } } ?>
Of course, there are a few customizations you should make – namely the $locs, $pages_to_query, GOOD_TIMING & POOR_TIMIING (both measured in msec) values. But, I hope I’ve gotten you off to a good start.
Questions, comments & criticisms happily taken!