Version: 1.1.0This documentation is for Spitfire 1.1.0.
Connecting a Ruby service with OTel
Rails and Sinatra; traces. Values: Connecting services with OTel: overview.
Version table
| Ruby | opentelemetry-sdk |
opentelemetry-exporter-otlp |
opentelemetry-instrumentation-all |
Framework |
|---|---|---|---|---|
| 3.3 and later | 1.13.1 | 0.37.0 | 0.100.0 | Rails 7.1, 7.2, 8.x; Sinatra 2, 3, 4 |
| 3.2 | 1.10.0 | 0.32.0 | 0.91.0 | Rails 7.0 – 8.x; Sinatra 2, 3, 4 |
| 3.1 and earlier | not supported | – | – | Upgrade to Ruby 3.3 |
Find your version: ruby --version
The commands say 1.13.1, 0.37.0, 0.100.0; for Ruby 3.2 write 1.10.0, 0.32.0, 0.91.0.
Metrics and logs: not sent (the Ruby metrics and logs SDKs are not stable). Server metrics: Collector.
Verified: 2026-11-04. Source: Ruby getting started, supported Ruby versions, RubyGems opentelemetry-sdk, RubyGems opentelemetry-exporter-otlp, RubyGems opentelemetry-instrumentation-all, Rails instrumentation (Rails versions).
What you need
- Spitfire address
https://<spitfire>and OTLP receiver tokensfotlp_… - Service name
<service-name>, version<service-version>, environment<environment> - The application folder (here
/srv/app, whereGemfileis)
Linux (systemd)
- Add the gems:
cd /srv/app && bundle add opentelemetry-sdk --version 1.13.1 && bundle add opentelemetry-exporter-otlp --version 0.37.0 && bundle add opentelemetry-instrumentation-all --version 0.100.0- Rails: create
/srv/app/config/initializers/opentelemetry.rb; Sinatra: create/srv/app/config/opentelemetry.rb. Paste:
# IS_OTEL_ENABLED=true: OTel on; any other value: off.
if ENV['IS_OTEL_ENABLED'] == 'true'
require 'opentelemetry/sdk'
require 'opentelemetry/exporter/otlp'
require 'opentelemetry/instrumentation/all'
OpenTelemetry::SDK.configure(&:use_all)
end- Sinatra only: in
app.rb, underrequire 'sinatra', add:
require_relative 'config/opentelemetry'- Create the folder:
sudo mkdir -p /etc/spitfire-otel- Create
/etc/spitfire-otel/<service-name>.envand paste:
IS_OTEL_ENABLED=true
OTEL_SERVICE_NAME=<service-name>
OTEL_RESOURCE_ATTRIBUTES=service.version=<service-version>,deployment.environment=<environment>
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=https://<spitfire>/otlp/v1/traces
OTEL_EXPORTER_OTLP_TRACES_HEADERS=authorization=sfotlp_…
OTEL_TRACES_EXPORTER=otlp
OTEL_METRICS_EXPORTER=none
OTEL_LOGS_EXPORTER=none
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=0.1
NO_PROXY=<spitfire>
#OTEL_EXPORTER_OTLP_CERTIFICATE=/etc/spitfire-otel/ca.pem- Restrict its permission:
sudo chmod 600 /etc/spitfire-otel/<service-name>.env- Give the environment file to the service (
<unit>: its systemd unit):
sudo mkdir -p /etc/systemd/system/<unit>.service.d && printf '[Service]\nEnvironmentFile=/etc/spitfire-otel/<service-name>.env\n' | sudo tee /etc/systemd/system/<unit>.service.d/otel.conf >/dev/null- Restart:
sudo systemctl daemon-reload && sudo systemctl restart <unit>Docker
- Linux steps 2 and 3 in the image's source. In the
Dockerfile, afterbundle install:
RUN bundle add opentelemetry-sdk --version 1.13.1 && bundle add opentelemetry-exporter-otlp --version 0.37.0 && bundle add opentelemetry-instrumentation-all --version 0.100.0- Save the environment file (Linux steps 4–6) on the Docker machine, then run:
docker run -d --env-file /etc/spitfire-otel/<service-name>.env <image>- After an environment file change, recreate the container:
docker compose -f /srv/app/compose.yaml up -d --force-recreate <service>Kubernetes
- Prepare the image as in the Docker section. Make the environment file a Secret:
kubectl create secret generic <service-name>-otel --from-env-file=/etc/spitfire-otel/<service-name>.env --dry-run=client -o yaml | kubectl apply -f -- In the Deployment, under the container:
envFrom:
- secretRef:
name: <service-name>-otel- Restart:
kubectl rollout restart deployment/<deployment>Verify
- The gems load:
cd /srv/app && IS_OTEL_ENABLED=true bundle exec ruby -e 'require "opentelemetry/sdk"; require "opentelemetry/exporter/otlp"; require "opentelemetry/instrumentation/all"; puts "OK"'- Spitfire takes the token:
curl -s -o /dev/null -w '%{http_code}' -X POST https://<spitfire>/otlp/v1/traces -H 'Authorization: Bearer sfotlp_…' -H 'Content-Type: application/json' -d '{}' | grep -q '^200