lightstep 0.12.0 → 0.13.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/.circleci/config.yml +31 -0
- data/.gitignore +0 -2
- data/.rubocop.yml +48 -0
- data/Gemfile.lock +52 -0
- data/Makefile +2 -2
- data/example.rb +2 -2
- data/examples/rack/inject_extract.rb +1 -1
- data/lib/lightstep.rb +2 -0
- data/lib/lightstep/reporter.rb +14 -9
- data/lib/lightstep/scope.rb +23 -0
- data/lib/lightstep/scope_manager.rb +54 -0
- data/lib/lightstep/span.rb +18 -14
- data/lib/lightstep/tracer.rb +80 -3
- data/lib/lightstep/transport/base.rb +0 -3
- data/lib/lightstep/transport/http_json.rb +73 -17
- data/lib/lightstep/version.rb +1 -1
- data/lightstep.gemspec +2 -2
- metadata +11 -6
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 412b678787b505c5c97155f3d702adf01e8ebd60254fb793a07e8ae4da2cd7fa
         | 
| 4 | 
            +
              data.tar.gz: bdd33820334d2306ce78b7e84928e4be5193211d0c359bba02b4032ed3c6fc42
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 8d1395123221d74ce722e748dc21951f8462103dd505edc42f3f04c32f3f9eed524358a684085cb8ba55acd35dc3909102447cb0133700f8b91016687bf0ba00
         | 
| 7 | 
            +
              data.tar.gz: 597593ee87d988b10f9c79fc80ddfa5e4b3f05290e5033873aeb1e7655d6562dacb5f81410a3d0db62d2a418958e9165557e17f062f188db4602c2e3c09a0b44
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            version: 2
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            jobs:
         | 
| 4 | 
            +
              test:
         | 
| 5 | 
            +
                docker:
         | 
| 6 | 
            +
                  - image: circleci/ruby:2
         | 
| 7 | 
            +
                steps:
         | 
| 8 | 
            +
                  - checkout
         | 
| 9 | 
            +
                  - restore_cache:
         | 
| 10 | 
            +
                      keys:
         | 
| 11 | 
            +
                        - gem-cache-v2-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
         | 
| 12 | 
            +
                        - gem-cache-v2-{{ .Branch }}-
         | 
| 13 | 
            +
                        - gem-cache-v2-
         | 
| 14 | 
            +
                  - run:
         | 
| 15 | 
            +
                      name: "set up environment"
         | 
| 16 | 
            +
                      command: |
         | 
| 17 | 
            +
                        echo 'export BUNDLE_PATH="$HOME/project/.bundler_cache"' >> $BASH_ENV
         | 
| 18 | 
            +
                        source $BASH_ENV
         | 
| 19 | 
            +
                  - run: bundle
         | 
| 20 | 
            +
                  - save_cache:
         | 
| 21 | 
            +
                      paths:
         | 
| 22 | 
            +
                        - ~/project/.bundler_cache
         | 
| 23 | 
            +
                      key: gem-cache-v2-{{ .Branch }}-{{ checksum "Gemfile.lock" }}
         | 
| 24 | 
            +
                  - run: make test
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            workflows:
         | 
| 27 | 
            +
              version: 2
         | 
| 28 | 
            +
              test:
         | 
| 29 | 
            +
                jobs:
         | 
| 30 | 
            +
                  - test
         | 
| 31 | 
            +
             | 
    
        data/.gitignore
    CHANGED
    
    
    
        data/.rubocop.yml
    ADDED
    
    | @@ -0,0 +1,48 @@ | |
| 1 | 
            +
            AllCops:
         | 
| 2 | 
            +
              Exclude:
         | 
| 3 | 
            +
                - spec/**/*
         | 
| 4 | 
            +
                - .bundle/**/*
         | 
| 5 | 
            +
                - bin/**/*
         | 
| 6 | 
            +
                - vendor/**/*
         | 
| 7 | 
            +
                - tmp/**/*
         | 
| 8 | 
            +
                - log/**/*
         | 
| 9 | 
            +
                - Rakefile
         | 
| 10 | 
            +
                - lightstep.gemspec
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            Lint/AmbiguousOperator:
         | 
| 13 | 
            +
              Enabled: false
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            Metrics/ParameterLists:
         | 
| 16 | 
            +
              Enabled: false
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            Metrics/AbcSize:
         | 
| 19 | 
            +
              Max: 147
         | 
| 20 | 
            +
             | 
| 21 | 
            +
            Metrics/BlockNesting:
         | 
| 22 | 
            +
              Max: 4
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            # Configuration parameters: CountComments.
         | 
| 25 | 
            +
            Metrics/ClassLength:
         | 
| 26 | 
            +
              Max: 406
         | 
| 27 | 
            +
             | 
| 28 | 
            +
            Metrics/CyclomaticComplexity:
         | 
| 29 | 
            +
              Max: 24
         | 
| 30 | 
            +
             | 
| 31 | 
            +
            # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
         | 
| 32 | 
            +
            # URISchemes: http, https
         | 
| 33 | 
            +
            Metrics/LineLength:
         | 
| 34 | 
            +
              Enabled: false
         | 
| 35 | 
            +
             | 
| 36 | 
            +
            # Configuration parameters: CountComments.
         | 
| 37 | 
            +
            Metrics/MethodLength:
         | 
| 38 | 
            +
              Max: 88
         | 
| 39 | 
            +
             | 
| 40 | 
            +
            # Configuration parameters: CountComments.
         | 
| 41 | 
            +
            Metrics/ModuleLength:
         | 
| 42 | 
            +
              Max: 1000
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            Performance/RedundantBlockCall:
         | 
| 45 | 
            +
              Enabled: false
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            Style/PercentLiteralDelimiters:
         | 
| 48 | 
            +
              Enabled: false
         | 
    
        data/Gemfile.lock
    ADDED
    
    | @@ -0,0 +1,52 @@ | |
| 1 | 
            +
            PATH
         | 
| 2 | 
            +
              remote: .
         | 
| 3 | 
            +
              specs:
         | 
| 4 | 
            +
                lightstep (0.13.0)
         | 
| 5 | 
            +
                  concurrent-ruby (~> 1.0)
         | 
| 6 | 
            +
                  opentracing (~> 0.4.1)
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            GEM
         | 
| 9 | 
            +
              remote: https://rubygems.org/
         | 
| 10 | 
            +
              specs:
         | 
| 11 | 
            +
                bump (0.6.1)
         | 
| 12 | 
            +
                concurrent-ruby (1.0.5)
         | 
| 13 | 
            +
                diff-lcs (1.3)
         | 
| 14 | 
            +
                docile (1.3.1)
         | 
| 15 | 
            +
                json (2.1.0)
         | 
| 16 | 
            +
                opentracing (0.4.1)
         | 
| 17 | 
            +
                rack (2.0.5)
         | 
| 18 | 
            +
                rake (11.3.0)
         | 
| 19 | 
            +
                rspec (3.7.0)
         | 
| 20 | 
            +
                  rspec-core (~> 3.7.0)
         | 
| 21 | 
            +
                  rspec-expectations (~> 3.7.0)
         | 
| 22 | 
            +
                  rspec-mocks (~> 3.7.0)
         | 
| 23 | 
            +
                rspec-core (3.7.1)
         | 
| 24 | 
            +
                  rspec-support (~> 3.7.0)
         | 
| 25 | 
            +
                rspec-expectations (3.7.0)
         | 
| 26 | 
            +
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 27 | 
            +
                  rspec-support (~> 3.7.0)
         | 
| 28 | 
            +
                rspec-mocks (3.7.0)
         | 
| 29 | 
            +
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 30 | 
            +
                  rspec-support (~> 3.7.0)
         | 
| 31 | 
            +
                rspec-support (3.7.1)
         | 
| 32 | 
            +
                simplecov (0.16.1)
         | 
| 33 | 
            +
                  docile (~> 1.1)
         | 
| 34 | 
            +
                  json (>= 1.8, < 3)
         | 
| 35 | 
            +
                  simplecov-html (~> 0.10.0)
         | 
| 36 | 
            +
                simplecov-html (0.10.2)
         | 
| 37 | 
            +
                timecop (0.8.1)
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            PLATFORMS
         | 
| 40 | 
            +
              ruby
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            DEPENDENCIES
         | 
| 43 | 
            +
              bump (~> 0.5)
         | 
| 44 | 
            +
              lightstep!
         | 
| 45 | 
            +
              rack (~> 2.0)
         | 
| 46 | 
            +
              rake (~> 11.3)
         | 
| 47 | 
            +
              rspec (~> 3.0)
         | 
| 48 | 
            +
              simplecov (~> 0.16)
         | 
| 49 | 
            +
              timecop (~> 0.8.0)
         | 
| 50 | 
            +
             | 
| 51 | 
            +
            BUNDLED WITH
         | 
| 52 | 
            +
               1.16.6
         | 
    
        data/Makefile
    CHANGED
    
    | @@ -14,8 +14,8 @@ benchmark: | |
| 14 14 | 
             
            	ruby benchmark/threading/thread_test.rb
         | 
| 15 15 |  | 
| 16 16 | 
             
            bump-version:
         | 
| 17 | 
            -
            	# ruby -e 'require "bump"; Bump::Bump.run(" | 
| 18 | 
            -
            	 | 
| 17 | 
            +
            	# ruby -e 'require "bump"; Bump::Bump.run("patch")'
         | 
| 18 | 
            +
            	make build	# rebuild after version increment
         | 
| 19 19 | 
             
            	git tag `ruby scripts/version.rb`
         | 
| 20 20 | 
             
            	# git push
         | 
| 21 21 | 
             
            	git push --tags
         | 
    
        data/example.rb
    CHANGED
    
    | @@ -11,7 +11,7 @@ LightStep.configure(component_name: 'lightstep/ruby/example', access_token: acce | |
| 11 11 | 
             
            puts 'Starting operation...'
         | 
| 12 12 | 
             
            span = LightStep.start_span('my_span')
         | 
| 13 13 | 
             
            thread1 = Thread.new do
         | 
| 14 | 
            -
               | 
| 14 | 
            +
              (1..10).each do |i|
         | 
| 15 15 | 
             
                sleep(0.15)
         | 
| 16 16 | 
             
                puts "Logging event #{i}..."
         | 
| 17 17 | 
             
                span.log(event: 'hello world', count: i)
         | 
| @@ -19,7 +19,7 @@ thread1 = Thread.new do | |
| 19 19 | 
             
            end
         | 
| 20 20 | 
             
            thread2 = Thread.new do
         | 
| 21 21 | 
             
              current = 1
         | 
| 22 | 
            -
               | 
| 22 | 
            +
              (1..16).each do |i|
         | 
| 23 23 | 
             
                child = LightStep.start_span('my_child', child_of: span.span_context)
         | 
| 24 24 | 
             
                sleep(0.1)
         | 
| 25 25 | 
             
                current *= 2
         | 
    
        data/lib/lightstep.rb
    CHANGED
    
    
    
        data/lib/lightstep/reporter.rb
    CHANGED
    
    | @@ -57,7 +57,10 @@ module LightStep | |
| 57 57 |  | 
| 58 58 | 
             
                  span_records = @span_records.slice!(0, @span_records.length)
         | 
| 59 59 | 
             
                  dropped_spans = 0
         | 
| 60 | 
            -
                  @dropped_spans.update | 
| 60 | 
            +
                  @dropped_spans.update do |old|
         | 
| 61 | 
            +
                    dropped_spans = old
         | 
| 62 | 
            +
                    0
         | 
| 63 | 
            +
                  end
         | 
| 61 64 |  | 
| 62 65 | 
             
                  report_request = {
         | 
| 63 66 | 
             
                    runtime: @runtime,
         | 
| @@ -65,9 +68,10 @@ module LightStep | |
| 65 68 | 
             
                    youngest_micros: now,
         | 
| 66 69 | 
             
                    span_records: span_records,
         | 
| 67 70 | 
             
                    internal_metrics: {
         | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
             | 
| 71 | 
            +
                      counts: [{
         | 
| 72 | 
            +
                        name: 'spans.dropped',
         | 
| 73 | 
            +
                        int64_value: dropped_spans
         | 
| 74 | 
            +
                      }]
         | 
| 71 75 | 
             
                    }
         | 
| 72 76 | 
             
                  }
         | 
| 73 77 |  | 
| @@ -75,9 +79,10 @@ module LightStep | |
| 75 79 |  | 
| 76 80 | 
             
                  begin
         | 
| 77 81 | 
             
                    @transport.report(report_request)
         | 
| 78 | 
            -
                  rescue
         | 
| 79 | 
            -
             | 
| 80 | 
            -
             | 
| 82 | 
            +
                  rescue StandardError => e
         | 
| 83 | 
            +
                    LightStep.logger.error "LightStep error reporting to collector: #{e.message}"
         | 
| 84 | 
            +
                    # an error occurs, add the previous dropped_spans and count of spans
         | 
| 85 | 
            +
                    # that would have been recorded
         | 
| 81 86 | 
             
                    @dropped_spans.increment(dropped_spans + span_records.length)
         | 
| 82 87 | 
             
                  end
         | 
| 83 88 | 
             
                end
         | 
| @@ -103,8 +108,8 @@ module LightStep | |
| 103 108 | 
             
                        sleep(@period)
         | 
| 104 109 | 
             
                        flush
         | 
| 105 110 | 
             
                      end
         | 
| 106 | 
            -
                    rescue =>  | 
| 107 | 
            -
                       | 
| 111 | 
            +
                    rescue StandardError => e
         | 
| 112 | 
            +
                      LightStep.logger.error "LightStep failed to report spans: #{e.message}"
         | 
| 108 113 | 
             
                    end
         | 
| 109 114 | 
             
                  end
         | 
| 110 115 | 
             
                end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            module LightStep
         | 
| 2 | 
            +
              # Scope represents an OpenTracing Scope
         | 
| 3 | 
            +
              #
         | 
| 4 | 
            +
              # See http://www.opentracing.io for more information.
         | 
| 5 | 
            +
              class Scope
         | 
| 6 | 
            +
                attr_reader :span
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                def initialize(manager:, span:, finish_on_close: true)
         | 
| 9 | 
            +
                  @manager = manager
         | 
| 10 | 
            +
                  @span = span
         | 
| 11 | 
            +
                  @finish_on_close = finish_on_close
         | 
| 12 | 
            +
                end
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                # Mark the end of the active period for the current thread and Scope,
         | 
| 15 | 
            +
                # updating the ScopeManager#active in the process.
         | 
| 16 | 
            +
                def close
         | 
| 17 | 
            +
                  raise(LightStep::Error, 'already closed') if @closed
         | 
| 18 | 
            +
                  @closed = true
         | 
| 19 | 
            +
                  @span.finish if @finish_on_close
         | 
| 20 | 
            +
                  @manager.deactivate
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            module LightStep
         | 
| 2 | 
            +
              # ScopeManager represents an OpenTracing ScopeManager
         | 
| 3 | 
            +
              #
         | 
| 4 | 
            +
              # See http://www.opentracing.io for more information.
         | 
| 5 | 
            +
              #
         | 
| 6 | 
            +
              # The ScopeManager interface abstracts both the activation of Span instances
         | 
| 7 | 
            +
              # via ScopeManager#activate and access to an active Span/Scope via
         | 
| 8 | 
            +
              # ScopeManager#active
         | 
| 9 | 
            +
              #
         | 
| 10 | 
            +
              class ScopeManager
         | 
| 11 | 
            +
                # Make a span instance active.
         | 
| 12 | 
            +
                #
         | 
| 13 | 
            +
                # @param span [Span] the Span that should become active
         | 
| 14 | 
            +
                # @param finish_on_close [Boolean] whether the Span should automatically be
         | 
| 15 | 
            +
                #   finished when Scope#close is called
         | 
| 16 | 
            +
                # @return [Scope] instance to control the end of the active period for the
         | 
| 17 | 
            +
                #  Span. It is a programming error to neglect to call Scope#close on the
         | 
| 18 | 
            +
                #  returned instance.
         | 
| 19 | 
            +
                def activate(span:, finish_on_close: true)
         | 
| 20 | 
            +
                  return active if active && active.span == span
         | 
| 21 | 
            +
                  LightStep::Scope.new(manager: self, span: span, finish_on_close: finish_on_close).tap do |scope|
         | 
| 22 | 
            +
                    add_scope(scope)
         | 
| 23 | 
            +
                  end
         | 
| 24 | 
            +
                end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                # @return [Scope] the currently active Scope which can be used to access the
         | 
| 27 | 
            +
                # currently active Span.
         | 
| 28 | 
            +
                #
         | 
| 29 | 
            +
                # If there is a non-null Scope, its wrapped Span becomes an implicit parent
         | 
| 30 | 
            +
                # (as Reference#CHILD_OF) of any newly-created Span at Tracer#start_active_span
         | 
| 31 | 
            +
                # or Tracer#start_span time.
         | 
| 32 | 
            +
                def active
         | 
| 33 | 
            +
                  scopes.last
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                def deactivate
         | 
| 37 | 
            +
                  scopes.pop
         | 
| 38 | 
            +
                end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                private
         | 
| 41 | 
            +
             | 
| 42 | 
            +
                def scopes
         | 
| 43 | 
            +
                  Thread.current[object_id.to_s] || []
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                def add_scope(scope)
         | 
| 47 | 
            +
                  if Thread.current[object_id.to_s].nil?
         | 
| 48 | 
            +
                    Thread.current[object_id.to_s] = [scope]
         | 
| 49 | 
            +
                  else
         | 
| 50 | 
            +
                    Thread.current[object_id.to_s] << scope
         | 
| 51 | 
            +
                  end
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
              end
         | 
| 54 | 
            +
            end
         | 
    
        data/lib/lightstep/span.rb
    CHANGED
    
    | @@ -11,7 +11,10 @@ module LightStep | |
| 11 11 |  | 
| 12 12 | 
             
                # Internal use only
         | 
| 13 13 | 
             
                # @private
         | 
| 14 | 
            -
                attr_reader :start_micros, :end_micros, :tags, :operation_name, : | 
| 14 | 
            +
                attr_reader :start_micros, :end_micros, :tags, :operation_name, :context
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                # To keep backwards compatibility
         | 
| 17 | 
            +
                alias_method :span_context, :context
         | 
| 15 18 |  | 
| 16 19 | 
             
                # Creates a new {Span}
         | 
| 17 20 | 
             
                #
         | 
| @@ -37,6 +40,7 @@ module LightStep | |
| 37 40 | 
             
                  tags: nil,
         | 
| 38 41 | 
             
                  max_log_records:
         | 
| 39 42 | 
             
                )
         | 
| 43 | 
            +
             | 
| 40 44 | 
             
                  @tags = Concurrent::Hash.new
         | 
| 41 45 | 
             
                  @tags.update(tags) unless tags.nil?
         | 
| 42 46 | 
             
                  @log_records = Concurrent::Array.new
         | 
| @@ -49,14 +53,14 @@ module LightStep | |
| 49 53 |  | 
| 50 54 | 
             
                  ref = child_of ? child_of : references
         | 
| 51 55 | 
             
                  ref = ref[0] if (Array === ref)
         | 
| 52 | 
            -
                  ref = ref. | 
| 56 | 
            +
                  ref = ref.context if (Span === ref)
         | 
| 53 57 |  | 
| 54 58 | 
             
                  if SpanContext === ref
         | 
| 55 | 
            -
                    @ | 
| 59 | 
            +
                    @context = SpanContext.new(id: LightStep.guid, trace_id: ref.trace_id)
         | 
| 56 60 | 
             
                    set_baggage(ref.baggage)
         | 
| 57 61 | 
             
                    set_tag(:parent_span_guid, ref.id)
         | 
| 58 62 | 
             
                  else
         | 
| 59 | 
            -
                    @ | 
| 63 | 
            +
                    @context = SpanContext.new(id: LightStep.guid, trace_id: LightStep.guid)
         | 
| 60 64 | 
             
                  end
         | 
| 61 65 | 
             
                end
         | 
| 62 66 |  | 
| @@ -76,10 +80,10 @@ module LightStep | |
| 76 80 | 
             
                # @param key [String] the key of the baggage item
         | 
| 77 81 | 
             
                # @param value [String] the value of the baggage item
         | 
| 78 82 | 
             
                def set_baggage_item(key, value)
         | 
| 79 | 
            -
                  @ | 
| 80 | 
            -
                    id:  | 
| 81 | 
            -
                    trace_id:  | 
| 82 | 
            -
                    baggage:  | 
| 83 | 
            +
                  @context = SpanContext.new(
         | 
| 84 | 
            +
                    id: context.id,
         | 
| 85 | 
            +
                    trace_id: context.trace_id,
         | 
| 86 | 
            +
                    baggage: context.baggage.merge({key => value})
         | 
| 83 87 | 
             
                  )
         | 
| 84 88 | 
             
                  self
         | 
| 85 89 | 
             
                end
         | 
| @@ -87,9 +91,9 @@ module LightStep | |
| 87 91 | 
             
                # Set all baggage at once. This will reset the baggage to the given param.
         | 
| 88 92 | 
             
                # @param baggage [Hash] new baggage for the span
         | 
| 89 93 | 
             
                def set_baggage(baggage = {})
         | 
| 90 | 
            -
                  @ | 
| 91 | 
            -
                    id:  | 
| 92 | 
            -
                    trace_id:  | 
| 94 | 
            +
                  @context = SpanContext.new(
         | 
| 95 | 
            +
                    id: context.id,
         | 
| 96 | 
            +
                    trace_id: context.trace_id,
         | 
| 93 97 | 
             
                    baggage: baggage
         | 
| 94 98 | 
             
                  )
         | 
| 95 99 | 
             
                end
         | 
| @@ -98,7 +102,7 @@ module LightStep | |
| 98 102 | 
             
                # @param key [String] the key of the baggage item
         | 
| 99 103 | 
             
                # @return Value of the baggage item
         | 
| 100 104 | 
             
                def get_baggage_item(key)
         | 
| 101 | 
            -
                   | 
| 105 | 
            +
                  context.baggage[key]
         | 
| 102 106 | 
             
                end
         | 
| 103 107 |  | 
| 104 108 | 
             
                # Add a log entry to this span
         | 
| @@ -140,8 +144,8 @@ module LightStep | |
| 140 144 | 
             
                def to_h
         | 
| 141 145 | 
             
                  {
         | 
| 142 146 | 
             
                    runtime_guid: tracer.guid,
         | 
| 143 | 
            -
                    span_guid:  | 
| 144 | 
            -
                    trace_guid:  | 
| 147 | 
            +
                    span_guid: context.id,
         | 
| 148 | 
            +
                    trace_guid: context.trace_id,
         | 
| 145 149 | 
             
                    span_name: operation_name,
         | 
| 146 150 | 
             
                    attributes: tags.map {|key, value|
         | 
| 147 151 | 
             
                      {Key: key.to_s, Value: value}
         | 
    
        data/lib/lightstep/tracer.rb
    CHANGED
    
    | @@ -53,6 +53,78 @@ module LightStep | |
| 53 53 |  | 
| 54 54 | 
             
                # TODO(bhs): Support FollowsFrom and multiple references
         | 
| 55 55 |  | 
| 56 | 
            +
                # Creates a scope manager or returns the already-created one.
         | 
| 57 | 
            +
                #
         | 
| 58 | 
            +
                # @return [ScopeManager] the current ScopeManager, which may be a no-op but
         | 
| 59 | 
            +
                #   may not be nil.
         | 
| 60 | 
            +
                def scope_manager
         | 
| 61 | 
            +
                  @scope_manager ||= LightStep::ScopeManager.new
         | 
| 62 | 
            +
                end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                # Returns a newly started and activated Scope.
         | 
| 65 | 
            +
                #
         | 
| 66 | 
            +
                # If ScopeManager#active is not nil, no explicit references are provided,
         | 
| 67 | 
            +
                # and `ignore_active_scope` is false, then an inferred References#CHILD_OF
         | 
| 68 | 
            +
                # reference is created to the ScopeManager#active's SpanContext when
         | 
| 69 | 
            +
                # start_active_span is invoked.
         | 
| 70 | 
            +
                #
         | 
| 71 | 
            +
                # @param operation_name [String] The operation name for the Span
         | 
| 72 | 
            +
                # @param child_of [SpanContext, Span] SpanContext that acts as a parent to
         | 
| 73 | 
            +
                #        the newly-started Span. If a Span instance is provided, its
         | 
| 74 | 
            +
                #        context is automatically substituted. See [Reference] for more
         | 
| 75 | 
            +
                #        information.
         | 
| 76 | 
            +
                #
         | 
| 77 | 
            +
                #   If specified, the `references` parameter must be omitted.
         | 
| 78 | 
            +
                # @param references [Array<Reference>] An array of reference
         | 
| 79 | 
            +
                #   objects that identify one or more parent SpanContexts.
         | 
| 80 | 
            +
                # @param start_time [Time] When the Span started, if not now
         | 
| 81 | 
            +
                # @param tags [Hash] Tags to assign to the Span at start time
         | 
| 82 | 
            +
                # @param ignore_active_scope [Boolean] whether to create an implicit
         | 
| 83 | 
            +
                #   References#CHILD_OF reference to the ScopeManager#active.
         | 
| 84 | 
            +
                # @param finish_on_close [Boolean] whether span should automatically be
         | 
| 85 | 
            +
                #   finished when Scope#close is called
         | 
| 86 | 
            +
                # @yield [Scope] If an optional block is passed to start_active it will
         | 
| 87 | 
            +
                #   yield the newly-started Scope. If `finish_on_close` is true then the
         | 
| 88 | 
            +
                #   Span will be finished automatically after the block is executed.
         | 
| 89 | 
            +
                # @return [Scope] The newly-started and activated Scope
         | 
| 90 | 
            +
                def start_active_span(operation_name,
         | 
| 91 | 
            +
                                      child_of: nil,
         | 
| 92 | 
            +
                                      references: nil,
         | 
| 93 | 
            +
                                      start_time: Time.now,
         | 
| 94 | 
            +
                                      tags: nil,
         | 
| 95 | 
            +
                                      ignore_active_scope: false,
         | 
| 96 | 
            +
                                      finish_on_close: true)
         | 
| 97 | 
            +
                  if child_of.nil? && references.nil? && !ignore_active_scope
         | 
| 98 | 
            +
                    child_of = active_span
         | 
| 99 | 
            +
                  end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                  span = start_span(
         | 
| 102 | 
            +
                    operation_name,
         | 
| 103 | 
            +
                    child_of: child_of,
         | 
| 104 | 
            +
                    references: references,
         | 
| 105 | 
            +
                    start_time: start_time,
         | 
| 106 | 
            +
                    tags: tags,
         | 
| 107 | 
            +
                    ignore_active_scope: ignore_active_scope
         | 
| 108 | 
            +
                  )
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                  scope_manager.activate(span: span, finish_on_close: finish_on_close).tap do |scope|
         | 
| 111 | 
            +
                    if block_given?
         | 
| 112 | 
            +
                      yield scope
         | 
| 113 | 
            +
                      scope.close
         | 
| 114 | 
            +
                    end
         | 
| 115 | 
            +
                  end
         | 
| 116 | 
            +
                end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
                # Returns the span from the active scope, if any.
         | 
| 119 | 
            +
                #
         | 
| 120 | 
            +
                # @return [Span, nil] the active span. This is a shorthand for
         | 
| 121 | 
            +
                #   `scope_manager.active.span`, and nil will be returned if
         | 
| 122 | 
            +
                #   Scope#active is nil.
         | 
| 123 | 
            +
                def active_span
         | 
| 124 | 
            +
                  scope = scope_manager.active
         | 
| 125 | 
            +
                  scope.span if scope
         | 
| 126 | 
            +
                end
         | 
| 127 | 
            +
             | 
| 56 128 | 
             
                # Starts a new span.
         | 
| 57 129 | 
             
                #
         | 
| 58 130 | 
             
                # @param operation_name [String] The operation name for the Span
         | 
| @@ -64,8 +136,13 @@ module LightStep | |
| 64 136 | 
             
                #         are provided, their .span_context is automatically substituted.
         | 
| 65 137 | 
             
                # @param start_time [Time] When the Span started, if not now
         | 
| 66 138 | 
             
                # @param tags [Hash] Tags to assign to the Span at start time
         | 
| 139 | 
            +
                # @param ignore_active_scope [Boolean] whether to create an implicit
         | 
| 140 | 
            +
                #   References#CHILD_OF reference to the ScopeManager#active.
         | 
| 67 141 | 
             
                # @return [Span]
         | 
| 68 | 
            -
                def start_span(operation_name, child_of: nil, references:  | 
| 142 | 
            +
                def start_span(operation_name, child_of: nil, references: nil, start_time: nil, tags: nil, ignore_active_scope: false)
         | 
| 143 | 
            +
                  if child_of.nil? && references.nil? && !ignore_active_scope
         | 
| 144 | 
            +
                    child_of = active_span
         | 
| 145 | 
            +
                  end
         | 
| 69 146 |  | 
| 70 147 | 
             
                  Span.new(
         | 
| 71 148 | 
             
                    tracer: self,
         | 
| @@ -150,7 +227,7 @@ module LightStep | |
| 150 227 | 
             
                protected
         | 
| 151 228 |  | 
| 152 229 | 
             
                def configure(component_name:, access_token: nil, transport: nil, tags: {})
         | 
| 153 | 
            -
                  raise ConfigurationError, "component_name must be a string" unless String | 
| 230 | 
            +
                  raise ConfigurationError, "component_name must be a string" unless component_name.is_a?(String)
         | 
| 154 231 | 
             
                  raise ConfigurationError, "component_name cannot be blank"  if component_name.empty?
         | 
| 155 232 |  | 
| 156 233 | 
             
                  if transport.nil? and !access_token.nil?
         | 
| @@ -234,7 +311,7 @@ module LightStep | |
| 234 311 | 
             
                def extract_from_rack(env)
         | 
| 235 312 | 
             
                  extract_from_text_map(env.reduce({}){|memo, tuple|
         | 
| 236 313 | 
             
                    raw_header, value = tuple
         | 
| 237 | 
            -
                    header = raw_header.gsub(/^HTTP_/, ''). | 
| 314 | 
            +
                    header = raw_header.gsub(/^HTTP_/, '').tr('_', '-').downcase
         | 
| 238 315 |  | 
| 239 316 | 
             
                    memo[header] = value if header.start_with?(CARRIER_TRACER_STATE_PREFIX, CARRIER_BAGGAGE_PREFIX)
         | 
| 240 317 | 
             
                    memo
         | 
| @@ -11,46 +11,102 @@ module LightStep | |
| 11 11 | 
             
                # within the fork (and in the parent post-fork). See
         | 
| 12 12 | 
             
                # `examples/fork_children/main.rb` for an example.
         | 
| 13 13 | 
             
                class HTTPJSON < Base
         | 
| 14 | 
            -
                  LIGHTSTEP_HOST =  | 
| 14 | 
            +
                  LIGHTSTEP_HOST = 'collector.lightstep.com'.freeze
         | 
| 15 15 | 
             
                  LIGHTSTEP_PORT = 443
         | 
| 16 16 |  | 
| 17 | 
            -
                  ENCRYPTION_TLS = 'tls'
         | 
| 18 | 
            -
                  ENCRYPTION_NONE = 'none'
         | 
| 17 | 
            +
                  ENCRYPTION_TLS = 'tls'.freeze
         | 
| 18 | 
            +
                  ENCRYPTION_NONE = 'none'.freeze
         | 
| 19 19 |  | 
| 20 | 
            +
                  REPORTS_API_ENDPOINT = '/api/v0/reports'.freeze
         | 
| 21 | 
            +
                  HEADER_ACCESS_TOKEN = 'LightStep-Access-Token'.freeze
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                  ##
         | 
| 20 24 | 
             
                  # Initialize the transport
         | 
| 21 | 
            -
                  # | 
| 25 | 
            +
                  #
         | 
| 26 | 
            +
                  # @param host [String] host of the domain to the endpoint to push data
         | 
| 22 27 | 
             
                  # @param port [Numeric] port on which to connect
         | 
| 23 28 | 
             
                  # @param verbose [Numeric] verbosity level. Right now 0-3 are supported
         | 
| 24 29 | 
             
                  # @param encryption [ENCRYPTION_TLS, ENCRYPTION_NONE] kind of encryption to use
         | 
| 25 30 | 
             
                  # @param access_token [String] access token for LightStep server
         | 
| 26 | 
            -
                  # @ | 
| 27 | 
            -
                   | 
| 31 | 
            +
                  # @param ssl_verify_peer [Boolean]
         | 
| 32 | 
            +
                  # @param open_timeout [Integer]
         | 
| 33 | 
            +
                  # @param read_timeout [Integer]
         | 
| 34 | 
            +
                  # @param continue_timeout [Integer]
         | 
| 35 | 
            +
                  # @param keep_alive_timeout [Integer]
         | 
| 36 | 
            +
                  # @param logger [Logger]
         | 
| 37 | 
            +
                  #
         | 
| 38 | 
            +
                  def initialize(
         | 
| 39 | 
            +
                    host: LIGHTSTEP_HOST,
         | 
| 40 | 
            +
                    port: LIGHTSTEP_PORT,
         | 
| 41 | 
            +
                    verbose: 0,
         | 
| 42 | 
            +
                    encryption: ENCRYPTION_TLS,
         | 
| 43 | 
            +
                    access_token:,
         | 
| 44 | 
            +
                    ssl_verify_peer: true,
         | 
| 45 | 
            +
                    open_timeout: 20,
         | 
| 46 | 
            +
                    read_timeout: 20,
         | 
| 47 | 
            +
                    continue_timeout: nil,
         | 
| 48 | 
            +
                    keep_alive_timeout: 2,
         | 
| 49 | 
            +
                    logger: nil
         | 
| 50 | 
            +
                  )
         | 
| 28 51 | 
             
                    @host = host
         | 
| 29 52 | 
             
                    @port = port
         | 
| 30 53 | 
             
                    @verbose = verbose
         | 
| 31 54 | 
             
                    @encryption = encryption
         | 
| 55 | 
            +
                    @ssl_verify_peer = ssl_verify_peer
         | 
| 56 | 
            +
                    @open_timeout = open_timeout.to_i
         | 
| 57 | 
            +
                    @read_timeout = read_timeout.to_i
         | 
| 58 | 
            +
                    @continue_timeout = continue_timeout
         | 
| 59 | 
            +
                    @keep_alive_timeout = keep_alive_timeout.to_i
         | 
| 32 60 |  | 
| 33 | 
            -
                    raise Tracer::ConfigurationError,  | 
| 34 | 
            -
                    raise Tracer::ConfigurationError,  | 
| 61 | 
            +
                    raise Tracer::ConfigurationError, 'access_token must be a string' unless access_token.is_a?(String)
         | 
| 62 | 
            +
                    raise Tracer::ConfigurationError, 'access_token cannot be blank'  if access_token.empty?
         | 
| 35 63 | 
             
                    @access_token = access_token
         | 
| 64 | 
            +
                    @logger = logger || LightStep.logger
         | 
| 36 65 | 
             
                  end
         | 
| 37 66 |  | 
| 67 | 
            +
                  ##
         | 
| 38 68 | 
             
                  # Queue a report for sending
         | 
| 69 | 
            +
                  #
         | 
| 39 70 | 
             
                  def report(report)
         | 
| 40 | 
            -
                     | 
| 71 | 
            +
                    @logger.info report if @verbose >= 3
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                    req = build_request(report)
         | 
| 74 | 
            +
                    res = connection.request(req)
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    @logger.info res.to_s if @verbose >= 3
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                    nil
         | 
| 79 | 
            +
                  end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
                  private
         | 
| 41 82 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 83 | 
            +
                  ##
         | 
| 84 | 
            +
                  # @param [Hash] report
         | 
| 85 | 
            +
                  # @return [Net::HTTP::Post]
         | 
| 86 | 
            +
                  #
         | 
| 87 | 
            +
                  def build_request(report)
         | 
| 88 | 
            +
                    req = Net::HTTP::Post.new(REPORTS_API_ENDPOINT)
         | 
| 89 | 
            +
                    req[HEADER_ACCESS_TOKEN] = @access_token
         | 
| 46 90 | 
             
                    req['Content-Type'] = 'application/json'
         | 
| 47 91 | 
             
                    req['Connection'] = 'keep-alive'
         | 
| 48 92 | 
             
                    req.body = report.to_json
         | 
| 49 | 
            -
                     | 
| 50 | 
            -
             | 
| 51 | 
            -
                    puts res.to_s if @verbose >= 3
         | 
| 93 | 
            +
                    req
         | 
| 94 | 
            +
                  end
         | 
| 52 95 |  | 
| 53 | 
            -
             | 
| 96 | 
            +
                  ##
         | 
| 97 | 
            +
                  # @return [Net::HTTP]
         | 
| 98 | 
            +
                  #
         | 
| 99 | 
            +
                  def connection
         | 
| 100 | 
            +
                    unless @connection
         | 
| 101 | 
            +
                      @connection = ::Net::HTTP.new(@host, @port)
         | 
| 102 | 
            +
                      @connection.use_ssl = @encryption == ENCRYPTION_TLS
         | 
| 103 | 
            +
                      @connection.verify_mode = ::OpenSSL::SSL::VERIFY_NONE unless @ssl_verify_peer
         | 
| 104 | 
            +
                      @connection.open_timeout = @open_timeout
         | 
| 105 | 
            +
                      @connection.read_timeout = @read_timeout
         | 
| 106 | 
            +
                      @connection.continue_timeout = @continue_timeout
         | 
| 107 | 
            +
                      @connection.keep_alive_timeout = @keep_alive_timeout
         | 
| 108 | 
            +
                    end
         | 
| 109 | 
            +
                    @connection
         | 
| 54 110 | 
             
                  end
         | 
| 55 111 | 
             
                end
         | 
| 56 112 | 
             
              end
         | 
    
        data/lib/lightstep/version.rb
    CHANGED
    
    
    
        data/lightstep.gemspec
    CHANGED
    
    | @@ -17,11 +17,11 @@ Gem::Specification.new do |spec| | |
| 17 17 | 
             
              spec.require_paths = ['lib']
         | 
| 18 18 |  | 
| 19 19 | 
             
              spec.add_dependency 'concurrent-ruby', '~> 1.0'
         | 
| 20 | 
            -
              spec.add_dependency 'opentracing', '~> 0. | 
| 20 | 
            +
              spec.add_dependency 'opentracing', '~> 0.4.1'
         | 
| 21 21 | 
             
              spec.add_development_dependency 'rake', '~> 11.3'
         | 
| 22 22 | 
             
              spec.add_development_dependency 'rack', '~> 2.0'
         | 
| 23 23 | 
             
              spec.add_development_dependency 'rspec', '~> 3.0'
         | 
| 24 24 | 
             
              spec.add_development_dependency 'bump', '~> 0.5'
         | 
| 25 | 
            -
              spec.add_development_dependency 'simplecov', '~> 0. | 
| 25 | 
            +
              spec.add_development_dependency 'simplecov', '~> 0.16'
         | 
| 26 26 | 
             
              spec.add_development_dependency 'timecop', '~> 0.8.0'
         | 
| 27 27 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: lightstep
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.13.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - bcronin
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2018- | 
| 11 | 
            +
            date: 2018-10-18 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: concurrent-ruby
         | 
| @@ -30,14 +30,14 @@ dependencies: | |
| 30 30 | 
             
                requirements:
         | 
| 31 31 | 
             
                - - "~>"
         | 
| 32 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version:  | 
| 33 | 
            +
                    version: 0.4.1
         | 
| 34 34 | 
             
              type: :runtime
         | 
| 35 35 | 
             
              prerelease: false
         | 
| 36 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 37 | 
             
                requirements:
         | 
| 38 38 | 
             
                - - "~>"
         | 
| 39 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version:  | 
| 40 | 
            +
                    version: 0.4.1
         | 
| 41 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 42 | 
             
              name: rake
         | 
| 43 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -100,14 +100,14 @@ dependencies: | |
| 100 100 | 
             
                requirements:
         | 
| 101 101 | 
             
                - - "~>"
         | 
| 102 102 | 
             
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            -
                    version: 0. | 
| 103 | 
            +
                    version: '0.16'
         | 
| 104 104 | 
             
              type: :development
         | 
| 105 105 | 
             
              prerelease: false
         | 
| 106 106 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 107 | 
             
                requirements:
         | 
| 108 108 | 
             
                - - "~>"
         | 
| 109 109 | 
             
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            -
                    version: 0. | 
| 110 | 
            +
                    version: '0.16'
         | 
| 111 111 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 112 112 | 
             
              name: timecop
         | 
| 113 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -129,9 +129,12 @@ executables: [] | |
| 129 129 | 
             
            extensions: []
         | 
| 130 130 | 
             
            extra_rdoc_files: []
         | 
| 131 131 | 
             
            files:
         | 
| 132 | 
            +
            - ".circleci/config.yml"
         | 
| 132 133 | 
             
            - ".gitignore"
         | 
| 133 134 | 
             
            - ".rspec"
         | 
| 135 | 
            +
            - ".rubocop.yml"
         | 
| 134 136 | 
             
            - Gemfile
         | 
| 137 | 
            +
            - Gemfile.lock
         | 
| 135 138 | 
             
            - LICENSE.txt
         | 
| 136 139 | 
             
            - Makefile
         | 
| 137 140 | 
             
            - README.md
         | 
| @@ -149,6 +152,8 @@ files: | |
| 149 152 | 
             
            - lib/lightstep.rb
         | 
| 150 153 | 
             
            - lib/lightstep/global_tracer.rb
         | 
| 151 154 | 
             
            - lib/lightstep/reporter.rb
         | 
| 155 | 
            +
            - lib/lightstep/scope.rb
         | 
| 156 | 
            +
            - lib/lightstep/scope_manager.rb
         | 
| 152 157 | 
             
            - lib/lightstep/span.rb
         | 
| 153 158 | 
             
            - lib/lightstep/span_context.rb
         | 
| 154 159 | 
             
            - lib/lightstep/tracer.rb
         |