elastic-apm 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.ci/.jenkins_exclude.yml +47 -0
- data/.ci/.jenkins_framework.yml +4 -0
- data/.ci/.jenkins_master_framework.yml +1 -0
- data/.ci/.jenkins_ruby.yml +1 -0
- data/.ci/downstreamTests.groovy +1 -1
- data/.gitignore +2 -1
- data/.rspec +1 -0
- data/CHANGELOG.asciidoc +24 -0
- data/Dockerfile +43 -0
- data/Gemfile +34 -15
- data/README.md +30 -1
- data/bin/dev +54 -0
- data/bin/run-tests +27 -0
- data/docker-compose.yml +32 -0
- data/docs/api.asciidoc +13 -2
- data/docs/configuration.asciidoc +30 -0
- data/docs/getting-started-rack.asciidoc +24 -0
- data/docs/release-notes.asciidoc +1 -1
- data/lib/elastic_apm.rb +12 -1
- data/lib/elastic_apm/agent.rb +15 -3
- data/lib/elastic_apm/central_config.rb +39 -19
- data/lib/elastic_apm/child_durations.rb +42 -0
- data/lib/elastic_apm/config.rb +27 -11
- data/lib/elastic_apm/context/request/socket.rb +1 -1
- data/lib/elastic_apm/context_builder.rb +1 -1
- data/lib/elastic_apm/error.rb +10 -0
- data/lib/elastic_apm/error/exception.rb +7 -0
- data/lib/elastic_apm/grape.rb +48 -0
- data/lib/elastic_apm/instrumenter.rb +77 -4
- data/lib/elastic_apm/logging.rb +0 -2
- data/lib/elastic_apm/metrics.rb +39 -26
- data/lib/elastic_apm/metrics/breakdown_set.rb +14 -0
- data/lib/elastic_apm/metrics/{cpu_mem.rb → cpu_mem_set.rb} +62 -54
- data/lib/elastic_apm/metrics/metric.rb +117 -0
- data/lib/elastic_apm/metrics/set.rb +106 -0
- data/lib/elastic_apm/metrics/span_scoped_set.rb +39 -0
- data/lib/elastic_apm/metrics/transaction_set.rb +11 -0
- data/lib/elastic_apm/metrics/vm_set.rb +44 -0
- data/lib/elastic_apm/metricset.rb +31 -4
- data/lib/elastic_apm/normalizers.rb +6 -0
- data/lib/elastic_apm/normalizers/grape.rb +5 -0
- data/lib/elastic_apm/normalizers/grape/endpoint_run.rb +47 -0
- data/lib/elastic_apm/normalizers/rails/active_record.rb +16 -5
- data/lib/elastic_apm/opentracing.rb +4 -4
- data/lib/elastic_apm/rails.rb +12 -2
- data/lib/elastic_apm/railtie.rb +1 -5
- data/lib/elastic_apm/sinatra.rb +1 -1
- data/lib/elastic_apm/span.rb +15 -10
- data/lib/elastic_apm/spies.rb +0 -1
- data/lib/elastic_apm/sql_summarizer.rb +8 -6
- data/lib/elastic_apm/subscriber.rb +4 -1
- data/lib/elastic_apm/transaction.rb +6 -6
- data/lib/elastic_apm/transport/base.rb +7 -0
- data/lib/elastic_apm/transport/connection.rb +11 -69
- data/lib/elastic_apm/transport/connection/http.rb +43 -35
- data/lib/elastic_apm/transport/connection/proxy_pipe.rb +0 -3
- data/lib/elastic_apm/transport/headers.rb +62 -0
- data/lib/elastic_apm/transport/serializers.rb +0 -2
- data/lib/elastic_apm/transport/serializers/metricset_serializer.rb +19 -6
- data/lib/elastic_apm/transport/serializers/span_serializer.rb +3 -3
- data/lib/elastic_apm/transport/user_agent.rb +31 -0
- data/lib/elastic_apm/transport/worker.rb +1 -2
- data/lib/elastic_apm/version.rb +1 -1
- metadata +20 -6
- data/lib/elastic_apm/metrics/vm.rb +0 -60
- data/lib/elastic_apm/util/prefixed_logger.rb +0 -18
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: d6058bb61034dc14b1b22a3a5f45a592721b968d314bb5f63ca171c600bbb1bc
         | 
| 4 | 
            +
              data.tar.gz: fffcd9160ec251a5ad51aae149dbfc3f50cf16b3fc866385f24f83f555b8b804
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: f7a8bd72f34f7158619c124e4eff24c9b5d57e68c3b5761b1a6305e632f3aff549be7ed37924775d8ad61119f99a87081567969c0e386641b8789662ff3f54ca
         | 
| 7 | 
            +
              data.tar.gz: a8ce8dc0c3a3def4e08ca68b33d73c288bb6ca1fe6a6ff5fd0bbfe5e03f695848855c91b024e28e2ad0872895afa5659c8ff07f06b16277ea9755c0598d711b9
         | 
    
        data/.ci/.jenkins_exclude.yml
    CHANGED
    
    | @@ -4,6 +4,8 @@ exclude: | |
| 4 4 | 
             
                FRAMEWORK: rails-4.2
         | 
| 5 5 | 
             
              - RUBY_VERSION: jruby:9.1
         | 
| 6 6 | 
             
                FRAMEWORK: rails-4.2
         | 
| 7 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-13-jdk
         | 
| 8 | 
            +
                FRAMEWORK: rails-4.2
         | 
| 7 9 | 
             
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-12-jdk
         | 
| 8 10 | 
             
                FRAMEWORK: rails-4.2
         | 
| 9 11 | 
             
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-11-jdk
         | 
| @@ -33,6 +35,8 @@ exclude: | |
| 33 35 | 
             
                FRAMEWORK: rails-master
         | 
| 34 36 | 
             
              - RUBY_VERSION: jruby:9.1
         | 
| 35 37 | 
             
                FRAMEWORK: rails-master
         | 
| 38 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-13-jdk
         | 
| 39 | 
            +
                FRAMEWORK: rails-master
         | 
| 36 40 | 
             
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-12-jdk
         | 
| 37 41 | 
             
                FRAMEWORK: rails-master
         | 
| 38 42 | 
             
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-11-jdk
         | 
| @@ -52,6 +56,8 @@ exclude: | |
| 52 56 | 
             
                FRAMEWORK: sinatra-master
         | 
| 53 57 | 
             
              - RUBY_VERSION: jruby:9.1
         | 
| 54 58 | 
             
                FRAMEWORK: sinatra-master
         | 
| 59 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-13-jdk
         | 
| 60 | 
            +
                FRAMEWORK: sinatra-master
         | 
| 55 61 | 
             
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-12-jdk
         | 
| 56 62 | 
             
                FRAMEWORK: sinatra-master
         | 
| 57 63 | 
             
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-11-jdk
         | 
| @@ -61,3 +67,44 @@ exclude: | |
| 61 67 | 
             
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.1-7-jdk
         | 
| 62 68 | 
             
                FRAMEWORK: sinatra-master
         | 
| 63 69 |  | 
| 70 | 
            +
              - RUBY_VERSION: ruby:2.5
         | 
| 71 | 
            +
                FRAMEWORK: grape-master
         | 
| 72 | 
            +
              - RUBY_VERSION: ruby:2.4
         | 
| 73 | 
            +
                FRAMEWORK: grape-master
         | 
| 74 | 
            +
              - RUBY_VERSION: ruby:2.3
         | 
| 75 | 
            +
                FRAMEWORK: grape-master
         | 
| 76 | 
            +
              - RUBY_VERSION: jruby:9.2
         | 
| 77 | 
            +
                FRAMEWORK: grape-master
         | 
| 78 | 
            +
              - RUBY_VERSION: jruby:9.1
         | 
| 79 | 
            +
                FRAMEWORK: grape-master
         | 
| 80 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-13-jdk
         | 
| 81 | 
            +
                FRAMEWORK: grape-master
         | 
| 82 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-12-jdk
         | 
| 83 | 
            +
                FRAMEWORK: grape-master
         | 
| 84 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-11-jdk
         | 
| 85 | 
            +
                FRAMEWORK: grape-master
         | 
| 86 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-8-jdk
         | 
| 87 | 
            +
                FRAMEWORK: grape-master
         | 
| 88 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.1-7-jdk
         | 
| 89 | 
            +
                FRAMEWORK: grape-master
         | 
| 90 | 
            +
             | 
| 91 | 
            +
              - RUBY_VERSION: ruby:2.5
         | 
| 92 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 93 | 
            +
              - RUBY_VERSION: ruby:2.4
         | 
| 94 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 95 | 
            +
              - RUBY_VERSION: ruby:2.3
         | 
| 96 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 97 | 
            +
              - RUBY_VERSION: jruby:9.2
         | 
| 98 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 99 | 
            +
              - RUBY_VERSION: jruby:9.1
         | 
| 100 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 101 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-13-jdk
         | 
| 102 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 103 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-12-jdk
         | 
| 104 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 105 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-11-jdk
         | 
| 106 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 107 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.2-8-jdk
         | 
| 108 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
| 109 | 
            +
              - RUBY_VERSION: docker.elastic.co/observability-ci/jruby:9.1-7-jdk
         | 
| 110 | 
            +
                FRAMEWORK: grape-1.2,sinatra-2.0,rails-6.0
         | 
    
        data/.ci/.jenkins_framework.yml
    CHANGED
    
    
    
        data/.ci/.jenkins_ruby.yml
    CHANGED
    
    | @@ -5,6 +5,7 @@ RUBY_VERSION: | |
| 5 5 | 
             
              - ruby:2.3
         | 
| 6 6 | 
             
              - jruby:9.2
         | 
| 7 7 | 
             
              - jruby:9.1
         | 
| 8 | 
            +
              - docker.elastic.co/observability-ci/jruby:9.2-13-jdk
         | 
| 8 9 | 
             
              - docker.elastic.co/observability-ci/jruby:9.2-12-jdk
         | 
| 9 10 | 
             
              - docker.elastic.co/observability-ci/jruby:9.2-11-jdk
         | 
| 10 11 | 
             
              - docker.elastic.co/observability-ci/jruby:9.2-8-jdk
         | 
    
        data/.ci/downstreamTests.groovy
    CHANGED
    
    | @@ -117,7 +117,7 @@ class RubyParallelTaskGenerator extends DefaultParallelTaskGenerator { | |
| 117 117 | 
             
                    } finally {
         | 
| 118 118 | 
             
                      steps.junit(allowEmptyResults: true,
         | 
| 119 119 | 
             
                        keepLongStdio: true,
         | 
| 120 | 
            -
                        testResults: "**/spec/ruby-agent-junit.xml")
         | 
| 120 | 
            +
                        testResults: "**/spec/junit-reports/**/ruby-agent-junit.xml")
         | 
| 121 121 | 
             
                      if (steps.isCodecovEnabled(x, y)) {
         | 
| 122 122 | 
             
                        steps.codecov(repo: "${steps.env.REPO}", basedir: "${steps.env.BASE_DIR}",
         | 
| 123 123 | 
             
                                      secret: "${steps.env.CODECOV_SECRET}")
         | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rspec
    CHANGED
    
    
    
        data/CHANGELOG.asciidoc
    CHANGED
    
    | @@ -28,6 +28,30 @@ endif::[] | |
| 28 28 | 
             
            - Fix {pull}2526[#2526]
         | 
| 29 29 | 
             
            ////
         | 
| 30 30 |  | 
| 31 | 
            +
            [[release-notes-3.x]]
         | 
| 32 | 
            +
            === Ruby Agent version 3.x
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            [[release-notes-3.2.0]]
         | 
| 35 | 
            +
            ==== 3.2.0 (2019-11-19)
         | 
| 36 | 
            +
             | 
| 37 | 
            +
            [float]
         | 
| 38 | 
            +
            ===== Added
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            - Add Grape support. {pull}562[#562]
         | 
| 41 | 
            +
            - Add Breakdown Metrics {pull}526[#526]
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            [float]
         | 
| 44 | 
            +
            ===== Changes
         | 
| 45 | 
            +
             | 
| 46 | 
            +
            - Set remote_addr to immediate socket {pull}615[#615]
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            [float]
         | 
| 49 | 
            +
            ===== Fixed
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            - Fixed pulling config from Kibana {pull}594[#594]
         | 
| 52 | 
            +
            - Fixed a bug where the agent would alter the original cookies hash {pull}616[#616]
         | 
| 53 | 
            +
             | 
| 54 | 
            +
             | 
| 31 55 | 
             
            [[release-notes-3.x]]
         | 
| 32 56 | 
             
            === Ruby Agent version 3.x
         | 
| 33 57 |  | 
    
        data/Dockerfile
    ADDED
    
    | @@ -0,0 +1,43 @@ | |
| 1 | 
            +
            ARG RUBY_IMAGE
         | 
| 2 | 
            +
            FROM ${RUBY_IMAGE}
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            ARG USER_ID_GROUP
         | 
| 5 | 
            +
            ARG FRAMEWORKS
         | 
| 6 | 
            +
            ARG VENDOR_PATH
         | 
| 7 | 
            +
            ARG BUNDLER_VERSION
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            # For tzdata
         | 
| 10 | 
            +
            # ENV DEBIAN_FRONTEND=noninteractive
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            RUN apt-get update -qq \
         | 
| 13 | 
            +
                  && apt-get install -qq -y --no-install-recommends \
         | 
| 14 | 
            +
                    build-essential libpq-dev git \
         | 
| 15 | 
            +
                  && rm -rf /var/lib/apt/lists/*
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            # Configure bundler and PATH
         | 
| 18 | 
            +
            ENV LANG=C.UTF-8
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            ENV GEM_HOME=$VENDOR_PATH
         | 
| 21 | 
            +
            ENV BUNDLE_PATH=$GEM_HOME \
         | 
| 22 | 
            +
              BUNDLE_JOBS=4 BUNDLE_RETRY=3
         | 
| 23 | 
            +
            ENV BUNDLE_APP_CONFIG=$BUNDLE_PATH \
         | 
| 24 | 
            +
              BUNDLE_BIN=$BUNDLE_PATH/bin
         | 
| 25 | 
            +
            ENV PATH=/app/bin:$BUNDLE_BIN:$PATH
         | 
| 26 | 
            +
             | 
| 27 | 
            +
            ENV FRAMEWORKS $FRAMEWORKS
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            RUN mkdir -p $VENDOR_PATH \
         | 
| 30 | 
            +
                  && chown -R $USER_ID_GROUP $VENDOR_PATH
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            USER $USER_ID_GROUP
         | 
| 33 | 
            +
             | 
| 34 | 
            +
            # Upgrade RubyGems and install required Bundler version
         | 
| 35 | 
            +
            RUN gem update --system && \
         | 
| 36 | 
            +
                  gem install bundler:$BUNDLER_VERSION
         | 
| 37 | 
            +
             | 
| 38 | 
            +
            # Use unpatched, system version for more speed over less security
         | 
| 39 | 
            +
            RUN gem install nokogiri -- --use-system-libraries
         | 
| 40 | 
            +
            # Rake is required to build http-parser on some jruby images
         | 
| 41 | 
            +
            RUN gem install rake
         | 
| 42 | 
            +
             | 
| 43 | 
            +
            WORKDIR /app
         | 
    
        data/Gemfile
    CHANGED
    
    | @@ -4,15 +4,17 @@ source 'https://rubygems.org' | |
| 4 4 |  | 
| 5 5 | 
             
            git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
         | 
| 6 6 |  | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 7 | 
            +
            # Tools
         | 
| 8 | 
            +
            gem 'bootsnap', require: false
         | 
| 9 | 
            +
            gem 'pry'
         | 
| 9 10 | 
             
            gem 'rack-test'
         | 
| 10 | 
            -
            gem 'rspec'
         | 
| 11 | 
            +
            gem 'rspec', '~> 3'
         | 
| 11 12 | 
             
            gem 'rspec-its'
         | 
| 12 13 | 
             
            gem 'rubocop', require: nil
         | 
| 13 14 | 
             
            gem 'timecop'
         | 
| 14 15 | 
             
            gem 'webmock'
         | 
| 15 16 |  | 
| 17 | 
            +
            # Integrations
         | 
| 16 18 | 
             
            gem 'elasticsearch', require: nil
         | 
| 17 19 | 
             
            gem 'fakeredis', require: nil
         | 
| 18 20 | 
             
            gem 'faraday', require: nil
         | 
| @@ -28,30 +30,47 @@ gem 'yard', require: nil | |
| 28 30 | 
             
            gem 'yarjuf'
         | 
| 29 31 |  | 
| 30 32 | 
             
            if RUBY_PLATFORM == 'java'
         | 
| 33 | 
            +
              gem 'activerecord-jdbcsqlite3-adapter'
         | 
| 31 34 | 
             
              gem 'jdbc-sqlite3'
         | 
| 32 35 | 
             
            else
         | 
| 33 36 | 
             
              gem 'sqlite3'
         | 
| 34 37 | 
             
            end
         | 
| 35 38 |  | 
| 36 | 
            -
             | 
| 37 | 
            -
             | 
| 39 | 
            +
            ## Install Framework
         | 
| 40 | 
            +
            GITHUB_REPOS = {
         | 
| 41 | 
            +
              'grape' => 'ruby-grape/grape',
         | 
| 42 | 
            +
              'rails' => 'rails/rails',
         | 
| 43 | 
            +
              'sinatra' => 'sinatra/sinatra'
         | 
| 44 | 
            +
            }.freeze
         | 
| 38 45 |  | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
               | 
| 44 | 
            -
             | 
| 45 | 
            -
              gem framework
         | 
| 46 | 
            +
            #                new               || legacy           || default
         | 
| 47 | 
            +
            env_frameworks = ENV['FRAMEWORKS'] || ENV['FRAMEWORK'] || ''
         | 
| 48 | 
            +
            parsed_frameworks = env_frameworks.split(',')
         | 
| 49 | 
            +
            frameworks_versions = parsed_frameworks.inject({}) do |frameworks, str|
         | 
| 50 | 
            +
              framework, *version = str.split('-')
         | 
| 51 | 
            +
              frameworks.merge(framework => version.join('-'))
         | 
| 46 52 | 
             
            end
         | 
| 47 53 |  | 
| 48 | 
            -
             | 
| 54 | 
            +
            frameworks_versions.each do |framework, version|
         | 
| 55 | 
            +
              case version
         | 
| 56 | 
            +
              when 'master'
         | 
| 57 | 
            +
                gem framework, github: GITHUB_REPOS.fetch[framework]
         | 
| 58 | 
            +
              when /.+/
         | 
| 59 | 
            +
                gem framework, "~> #{version}.0"
         | 
| 60 | 
            +
              else
         | 
| 61 | 
            +
                gem framework
         | 
| 62 | 
            +
              end
         | 
| 63 | 
            +
            end
         | 
| 49 64 |  | 
| 50 | 
            -
             | 
| 51 | 
            -
               | 
| 65 | 
            +
            if frameworks_versions.key?('rails')
         | 
| 66 | 
            +
              unless frameworks_versions['rails'] =~ /^(master|6)/
         | 
| 67 | 
            +
                gem 'delayed_job', require: nil
         | 
| 68 | 
            +
              end
         | 
| 52 69 | 
             
            end
         | 
| 53 70 |  | 
| 54 71 | 
             
            group :bench do
         | 
| 55 72 | 
             
              gem 'ruby-prof', require: nil, platforms: %i[ruby]
         | 
| 56 73 | 
             
              gem 'stackprof', require: nil, platforms: %i[ruby]
         | 
| 57 74 | 
             
            end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
            gemspec
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            # elastic-apm
         | 
| 2 | 
            -
            ## Elastic APM agent for  | 
| 2 | 
            +
            ## Elastic APM agent for Ruby
         | 
| 3 3 |  | 
| 4 4 | 
             
            [](https://apm-ci.elastic.co/job/apm-agent-ruby/job/apm-agent-ruby-mbp/job/master/) [](https://rubygems.org/gems/elastic-apm) [](https://codecov.io/gh/elastic/apm-agent-ruby)
         | 
| 5 5 |  | 
| @@ -35,6 +35,35 @@ The official Rubygem for [Elastic][] [APM][]. | |
| 35 35 | 
             
            If you find a bug, please [report an issue](https://github.com/elastic/apm-agent-ruby/issues).
         | 
| 36 36 | 
             
            For any other assistance, please open or add to a topic on the [APM discuss forum](https://discuss.elastic.co/c/apm).
         | 
| 37 37 |  | 
| 38 | 
            +
            ## Development
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            A Docker based setup is provided for development.
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            To run all specs in the official `ruby:latest` image:
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            ```sh
         | 
| 45 | 
            +
            $ bin/dev
         | 
| 46 | 
            +
            ```
         | 
| 47 | 
            +
             | 
| 48 | 
            +
            To pick a specific Ruby version, specify it with the `-i` flag:
         | 
| 49 | 
            +
             | 
| 50 | 
            +
            ```sh
         | 
| 51 | 
            +
            $ bin/dev -i jruby:9.2 
         | 
| 52 | 
            +
            ```
         | 
| 53 | 
            +
             | 
| 54 | 
            +
            If the first argument is a path starting with `spec/`, the passed specs will be run. Otherwise any arguments passed will be run as a command inside the container:
         | 
| 55 | 
            +
             | 
| 56 | 
            +
            ```sh
         | 
| 57 | 
            +
            $ bin/dev -i jruby:9.2 spec/integration/rails_spec.rb   # ✅
         | 
| 58 | 
            +
            $ bin/dev -i some_custom_image bash                     # ✅
         | 
| 59 | 
            +
            ```
         | 
| 60 | 
            +
             | 
| 61 | 
            +
            To see all options:
         | 
| 62 | 
            +
             | 
| 63 | 
            +
            ```sh
         | 
| 64 | 
            +
            $ bin/dev -h
         | 
| 65 | 
            +
            ```
         | 
| 66 | 
            +
             | 
| 38 67 | 
             
            ## License
         | 
| 39 68 |  | 
| 40 69 | 
             
            Apache 2.0
         | 
    
        data/bin/dev
    ADDED
    
    | @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require 'optparse'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            options = {}
         | 
| 7 | 
            +
            OptionParser.new do |opts|
         | 
| 8 | 
            +
              opts.banner = 'Usage: bin/dev [options] [command]'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              opts.on(
         | 
| 11 | 
            +
                '-iIMAGE', '--image=IMAGE',
         | 
| 12 | 
            +
                'Specify Docker image (eg. ruby:latest)'
         | 
| 13 | 
            +
              ) { |val| options[:image] = val }
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              opts.on(
         | 
| 16 | 
            +
                '-fFRAMEWORKS', '--frameworks=FRAMEWORKS',
         | 
| 17 | 
            +
                'Specify frameworks to test (eg. rails:master,sinatra)'
         | 
| 18 | 
            +
              ) { |val| options[:frameworks] = val }
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              opts.on(
         | 
| 21 | 
            +
                '-s', '--skip-build',
         | 
| 22 | 
            +
                'Skip building image'
         | 
| 23 | 
            +
              ) { |val| options[:skip_build] = val }
         | 
| 24 | 
            +
            end.parse!
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            USER_ID_GROUP = %w[u g].map { |f| `id -#{f}`.chomp }.join(':')
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            RUBY_IMAGE = options.fetch(:image, 'ruby:latest')
         | 
| 29 | 
            +
            FRAMEWORKS = options.fetch(:frameworks, 'rails,sinatra,grape')
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            IMAGE_PATH_SAFE = RUBY_IMAGE.gsub(':', '_')
         | 
| 32 | 
            +
            IMAGE_NAME = "apm-agent-ruby:#{IMAGE_PATH_SAFE}"
         | 
| 33 | 
            +
            VENDOR_PATH = "/vendor/#{IMAGE_PATH_SAFE}"
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            def run(cmd)
         | 
| 36 | 
            +
              "IMAGE_NAME=#{IMAGE_NAME} #{cmd}".tap do |str|
         | 
| 37 | 
            +
                puts str
         | 
| 38 | 
            +
                system str
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            unless options[:skip_build]
         | 
| 43 | 
            +
              run 'docker-compose build ' \
         | 
| 44 | 
            +
                " --build-arg RUBY_IMAGE=#{RUBY_IMAGE}" \
         | 
| 45 | 
            +
                " --build-arg USER_ID_GROUP=#{USER_ID_GROUP}" \
         | 
| 46 | 
            +
                " --build-arg FRAMEWORKS=#{FRAMEWORKS}" \
         | 
| 47 | 
            +
                " --build-arg VENDOR_PATH=#{VENDOR_PATH}"
         | 
| 48 | 
            +
              exit $?.exitstatus unless $?.success?
         | 
| 49 | 
            +
            end
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            run 'docker-compose run' \
         | 
| 52 | 
            +
              " -u #{USER_ID_GROUP}" \
         | 
| 53 | 
            +
              ' --rm' \
         | 
| 54 | 
            +
              " specs #{ARGV.join}"
         | 
    
        data/bin/run-tests
    ADDED
    
    | @@ -0,0 +1,27 @@ | |
| 1 | 
            +
            #!/bin/bash
         | 
| 2 | 
            +
            set -e
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            runRspec(){
         | 
| 5 | 
            +
              local case=${1:-""}
         | 
| 6 | 
            +
              local bn=${case}
         | 
| 7 | 
            +
             | 
| 8 | 
            +
              if [ -n "${case}" ]; then
         | 
| 9 | 
            +
                bn="$(basename ${case} _spec.rb)/"
         | 
| 10 | 
            +
              fi
         | 
| 11 | 
            +
              bundle exec rspec -f progress -f JUnit -o spec/junit-reports/${bn}ruby-agent-junit.xml ${case}
         | 
| 12 | 
            +
            }
         | 
| 13 | 
            +
            specific_spec=$1
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            if [[ $specific_spec = '' ]]; then
         | 
| 16 | 
            +
              echo 'Running all specs, including integration'
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              runRspec
         | 
| 19 | 
            +
              for i in $(find spec/integration -name '*_spec.rb')
         | 
| 20 | 
            +
              do
         | 
| 21 | 
            +
                runRspec "$i"
         | 
| 22 | 
            +
              done
         | 
| 23 | 
            +
            else
         | 
| 24 | 
            +
              echo "Running only $specific_spec"
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              runRspec $1
         | 
| 27 | 
            +
            fi
         | 
    
        data/docker-compose.yml
    ADDED
    
    | @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            version: '3.4'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            services:
         | 
| 5 | 
            +
              mongodb:
         | 
| 6 | 
            +
                image: mongo:latest
         | 
| 7 | 
            +
                volumes: ['mongodata:/data/db']
         | 
| 8 | 
            +
                ports: ['27017:27017']
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              specs:
         | 
| 11 | 
            +
                build:
         | 
| 12 | 
            +
                  context: .
         | 
| 13 | 
            +
                  args:
         | 
| 14 | 
            +
                    BUNDLER_VERSION: '2.0.2'
         | 
| 15 | 
            +
                image: '$IMAGE_NAME'
         | 
| 16 | 
            +
                environment:
         | 
| 17 | 
            +
                  HOME: '/tmp'
         | 
| 18 | 
            +
                  MONGODB_URL: 'mongodb:27017'
         | 
| 19 | 
            +
                entrypoint:
         | 
| 20 | 
            +
                  'spec/entrypoint.sh'
         | 
| 21 | 
            +
                tty: true
         | 
| 22 | 
            +
                volumes:
         | 
| 23 | 
            +
                  - .:/app:cached
         | 
| 24 | 
            +
                  - ./vendor:/vendor
         | 
| 25 | 
            +
                tmpfs:
         | 
| 26 | 
            +
                  - /tmp:exec,mode=1777
         | 
| 27 | 
            +
                depends_on:
         | 
| 28 | 
            +
                  - mongodb
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            volumes:
         | 
| 31 | 
            +
              vendor:
         | 
| 32 | 
            +
              mongodata:
         |