Elastic

Как интегрировать Elasticsearch с OpenReplay и просматривать ошибки бэкенда рядом с воспроизведениями сессий.

Elastic

Как интегрировать Elasticsearch с OpenReplay и просматривать ошибки бэкенда рядом с записями сессий.

1. Создание нового ключа API

Section titled 1. Создание нового ключа API

Если вы используете панель управления Kibana:

  1. Войдите в свою панель управления Kibana.
  2. Перейдите в Dev Tools > Console.
  3. Скопируйте следующий код консоли в вашу консоль и выполните его.

Если вы используете команды CURL:

  1. Выполните следующую команду cURL в вашем терминале.

Примечание: по умолчанию эта интеграция выполняет поиск логов в любом индексе, который соответствует *log*. Если у вас есть отдельный индекс для логов, который не соответствует этому шаблону, измените имя индекса в строке 12 в следующей команде. Если вы хотите указать более одного индекса, вы можете разделить имена с помощью ,.

POST /_security/api_key
{
  "name": "openreplay-api-key",
  "role_descriptors": {
    "openreplay-role": {
      "cluster": [
        "all"
      ],
      "index": [
        {
          "names": [
            "*log*"
          ],
          "privileges": [
            "read"
          ]
        }
      ]
    }
  }
}

Если вы использовали любой из предыдущих методов для генерации ключа API, вы получите результат, подобный следующему:

{
  "id" : "eQWAIG0Bo0VqB8HXFH9-",
  "name" : "openreplay-api-key",
  "api_key" : "dZ5ycVRJTU-5UW_RYfi1_w"
}

Обязательно скопируйте id и api_key, так как они понадобятся нам для интеграции. Для получения дополнительной информации о создании ключа API обратитесь к этой документации.

2. Включение Elasticsearch в OpenReplay

Section titled 2. Включение Elasticsearch в OpenReplay

Укажите ваш адрес host, port, id и api_key в панели управления OpenReplay в разделе «Preferences > Integration». Если вы изменили индекс при генерации api_key, укажите его имя в indexes.

Интеграция Elasticsearch в OpenReplay

3. Передача openReplaySessionToken

Section titled 3. Передача openReplaySessionToken

Чтобы связать событие Elasticsearch с записанной пользовательской сессией, уникальный токен должен передаваться из вашего фронтенда в бэкенд при каждом запросе, который вы хотите отслеживать. Это можно сделать с помощью пользовательского HTTP-заголовка. В приведённом ниже примере мы используем функцию fetch для отправки этого заголовка.

const headers = {
  Accept: 'application/json',
  'Content-Type': 'application/json',
};
if (tracker.getSessionToken()) { // or window.OpenReplay instead of tracker if you're using the snippet
  headers['X-OpenReplay-SessionToken'] = tracker.getSessionToken(); // Inject openReplaySessionToken
}
fetch('www.your-backend.com', {
  'GET',
  headers,
});

Чтобы OpenReplay мог связать запись лога Elasticsearch с записанной пользовательской сессией, уникальный токен должен передаваться в составе каждой ошибки бэкенда, которую вы хотите отслеживать.

Ниже приведён пример на Python с использованием Monkey Patching.

import sys
import traceback
#...
old_tb = traceback.print_exception
old_f = sys.stdout
old_e = sys.stderr
OPENREPLAY_SESSION_TOKEN = None

class F:
    def write(self, x):
        if OPENREPLAY_SESSION_TOKEN is not None and x != '\n':
            old_f.write(f"[openReplaySessionToken={OPENREPLAY_SESSION_TOKEN}] {x}")
        else:
            old_f.write(x)

    def flush(self):
        pass

def tb_print_exception(etype, value, tb, limit=None, file=None, chain=True):
    if OPENREPLAY_SESSION_TOKEN is not None:
        value = type(value)(f"[openReplaySessionToken={OPENREPLAY_SESSION_TOKEN}] " + str(value))
    old_tb(etype, value, tb, limit, file, chain)

traceback.print_exception = tb_print_exception

sys.stderr = F()

Имя тега openReplaySessionToken чувствительно к регистру.

Особые замечания

Section titled Особые замечания

По умолчанию мы ищем каждый лог, связанный с сессией OpenReplay, используя атрибуты message и utc_time. Нас интересуют только логи ошибок; чтобы идентифицировать логи ошибок, мы проверяем, содержит ли атрибут tags значение error.

Остались вопросы?

Section titled Остались вопросы?

Если вы столкнулись с какими-либо проблемами, присоединяйтесь к нашему Slack или загляните на наш Форум и получите помощь от нашего сообщества.