Elastic
Как интегрировать Elasticsearch с OpenReplay и просматривать ошибки бэкенда рядом с записями сессий.
1. Создание нового ключа API
Section titled 1. Создание нового ключа APIЕсли вы используете панель управления Kibana:
- Войдите в свою панель управления Kibana.
- Перейдите в Dev Tools > Console.
- Скопируйте следующий код консоли в вашу консоль и выполните его.
Если вы используете команды CURL:
- Выполните следующую команду 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.

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 или загляните на наш Форум и получите помощь от нашего сообщества.