The descriptions below assume you are in the locally cloned project root directory, i.e. apm-ruby
.
Prerequisites
- Docker
- Docker Compose
You'll need a host environment that can run the various Rake tasks to spin up development and testing containers. The following describes how to do this with rbenv.
Mac
brew install rbenv ruby-build
Linux
sudo apt install rbenv
Built from source (github)
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'eval "$(~/.rbenv/bin/rbenv init - bash)"' >> ~/.bashrc # for bash
echo 'eval "$(~/.rbenv/bin/rbenv init - zsh)"' >> ~/.zshrc # for zsh
Install ruby from rbenv:
# list latest stable versions:
rbenv install -l
# list all local versions:
rbenv install -L
# install a Ruby version:
rbenv install 3.1.2
Enable rbenv by following the instructions printed by this command:
rbenv init
Set ruby version to use. Set this at the global level to prevent .ruby-version
conflicts within the development container which bind mounts the working tree:
rbenv global 3.1.2 # set the default Ruby version for this machine
Install bundler, configure it to skip unneeded groups, then install the project dependencies to allow working with Rake tasks:
gem install bundler
bundle config set --local without development test
bundle install
Should now be able to list the Rake tasks:
bundle exec rake -T
The solarwinds_apm
gem requires a Linux run time environment. To work on the codebase we set up an Ubuntu container with the tools needed to build, install and work with the project.
Starting the container:
bundle exec rake docker_dev
In the container, set up the environment and project dependencies:
# choose the ruby version to use, setting it at the global level
rbenv versions
rbenv global <some-version>
# install project gem dependencies
bundle install
The gem can be built, installed, and run inside the development container:
# build the gem
bundle exec rake build_gem
# install the built gem
gem install builds/solarwinds_apm-<version>.gem
# load the gem
SW_APM_SERVICE_KEY=<api-token:service-name> irb -r solarwinds_apm
During install, the gem compiles a C extension called oboe which provides core functionality such as sampling and data transmission. When loading the gem from local source for development, the extension needs to be explicitly compiled:
bundle exec rake clean
bundle exec rake fetch
bundle exec rake compile
# or use the short version that does it all
bundle exec rake cfc
Now loading the gem from local source should work:
SW_APM_SERVICE_KEY=<api-token:service-name> bundle exec irb -r solarwinds_apm
Use this Rake task to run rubocop inside the development container:
bundle exec rake rubocop
It will produce the file rubocop_result.txt
. Issues found should be addressed prior to commit.
On the host machine, you can use the docker_tests
Rake task to run the test suite, or launch an interactive shell session into the test container to run specific tests or to debug.
Run the test suite:
# run tests in a ruby:3.1.0-bullseye container
bundle exec rake docker_tests
# run tests in a ruby:2.7.5 container
bundle exec rake 'docker_tests[2.7.5]'
# run tests in a ruby:3.2-alpine linux/amd64 container
bundle exec rake 'docker_tests[3.2-alpine,,linux/amd64]'
Test logs are written to the project's log
directory, which is bind mounted and available on the host machine.
Start an interactive session in the container:
bundle exec rake 'docker_tests[,false]'
In the container, set up the environment:
test/test_setup.sh
To run the full suite:
test/run_tests.sh
To run a single test file:
# most tests require just the unit.gemfile dependencies
BUNDLE_GEMFILE=gemfiles/unit.gemfile bundle update
BUNDLE_GEMFILE=gemfiles/unit.gemfile bundle exec ruby -I test test/opentelemetry/solarwinds_exporter_test.rb
BUNDLE_GEMFILE=gemfiles/unit.gemfile bundle exec ruby -I test test/opentelemetry/solarwinds_propagator_test.rb
# marginalia tests require the rails_6x.gemfile dependencies
BUNDLE_GEMFILE=gemfiles/rails_6x.gemfile bundle install
BUNDLE_GEMFILE=gemfiles/rails_6x.gemfile bundle exec ruby -I test test/support/swomarginalia/swomarginalia_test.rb
To run a specific test (that requires unit.gemfile):
BUNDLE_GEMFILE=gemfiles/unit.gemfile bundle update
BUNDLE_GEMFILE=gemfiles/unit.gemfile bundle exec ruby -I test test/opentelemetry/solarwinds_exporter_test.rb -n /test_build_meta_data/
BUNDLE_GEMFILE=gemfiles/unit.gemfile bundle exec ruby -I test test/solarwinds_apm/otel_config_test.rb -n /test_resolve_propagators_with_defaults/