如何使用 Elastic APM Ruby 代理装载 Ruby 应用

将性能指标从 Ruby 应用发送到 APM 服务器就像安装 elastic-apm Rubygem 一样简单。大多数集成均为即插即用型,并且内置了对 Rails 和 Rack 的支持。

不过,您可以采用多种方式向数据添加更多信息,以及设置您自己的定制装载。

向已装载的部件添加更多信息

若要向已收集的数据添加更多信息,需要先了解 Elastic APM 的一些概念。

假设您的应用是围绕 companies 概念构建的,您可以为每个事务和错误分配 current_company.short_name。标记是简单的_键值_对,它们在 Elasticsearch 中编入索引,因此,既可筛选也可查询,您可以采用任何所需的方式对指标进行切片和分块:

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company, current_company.short_name
  end
end

这样可让您更轻松查看某些性能问题或异常是否只影响到您的部分客户。

仅列出 Opbeans 公司的请求

用户是另一个广泛使用的概念,Elastic APM 中也包含了这一概念:

class ApplicationController < ActionController::Base
  before_action do
    ElasticAPM.set_label :company_id, current_company.id
    ElasticAPM.set_user current_user
  end
end

代理将包括所传递内容的 idemailusername 字段。当然,您也可以将这些字段定制为在应用中可能调用的任何字段

SpanHelpers 模块

如果您想要跟踪某个方法的持续时间,则可以使用 Spanhelpers 模块。它提供了两个方法:span_methodspan_class_method

class ThingsController < ApplicationController
  include ElasticAPM::SpanHelpers

  # ...

  def do_the_work
    # ...
  end
  span_method :do_the_work

  def self.do_other_work
    # ...
  end
  span_class_method :do_other_work

  # ... alternative syntax for newer versions of Ruby

  span_method \
  def do_the_work
    # ...
  end
end

请参阅 Elastic APM Ruby 代理 SpanHelpers 文档

如果您要测量的是一个简单的方法调用,那么这种方法会非常适用。如果您希望进行更细粒度的控制,则需要使用通用的 API。

手动创建事务和跨度

为了手动创建事务和跨度,代理还提供了一个公共 API。代理本身在内部使用这个 API 来装载大多数受支持的库。

您首先要用到的就是_事务_。如果您处于 Rails 应用、使用中间件的 Rack 应用的请求中,或其中一个受支持作业运行程序的后台作业中,那么您很可能已经处于事务中了。

如果不是这样,请创建一个类似如下的事务:

ElasticAPM.start # if it isn't started already

begin
  transaction = ElasticAPM.start_transaction 'Optional name', 'optional.type'
  # It's your responsibility to make sure the transactions are ended.
  # To make sure we do so, we wrap in begin..ensure.
ensure
  ElasticAPM.end_transaction
end

或者,有一个相同的块版本,确保在之后结束:

ElasticAPM.with_transaction do |transaction|
  # if you need to, you can alter the transaction inside, eg:
  transaction.name = method_that_returns_the_name

  # be aware that if the agent isn't started, `transaction` is nil but the block is still evaluated
end

在事务内部,_跨度_是应用执行的各个工作块。如果您使用任何自动装载的库,则所有您需要做的就是将它们包装在事务中。

如果需要额外跨度,则 API 将匹配事务:

begin
  span = ElasticAPM.start_span 'Required name', 'optional.type'
ensure
  ElasticAPM.end_span
end

# Or the block form
ElasticAPM.with_span 'Hard work' do |span|
  # ...
end

为什么花费这么长时间…噢

有关这个公共 API,请参阅 APM Ruby 代理文档

容易上手,轻松扩展

我们已经尽力使 Ruby APM 代理的初始设置尽可能简单。如果您不想且不需要上述任何设置,您仍可以获取很多有用的信息。

不过,如果您想动手仔细研究应用程序的每个部分,Elastic APM 也提供了这样的工具。

立即试用

您的 Ruby 运行得怎么样?它把时间都花哪儿了?您应将下一个冲刺的重点放在哪里才能提升用户体验呢?Elastic APM 和 Ruby 代理可以帮助回答所有这些问题以及更多疑问。装载您的应用,可以下载 Elastic Stack 并在本地运行,也可以通过一个免费试用版(其中包括 APM Server)将您的跟踪发送到 Elastic Cloud 上的 Elasticsearch 服务。一如既往,如果您有任何问题、想法、看法或顾虑,请访问讨论论坛。