Elastic

Como integrar o Elasticsearch com o OpenReplay e ver erros de backend junto com os session replays.

Elastic

Saiba como integrar os logs de backend do Elastic com os session replays do OpenReplay para ampliar seus recursos de monitoramento e depuração.

Dependendo da sua configuração, você pode criar uma chave de API usando o dashboard do Kibana ou por meio de comandos cURL.

Usando o dashboard do Kibana

  1. Faça login no seu dashboard do Kibana.

  2. Acesse Dev Tools: navegue até Dev Tools > Console.

  3. Crie a API Key: copie o código a seguir para o console e execute-o:

    POST /_security/api_key
    {
      "name": "openreplay-api-key",
      "role_descriptors": {
        "openreplay-role": {
          "cluster": ["all"],
          "index": [
            {
              "names": ["*log*"],
              "privileges": ["read"]
            }
          ]
        }
      }
    }
  1. Execute o comando cURL: rode o comando a seguir no seu 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'

    Substitua https://your-elasticsearch-host:port pelo host e pela porta do seu Elasticsearch, e username:password pelas suas credenciais.

Nota:

  • Por padrão, esta integração busca logs em qualquer índice que corresponda a *log*. Se você tiver um índice específico para logs que não corresponda a esse padrão, altere o campo names na requisição de criação da chave de API.
  • Para especificar vários índices, separe os nomes com vírgulas, por exemplo: "names": ["index1", "index2"].

Depois de executar o comando, você receberá uma resposta como esta:

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

Importante: copie o id e o api_key, pois você precisará deles para a integração.

Referência: Elasticsearch - Create API Key

2. Configure a integração do Elasticsearch no OpenReplay

Section titled 2. Configure a integração do Elasticsearch no OpenReplay

Na sua conta do OpenReplay, siga estas 3 etapas para concluir a correlação entre os session replays e os logs de backend do Elasticsearch.

Ative a integração do Elasticsearch

Section titled Ative a integração do Elasticsearch
  1. Vá para Preferences > Integrations no OpenReplay.
  2. Selecione a aba Backend Logging.
  3. Selecione o projeto no qual você deseja ativar a integração do Elasticsearch: localize o card da integração do Elasticsearch e clique nele.

Insira as credenciais do Elasticsearch

Section titled Insira as credenciais do Elasticsearch

Na barra lateral da integração do Elasticsearch, insira:

  • API KEY ID: o id da chave de API que você gerou.
  • API Key: o api_key da chave de API que você gerou.
  • Indexes: se você alterou o índice ao gerar a chave de API, informe aqui o(s) nome(s).
  • Clique em Add para testar a conexão.

3. Propague o openReplaySession.id

Section titled 3. Propague o openReplaySession.id

Para vincular um evento do Elasticsearch à sessão de usuário gravada, é necessário propagar um ID de sessão exclusivo (openReplaySession.id) do seu frontend para o seu backend em cada requisição que você deseja rastrear.

a. Inclua o openReplaySession.id nas requisições de API do frontend

Section titled a. Inclua o openReplaySession.id nas requisições de API do frontend

Nota: tracker.start() é assíncrono e retorna uma Promise. Você precisa esperar que ela seja resolvida antes de chamar tracker.getSessionID() para garantir que o ID da sessão esteja disponível.

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

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

// Initialize the tracker
tracker.configure({
  projectKey: 'YOUR_PROJECT_KEY',
  ingestPoint: "https://openreplay.mydomain.com/ingest", // when dealing with the self-hosted version of OpenReplay
});

// 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. Inclua o openReplaySession.id nos logs do backend

Section titled b. Inclua o openReplaySession.id nos logs do backend

Para que o OpenReplay associe uma entrada de log do Elasticsearch à sessão de usuário gravada, o openReplaySession.id deve ser incluído em cada erro de backend que você deseja rastrear.

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()

Por padrão, o OpenReplay procura cada log associado a uma sessão do OpenReplay usando os atributos message e utc_time. Ele se concentra em logs de erro, identificados verificando se o atributo tags contém o valor error.

Nota:

  • Estrutura de log personalizada: se os seus logs tiverem uma estrutura diferente, talvez seja necessário ajustar a configuração de logging ou avisar o suporte do OpenReplay para que ele acomode a sua configuração.
  • Identificação de erros: certifique-se de que os logs de erro estejam marcados adequadamente com tags para que o OpenReplay consiga identificá-los.

Se você encontrar algum problema, conecte-se ao nosso Slack e peça ajuda à nossa comunidade.