10

即使在过去几个月 API 的样本数超过 30k 之后,我也无法在 Firebase 性能监控中查看详细的 URL 模式。

它只是像这样显示根 API 域:

api.myAppName.in/**

而不是像

api.myAppName.in/app/v3/user/*/profile/

如果您将鼠标悬停,控制台只会在 API 上显示一个标签“未分类”并带有此消息

随着我们收集大量样本,将出现来自 api.myAppName.in 的详细 URL 模式。收集后最多允许 24 小时。

但如前所述,已经几个月了,样本超过了 30k。

我正在使用改造,如果有帮助的话。

4

2 回答 2

11

我已联系 Firebase 支持,他们的回答是:

...

  • 如此处所述,虽然性能监控会报告您应用的大多数网络请求,但可能不会报告一些。因此,建议在您的应用程序中添加对特定请求的监控。

  • 为了将请求报告给性能监控控制台,任何使用 trace.start() 启动的跟踪也必须通过调用 trace.stop() 方法来停止。
    永远不会停止的跟踪,永远不会报告。

  • 通配符仅基于路径段而不是查询字符串。为了在仪表板中进行聚合,查询字符串被忽略。
  • 对于域 abc,它的路径 abc/d/ 应该已经从几十个唯一设备请求,以便路径 abc/d/ 在您选择的过滤器的时间范围内单独显示在仪表板中。
  • 性能监控的已知问题

对于我上面提到的第四点,还有一件事要记住。假设 N 是代表我前面提到的“几十”阈值的确定数值。而且,我们正在监控以下 3 个不同的路径段: 1. www.something.com/a/ 2. www.something.com/b/ 3. www.something.com/c/

在给定的时间范围内,如果上述所有 3 条路径都收到 N-1 个命中。也就是说,不符合门槛要求。虽然从 www.something.com 的整体来看,点击次数可能几乎是 N 的 3 倍(这就是仪表板将显示的内容),但在给定的时间范围内,每条路径的单独点击未达到阈值因此,仅显示汇总的数字统计信息。

...

我用来拦截改造请求并监控请求时间的代码是:(为了安全起见,我删除了查询参数数据)

val builder = OkHttpClient.Builder()
 .addInterceptor(FirebasePerformanceInterceptor(FirebasePerformance.getInstance()))
  .build()

// Adapted from: http://qaru.site/questions/15007824/how-can-i-get-the-url-and-method-of-retrofit-request-on-onsubscribe-of-rxjava-2-custom-operator
class FirebasePerformanceInterceptor(private val performanceInstance: FirebasePerformance) : Interceptor {
  override fun intercept(chain: Interceptor.Chain): Response {
    val request = chain.request()
    //Get request values
    val url = request.url().url()
    val urlPath = getUrlWithoutQuery(url)

    val requestPayloadSize = request.body()?.contentLength() ?: 0L
    val httpMethod = request.method()

    //Initialize http trace
    val trace = performanceInstance.newHttpMetric(urlPath, httpMethod)
    trace.setRequestPayloadSize(requestPayloadSize)
    trace.start()

    //Proceed
    val response = chain.proceed(chain.request())

    //Get response values
    val responseCode = response.code()

    //Add response values to trace and close it
    trace.setHttpResponseCode(responseCode)
    trace.stop()

    return response
  }
    }

private fun getUrlWithoutQuery(url: URL): URL {
  val uri = URI(url.protocol, url.host, url.path, null)
  return uri.toURL()
}

要测试它是否正确记录:按照这个调试教程:你会看到类似的东西:

10-24 19:48:21.162 23037 24411 I FirebasePerformance: Logging NetworkRequestMetric - https://your-api-domain.com/cart 0b 147809ms,
于 2018-10-24T22:13:47.917 回答
5

Firebase 性能监控现在支持创建自定义 URL 模式,允许您定位更具体的 URL。从文档:

您可以创建自定义 URL 模式来监控 Firebase 未通过其派生的自动 URL 模式匹配捕获的特定 URL 模式。例如,您可以使用自定义 URL 模式对特定 URL 进行故障排除或随着时间的推移监控一组特定的 URL。

因此,如果您确实想捕获类似的东西api.myAppName.in/app/v3/user/*/profile/**,您现在可以

有关更多详细信息,请参阅文档

于 2019-10-30T13:53:43.980 回答