使用apollo graphql客户端记录请求时间的正确方法是什么?

使用apollo graphql客户端记录请求时间的正确方法是什么?,graphql,apollo-client,Graphql,Apollo Client,我正在react本机应用程序上进行一些应用程序评测,我发现使用阿波罗链接记录器(以及我自己滚动的链接)得到的请求时间与Android profiler的网络通道之间存在很大差异。对于探查器中的600毫秒请求,我看到使用apollo link系统的中间件发出了2秒以上的请求 我自己的链接中没有太多内容(如下) 看起来它最终也会在阿波罗管理这个请求链所需的时间内进行分解。我已经通过直接使用fetch从其他端点获取数据并将这些时间与探查器时间(匹配)进行比较,确认这不是应用程序的一般问题 我是否应该期

我正在react本机应用程序上进行一些应用程序评测,我发现使用阿波罗链接记录器(以及我自己滚动的链接)得到的请求时间与Android profiler的网络通道之间存在很大差异。对于探查器中的600毫秒请求,我看到使用apollo link系统的中间件发出了2秒以上的请求

我自己的链接中没有太多内容(如下)

看起来它最终也会在阿波罗管理这个请求链所需的时间内进行分解。我已经通过直接使用fetch从其他端点获取数据并将这些时间与探查器时间(匹配)进行比较,确认这不是应用程序的一般问题

我是否应该期望这实际反映请求时间?在本机网络请求和我在apollo客户端中看到的时间之间的剩余时间可能会在哪里?

问题(至少在我使用的版本中)是,Zen Observable(apollo在这些链接中使用)在每次进行订阅调用时都会执行其逻辑。这意味着我收到了两个被发送的请求,因为我有两个链接,每个链接都称为subscribe并转发了已经创建的observable。我的解决方法是每次创建新的可观察对象,并将它们连接到先前链接传递的可观察对象

const metricsLink = new ApolloLink((operation, forward) => {

    const { operationName } = operation
    const startTime = new Date().getTime()
    const observable = forward(operation)

    // Return a new observable so no other links can call .subscribe on the
    // the one that we were passsed.
    return new Observable(observer => {
        observable.subscribe({
            complete: () => {
                const elapsed = new Date().getTime() - startTime
                console.warn(`[METRICS][${operationName}] (${elapsed}) complete`)
                observer.complete()
            },
            next: observer.next.bind(observer),
            error: error => {
                // ...
                observer.error(error)
            }
        })
    })
})
这对我来说似乎是一个疏忽,但至少我有一个解决办法。

从中,有一个使用链接组合测量时间的示例

注意:我已经修改了示例,使用
performance.now()
而不是基于

const timeStartLink=new ApolloLink((操作,转发)=>{
operation.setContext({start:performance.now()})
返回前进(操作)
})
const logTimeLink=新的ApolloLink((操作,转发)=>{
返回向前(操作).map(数据=>{
//来自上一链接的数据
const time=performance.now()-operation.getContext().start
console.log(`operation${operation.operationName}花费了${time}完成`)
返回数据
})
})
const link=timeStartLink.concat(logTimeLink)

您是否有其他链接/中间件?你想精确测量多少?为了这个实验,我删除了其他链接。我想测量我们等待网络请求的实际时间,这就是我在使用android profiler时看到的。至少,如果我要尝试提高性能,我需要了解我正在测量的时间与我在探查器中看到的真实网络时间之间的差异。我不确定这是否能解释如此大的差异,但Apollo客户端所做的不仅仅是处理网络请求。解析传入的JSON,将其写入缓存,等等。是的,一定是这样。实际上,我就这一点提出了一个问题()。我知道网络请求时间需要记录在哪里,但我不能从这里真正了解它。上下文文档中有一个例子正是这样做的:基本上,这个想法是创建一个链接来设置开始时间和另一个链接来计算经过的时间。你考虑过这种方法吗?
const metricsLink = new ApolloLink((operation, forward) => {

    const { operationName } = operation
    const startTime = new Date().getTime()
    const observable = forward(operation)

    // Return a new observable so no other links can call .subscribe on the
    // the one that we were passsed.
    return new Observable(observer => {
        observable.subscribe({
            complete: () => {
                const elapsed = new Date().getTime() - startTime
                console.warn(`[METRICS][${operationName}] (${elapsed}) complete`)
                observer.complete()
            },
            next: observer.next.bind(observer),
            error: error => {
                // ...
                observer.error(error)
            }
        })
    })
})