как добавить базовое событие Keen.io с помощью javascript

Я пытаюсь настроить базовый пример, который отправляет пользовательское событие Keen.io через js. На данный момент мне не нужны никакие презентации, визуализации и т.д.

Вот пример, который я создал из другого, найденного в Интернете. Я попробовал несколько вариантов, и все они работают в Google Chrome, но ни один из них не работает в Firefox (38.0 для Ubuntu canonical — 1.0).

  1. если я добавлю в шапку встроенный скрипт (!function(a,b){a("Keen"...) как это предлагается в мануале, я не получаю никаких ошибок в FF , но кажется, что addEvent никогда не вызывается и не выдает ни ответа, ни "err", ни "res".

  2. если включаю библиотеку из CDN (d26b395fwzu5fz.cloudfront.net/3.2.4/keen.min.js), то при загрузке страницы получаю ошибку:

    ReferenceError: Keen не определен
    var KeenClient = new Keen({

  3. Если я загружаю файл js и обслуживаю его локально, после нажатия кнопки я получаю следующий ответ об ошибке:

    Ошибка: запрос не выполнен
    err = new Error(is_err ? res.body.message : 'Произошла неизвестная ошибка');

Все эти попытки работают в Chrome, но мне нужно, чтобы это работало и в других браузерах.


person bosskovic    schedule 20.05.2015    source источник


Ответы (1)


Я получил ответ от команды Keen.io. Оказалось, что Adblock Plus мешает работе скрипта. После того, как я его отключил, в FF все работает, как в Chrome.


После некоторого расследования выяснилось, что запрос к http://api.keen.io был заблокирован фильтром "EasyPrivacy" из ABP с этими правилами фильтрации:

Таким образом, отправка запроса на «промежуточный» сервер (прокси) кажется единственным решением, которое я вижу.


У нас есть немного специфический вариант использования — необходимость отслеживать статический сайт, а также доступ к серверу API рельсов, но решение, которое мы в итоге использовали, может кому-то пригодиться.

ошибка.html

<html>
<head>
  <title>Error</title>
  <script src="/js/vendor/jquery-1.11.2.min.js"></script>
  <script src="/js/notification.js"></script>
  <script type="text/javascript">
    $(document).on('ready', function () {
      try {
        $.get(document.URL).complete(function (xhr, textStatus) {
          var code = xhr.status;
          if (code == 200) {
            var codeFromPath = window.location.pathname.split('/').reverse()[0].split('.')[0];
            if (['400', '403', '404', '405', '414', '416', '500', '501', '502', '503', '504'].indexOf(codeFromPath) > -1) {
              code = codeFromPath;
            }
          }
          Notification.send(code);
        });
      }
      catch (error) {
        Notification.send('error.html', error);
      }
    });
  </script>
</head>
<body>
There was an error. Site Administrators were notified.
</body>
</html>

notification.js

var Notification = (function () {

  var endpoint = 'http://my-rails-server-com/notice';

  function send(type, jsData) {
    try {
      if (jsData == undefined) {
        jsData = {};
      }

      $.post(endpoint, clientData(type, jsData));
    }
    catch (error) {
    }
  }

  //  private
  function clientData(type, jsData) {
    return {
      data: {
        type: type,
        jsErrorData: jsData,
        innerHeight: window.innerHeight,
        innerWidth: window.innerWidth,
        pageXOffset: window.pageXOffset,
        pageYOffset: window.pageYOffset,
        status: status,
        navigator: {
          appCodeName: navigator.appCodeName,
          appName: navigator.appName,
          appVersion: navigator.appVersion,
          cookieEnabled: navigator.cookieEnabled,
          language: navigator.language,
          onLine: navigator.onLine,
          platform: navigator.platform,
          product: navigator.product,
          userAgent: navigator.userAgent
        },

        history: {
          length: history.length
        },
        document: {
          documentMode: document.documentMode,
          documentURI: document.documentURI,
          domain: document.domain,
          referrer: document.referrer,
          title: document.title,
          URL: document.URL
        },
        screen: {
          width: screen.width,
          height: screen.height,
          availWidth: screen.availWidth,
          availHeight: screen.availHeight,
          colorDepth: screen.colorDepth,
          pixelDepth: screen.pixelDepth
        },
        location: {
          hash: window.location.hash,
          host: window.location.host,
          hostname: window.location.hostname,
          href: window.location.href,
          origin: window.location.origin,
          pathname: window.location.pathname,
          port: window.location.port,
          protocol: window.location.protocol,
          search: window.location.search
        }
      }
    }
  }

  return {
    send: send
  }
}());

пример отправки уведомления вручную из кода js:

try {
  // some code that may produce an error
}
catch (error) {
  Notification.send('name of keen collection', error);
}

рельсы

# gemfile
gem 'keen'

#routes
resource :notice, only: :create

#controller
class NoticesController < ApplicationController

  def create
    # response to Keen.publish does not include an ID of the newly added notification, so we add an identifier
    # that we can use later to easily track down the exact notification on keen
    data = params['data'].merge('id' => Time.now.to_i)

    Keen.publish(data['type'], data) unless dev?(data)

    # we send part of the payload to a company chat, channel depends on wheter the origin of exception is in dev or production
    ChatNotifier.notify(data, dev?(data)) unless data['type'] == '404'
    render json: nil, status: :ok
  end

  private

  def dev?(data)
    %w(site local).include?(data['location']['origin'].split('.').last)
  end
end
person bosskovic    schedule 21.05.2015