支持的技术

编辑

Elastic APM Ruby Agent 内置支持许多框架和库。通常,我们希望支持所有最流行的库。如果缺少您最喜欢的库,请随时在问题中提出请求,或者更好的是,创建一个拉取请求。

Ruby

编辑

我们遵循 Ruby 自己的维护策略,并根据Ruby 维护分支正式支持所有当前维护的版本。

Web 框架和库

编辑

我们自动支持 Ruby on Rails 和所有与 Rack 兼容的 Web 框架。

我们针对所有支持的 Rails、Sinatra 和 Grape 的次要版本进行测试。

Ruby on Rails

编辑

我们目前支持 4.2 版之后的 Rails 所有版本。这遵循 Rails 自己的安全策略

请参阅Rails 入门

Sinatra

编辑

我们目前支持 1.0 版之后的 Sinatra 所有版本。

请参阅Rack 入门

Grape

编辑

我们目前支持 1.2 版之后的 Grape 所有版本。

请参阅Grape 示例

数据库

编辑

我们使用以下方法自动检测数据库操作

  • ActiveRecord (v4.2+)
  • DynamoDB (v1.0+)
  • Elasticsearch (v0.9+)
  • Mongo (v2.1+)
  • Redis (v3.1+)
  • Sequel (v4.35+)

外部 HTTP 请求

编辑

我们使用以下库自动检测并为外部请求添加分布式跟踪的支持

  • net/http
  • Http.rb (v0.6+)
  • Faraday (v0.2.1+)

注意: 这些库通常在未指定 Host 时假设 localhost,因此代理也是如此。

后台处理

编辑

我们使用以下方法自动检测后台处理

  • DelayedJob
  • Sidekiq
  • Shoryuken
  • Sneakers (v2.12.0+)(实验性,请参阅#676
  • Resque (v2.0.0+)
  • SuckerPunch (v2.0.0+)

Resque

编辑

要使代理与 Resque 一起使用,您需要在启动 Resque 工作进程之前先需要 elastic_apm/resque

例如,在您的 Rakefile

require 'resque'
require 'elastic_apm'
require 'elastic_apm/resque'

启动 Resque 时,您应该在 Resque 日志中看到一系列类似以下的消息

I, [XXX #81227]  INFO -- : Starting worker main
D, [XXX #81227] DEBUG -- : Registered signals
I, [XXX #81227]  INFO -- : Running before_first_fork hooks
D, [XXX #81227] DEBUG -- : Starting ElasticAPM agent

此外,请确保将 Resque 环境变量 RUN_AT_EXIT_HOOKS 设置为 true。否则,在代理有机会将所有分叉的事件发送到 APM 服务器之前,可能会终止分叉。

SuckerPunch

编辑

SuckerPunch 中异步执行的作业会自动检测。

请注意,在用户定义的 JobClass#perform 方法中引发的错误将在由代理处理之前先由 SuckerPunch 异常处理程序处理。在 2.0 版中,可以通过 SuckerPunch.exception_handler 访问/设置处理程序。除非您在异常处理程序中重新引发错误,否则代理事务将被标记为成功。您也可以通过ElasticAPM.report在自定义 SuckerPunch 异常处理程序中显式报告错误。

gRPC

编辑

我们使用 grpc gem 自动检测 gRPC。请注意,这是实验性的,因为截至 1.27.0 版,grpc gem 对 Interceptors 的支持是实验性的。

要检测客户端,请在 Stub 创建时将 ElasticAPM::GRPC::ClientInterceptor 添加为 interceptor

Helloworld::Greeter::Stub.new(
  'localhost:50051',
  interceptors: [ElasticAPM::GRPC::ClientInterceptor.new]
)

要检测服务器,请添加 ElasticAPM::GRPC::ServerInterceptor

GRPC::RpcServer.new(interceptors: [ElasticAPM::GRPC::ServerInterceptor.new])