如何使用 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
这样可让您更轻松查看某些性能问题或异常是否只影响到您的部分客户。
用户是另一个广泛使用的概念,Elastic APM 中也包含了这一概念:
class ApplicationController < ActionController::Base
before_action do
ElasticAPM.set_label :company_id, current_company.id
ElasticAPM.set_user current_user
end
end
代理将包括所传递内容的 id
、email
和 username
字段。当然,您也可以将这些字段定制为在应用中可能调用的任何字段。
SpanHelpers
模块
如果您想要跟踪某个方法的持续时间,则可以使用 Spanhelpers
模块。它提供了两个方法:span_method
和 span_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 服务。一如既往,如果您有任何问题、想法、看法或顾虑,请访问讨论论坛。