Elastic

Comment intégrer Elasticsearch à OpenReplay et voir les erreurs backend à côté des relectures de session.

Elastic

Découvrez comment intégrer les journaux backend d’Elastic aux relectures de session d’OpenReplay afin d’étendre vos capacités de surveillance et de débogage.

1. Créer une nouvelle clé d’API

Section titled 1. Créer une nouvelle clé d’API

Selon votre configuration, vous pouvez créer une clé d’API à l’aide du tableau de bord Kibana ou via des commandes cURL.

Avec le tableau de bord Kibana

  1. Connectez-vous à votre tableau de bord Kibana.

  2. Accédez à Dev Tools : Naviguez vers Dev Tools > Console.

  3. Créez la clé d’API : Copiez le code suivant dans la console et exécutez-le :

    POST /_security/api_key
    {
      "name": "openreplay-api-key",
      "role_descriptors": {
        "openreplay-role": {
          "cluster": ["all"],
          "index": [
            {
              "names": ["*log*"],
              "privileges": ["read"]
            }
          ]
        }
      }
    }
  1. Exécutez la commande cURL : Lancez la commande suivante dans votre terminal :

    curl -X POST "https://your-elasticsearch-host:port/_security/api_key" \
    -H 'Content-Type: application/json' \
    -d'
    {
      "name": "openreplay-api-key",
      "role_descriptors": {
        "openreplay-role": {
          "cluster": ["all"],
          "index": [
            {
              "names": ["*log*"],
              "privileges": ["read"]
            }
          ]
        }
      }
    }' \
    -u 'username:password'

    Remplacez https://your-elasticsearch-host:port par l’hôte et le port de votre Elasticsearch, et username:password par vos identifiants.

Remarque :

  • Par défaut, cette intégration recherche les journaux dans tout index correspondant à *log*. Si vous disposez d’un index spécifique pour les journaux qui ne correspond pas à ce motif, modifiez le champ names dans la requête de création de la clé d’API.
  • Pour spécifier plusieurs index, séparez les noms par des virgules, par exemple "names": ["index1", "index2"].

Après avoir exécuté la commande, vous recevrez une réponse semblable à celle-ci :

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

Important : Veillez à copier l’id et l’api_key, car vous en aurez besoin pour l’intégration.

Référence : Elasticsearch - Create API Key

2. Configurer l’intégration Elasticsearch dans OpenReplay

Section titled 2. Configurer l’intégration Elasticsearch dans OpenReplay

Dans votre compte OpenReplay, suivez ces 3 étapes pour finaliser la corrélation des relectures de session avec les journaux backend d’Elasticsearch.

Activer l’intégration Elasticsearch

Section titled Activer l’intégration Elasticsearch
  1. Accédez à Preferences > Integrations dans OpenReplay.
  2. Sélectionnez l’onglet Backend Logging.
  3. Sélectionnez le projet pour lequel vous souhaitez activer l’intégration Elasticsearch : Repérez la carte d’intégration Elasticsearch > Cliquez dessus.

Saisir les identifiants Elasticsearch

Section titled Saisir les identifiants Elasticsearch

Dans la barre latérale de l’intégration Elasticsearch, saisissez :

  • API KEY ID : L’id de la clé d’API que vous avez générée.
  • API Key : L’api_key de la clé d’API que vous avez générée.
  • Indexes : Si vous avez modifié l’index lors de la génération de la clé d’API, indiquez ici le ou les noms.
  • Cliquez sur Add pour tester la connexion.

3. Propager openReplaySession.id

Section titled 3. Propager openReplaySession.id

Pour relier un événement Elasticsearch à la session utilisateur enregistrée, un identifiant de session unique (openReplaySession.id) doit être propagé depuis votre frontend vers votre backend à chaque requête que vous souhaitez suivre.

a. Inclure openReplaySession.id dans les requêtes d’API du frontend

Section titled a. Inclure openReplaySession.id dans les requêtes d’API du frontend

Remarque : tracker.start() est asynchrone et renvoie une promesse. Vous devez attendre sa résolution avant d’appeler tracker.getSessionID() afin de garantir que l’identifiant de session est disponible.

// JavaScript Example for for Single Page Applications (SPA):

// Import OpenReplay
import OpenReplay from '@openreplay/tracker';

// Initialize the tracker
const tracker = new OpenReplay({
  projectKey: 'YOUR_PROJECT_KEY',
});

// Start the tracker and wait for it to resolve
tracker.start().then(() => {
  // Get the session ID after the tracker has started
  const sessionId = tracker.getSessionID();

  const headers = {
    'Content-Type': 'application/json',
  };

  if (sessionId) {
    headers['openReplaySession.id'] = sessionId;
  }

  // Make the API request
  fetch('https://www.your-backend.com/api/endpoint', {
    method: 'GET', // or 'POST', 'PUT', etc.
    headers,
    // ...other options
  })
    .then(response => {
      // Handle response
    })
    .catch(error => {
      // Handle error
    });
});

b. Inclure openReplaySession.id dans les journaux backend

Section titled b. Inclure openReplaySession.id dans les journaux backend

Pour qu’OpenReplay puisse associer une entrée de journal Elasticsearch à la session utilisateur enregistrée, l’openReplaySession.id doit être inclus dans chaque erreur backend que vous souhaitez suivre.

import logging
from flask import Flask, request, g

app = Flask(__name__)

# Configure the root logger
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger()

# Create a custom logging filter
class OpenReplayFilter(logging.Filter):
    def filter(self, record):
        session_id = getattr(g, 'openreplay_session_id', None)
        if session_id:
            record.msg = f"[openReplaySession.id={session_id}] {record.msg}"
        return True

# Add the filter to the logger
logger.addFilter(OpenReplayFilter())

@app.before_request
def before_request():
    # Extract the session ID from headers and store it in the Flask `g` object
    g.openreplay_session_id = request.headers.get('openReplaySession.id')

@app.route('/api/endpoint')
def api_endpoint():
    # Your logic here

    # Log an event with the session ID automatically included
    logger.info("Endpoint accessed")

    return 'Success', 200

@app.errorhandler(Exception)
def handle_exception(e):
    # Log the error with the session ID automatically included
    logger.error(f"Error: {str(e)}")
    return 'Internal Server Error', 500

if __name__ == '__main__':
    app.run()

4. Considérations particulières

Section titled 4. Considérations particulières

Par défaut, OpenReplay recherche chaque journal associé à une session OpenReplay à l’aide des attributs message et utc_time. Il se concentre sur les journaux d’erreurs, identifiés en vérifiant si l’attribut tags contient la valeur error.

Remarque :

  • Structure de journal personnalisée : Si vos journaux ont une structure différente, vous devrez peut-être ajuster votre configuration de journalisation ou en informer le support OpenReplay afin de prendre en charge votre configuration.
  • Identification des erreurs : Assurez-vous que les journaux d’erreurs sont correctement étiquetés afin qu’OpenReplay puisse les identifier.

Si vous rencontrez des problèmes, rejoignez notre Slack ou consultez notre Forum et obtenez de l’aide de notre communauté.