-
Notifications
You must be signed in to change notification settings - Fork 0
/
new_relic_rpm.reports.inc
189 lines (162 loc) · 6.31 KB
/
new_relic_rpm.reports.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<?php
/**
* @file
* Reporting page callbacks.
*/
/**
* Main page for RPM reporting. List all the applications on this API Key.
*/
function new_relic_rpm_reporting() {
// If no API key is set, break here and error out.
$api_key = variable_get('new_relic_rpm_api_key', '');
if (empty($api_key)) {
drupal_set_message(t('You need to enter your New Relic API key from your New Relic account settings page before you are able to view reports within Drupal. Visit the <a href="@settings">New Relic RPM Drupal admin page</a> to enter your API key.', array('@settings' => url('admin/config/development/new-relic-rpm'))), 'error');
return '<h2>' . t('No API key found.') . '</h2>';
}
// Get basic app health.
// This is also our first check for a bad key/access denied.
// Only hit the REST API every 60 seconds.
if ($_SESSION['new_relic_rpm_health_time'] < $_SERVER['REQUEST_TIME'] - 60 || !$_SESSION['new_relic_rpm_health_xml']) {
$app_health = new_relic_rpm_curl('https://rpm.newrelic.com/accounts.xml?include=application_health');
}
else {
$app_health = $_SESSION['new_relic_rpm_health_xml'];
}
// Error out of the return is False, store data if it is good.
if (!$app_health) {
drupal_set_message(t('The New Relic REST API has denied your key. Either the key you entered on the <a href="@settings">New Relic RPM Drupal admin page</a> is incorrect, or you have not enabled API access for this application within the New Relic RPM webiste.', array('@settings' => url('admin/config/development/new-relic-rpm'))), 'error');
return '<h2>' . t('API access denied.') . '</h2>';
}
else {
$_SESSION['new_relic_rpm_health_time'] = $_SERVER['REQUEST_TIME'];
$_SESSION['new_relic_rpm_health_xml'] = $app_health;
}
return new_relic_rpm_render_health($app_health);
}
/**
* Load the details for a specfic application.
*/
function new_relic_rpm_reporting_details($cust_id, $app_id) {
$output = '';
// If no API key is set, break here and error out.
$api_key = variable_get('new_relic_rpm_api_key', '');
if (empty($api_key)) {
drupal_set_message(t('You need to enter your New Relic API key from your New Relic account settings page before you are able to view reports within Drupal. Visit the <a href="@settings">New Relic RPM Drupal admin page</a> to enter your API key.', array('@settings' => url('admin/config/development/new-relic-rpm'))), 'error');
return '<h2>' . t('No API key found.') . '</h2>';
}
// Only hit the REST API every 60 seconds.
if ($_SESSION['new_relic_rpm_dash_time'] < $_SERVER['REQUEST_TIME'] - 60 || !$_SESSION['new_relic_rpm_dash_xml']) {
$app_dashboard = new_relic_rpm_curl('https://rpm.newrelic.com/application_dashboard?application_id=' . $app_id);
}
else {
$app_dashboard = $_SESSION['new_relic_rpm_dash_xml'];
}
// Error out if value is false, save cached copy of XML if it is good.
if (!$app_dashboard) {
drupal_set_message(t('The New Relic REST API has denied your key. Either the key you entered on the <a href="@settings">New Relic RPM Drupal admin page</a> is incorrect, or you have not enabled API access for this application within the New Relic RPM webiste.', array('@settings' => url('admin/config/development/new-relic-rpm'))), 'error');
return '<h2>' . t('API access denied.') . '</h2>';
}
else {
$_SESSION['new_relic_rpm_dash_time'] = $_SERVER['REQUEST_TIME'];
$_SESSION['new_relic_rpm_dash_xml'] = $app_dashboard;
}
$output .= $app_dashboard;
$output .= new_relic_rpm_render_actions($cust_id, $app_id);
return $output;
}
/**
* Render the application health display.
*
* @todo Figure out the threshold information
*/
function new_relic_rpm_render_health($app_health) {
$app_obj = simplexml_load_string($app_health);
$cust_id = (string) $app_obj->account->id;
$apps = $app_obj->account->applications;
foreach ($apps as $app) {
foreach ($app as $data) {
foreach ($data->{"threshold-values"} as $val) {
foreach ($val->threshold_value as $v) {
$app_name = (string) $data->name;
$attr_name = (string) $v->attributes()->name;
$app_data[$app_name][$attr_name]['val'] = (string) $v->attributes()->formatted_metric_value;
$app_data[$app_name][$attr_name]['mval'] = (string) $v->attributes()->metric_value;
$app_data[$app_name][$attr_name]['thresh'] = (string) $v->attributes()->threshold_value;
$app_data[$app_name]['AppID'] = (string) $data->id;
}
}
}
}
$table['header'] = array(
'App Name',
'App ID',
'ApDex',
'Resp. Time',
'Errors %',
'Error Rate (EPM)',
'Throughput (rpm)',
'App Busy %',
'DB %',
'CPU',
'Memory',
'Details',
);
$metrics = array(
'Apdex',
'Response Time',
'Errors',
'Error Rate',
'Throughput',
'Application Busy',
'DB',
'CPU',
'Memory',
);
foreach ($app_data as $k => $v) {
$row = array($k, $v['AppID']);
foreach ($metrics as $metric) {
$cell = array('data' => $v[$metric]['val']);
if ($v[$metric]['mval'] > $v[$metric]['thresh']) {
$cell['class'] = 'error';
}
$row[] = $cell;
}
$row[] = l(t('Details'), 'admin/reports/new-relic-rpm/details/' . $cust_id . '/' . $v['AppID'], array('query' => array('app_name' => $k)));
$table['rows'][] = $row;
}
return theme('table', $table);
}
/**
* Render the quick actions menu.
*/
function new_relic_rpm_render_actions($cust_id, $app_id) {
$rpm_url = "https://rpm.newrelic.com/accounts/{$cust_id}/applications/{$app_id}";
$actions = array(
'transactions' => t('Web Transactions'),
'databases' => t('Database Activity'),
'background_tasks' => t('Background Tasks'),
'traced_errors' => t('Traced Errors'),
'edit' => t('App Settings'),
'edit_alerts' => t('App Alerts & Thresholds'),
'deployments' => t('Deployments'),
);
$links = array(
'overview' => array(
'title' => t("Overview"),
'href' => $rpm_url,
'attributes' => array('class' => '_blank'),
),
);
foreach ($actions as $action => $title) {
$links[$action] = array(
'title' => $title,
'href' => "{$rpm_url}/{$action}",
'attributes' => array('target' => '_blank'),
);
}
$list = array(
'heading' => t("Links to New Relic's website for this Application"),
'links' => $links,
);
return theme('links', $list);
}