自定义事务

编辑

Elastic APM 使用事务和跨度的概念来收集性能数据:跨度衡量一个操作单元,并分组到事务中。

默认情况下,Elastic APM JS 代理会为所有支持的技术创建事务并将其发送到 apm-server。但是,如果当前的检测未提供所有洞察信息,您可以创建自定义事务来填补空白。

以下是如何使用自定义事务和跨度的示例

const transaction = apm.startTransaction('Application start', 'custom')
const url = 'http://example.com/data.json'
const httpSpan = transaction.startSpan('GET ' + url, 'external.http')
fetch(url)
  .then((resp) => {
    if (!resp.ok) {
      apm.captureError(new Error(`fetch failed with status ${resp.status} ${resp.statusText}`))
    }
    httpSpan.end()
    transaction.end()
  })

自定义事务不受代理管理,因此代理不会捕获在自动检测中显示的跨度和其他时间信息,例如 XHR、资源计时等。

创建受管理的事务

编辑

如果用户有兴趣基于支持的技术将所有其他时间信息和跨度关联到自定义事务中,他们可以在创建事务时将managed标志传递给true,并将由代理控制。但是,一旦所有关联的跨度完成,事务可能会自动关闭。如果用户想要控制此行为,他们可以创建一个阻塞跨度,该跨度将保留事务,直到调用span.end

const transaction = apm.startTransaction('custom managed', 'custom', { managed: true })
const span = transaction.startSpan('async-task', 'app', { blocking: true })

setTimeout(() => {
  span.end()
  /**
   * This would also end the managed transaction once all the blocking spans are completed and
   * transaction would also contain other timing information and spans similar to auto
   * instrumented transactions like `page-load` and `route-change`.
   */
}, 1000)

自定义事务和受管理的事务都会在调用transaction.end后以配置的间隔自动排队并一起发送。