Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Testing Rollbar Integration. #16

Open
wants to merge 5 commits into
base: 7.x-1.x
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"require": {
"rollbar/rollbar": "0.18.2",
"psr/log": "dev-master"
}
}
25 changes: 24 additions & 1 deletion logs_http.admin.inc
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,34 @@ function logs_http_admin_settings($form, &$form_state) {

$form['logs_http_url'] = array(
'#type' => 'textfield',
'#size' => 100,
'#title' => t('Endpoint'),
'#description' => t('The URL to POST the data to.'),
'#default_value' => variable_get('logs_http_url', NULL),
);

$form['logs_http_use_rollbar'] = array(
'#type' => 'checkbox',
'#title' => t('Use rollbar API'),
'#description' => t('Enable Logs HTTP POST for rollbar'),
'#default_value' => variable_get('logs_http_use_rollbar', FALSE),
);

$form['logs_http_rollbar_access_token'] = array(
'#type' => 'textfield',
'#size' => 100,
'#title' => t('Rollbar Server Access Token'),
'#default_value' => variable_get('logs_http_rollbar_access_token', NULL),
);

$form['logs_http_rollbar_access_token_js'] = array(
'#type' => 'textfield',
'#size' => 100,
'#title' => t('Rollbar Client Access Token (javascript)'),
'#description' => t('Type 0 to disable'),
'#default_value' => variable_get('logs_http_rollbar_access_token_js', 0),
);

$options = array(
WATCHDOG_EMERGENCY => t('Emergency'),
WATCHDOG_ALERT => t('Alert'),
Expand All @@ -46,7 +69,7 @@ function logs_http_admin_settings($form, &$form_state) {
'#type' => 'textfield',
'#title' => t('Unique ID'),
'#description' => t('An arbitrary ID that will identify the environment.'),
'#default_value' => variable_get('logs_http_uuid'),
'#default_value' => variable_get('development'),
);

return system_settings_form($form);
Expand Down
108 changes: 102 additions & 6 deletions logs_http.module
Original file line number Diff line number Diff line change
Expand Up @@ -99,18 +99,114 @@ function logs_http_shutdown() {

$url = logs_http_get_http_url();

// Post to rollbar.
if (variable_get('logs_http_use_rollbar', FALSE)) {
logs_http_rollbar_post($events, $url);
}
// Regular logging.
else {
// Send events to logs.
foreach ($events as $event) {
$options = array(
'method' => 'POST',
'data' => drupal_json_encode($event),
);

// Send data to Logs.
$response = drupal_http_request($url, $options);
}
}
}

/**
* Run rollbar API
*/
function logs_http_rollbar_post($events, $url) {
global $user;
$config = array(
// required
'access_token' => variable_get('logs_http_rollbar_access_token', NULL),
'local_username' => isset($user->name) ? $user->name : 'anonymous',
// optional - environment name. any string will do.
'environment' => variable_get('logs_http_uuid', 'development'),
'base_api_url' => $url,
);
// Log with Rollbar
Rollbar::init($config);

// Send events to logs.
foreach ($events as $event) {
$options = array(
'method' => 'POST',
'data' => drupal_json_encode($event),
);

// Send data to Logs.
$response = drupal_http_request($url, $options);
switch ($event['severity']) {
case WATCHDOG_ALERT:
case WATCHDOG_CRITICAL:
case WATCHDOG_EMERGENCY:
case WATCHDOG_ERROR:
$level = 'error';
break;
case WATCHDOG_WARNING:
$level = 'warning';
break;
case WATCHDOG_INFO:
case WATCHDOG_DEBUG:
case WATCHDOG_NOTICE:
$level = 'info';
break;
default:
$level = 'info';
break;
}
Rollbar::report_message("{$event['type']} : {$event['message']}", $level, $event);
}
}

/**
* Implements hook_init().
*/
function logs_http_init() {

// If php support is turned off then return.
if (!variable_get('logs_http_rollbar_access_token_js', 0)) {
return;
}
// If not disabled.
if (!$url = logs_http_get_http_url()) {
return;
}
// Client settings.
$token = check_plain(variable_get('logs_http_rollbar_access_token_js', ''));
$env = check_plain(variable_get('logs_http_uuid', 'development'));

// I had some issues appending this via jQuery and using Drupal.behaviors,
// so have opted to use javascript, in line with Rollbar.com
// documentation this is essentially an exact copy of the code
// located @ https://rollbar.com/docs/items_js/
$js = "
var _rollbarConfig = {
accessToken:\"" . $token . "\",
captureUncaught: true,
captureUnhandledRejections: true,
endpoint: \"" . $url . "\",
payload: {
environment:\"" . $env . "\"
}
};
// Rollbar Snippet
!function(r){function e(n){if(o[n])return o[n].exports;var t=o[n]={exports:{},id:n,loaded:!1};return r[n].call(t.exports,t,t.exports,e),t.loaded=!0,t.exports}var o={};return e.m=r,e.c=o,e.p=\"\",e(0)}([function(r,e,o){\"use strict\";var n=o(1).Rollbar,t=o(2);_rollbarConfig.rollbarJsUrl=_rollbarConfig.rollbarJsUrl||\"https://cdnjs.cloudflare.com/ajax/libs/rollbar.js/1.9.4/rollbar.min.js\";var a=n.init(window,_rollbarConfig),i=t(a,_rollbarConfig);a.loadFull(window,document,!_rollbarConfig.async,_rollbarConfig,i)},function(r,e){\"use strict\";function o(r){return function(){try{return r.apply(this,arguments)}catch(r){try{console.error(\"[Rollbar]: Internal error\",r)}catch(r){}}}}function n(r,e,o){window._rollbarWrappedError&&(o[4]||(o[4]=window._rollbarWrappedError),o[5]||(o[5]=window._rollbarWrappedError._rollbarContext),window._rollbarWrappedError=null),r.uncaughtError.apply(r,o),e&&e.apply(window,o)}function t(r){var e=function(){var e=Array.prototype.slice.call(arguments,0);n(r,r._rollbarOldOnError,e)};return e.belongsToShim=!0,e}function a(r){this.shimId=++c,this.notifier=null,this.parentShim=r,this._rollbarOldOnError=null}function i(r){var e=a;return o(function(){if(this.notifier)return this.notifier[r].apply(this.notifier,arguments);var o=this,n=\"scope\"===r;n&&(o=new e(this));var t=Array.prototype.slice.call(arguments,0),a={shim:o,method:r,args:t,ts:new Date};return window._rollbarShimQueue.push(a),n?o:void 0})}function l(r,e){if(e.hasOwnProperty&&e.hasOwnProperty(\"addEventListener\")){var o=e.addEventListener;e.addEventListener=function(e,n,t){o.call(this,e,r.wrap(n),t)};var n=e.removeEventListener;e.removeEventListener=function(r,e,o){n.call(this,r,e&&e._wrapped?e._wrapped:e,o)}}}var c=0;a.init=function(r,e){var n=e.globalAlias||\"Rollbar\";if(\"object\"==typeof r[n])return r[n];r._rollbarShimQueue=[],r._rollbarWrappedError=null,e=e||{};var i=new a;return o(function(){if(i.configure(e),e.captureUncaught){i._rollbarOldOnError=r.onerror,r.onerror=t(i);var o,a,c=\"EventTarget,Window,Node,ApplicationCache,AudioTrackList,ChannelMergerNode,CryptoOperation,EventSource,FileReader,HTMLUnknownElement,IDBDatabase,IDBRequest,IDBTransaction,KeyOperation,MediaController,MessagePort,ModalWindow,Notification,SVGElementInstance,Screen,TextTrack,TextTrackCue,TextTrackList,WebSocket,WebSocketWorker,Worker,XMLHttpRequest,XMLHttpRequestEventTarget,XMLHttpRequestUpload\".split(\",\");for(o=0;o<c.length;++o)a=c[o],r[a]&&r[a].prototype&&l(i,r[a].prototype)}return e.captureUnhandledRejections&&(i._unhandledRejectionHandler=function(r){var e=r.reason,o=r.promise,n=r.detail;!e&&n&&(e=n.reason,o=n.promise),i.unhandledRejection(e,o)},r.addEventListener(\"unhandledrejection\",i._unhandledRejectionHandler)),r[n]=i,i})()},a.prototype.loadFull=function(r,e,n,t,a){var i=function(){var e;if(void 0===r._rollbarPayloadQueue){var o,n,t,i;for(e=new Error(\"rollbar.js did not load\");o=r._rollbarShimQueue.shift();)for(t=o.args,i=0;i<t.length;++i)if(n=t[i],\"function\"==typeof n){n(e);break}}\"function\"==typeof a&&a(e)},l=!1,c=e.createElement(\"script\"),p=e.getElementsByTagName(\"script\")[0],s=p.parentNode;c.crossOrigin=\"\",c.src=t.rollbarJsUrl,c.async=!n,c.onload=c.onreadystatechange=o(function(){if(!(l||this.readyState&&\"loaded\"!==this.readyState&&\"complete\"!==this.readyState)){c.onload=c.onreadystatechange=null;try{s.removeChild(c)}catch(r){}l=!0,i()}}),s.insertBefore(c,p)},a.prototype.wrap=function(r,e){try{var o;if(o=\"function\"==typeof e?e:function(){return e||{}},\"function\"!=typeof r)return r;if(r._isWrap)return r;if(!r._wrapped){r._wrapped=function(){try{return r.apply(this,arguments)}catch(e){throw\"string\"==typeof e&&(e=new String(e)),e._rollbarContext=o()||{},e._rollbarContext._wrappedSource=r.toString(),window._rollbarWrappedError=e,e}},r._wrapped._isWrap=!0;for(var n in r)r.hasOwnProperty(n)&&(r._wrapped[n]=r[n])}return r._wrapped}catch(e){return r}};for(var p=\"log,debug,info,warn,warning,error,critical,global,configure,scope,uncaughtError,unhandledRejection\".split(\",\"),s=0;s<p.length;++s)a.prototype[p[s]]=i(p[s]);r.exports={Rollbar:a,_rollbarWindowOnError:n}},function(r,e){\"use strict\";r.exports=function(r,e){return function(o){if(!o&&!window._rollbarInitialized){var n=window.RollbarNotifier,t=e||{},a=t.globalAlias||\"Rollbar\",i=window.Rollbar.init(t,r);i._processShimQueue(window._rollbarShimQueue||[]),window[a]=i,window._rollbarInitialized=!0,n.processPayloads()}}}}]);
// End Rollbar Snippet";

// Add the function, we add it after drupal
// and jquery have been loaded.
// but before everything else.
drupal_add_js($js, array(
'type' => 'inline',
'scope' => 'header',
'weight' => -99,
'group' => JS_LIBRARY
));
}


/**
* Register an event in a static cache.
*
Expand Down