@ apollo/ 客户端的反向- Native 监视
概览
用真实用户监控( RUM) 监视您的 GraphQL 资源, 并进行以下操作 :
- 识别图QL 查询和变异
- 识别用于查询和变异的图QL变量
- 识别 GraphQL 查询有效载荷
- 从响应中抓取 GraphQL 错误
RUM 支持 GraphQL 请求 @ apollo/ 客户端。 。 。 .
设置
先决条件
在您的移动回放原生应用程序上设置 RUM React Independent SDK 。 更多信息见 RUM 反应原生监测。 。 。 .
添加 @apollo/client (v3.0+)和 (v graphql (v15.0+) 您的应用程序 正式安装文件。 。 。 .
工具您的阿波罗客户端
迁移到 HttpLink
如果你以 uri 参数,以 HttpLink数字 :
import { ApolloClient, HttpLink } from '@apollo/client';
// before
const apolloClient = new ApolloClient({
uri: 'https://my.api.com/graphql'
});
// after
const apolloClient = new ApolloClient({
link: new HttpLink({ uri: 'https://my.api.com/graphql' })
});
使用数据犬阿波罗客户端链接来收集信息
导入 DatadogLink 从 @datadog/mobile-react-native-apollo-client 并用在您的 Apollocent 初始化中 :
import { ApolloClient, from, HttpLink } from '@apollo/client';
import { DatadogLink } from '@datadog/mobile-react-native-apollo-client';
const apolloClient = new ApolloClient({
link: from([
new DatadogLink(),
new HttpLink({ uri: 'https://my.api.com/graphql' }) // always in last position
])
});
配置选项
您可以将选项传递给 DatadogLink 控制所收集数据的构造器:
new DatadogLink({
trackVariables: true, // track GraphQL operation variables (default: true)
trackPayload: false, // track the GraphQL query payload (default: false)
trackErrors: false // track GraphQL errors from the response (default: false)
});
| 选项 | 默认 | 说明 |
|---|---|---|
trackVariables | true | 收集传送到 GraphQL 操作的变量 。 您可以使用 resourceEventMapper。 。 。 . |
trackPayload | false | 收集 GraphQL 查询字符串( 操作机构) . |
trackErrors | false | 在 GraphQL 回复中收集错误 errors 阵列。 仅 message, (中文(简体) ), code, (中文(简体) ), locations,以及 path 字段; 所有其他字段(如 extensions 细节和 stacktrace)被过滤出. |
关于阿波罗客户端链接的更多信息,请参见 正式文件。 。 。 .
编辑敏感的图形QL数据
使用一个 resourceEventMapper 用于编辑或从 GraphQL 属性中去掉敏感数据。 在资源事件上下文中,变量、有效载荷和出错都作为JSON字符串存储.
const datadogConfiguration = new DatadogProviderConfiguration(
'<CLIENT_TOKEN>',
'<ENVIRONMENT_NAME>',
TrackingConsent.GRANTED,
{
rumConfiguration: {
applicationId: '<RUM_APPLICATION_ID>',
trackResources: true
}
}
);
datadogConfiguration.resourceEventMapper = event => {
const context = event.context as Record<string, string>;
// Redact sensitive variables
if (context['_dd.graphql.variables']) {
const variables = JSON.parse(context['_dd.graphql.variables']);
if (variables.password) {
variables.password = '***';
}
context['_dd.graphql.variables'] = JSON.stringify(variables);
}
// Drop the payload entirely for a specific operation
if (context['_dd.graphql.operation_name'] === 'TestOperation') {
delete context['_dd.graphql.payload'];
}
// Redact error messages
if (context['_dd.graphql.errors']) {
const errors = JSON.parse(context['_dd.graphql.errors']);
for (const error of errors) {
error.message = error.message.replace(/email=\S+/g, 'email=***');
}
context['_dd.graphql.errors'] = JSON.stringify(errors);
}
return event;
};