RSpec Otel
RSpec matchers to be used with the OpenTelemetry framework
Installation
Add this line to your Gemfile:
gem 'rspec-otel'Within your spec helper, require the gem:
require 'rspec_otel'And include the matchers within the rspec configuration:
RSpec.configure do |config|
config.include RspecOtel::Matchers
endUsage
Matching the presence of a span
You can match the emission of a span with the emit_span matcher:
require 'spec_helper'
RSpec.describe 'User API' do
it 'emits a span' do
expect do
get :user, id: 1
end.to emit_span('GET /user')
end
endemit_span will also match a regular expression:
require 'spec_helper'
RSpec.describe 'User API' do
it 'emits a span' do
expect do
get :user, id: 1
end.to emit_span(/^GET /)
end
endSeveral conditions can be added to the matcher:
-
as_root- Will match spans that are the root of a trace. -
as_child- Will match spans that are not the root of a trace -
with_attributes- Will match only the spans with the specified attributes. -
without_attributes- Will only match the spans that do not have the specified attributes -
with_event- Will match only the spans with the specified event. -
without_event- Will only match the spans that do not have the specified event -
with_link- Will match only the spans with the specified link. -
without_link- Will only match the spans that do not have the specified link -
with_status- Will match only the spans that have the proper status. -
with_exception- Will match only the spans that have the specified exception event. -
without_exception- Will match only the spans that do not have the specified exception event.
The *_event condition can be called multiple times with different events.
Matching the presence of a metric
You can match the emission of a metric with the emit_metric matcher:
require 'spec_helper'
RSpec.describe 'User API' do
it 'emits a metric' do
expect do
get :user, id: 1
end.to emit_metric('http.server.duration')
end
endemit_metric will also match a regular expression:
expect do
get :user, id: 1
end.to emit_metric(/^http\.server\./)Several conditions can be added to the matcher:
-
of_type- Will match only metrics of the specified instrument kind (:counter,:histogram,:gauge,:up_down_counter,:observable_counter,:observable_gauge,:observable_up_down_counter). -
with_attributes- Will match only the metrics with the specified attributes on a data point. -
without_attributes- Will only match the metrics that do not have the specified attributes on any data point. -
with_value- Will match only the metrics where a data point has the specified value (applies to counters, gauges, and up-down counters). -
with_count- Will match only the metrics where a histogram data point has the specified recording count (applies to histograms only).
expect do
get :user, id: 1
end.to emit_metric('http.server.duration')
.of_type(:histogram)
.with_attributes({ 'http.request.method' => 'GET' })Disabling
We wrap every example in a new OpenTelemetry SDK configuration by default, if you wish to disable this you can tag your example with :rspec_otel_disable_tracing:
require 'spec_helper'
RSpec.describe 'User API', :rspec_otel_disable_tracing do
it 'tests my code' do
expect(true).to be true
end
endCompatibility
RSpec Otel ensures compatibility with the currently supported versions of the Ruby Language.