ygrene_istio_tracing 1.0.2 → 1.0.3
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/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/lib/ygrene_istio_tracing.rb +4 -0
- data/lib/ygrene_istio_tracing/tracing.rb +12 -0
- data/lib/ygrene_istio_tracing/tracing/context.rb +46 -0
- data/lib/ygrene_istio_tracing/tracing/header.rb +22 -0
- data/lib/ygrene_istio_tracing/tracing/http.rb +45 -0
- data/lib/ygrene_istio_tracing/tracing/rack.rb +23 -0
- data/lib/ygrene_istio_tracing/tracing/railtie.rb +14 -0
- data/lib/ygrene_istio_tracing/version.rb +5 -0
- data/ygrene_istio_tracing.gemspec +44 -0
- metadata +12 -1
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 130a10777cc833fd87deccd676ec488a8b851fd9e875603e8aca682355ecf29a
         | 
| 4 | 
            +
              data.tar.gz: ce364a10d73bc0008010cdd6b848e4759e793a5e1fa3423ca39d2b9169cd7a24
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: a86ed190b5a3556d02dba560899e723856e950fdb3079ce0662502a3f86e41cd7e23726ad402120bf17b9cfaeafaa02871710325fd12c6b982d2ce5de8a8ed7b
         | 
| 7 | 
            +
              data.tar.gz: 34e5a7cc8bffff5b33985f9d426a5cfb1b510448859f35f3abe13a3ca1f5694f1943c45f5c5085ccfa80935036f1f92bdf8d86e3449b71b0c8385624fa8d775a
         | 
    
        data/.ruby-gemset
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            ygrene-istio-tracing
         | 
    
        data/.ruby-version
    ADDED
    
    | @@ -0,0 +1 @@ | |
| 1 | 
            +
            ruby-2.5.1
         | 
| @@ -0,0 +1,12 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'ygrene_istio_tracing/tracing/context'
         | 
| 4 | 
            +
            require 'ygrene_istio_tracing/tracing/header'
         | 
| 5 | 
            +
            require 'ygrene_istio_tracing/tracing/http'
         | 
| 6 | 
            +
            require 'ygrene_istio_tracing/tracing/rack'
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            begin
         | 
| 9 | 
            +
              require 'rails/railtie'
         | 
| 10 | 
            +
              require 'ygrene_istio_tracing/tracing/railtie'
         | 
| 11 | 
            +
            rescue LoadError
         | 
| 12 | 
            +
            end
         | 
| @@ -0,0 +1,46 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module YgreneIstioTracing
         | 
| 4 | 
            +
              module Tracing
         | 
| 5 | 
            +
                class NotSetError < ::StandardError
         | 
| 6 | 
            +
                  def initialize
         | 
| 7 | 
            +
                    super('Context is not set for this thread')
         | 
| 8 | 
            +
                  end
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                class Context
         | 
| 12 | 
            +
                  VAR_NAME = :_istio_tracing_context_
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  class << self
         | 
| 15 | 
            +
                    def current
         | 
| 16 | 
            +
                      Thread.current.thread_variable_get(VAR_NAME) || raise(NotSetError)
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    def with_given_context(ctx)
         | 
| 20 | 
            +
                      Thread.current.thread_variable_set(VAR_NAME, ctx)
         | 
| 21 | 
            +
                      yield
         | 
| 22 | 
            +
                    ensure
         | 
| 23 | 
            +
                      remove_current
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    def exists_current?
         | 
| 27 | 
            +
                      !!Thread.current.thread_variable_get(VAR_NAME)
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    def build_current(headers)
         | 
| 31 | 
            +
                      Thread.current.thread_variable_set(VAR_NAME, Context.new(headers))
         | 
| 32 | 
            +
                    end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    def remove_current
         | 
| 35 | 
            +
                      Thread.current.thread_variable_set(VAR_NAME, nil)
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                  end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                  attr_reader :headers
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                  def initialize(headers)
         | 
| 42 | 
            +
                    @headers = headers
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
              end
         | 
| 46 | 
            +
            end
         | 
| @@ -0,0 +1,22 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module YgreneIstioTracing
         | 
| 4 | 
            +
              module Tracing
         | 
| 5 | 
            +
                PROPAGATION_HEADERS = %w[
         | 
| 6 | 
            +
                  x-request-id
         | 
| 7 | 
            +
                  x-b3-traceid
         | 
| 8 | 
            +
                  x-b3-spanid
         | 
| 9 | 
            +
                  x-b3-parentspanid
         | 
| 10 | 
            +
                  x-b3-sampled
         | 
| 11 | 
            +
                  x-b3-flags
         | 
| 12 | 
            +
                  x-ot-span-context
         | 
| 13 | 
            +
                  X-REQUEST-ID
         | 
| 14 | 
            +
                  X-B3-TRACEID
         | 
| 15 | 
            +
                  X-B3-SPANID
         | 
| 16 | 
            +
                  X-B3-PARENTSPANID
         | 
| 17 | 
            +
                  X-B3-SAMPLED
         | 
| 18 | 
            +
                  X-B3-FLAGS
         | 
| 19 | 
            +
                  X-OT-SPAN-CONTEXT
         | 
| 20 | 
            +
                ].freeze
         | 
| 21 | 
            +
              end
         | 
| 22 | 
            +
            end
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'net/http'
         | 
| 4 | 
            +
            require 'typhoeus'
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            module YgreneIstioTracing
         | 
| 7 | 
            +
              module NetHttp
         | 
| 8 | 
            +
                module ClassInterceptor
         | 
| 9 | 
            +
                  def new(*options)
         | 
| 10 | 
            +
                    o = super(*options)
         | 
| 11 | 
            +
                    o
         | 
| 12 | 
            +
                  end
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
                module InstanceInterceptor
         | 
| 15 | 
            +
                  def initialize(*options)
         | 
| 16 | 
            +
                    super(*options)
         | 
| 17 | 
            +
                  end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                  def request(req, *args, &block)
         | 
| 20 | 
            +
                    return super unless Context.exists_current?
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    headers = YgreneIstioTracing::Tracing::Context.current.headers
         | 
| 23 | 
            +
                    YgreneIstioTracing::Tracing::PROPAGATION_HEADERS.each do |h|
         | 
| 24 | 
            +
                      req[h] = headers[h] if headers[h].present?
         | 
| 25 | 
            +
                    end
         | 
| 26 | 
            +
                    super
         | 
| 27 | 
            +
                  end
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
              end
         | 
| 30 | 
            +
            end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
            ::Net::HTTP.singleton_class.prepend YgreneIstioTracing::NetHttp::ClassInterceptor
         | 
| 33 | 
            +
            ::Net::HTTP.prepend YgreneIstioTracing::NetHttp::InstanceInterceptor
         | 
| 34 | 
            +
             | 
| 35 | 
            +
            module Typhoeus
         | 
| 36 | 
            +
              Typhoeus.before do |req|
         | 
| 37 | 
            +
                return req unless YgreneIstioTracing::Tracing::Context.exists_current?
         | 
| 38 | 
            +
             | 
| 39 | 
            +
                headers = YgreneIstioTracing::Tracing::Context.current.headers
         | 
| 40 | 
            +
                YgreneIstioTracing::Tracing::PROPAGATION_HEADERS.each do |h|
         | 
| 41 | 
            +
                  req.options[:headers][h] = headers[h] unless headers[h]&.nil?
         | 
| 42 | 
            +
                end
         | 
| 43 | 
            +
                req
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module YgreneIstioTracing
         | 
| 4 | 
            +
              module Tracing
         | 
| 5 | 
            +
                class RackMiddleware
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  def initialize(app)
         | 
| 8 | 
            +
                    @app = app
         | 
| 9 | 
            +
                  end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  def call(env)
         | 
| 12 | 
            +
                    Context.build_current(extract_http_headers(env))
         | 
| 13 | 
            +
                    @app.call(env)
         | 
| 14 | 
            +
                  ensure
         | 
| 15 | 
            +
                    Context.remove_current
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                  def extract_http_headers(env)
         | 
| 19 | 
            +
                    env.select { |k, _v| PROPAGATION_HEADERS.include?(k.downcase) }
         | 
| 20 | 
            +
                  end
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'rails/railtie'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module YgreneIstioTracing
         | 
| 6 | 
            +
              module Tracing
         | 
| 7 | 
            +
                class Railtie < ::Rails::Railtie
         | 
| 8 | 
            +
                  initializer 'ygrene_istio_tracing.tracing.rack_middleware' do |app|
         | 
| 9 | 
            +
                    puts 'Tracing Loaded'
         | 
| 10 | 
            +
                    app.middleware.use(::Istio::Tracing::RackMiddleware)
         | 
| 11 | 
            +
                  end
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
            end
         | 
| @@ -0,0 +1,44 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            lib = File.expand_path('lib', __dir__)
         | 
| 4 | 
            +
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 5 | 
            +
            require 'ygrene_istio_tracing/version'
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            Gem::Specification.new do |spec|
         | 
| 8 | 
            +
              spec.name          = 'ygrene_istio_tracing'
         | 
| 9 | 
            +
              spec.version       = YgreneIstioTracing::VERSION
         | 
| 10 | 
            +
              spec.authors       = ['Austin Adams']
         | 
| 11 | 
            +
              spec.email         = ['me@austbot.com']
         | 
| 12 | 
            +
             | 
| 13 | 
            +
              spec.summary       = 'Ruby gem for Istio service mesh (https://istio.io/)'
         | 
| 14 | 
            +
              spec.description   = 'This gem lets your rails app propagate http headers for distributed tracing with Istio.'
         | 
| 15 | 
            +
              spec.homepage      = 'https://github.com/ygrene/ygrene_istio_tracing'
         | 
| 16 | 
            +
             | 
| 17 | 
            +
              # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
         | 
| 18 | 
            +
              # to allow pushing to a single host or delete this section to allow pushing to any host.
         | 
| 19 | 
            +
              if spec.respond_to?(:metadata)
         | 
| 20 | 
            +
                spec.metadata['allowed_push_host'] = "https://rubygems.org"
         | 
| 21 | 
            +
              else
         | 
| 22 | 
            +
                raise 'RubyGems 2.0 or newer is required to protect against ' \
         | 
| 23 | 
            +
                  'public gem pushes.'
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              # Specify which files should be added to the gem when it is released.
         | 
| 27 | 
            +
              # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
         | 
| 28 | 
            +
              spec.files = Dir.chdir(File.expand_path(__dir__)) do
         | 
| 29 | 
            +
                `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
         | 
| 30 | 
            +
              end
         | 
| 31 | 
            +
              spec.bindir        = 'exe'
         | 
| 32 | 
            +
              spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
         | 
| 33 | 
            +
              spec.require_paths = ['lib']
         | 
| 34 | 
            +
             | 
| 35 | 
            +
              spec.add_dependency 'typhoeus', '~> 1.3.1'
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              spec.add_development_dependency 'bundler', '~> 1.16'
         | 
| 38 | 
            +
              spec.add_development_dependency 'rack'
         | 
| 39 | 
            +
              spec.add_development_dependency 'rake', '~> 10.0'
         | 
| 40 | 
            +
              spec.add_development_dependency 'rspec-rails'
         | 
| 41 | 
            +
             | 
| 42 | 
            +
              spec.add_development_dependency 'webmock', ['~>3.3.0']
         | 
| 43 | 
            +
              spec.add_development_dependency 'httparty', ['~>0.16.3']
         | 
| 44 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ygrene_istio_tracing
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Austin Adams
         | 
| @@ -118,6 +118,8 @@ extra_rdoc_files: [] | |
| 118 118 | 
             
            files:
         | 
| 119 119 | 
             
            - ".gitignore"
         | 
| 120 120 | 
             
            - ".rspec"
         | 
| 121 | 
            +
            - ".ruby-gemset"
         | 
| 122 | 
            +
            - ".ruby-version"
         | 
| 121 123 | 
             
            - Gemfile
         | 
| 122 124 | 
             
            - Gemfile.lock
         | 
| 123 125 | 
             
            - LICENSE
         | 
| @@ -125,6 +127,15 @@ files: | |
| 125 127 | 
             
            - Rakefile
         | 
| 126 128 | 
             
            - bin/console
         | 
| 127 129 | 
             
            - bin/setup
         | 
| 130 | 
            +
            - lib/ygrene_istio_tracing.rb
         | 
| 131 | 
            +
            - lib/ygrene_istio_tracing/tracing.rb
         | 
| 132 | 
            +
            - lib/ygrene_istio_tracing/tracing/context.rb
         | 
| 133 | 
            +
            - lib/ygrene_istio_tracing/tracing/header.rb
         | 
| 134 | 
            +
            - lib/ygrene_istio_tracing/tracing/http.rb
         | 
| 135 | 
            +
            - lib/ygrene_istio_tracing/tracing/rack.rb
         | 
| 136 | 
            +
            - lib/ygrene_istio_tracing/tracing/railtie.rb
         | 
| 137 | 
            +
            - lib/ygrene_istio_tracing/version.rb
         | 
| 138 | 
            +
            - ygrene_istio_tracing.gemspec
         | 
| 128 139 | 
             
            homepage: https://github.com/ygrene/ygrene_istio_tracing
         | 
| 129 140 | 
             
            licenses: []
         | 
| 130 141 | 
             
            metadata:
         |