自定义跨度编辑

这是一个使用自定义跨度的示例。有关 Elastic APM Node.js Span API 的一般信息,请参阅 Span API 文档

如果你想跟踪和计时事务期间在应用程序中发生的自定义事件,则可以向现有事务添加新的跨度。

在下面的示例中,我们创建了一个 Express 应用程序,它会计时以下操作需要多长时间:

  1. 接收 HTTP POST 或 PUT 请求的正文
  2. 解析客户端发送的 JSON
var apm = require('elastic-apm-node').start()
var app = require('express')()

// body reader middleware
app.use(function (req, res, next) {
  if (req.method !== 'POST' && req.method !== 'PUT') {
    return next()
  }

  // `startSpan` will only return a span if there's an
  // active transaction
  var span = apm.startSpan('receiving body')

  var buffers = []
  req.on('data', function (chunk) {
    buffers.push(chunk)
  })
  req.on('end', function () {
    req.body = Buffer.concat(buffers).toString()

    // end the span after we're done loading data from the
    // client
    if (span) span.end()

    next()
  })
})

// JSON parser middleware
app.use(function (req, res, next) {
  if (req.headers['content-type'] !== 'application/json') {
    return next()
  }

  // start a span to measure the time it takes to parse
  // the JSON
  var span = apm.startSpan('parse json')

  try {
    req.json = JSON.parse(req.body)
  } catch (e) {}

  // when we've processed the json, stop the custom span
  if (span) span.end()

  next()
})

// ...your route handler goes here...

app.listen(3000)