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;
 | 
						|
    }
 | 
						|
}
 |