GraphQL

Плагин GraphQL для OpenReplay.

GraphQL

Этот плагин позволяет захватывать запросы GraphQL и просматривать их позже при воспроизведении записей сессий. Это очень полезно для понимания и устранения проблем. Плагин GraphQL совместим с реализациями Apollo и Relay.

npm i @openreplay/tracker-graphql

Инициализируйте пакет @openreplay/tracker как обычно и загрузите в него плагин. Вызов plugin вернёт функцию, которая принимает четыре переменные operationKind, operationName, variables, result и duration (по умолчанию 0) и возвращает result без изменений.

import Tracker from '@openreplay/tracker';
import { createGraphqlMiddleware } from '@openreplay/tracker-graphql';

const tracker = new Tracker({
  projectKey: YOUR_PROJECT_KEY,
});

export const recordGraphQL = tracker.use(createGraphqlMiddleware());

Если вы используете сетевые инструменты Relay, вы можете просто создать middleware

import { createRelayMiddleware } from '@openreplay/tracker-graphql';

const trackerMiddleware = tracker.use(createRelayMiddleware());
const network = new RelayNetworkLayer([
  // your middleware
  // ,
  trackerMiddleware,
]);

Вы можете передать функцию Sanitizer в createRelayMiddleware, чтобы очистить переменные и данные перед их отправкой в OpenReplay.

const trackerLink = tracker.use(
  createRelayMiddleware((variables) => {
    return {
      ...variables,
      password: '***',
    };
  }),
);

Либо вы можете вручную поместить вызов recordGraphQL в реализацию NetworkLayer. Если вы реализуете её стандартным способом Network.create, то вам следует сделать что-то вроде следующего:

import { createGraphqlMiddleware } from '@openreplay/tracker-graphql'; // see above for recordGraphQL definition
import { Environment } from 'relay-runtime';

const handler = tracker.use(createGraphqlMiddleware());

function fetchQuery(operation, variables, cacheConfig, uploadables) {
  return fetch('www.myapi.com/resource', {
    // ...
  })
    .then((response) => response.json())
    .then((result) =>
      handler(
        // op kind, name, variables, response, duration (default 0)
        operation.operationKind,
        operation.name,
        variables,
        result,
        duration,
      ),
    );
}

const network = Network.create(fetchQuery);

Подробности см. в Relay Network Layer.

Для Apollo вам следует создать новый ApolloLink:

import { createTrackerLink } from '@openreplay/tracker-graphql';

const trackerLink = tracker.use(createTrackerLink());
const yourLink = new ApolloLink(trackerLink);

Вы можете передать функцию Sanitizer в createRelayMiddleware, чтобы очистить переменные и данные перед их отправкой в OpenReplay.

const trackerLink = tracker.use(
  createTrackerLink((variables) => {
    return {
      ...variables,
      password: '***',
    };
  }),
);

В качестве альтернативы вы можете использовать универсальный обработчик graphql:

import { createGraphqlMiddleware } from '@openreplay/tracker-graphql'; // see above for recordGraphQL definition
import { ApolloLink } from 'apollo-link';

const handler = tracker.use(createGraphqlMiddleware());

const trackerApolloLink = new ApolloLink((operation, forward) => {
  operation.setContext({ start: performance.now() });
  return forward(operation).map((result) => {
    const time = performance.now() - operation.getContext().start;
    return handler(
      // op kind, name, variables, response, duration (default 0)
      operation.query.definitions[0].operation,
      operation.operationName,
      operation.variables,
      result,
      time,
    );
  });
});

const link = ApolloLink.from([
  trackerApolloLink,
  // ...
]);

Подробности см. в Apollo Link и Apollo Networking.

Если вы ищете практический пример использования этого плагина для захвата данных операций (мутаций и запросов) в ваших записях сессий, ознакомьтесь с нашим подробным руководством здесь.

Возникли трудности с настройкой этого плагина? Присоединяйтесь к нашему Slack или посетите наш Форум и получите помощь от нашего сообщества.