自定义事务编辑

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 后以配置的间隔自动排队并一起发送。