指标和日志记录
如何监控 Apollo Server 的性能
Apollo Server 与 Apollo GraphOS 无缝集成,帮助您监控 GraphQL 操作的执行。此外,Apollo Server 还提供了一组可配置的机制来记录 GraphQL 操作的每个阶段。
使用联邦功能?请查看有关 联邦跟踪 的文档。
向 GraphOS 发送指标
Apollo GraphOS 提供了一个集成的中心点,用于所有 GraphQL 性能数据,您可以在 Apollo Studio 中查看。Studio 聚合和显示 您的架构、查询、请求和错误信息。您还可以配置支持 Slack 和 Datadog 集成的警报。
连接到 GraphOS
要将 Apollo Server 连接到 GraphOS,首先 获取一个图 API 密钥。要将此密钥提供给 Apollo Server,将其分配给服务器环境中的 APOLLO_KEY
环境变量。APOLLO_KEY
环境变量
然后,通过设置APOLLO_GRAPH_REF
环境变量,将您的服务器实例与特定的图 ID 和图变体关联起来。
您可以在命令行上设置环境变量值,如下所示,也可以使用 dotenv
npm 包(或其他类似工具)。
# Replace the example values below with values specific to your use case.# This example associates your server with the `my-variant` variant of# the `my-graph` graph.$ APOLLO_KEY=YOUR_API_KEY APOLLO_GRAPH_REF=my-graph@my-variant \node start-server.js
与工作室通信
默认情况下,Apollo Server每分钟将您的跟踪批量发送到工作室。这种行为可以高度自定义,您可以在使用报告插件配置中更改参数。
识别独立客户端
Apollo Studio的客户端识别功能使您能夠查看客户端不同版本的指标。要启用此功能,您的客户端需要在其发送给Apollo Server的GraphQL请求的标题中包含以下识别信息之一或全部:
标识符 | 标题名称(默认) | 示例值 |
---|---|---|
客户端名称 | apollographql-client-name | iOS原生 |
客户端版本 | apollographql-client-version | 1.0.1 |
这些字段可以有任何对您的应用程序有用的字符串值。为了简化在工作室中浏览和排序您的客户端数据,建议客户端版本使用三部分版本号(如1.0.1
)。
客户端版本与您当前版本的不绑定在Apollo Client(或任何其他客户端库)。您定义此值,并负责在客户端对重要更改后更新它。
在Apollo Client中设置客户端识别标题
如果您正在使用Apollo Client,您可以在ApolloClient
构造函数中设置客户端名称和版本的默认值。所有发送到Apollo Server的请求将自动将这些值包含在适当的标题中。
使用自定义标题
对于更高级的情况或要使用除默认标题之外的标题,请将generateClientInfo
函数传递到使用报告插件:
import { ApolloServer } from '@apollo/server';import { ApolloServerPluginUsageReporting } from '@apollo/server/plugin/usageReporting';const server = new ApolloServer({typeDefs,resolvers,plugins: [ApolloServerPluginUsageReporting({generateClientInfo: ({ request }) => {const headers = request.http && request.http.headers;if (headers) {return {clientName: headers['apollographql-client-name'],clientVersion: headers['apollographql-client-version'],};} else {return {clientName: 'Unknown Client',clientVersion: 'Unversioned',};}},}),],});const { url } = await startStandaloneServer(server);console.log(`🚀 Server listening at: ${url}`);
import { ApolloServer } from '@apollo/server';import { ApolloServerPluginUsageReporting } from '@apollo/server/plugin/usageReporting';const server = new ApolloServer({typeDefs,resolvers,plugins: [ApolloServerPluginUsageReporting({generateClientInfo: ({ request }) => {const headers = request.http && request.http.headers;if (headers) {return {clientName: headers['apollographql-client-name'],clientVersion: headers['apollographql-client-version'],};} else {return {clientName: 'Unknown Client',clientVersion: 'Unversioned',};}},}),],});const { url } = await startStandaloneServer(server);console.log(`🚀 Server listening at: ${url}`);
日志记录
您可以在 Apollo Server 中设置粒度详细的操作日志,方法是通过定义一个自定义插件。Apollo Server 插件允许您在 GraphQL 请求生命周期的各个阶段执行操作,例如当从客户端接收到 GraphQL 请求时。
以下示例定义了一个响应三个不同操作事件的插件。正如所示,您将这些定义的插件
数组提供给ApolloServer
构造函数。
有关可用的生命周期事件及其描述的列表,请参阅插件。
const myPlugin = {// Fires whenever a GraphQL request is received from a client.async requestDidStart(requestContext) {console.log('Request started! Query:\n' + requestContext.request.query);return {// Fires whenever Apollo Server will parse a GraphQL// request to create its associated document AST.async parsingDidStart(requestContext) {console.log('Parsing started!');},// Fires whenever Apollo Server will validate a// request's document AST against your GraphQL schema.async validationDidStart(requestContext) {console.log('Validation started!');},};},};const server = new ApolloServer({typeDefs,resolvers,plugins: [myPlugin],});
const myPlugin = {// Fires whenever a GraphQL request is received from a client.async requestDidStart(requestContext) {console.log('Request started! Query:\n' + requestContext.request.query);return {// Fires whenever Apollo Server will parse a GraphQL// request to create its associated document AST.async parsingDidStart(requestContext) {console.log('Parsing started!');},// Fires whenever Apollo Server will validate a// request's document AST against your GraphQL schema.async validationDidStart(requestContext) {console.log('Validation started!');},};},};const server = new ApolloServer({typeDefs,resolvers,plugins: [myPlugin],});