208 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			208 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| define('NEWRELIC_API_BASE', 'https://api.newrelic.com');
 | |
| 
 | |
| /**
 | |
|  * Interacts with the New Relic Connect API
 | |
|  * deprecated
 | |
|  * @link newrelic.github.com/newrelic_api/
 | |
|  */
 | |
| class NewRelicAPI {
 | |
|     private $_api_key;
 | |
| 
 | |
|     /**
 | |
|      * @param string $api_key New Relic API Key
 | |
|      */
 | |
|     function __construct($api_key) {
 | |
|         $this->_api_key = $api_key;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $api_call_url url path with query string used to define what to get from the NR API
 | |
|      * @throws Exception
 | |
|      * @return bool
 | |
|      */
 | |
|     private function _get($api_call_url) {
 | |
|         $defaults = array(
 | |
|             'headers'=>'x-api-key:'.$this->_api_key
 | |
|         );
 | |
|         $url = NEWRELIC_API_BASE . $api_call_url;
 | |
| 
 | |
|         $response = wp_remote_get($url, $defaults);
 | |
| 
 | |
|         if (is_wp_error($response)) {
 | |
|             throw new Exception('Could not get data');
 | |
|         } elseif ($response['response']['code'] == 200) {
 | |
|             $return = $response['body'];
 | |
|         } else {
 | |
|             switch ($response['response']['code']) {
 | |
|                 case '403':
 | |
|                     $message = __('Invalid API key', 'w3-total-cache');
 | |
|                     break;
 | |
|                 default:
 | |
|                     $message = $response['response']['message'];
 | |
|             }
 | |
| 
 | |
|             throw new Exception($message, $response['response']['code']);
 | |
|         }
 | |
|         return $return;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * @param string $api_call_url url path with query string used to define what to get from the NR API
 | |
|      * @param array $params key value array.
 | |
|      * @throws Exception
 | |
|      * @return bool
 | |
|      */
 | |
|     private function _put($api_call_url, $params) {
 | |
|         $defaults = array(
 | |
|             'method' => 'PUT',
 | |
|             'headers'=>'x-api-key:'.$this->_api_key,
 | |
|             'body' => $params
 | |
|         );
 | |
|         $url = NEWRELIC_API_BASE . $api_call_url;
 | |
|         $response = wp_remote_request($url, $defaults);
 | |
| 
 | |
|         if (is_wp_error($response)) {
 | |
|             throw new Exception('Could not put data');
 | |
|         } elseif ($response['response']['code'] == 200) {
 | |
|             $return = true;
 | |
|         } else {
 | |
|             throw new Exception($response['response']['message'], $response['response']['code']);
 | |
|         }
 | |
|         return $return;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get applications connected with the API key and provided account id.
 | |
|      * @param int $account_id
 | |
|      * @return array
 | |
|      */
 | |
|     function get_applications($account_id) {
 | |
|         $applications = array();
 | |
|         if ($xml_string  = $this->_get("/api/v1/accounts/{$account_id}/applications.xml")) {
 | |
|             $xml = simplexml_load_string($xml_string);
 | |
|             foreach($xml->application as $application) {
 | |
|                 $applications[(int)$application->id] = (string)$application->name;
 | |
|             }
 | |
|         }
 | |
|         return $applications;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get the application summary data for the provided application
 | |
|      * @param $application_id
 | |
|      * @return array array(metric name => metric value)
 | |
|      */
 | |
|     function get_application_summary($account_id, $application_id) {
 | |
|         $summary = array();
 | |
| 
 | |
|         if ($xml_string = $this->_get("/api/v1/accounts/{$account_id}/applications/{$application_id}/threshold_values.xml")) {
 | |
|             $xml = simplexml_load_string($xml_string);
 | |
|             foreach($xml->{'threshold_value'} as $value) {
 | |
|                 $summary[(string)$value['name']] = (string)$value['formatted_metric_value'];
 | |
|             }
 | |
|         }
 | |
|         return $summary;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Return key value array with information connected to account.
 | |
|      * @return array|mixed|null
 | |
|      */
 | |
|     function get_account() {
 | |
|         $account = null;
 | |
|         if ($xml_string = $this->_get('/api/v1/accounts.xml')) {
 | |
|             $xml = simplexml_load_string($xml_string);
 | |
|             foreach($xml->account as $account_values) {
 | |
|                 $account=json_decode(json_encode((array) $account_values), 1);
 | |
|                 break;
 | |
|             }
 | |
|         }
 | |
|         return $account;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Get key value array with application settings
 | |
|      * @param $application_id
 | |
|      * @return array|mixed
 | |
|      */
 | |
|     function get_application_settings($account_id, $application_id) {
 | |
|         $settings = array();
 | |
|         if ($xml_string = $this->_get("/api/v1/accounts/{$account_id}/application_settings/{$application_id}.xml")) {
 | |
|             $xml = simplexml_load_string($xml_string);
 | |
|             $settings=json_decode(json_encode((array) $xml), 1);
 | |
|         }
 | |
|         return $settings;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Update application settings. verifies the keys in provided settings array is acceptable
 | |
|      * @param $application_id
 | |
|      * @param $settings
 | |
|      * @return bool
 | |
|      */
 | |
|     function update_application_settings($account_id, $application_id, $settings) {
 | |
|         $supported = array('alerts_enabled', 'app_apdex_t','rum_apdex_t','rum_enabled');
 | |
|         $call = "/api/v1/accounts/{$account_id}/application_settings/{$application_id}.xml";
 | |
|         $params = array();
 | |
|         foreach($settings as $key => $value)  {
 | |
|             if (in_array($key, $supported))
 | |
|                 $params[$key] = $value;
 | |
|         }
 | |
| 
 | |
|         return $this->_put($call, $params);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Returns the available metric names for provided application
 | |
|      * @param $application_id
 | |
|      * @param string $regex
 | |
|      * @param string $limit
 | |
|      * @return array|mixed
 | |
|      */
 | |
|     function get_metric_names($application_id, $regex = '', $limit = '') {
 | |
|         $call = "/api/v1/agents/{$application_id}/metrics.json";
 | |
|         $callQS = '';
 | |
|         $qs = array();
 | |
|         if ($regex)
 | |
|             $qs[] = 're=' . urlencode($regex);
 | |
|         if ($limit)
 | |
|             $qs[] = 'limit=' . $limit;
 | |
|         if ($qs)
 | |
|             $callQS = '?' . implode('&', $qs);
 | |
|         $json = $this->_get($call . $callQS);
 | |
|         $metric_names=json_decode($json);
 | |
|         return $metric_names;
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Gets the metric data for the provided metric names.
 | |
|      * @param string $account_id
 | |
|      * @param string $application_id
 | |
|      * @param string $begin XML date in GMT
 | |
|      * @param string $to XML date in GMT
 | |
|      * @param array $metrics
 | |
|      * @param string $field
 | |
|      * @param bool $summary if values should be merged or overtime
 | |
|      * @return array|mixed
 | |
|      */
 | |
|     function get_metric_data($account_id, $application_id, $begin, $to, $metrics, $field, $summary = true) {
 | |
|         $metricParamArray = array();
 | |
|         foreach($metrics as $metric) {
 | |
|             $metricParamArray[] = 'metrics[]=' . urlencode($metric);
 | |
|         }
 | |
|         $metricQS = implode('&', $metricParamArray);
 | |
|         $fieldsQS = 'field=' . urlencode($field);
 | |
|         $agentQS =  'agent_id=' . urlencode($application_id);
 | |
|         $beginQS = 'begin=' . urlencode($begin);
 | |
|         $toQS = 'end=' . urlencode($to);
 | |
|         $summaryQS = $summary ? 'summary=1' : 'summary=0';
 | |
|         $command = $beginQS . '&' . $toQS . '&' . $metricQS . '&' . $fieldsQS . '&' . $agentQS . '&' . $summaryQS;
 | |
| 
 | |
|         $json = $this->_get("/api/v1/accounts/{$account_id}/metrics/data.json?{$command}");
 | |
|         $metric_data=json_decode($json);
 | |
| 
 | |
|         return $metric_data;
 | |
|     }
 | |
| }
 |