opentelemetry-api 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +9 -0
  3. data/OVERVIEW.md +66 -0
  4. data/lib/{opentelemetry/distributed_context/manager.rb → opentelemetry-api.rb} +1 -6
  5. data/lib/opentelemetry.rb +34 -16
  6. data/lib/opentelemetry/context.rb +138 -15
  7. data/lib/opentelemetry/context/key.rb +29 -0
  8. data/lib/opentelemetry/context/propagation.rb +22 -0
  9. data/lib/opentelemetry/context/propagation/composite_propagator.rb +77 -0
  10. data/lib/opentelemetry/context/propagation/default_getter.rb +26 -0
  11. data/lib/opentelemetry/context/propagation/default_setter.rb +26 -0
  12. data/lib/opentelemetry/context/propagation/noop_extractor.rb +26 -0
  13. data/lib/opentelemetry/context/propagation/noop_injector.rb +26 -0
  14. data/lib/opentelemetry/context/propagation/propagation.rb +27 -0
  15. data/lib/opentelemetry/context/propagation/propagator.rb +64 -0
  16. data/lib/opentelemetry/correlation_context.rb +16 -0
  17. data/lib/opentelemetry/correlation_context/builder.rb +18 -0
  18. data/lib/opentelemetry/correlation_context/manager.rb +36 -0
  19. data/lib/opentelemetry/correlation_context/propagation.rb +57 -0
  20. data/lib/opentelemetry/correlation_context/propagation/context_keys.rb +27 -0
  21. data/lib/opentelemetry/correlation_context/propagation/text_extractor.rb +60 -0
  22. data/lib/opentelemetry/correlation_context/propagation/text_injector.rb +55 -0
  23. data/lib/opentelemetry/instrumentation.rb +15 -0
  24. data/lib/opentelemetry/instrumentation/adapter.rb +244 -0
  25. data/lib/opentelemetry/instrumentation/registry.rb +87 -0
  26. data/lib/opentelemetry/metrics.rb +1 -1
  27. data/lib/opentelemetry/metrics/handles.rb +5 -15
  28. data/lib/opentelemetry/metrics/instruments.rb +18 -69
  29. data/lib/opentelemetry/metrics/meter.rb +2 -39
  30. data/lib/opentelemetry/metrics/{meter_factory.rb → meter_provider.rb} +2 -2
  31. data/lib/opentelemetry/trace.rb +2 -2
  32. data/lib/opentelemetry/trace/event.rb +4 -3
  33. data/lib/opentelemetry/trace/link.rb +4 -3
  34. data/lib/opentelemetry/trace/propagation.rb +17 -0
  35. data/lib/opentelemetry/trace/propagation/context_keys.rb +35 -0
  36. data/lib/opentelemetry/trace/propagation/trace_context.rb +59 -0
  37. data/lib/opentelemetry/trace/propagation/trace_context/text_extractor.rb +58 -0
  38. data/lib/opentelemetry/trace/propagation/trace_context/text_injector.rb +55 -0
  39. data/lib/opentelemetry/trace/propagation/trace_context/trace_parent.rb +126 -0
  40. data/lib/opentelemetry/trace/span.rb +14 -6
  41. data/lib/opentelemetry/trace/status.rb +7 -2
  42. data/lib/opentelemetry/trace/tracer.rb +47 -13
  43. data/lib/opentelemetry/trace/tracer_provider.rb +22 -0
  44. data/lib/opentelemetry/trace/util/http_to_status.rb +47 -0
  45. data/lib/opentelemetry/version.rb +1 -1
  46. metadata +33 -13
  47. data/lib/opentelemetry/distributed_context.rb +0 -19
  48. data/lib/opentelemetry/distributed_context/distributed_context.rb +0 -24
  49. data/lib/opentelemetry/distributed_context/entry.rb +0 -66
  50. data/lib/opentelemetry/distributed_context/propagation.rb +0 -19
  51. data/lib/opentelemetry/distributed_context/propagation/binary_format.rb +0 -26
  52. data/lib/opentelemetry/distributed_context/propagation/text_format.rb +0 -76
  53. data/lib/opentelemetry/distributed_context/propagation/trace_parent.rb +0 -124
  54. data/lib/opentelemetry/trace/sampling_hint.rb +0 -22
  55. data/lib/opentelemetry/trace/tracer_factory.rb +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 48050ae87a672b7a5e9ee6b28cd7b78d5affc75ddc4fca38b5fce29be29c667a
4
- data.tar.gz: b0227255a1f374fe2916110495cbe867dad595f1134f2a1ba536bb19493daa85
3
+ metadata.gz: c91a5540309be0f2dcc70066b25eab314bed537321a6d4b8360b72077cb9da22
4
+ data.tar.gz: 925121d6b30bf9cf3b1a17c30afbfdf5e328b0374b23a8daade2cf1d486e795f
5
5
  SHA512:
6
- metadata.gz: 1a75c86cb6407d28a58e573d06b5faa7b3ea67d3a8dd3fdd6b45dc0d40d5122326bdb0de0d7be2e86aa1f0ec853589a28103e880fc22cf3882d2159064077832
7
- data.tar.gz: 48aebdd8a8260daade30c068486eb2618e82e80807aa74f38398ad557f4735e7608629b44c59884b9794d306c5e1570b2a888f13df35dd1f1ee0635a7acc185f
6
+ metadata.gz: 93299563d90db1b05e873f431e151dc1d2e7e05f54d0b5311985be42d15a3f33f50e3e35fb24e0ef063a26a3cc06333bcb304ee418dd590ed124c08416735b80
7
+ data.tar.gz: e7edc0bde321596ec89fedc87c1209e35a6b306b22a87aa0e761a4a77cd3b4d9f0239a486f7444f280008c733e9a8378369cb0640fd60b58106bf256b9bd4e5c
@@ -0,0 +1,9 @@
1
+ --no-private
2
+ --title=OpenTelemetry API
3
+ --markup=markdown
4
+ --main=OVERVIEW.md
5
+ ./lib/opentelemetry/**/*.rb
6
+ ./lib/opentelemetry.rb
7
+ -
8
+ OVERVIEW.md
9
+ CHANGELOG.md
@@ -0,0 +1,66 @@
1
+ # opentelemetry-api
2
+
3
+ The `opentelemetry-api` gem defines the core OpenTelemetry interfaces for Ruby applications. Using `opentelemetry-api`, a library or application can code against the OpenTelemetry interfaces to produce telemetry data such as distributed traces and metrics.
4
+
5
+ ## What is OpenTelemetry?
6
+
7
+ [OpenTelemetry][opentelemetry-home] is an open source observability framework, providing a general-purpose API, SDK, and related tools required for the instrumentation of cloud-native software, frameworks, and libraries.
8
+
9
+ OpenTelemetry provides a single set of APIs, libraries, agents, and collector services to capture distributed traces and metrics from your application. You can analyze them using Prometheus, Jaeger, and other observability tools.
10
+
11
+ ## How does this gem fit in?
12
+
13
+ The `opentelemetry-api` gem defines the core OpenTelemetry interfaces in the form of abstract classes and no-op implementations. That is, it defines interfaces and data types sufficient for a library or application to code against to produce telemetry data, but does not actually collect, analyze, or export the data.
14
+
15
+ To collect and analyze telemetry data, *applications* should also install a concrete implementation of the API, such as the `opentelemetry-sdk` gem. However, *libraries* that produce telemetry data should depend only on `opentelemetry-api`, deferring the choise of concrete implementation to the application developer.
16
+
17
+ ## How do I get started?
18
+
19
+ Install the gem using:
20
+
21
+ ```
22
+ gem install opentelemetry-api
23
+ ```
24
+
25
+ Or, if you use [bundler][bundler-home], include `opentelemetry-api` in your `Gemfile`.
26
+
27
+ Then, use the OpenTelemetry interfaces to produces traces and other telemetry data. Following is a basic example.
28
+
29
+ ```ruby
30
+ require 'opentelemetry'
31
+
32
+ # Obtain the current default tracer factory
33
+ factory = OpenTelemetry.tracer_factory
34
+
35
+ # Create a trace
36
+ tracer = factory.tracer('my_app', '1.0')
37
+
38
+ # Record spans
39
+ tracer.in_span('my_task') do |task_span|
40
+ tracer.in_span('inner') do |inner_span|
41
+ # Do something here
42
+ end
43
+ end
44
+ ```
45
+
46
+ For additional examples, see the [examples on github][examples-github].
47
+
48
+ ## How can I get involved?
49
+
50
+ The `opentelemetry-api` gem source is [on github][repo-github], along with related gems including `opentelemetry-sdk`.
51
+
52
+ The OpenTelemetry Ruby gems are maintained by the OpenTelemetry-Ruby special interest group (SIG). You can get involved by joining us on our [gitter channel][ruby-gitter] or attending our weekly meeting. See the [meeting calendar][community-meetings] for dates and times. For more information on this and other language SIGs, see the OpenTelemetry [community page][ruby-sig].
53
+
54
+ ## License
55
+
56
+ The `opentelemetry-api` gem is distributed under the Apache 2.0 license. See [LICENSE][license-github] for more information.
57
+
58
+
59
+ [opentelemetry-home]: https://opentelemetry.io
60
+ [bundler-home]: https://bundler.io
61
+ [repo-github]: https://github.com/open-telemetry/opentelemetry-ruby
62
+ [license-github]: https://github.com/open-telemetry/opentelemetry-ruby/blob/master/LICENSE
63
+ [examples-github]: https://github.com/open-telemetry/opentelemetry-ruby/tree/master/examples
64
+ [ruby-sig]: https://github.com/open-telemetry/community#ruby-sig
65
+ [community-meetings]: https://github.com/open-telemetry/community#community-meetings
66
+ [ruby-gitter]: https://gitter.im/open-telemetry/opentelemetry-ruby
@@ -4,9 +4,4 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
- module OpenTelemetry
8
- module DistributedContext
9
- class Manager
10
- end
11
- end
12
- end
7
+ require 'opentelemetry'
@@ -1,42 +1,60 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2019 OpenTelemetry Authors
3
+ # Copyright 2020 OpenTelemetry Authors
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
+
6
7
  require 'logger'
7
8
 
8
9
  require 'opentelemetry/error'
9
10
  require 'opentelemetry/context'
10
- require 'opentelemetry/distributed_context'
11
+ require 'opentelemetry/correlation_context'
11
12
  require 'opentelemetry/internal'
13
+ require 'opentelemetry/instrumentation'
12
14
  require 'opentelemetry/metrics'
13
15
  require 'opentelemetry/trace'
14
16
  require 'opentelemetry/version'
15
17
 
16
- # OpenTelemetry provides global accessors for telemetry objects
18
+ # OpenTelemetry is an open source observability framework, providing a
19
+ # general-purpose API, SDK, and related tools required for the instrumentation
20
+ # of cloud-native software, frameworks, and libraries.
21
+ #
22
+ # The OpenTelemetry module provides global accessors for telemetry objects.
17
23
  module OpenTelemetry
18
24
  extend self
19
25
 
20
- attr_writer :tracer_factory, :meter_factory, :distributed_context_manager
26
+ attr_writer :tracer_provider, :meter_provider, :correlations
21
27
 
22
28
  attr_accessor :logger
23
29
 
24
- # @return [Object, Trace::TracerFactory] registered tracer factory or a
25
- # default no-op implementation of the tracer factory.
26
- def tracer_factory
27
- @tracer_factory ||= Trace::TracerFactory.new
30
+ # @return [Object, Trace::TracerProvider] registered tracer provider or a
31
+ # default no-op implementation of the tracer provider.
32
+ def tracer_provider
33
+ @tracer_provider ||= Trace::TracerProvider.new
34
+ end
35
+
36
+ # @return [Object, Metrics::MeterProvider] registered meter provider or a
37
+ # default no-op implementation of the meter provider.
38
+ def meter_provider
39
+ @meter_provider ||= Metrics::MeterProvider.new
40
+ end
41
+
42
+ # @return [Instrumentation::Registry] registry containing all known
43
+ # instrumentation
44
+ def instrumentation_registry
45
+ @instrumentation_registry ||= Instrumentation::Registry.new
28
46
  end
29
47
 
30
- # @return [Object, Metrics::MeterFactory] registered meter factory or a
31
- # default no-op implementation of the meter factory.
32
- def meter_factory
33
- @meter_factory ||= Metrics::MeterFactory.new
48
+ # @return [Object, CorrelationContext::Manager] registered
49
+ # correlation context manager or a default no-op implementation of the
50
+ # manager.
51
+ def correlations
52
+ @correlations ||= CorrelationContext::Manager.new
34
53
  end
35
54
 
36
- # @return [Object, DistributedContext::Manager] registered distributed
37
- # context manager or a default no-op implementation of the manager
38
- def distributed_context_manager
39
- @distributed_context_manager ||= DistributedContext::Manager.new
55
+ # @return [Context::Propagation::Propagation] an instance of the propagation API
56
+ def propagation
57
+ @propagation ||= Context::Propagation::Propagation.new
40
58
  end
41
59
 
42
60
  self.logger = Logger.new(STDOUT)
@@ -4,28 +4,151 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
+ require 'opentelemetry/context/key'
8
+ require 'opentelemetry/context/propagation'
9
+
7
10
  module OpenTelemetry
8
- # The Context module provides per-thread storage.
9
- module Context
10
- extend self
11
+ # Manages context on a per-fiber basis
12
+ class Context
13
+ KEY = :__opentelemetry_context__
14
+ EMPTY_ENTRIES = {}.freeze
15
+
16
+ class << self
17
+ # Returns a key used to index a value in a Context
18
+ #
19
+ # @param [String] name The key name
20
+ # @return [Context::Key]
21
+ def create_key(name)
22
+ Key.new(name)
23
+ end
24
+
25
+ # Returns current context, which is never nil
26
+ #
27
+ # @return [Context]
28
+ def current
29
+ Thread.current[KEY] ||= ROOT
30
+ end
31
+
32
+ # Sets the current context
33
+ #
34
+ # @param [Context] ctx The context to be made active
35
+ def current=(ctx)
36
+ Thread.current[KEY] = ctx
37
+ end
38
+
39
+ # Executes a block with ctx as the current context. It restores
40
+ # the previous context upon exiting.
41
+ #
42
+ # @param [Context] ctx The context to be made active
43
+ # @yield [context] Yields context to the block
44
+ def with_current(ctx)
45
+ prev = ctx.attach
46
+ yield ctx
47
+ ensure
48
+ ctx.detach(prev)
49
+ end
50
+
51
+ # Execute a block in a new context with key set to value. Restores the
52
+ # previous context after the block executes.
53
+
54
+ # @param [String] key The lookup key
55
+ # @param [Object] value The object stored under key
56
+ # @param [Callable] Block to execute in a new context
57
+ # @yield [context, value] Yields the newly created context and value to
58
+ # the block
59
+ def with_value(key, value)
60
+ ctx = current.set_value(key, value)
61
+ prev = ctx.attach
62
+ yield ctx, value
63
+ ensure
64
+ ctx.detach(prev)
65
+ end
66
+
67
+ # Execute a block in a new context where its values are merged with the
68
+ # incoming values. Restores the previous context after the block executes.
69
+
70
+ # @param [String] key The lookup key
71
+ # @param [Hash] values Will be merged with values of the current context
72
+ # and returned in a new context
73
+ # @param [Callable] Block to execute in a new context
74
+ # @yield [context, values] Yields the newly created context and values
75
+ # to the block
76
+ def with_values(values)
77
+ ctx = current.set_values(values)
78
+ prev = ctx.attach
79
+ yield ctx, values
80
+ ensure
81
+ ctx.detach(prev)
82
+ end
83
+
84
+ # Returns the value associated with key in the current context
85
+ #
86
+ # @param [String] key The lookup key
87
+ def value(key)
88
+ current.value(key)
89
+ end
90
+
91
+ def clear
92
+ self.current = ROOT
93
+ end
11
94
 
12
- def get(key)
13
- storage[key]
95
+ def empty
96
+ new(nil, EMPTY_ENTRIES)
97
+ end
14
98
  end
15
99
 
16
- def with(key, value)
17
- store = storage
18
- previous = store[key]
19
- store[key] = value
20
- yield value
21
- ensure
22
- store[key] = previous
100
+ def initialize(parent, entries)
101
+ @parent = parent
102
+ @entries = entries.freeze
23
103
  end
24
104
 
25
- private
105
+ # Returns the corresponding value (or nil) for key
106
+ #
107
+ # @param [Key] key The lookup key
108
+ # @return [Object]
109
+ def value(key)
110
+ @entries[key]
111
+ end
112
+
113
+ alias [] value
114
+
115
+ # Returns a new Context where entries contains the newly added key and value
116
+ #
117
+ # @param [Key] key The key to store this value under
118
+ # @param [Object] value Object to be stored under key
119
+ # @return [Context]
120
+ def set_value(key, value)
121
+ new_entries = @entries.dup
122
+ new_entries[key] = value
123
+ Context.new(self, new_entries)
124
+ end
125
+
126
+ # Returns a new Context with the current context's entries merged with the
127
+ # new entries
128
+ #
129
+ # @param [Hash] values The values to be merged with the current context's
130
+ # entries.
131
+ # @param [Object] value Object to be stored under key
132
+ # @return [Context]
133
+ def set_values(values) # rubocop:disable Naming/AccessorMethodName:
134
+ Context.new(self, @entries.merge(values))
135
+ end
26
136
 
27
- def storage
28
- Thread.current[:__opentelemetry__] ||= {}
137
+ # @api private
138
+ def attach
139
+ prev = self.class.current
140
+ self.class.current = self
141
+ prev
29
142
  end
143
+
144
+ # @api private
145
+ def detach(ctx_to_attach = nil)
146
+ OpenTelemetry.logger.warn 'Calls to detach should match corresponding calls to attach' if self.class.current != self
147
+
148
+ ctx_to_attach ||= @parent || ROOT
149
+ ctx_to_attach.attach
150
+ end
151
+
152
+ ROOT = empty.freeze
30
153
  end
31
154
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2019 OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ class Context
9
+ # The Key class provides mechanisms to index and access values from a
10
+ # Context
11
+ class Key
12
+ attr_reader :name
13
+
14
+ # @api private
15
+ # Use Context.create_key to obtain a Key instance.
16
+ def initialize(name)
17
+ @name = name
18
+ end
19
+
20
+ # Returns the value indexed by this Key in the specified context
21
+ #
22
+ # @param [optional Context] context The Context to lookup the key from.
23
+ # Defaults to +Context.current+.
24
+ def get(context = Context.current)
25
+ context[self]
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2019 OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ require 'opentelemetry/context/propagation/composite_propagator'
8
+ require 'opentelemetry/context/propagation/default_getter'
9
+ require 'opentelemetry/context/propagation/default_setter'
10
+ require 'opentelemetry/context/propagation/noop_extractor'
11
+ require 'opentelemetry/context/propagation/noop_injector'
12
+ require 'opentelemetry/context/propagation/propagation'
13
+ require 'opentelemetry/context/propagation/propagator'
14
+
15
+ module OpenTelemetry
16
+ class Context
17
+ # The propagation module contains APIs and utilities to interact with context
18
+ # and propagate across process boundaries.
19
+ module Propagation
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2020 OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ class Context
9
+ module Propagation
10
+ # A composite propagator composes a list of injectors and extractors into
11
+ # single interface exposing inject and extract methods. Injection and
12
+ # extraction will preserve the order of the injectors and extractors
13
+ # passed in during initialization.
14
+ class CompositePropagator
15
+ # Returns a Propagator that extracts using the provided extractors
16
+ # and injectors.
17
+ #
18
+ # @param [Array<#inject>] injectors
19
+ # @param [Array<#extract>] extractors
20
+ def initialize(injectors, extractors)
21
+ @injectors = injectors
22
+ @extractors = extractors
23
+ end
24
+
25
+ # Runs injectors in order and returns a carrier. If an injection fails
26
+ # a warning will be logged and remaining injectors will be executed.
27
+ # Always returns a valid carrier.
28
+ #
29
+ # @param [Object] carrier A carrier to inject context into
30
+ # context into
31
+ # @param [optional Context] context Context to be injected into carrier.
32
+ # Defaults to +Context.current+
33
+ # @param [optional Callable] setter An optional callable that takes a
34
+ # carrier, a key and a value and assigns the key-value pair in the
35
+ # carrier. If omitted the default setter will be used which expects
36
+ # the carrier to respond to [] and []=.
37
+ #
38
+ # @return [Object] carrier
39
+ def inject(carrier, context = Context.current, &setter)
40
+ @injectors.inject(carrier) do |memo, injector|
41
+ begin
42
+ injector.inject(memo, context, &setter)
43
+ rescue => e # rubocop:disable Style/RescueStandardError
44
+ OpenTelemetry.logger.warn "Error in CompositePropagator#inject #{e.message}"
45
+ carrier
46
+ end
47
+ end
48
+ end
49
+
50
+ # Runs extractors in order and returns a Context updated with the
51
+ # results of each extraction. If an extraction fails, a warning will be
52
+ # logged and remaining extractors will continue to be executed. Always
53
+ # returns a valid context.
54
+ #
55
+ # @param [Object] carrier The carrier to extract context from
56
+ # @param [optional Context] context Context to be updated with the state
57
+ # extracted from the carrier. Defaults to +Context.current+
58
+ # @param [optional Callable] getter An optional callable that takes a carrier and a key and
59
+ # returns the value associated with the key. If omitted the default getter will be used
60
+ # which expects the carrier to respond to [] and []=.
61
+ #
62
+ # @return [Context] a new context updated with state extracted from the
63
+ # carrier
64
+ def extract(carrier, context = Context.current, &getter)
65
+ @extractors.inject(context) do |ctx, extractor|
66
+ begin
67
+ extractor.extract(carrier, ctx, &getter)
68
+ rescue => e # rubocop:disable Style/RescueStandardError
69
+ OpenTelemetry.logger.warn "Error in CompositePropagator#extract #{e.message}"
70
+ ctx
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end