opentelemetry-api 0.2.0 → 0.3.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.
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
@@ -45,7 +45,7 @@ module OpenTelemetry
45
45
  # Set attribute
46
46
  #
47
47
  # Note that the OpenTelemetry project
48
- # {https://github.com/open-telemetry/opentelemetry-specification/blob/master/semantic-conventions.md
48
+ # {https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-semantic-conventions.md
49
49
  # documents} certain "standard attributes" that have prescribed semantic
50
50
  # meanings.
51
51
  #
@@ -71,16 +71,16 @@ module OpenTelemetry
71
71
  # span.add_event { tracer.create_event(name: 'event', attributes: {'eager' => false}) }
72
72
  #
73
73
  # Note that the OpenTelemetry project
74
- # {https://github.com/open-telemetry/opentelemetry-specification/blob/master/semantic-conventions.md
74
+ # {https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-semantic-conventions.md
75
75
  # documents} certain "standard event names and keys" which have
76
76
  # prescribed semantic meanings.
77
77
  #
78
78
  # @param [optional String] name Optional name of the event. This is
79
79
  # required if a block is not given.
80
- # @param [optional Hash<String, Object>] attributes One or more key:value
81
- # pairs, where the keys must be strings and the values may be string,
82
- # boolean or numeric type. This argument should only be used when
83
- # passing in a name.
80
+ # @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
81
+ # attributes One or more key:value pairs, where the keys must be
82
+ # strings and the values may be (array of) string, boolean or numeric
83
+ # type. This argument should only be used when passing in a name.
84
84
  # @param [optional Time] timestamp Optional timestamp for the event.
85
85
  # This argument should only be used when passing in a name.
86
86
  #
@@ -89,6 +89,14 @@ module OpenTelemetry
89
89
  self
90
90
  end
91
91
 
92
+ # Record an error during the execution of this span. Multiple errors
93
+ # can be recorded on a span.
94
+ #
95
+ # @param [Exception] error The error to recorded
96
+ #
97
+ # @return [void]
98
+ def record_error(error); end
99
+
92
100
  # Sets the Status to the Span
93
101
  #
94
102
  # If used, this will override the default Span status. Default is OK.
@@ -4,11 +4,16 @@
4
4
  #
5
5
  # SPDX-License-Identifier: Apache-2.0
6
6
 
7
+ require 'opentelemetry/trace/util/http_to_status'
8
+
7
9
  module OpenTelemetry
8
10
  module Trace
9
11
  # Status represents the status of a finished {Span}. It is composed of a
10
12
  # canonical code in conjunction with an optional descriptive message.
11
13
  class Status
14
+ # Convenience utility, not in API spec:
15
+ extend Util::HttpToStatus
16
+
12
17
  # Retrieve the canonical code of this Status.
13
18
  #
14
19
  # @return [Integer]
@@ -21,7 +26,7 @@ module OpenTelemetry
21
26
 
22
27
  # Initialize a Status.
23
28
  #
24
- # @param [Integer] canonical_code One of the standard GRPC codes: https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
29
+ # @param [Integer] canonical_code One of the standard gRPC codes: https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
25
30
  # @param [String] description
26
31
  def initialize(canonical_code, description: '')
27
32
  @canonical_code = canonical_code
@@ -36,7 +41,7 @@ module OpenTelemetry
36
41
  end
37
42
 
38
43
  # The following represents the canonical set of status codes of a
39
- # finished {Span}, following the standard GRPC codes:
44
+ # finished {Span}, following the standard gRPC codes:
40
45
  # https://github.com/grpc/grpc/blob/master/doc/statuscodes.md
41
46
 
42
47
  # The operation completed successfully.
@@ -8,11 +8,33 @@ module OpenTelemetry
8
8
  module Trace
9
9
  # No-op implementation of Tracer.
10
10
  class Tracer
11
- CONTEXT_SPAN_KEY = :__span__
12
- private_constant(:CONTEXT_SPAN_KEY)
11
+ EXTRACTED_SPAN_CONTEXT_KEY = Propagation::ContextKeys.extracted_span_context_key
12
+ CURRENT_SPAN_KEY = Propagation::ContextKeys.current_span_key
13
13
 
14
- def current_span
15
- Context.get(CONTEXT_SPAN_KEY) || Span::INVALID
14
+ private_constant :EXTRACTED_SPAN_CONTEXT_KEY, :CURRENT_SPAN_KEY
15
+
16
+ # Returns the current span from the current or provided context
17
+ #
18
+ # @param [optional Context] context The context to lookup the current
19
+ # {Span} from. Defaults to Context.current
20
+ def current_span(context = Context.current)
21
+ context.value(CURRENT_SPAN_KEY) || Span::INVALID
22
+ end
23
+
24
+ # Returns the the active span context from the given {Context}, or current
25
+ # if one is not explicitly passed in. The active span context may refer to
26
+ # a {SpanContext} that has been extracted. If both a current {Span} and an
27
+ # extracted, {SpanContext} exist, the context of the current {Span} will be
28
+ # returned.
29
+ #
30
+ # @param [optional Context] context The context to lookup the active
31
+ # {SpanContext} from.
32
+ #
33
+ def active_span_context(context = nil)
34
+ context ||= Context.current
35
+ context.value(CURRENT_SPAN_KEY)&.context ||
36
+ context.value(EXTRACTED_SPAN_CONTEXT_KEY) ||
37
+ SpanContext::INVALID
16
38
  end
17
39
 
18
40
  # This is a helper for the default use-case of extending the current trace with a span.
@@ -25,10 +47,19 @@ module OpenTelemetry
25
47
  #
26
48
  # OpenTelemetry.tracer.with_span(OpenTelemetry.tracer.start_span('do-the-thing')) do ... end
27
49
  #
28
- # On exit, the Span that was active before calling this method will be reactivated.
29
- def in_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil, sampling_hint: nil, with_parent: nil, with_parent_context: nil)
30
- span = start_span(name, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind, sampling_hint: sampling_hint, with_parent: with_parent, with_parent_context: with_parent_context)
31
- with_span(span) { |s| yield s }
50
+ # On exit, the Span that was active before calling this method will be reactivated. If an
51
+ # exception occurs during the execution of the provided block, it will be recorded on the
52
+ # span and reraised.
53
+ # @yield [span, context] yields the newly created span and a context containing the
54
+ # span to the block.
55
+ def in_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil, with_parent: nil, with_parent_context: nil)
56
+ span = start_span(name, attributes: attributes, links: links, start_timestamp: start_timestamp, kind: kind, with_parent: with_parent, with_parent_context: with_parent_context)
57
+ with_span(span) { |s, c| yield s, c }
58
+ rescue Exception => e # rubocop:disable Lint/RescueException
59
+ span.record_error(e)
60
+ span.status = Status.new(Status::UNKNOWN_ERROR,
61
+ description: "Unhandled exception of type: #{e.class}")
62
+ raise e
32
63
  ensure
33
64
  span.finish
34
65
  end
@@ -37,11 +68,14 @@ module OpenTelemetry
37
68
  # available implicitly.
38
69
  #
39
70
  # On exit, the Span that was active before calling this method will be reactivated.
71
+ #
72
+ # @param [Span] span the span to activate
73
+ # @yield [span, context] yields span and a context containing the span to the block.
40
74
  def with_span(span)
41
- Context.with(CONTEXT_SPAN_KEY, span) { |s| yield s }
75
+ Context.with_value(CURRENT_SPAN_KEY, span) { |c, s| yield s, c }
42
76
  end
43
77
 
44
- def start_root_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil, sampling_hint: nil)
78
+ def start_root_span(name, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
45
79
  Span.new
46
80
  end
47
81
 
@@ -52,12 +86,12 @@ module OpenTelemetry
52
86
  #
53
87
  # @param [optional Span] with_parent Explicitly managed parent Span, overrides
54
88
  # +with_parent_context+.
55
- # @param [optional SpanContext] with_parent_context Explicitly managed. Overridden by
89
+ # @param [optional Context] with_parent_context Explicitly managed. Overridden by
56
90
  # +with_parent+.
57
91
  #
58
92
  # @return [Span]
59
- def start_span(name, with_parent: nil, with_parent_context: nil, attributes: nil, links: nil, start_timestamp: nil, kind: nil, sampling_hint: nil)
60
- span_context = with_parent&.context || with_parent_context || current_span.context
93
+ def start_span(name, with_parent: nil, with_parent_context: nil, attributes: nil, links: nil, start_timestamp: nil, kind: nil)
94
+ span_context = with_parent&.context || active_span_context(with_parent_context)
61
95
  if span_context.valid?
62
96
  Span.new(span_context: span_context)
63
97
  else
@@ -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
+ module OpenTelemetry
8
+ module Trace
9
+ # No-op implementation of a tracer provider.
10
+ class TracerProvider
11
+ # Returns a {Tracer} instance.
12
+ #
13
+ # @param [optional String] name Instrumentation package name
14
+ # @param [optional String] version Instrumentation package version
15
+ #
16
+ # @return [Tracer]
17
+ def tracer(name = nil, version = nil)
18
+ @tracer ||= Tracer.new
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2019 OpenTelemetry Authors
4
+ #
5
+ # SPDX-License-Identifier: Apache-2.0
6
+
7
+ module OpenTelemetry
8
+ module Trace
9
+ module Util
10
+ # Convenience methods, not necessarily required by the API specification.
11
+ module HttpToStatus
12
+ # Implemented according to
13
+ # https://github.com/open-telemetry/opentelemetry-specification/issues/306
14
+ # https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/data-http.md#status
15
+ #
16
+ # @param code Numeric HTTP status
17
+ # @return Status
18
+ def http_to_status(code) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
19
+ case code.to_i
20
+ when 100..399
21
+ new(const_get(:OK))
22
+ when 401
23
+ new(const_get(:UNAUTHENTICATED))
24
+ when 403
25
+ new(const_get(:PERMISSION_DENIED))
26
+ when 404
27
+ new(const_get(:NOT_FOUND))
28
+ when 429
29
+ new(const_get(:RESOURCE_EXHAUSTED))
30
+ when 400..499
31
+ new(const_get(:INVALID_ARGUMENT))
32
+ when 501
33
+ new(const_get(:UNIMPLEMENTED))
34
+ when 503
35
+ new(const_get(:UNAVAILABLE))
36
+ when 504
37
+ new(const_get(:DEADLINE_EXCEEDED))
38
+ when 500..599
39
+ new(const_get(:INTERNAL_ERROR))
40
+ else
41
+ new(const_get(:UNKNOWN_ERROR))
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -6,5 +6,5 @@
6
6
 
7
7
  module OpenTelemetry
8
8
  ## Current OpenTelemetry version
9
- VERSION = '0.2.0'
9
+ VERSION = '0.3.0'
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opentelemetry-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OpenTelemetry Authors
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-13 00:00:00.000000000 Z
11
+ date: 2020-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ipsa
@@ -143,36 +143,56 @@ executables: []
143
143
  extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
+ - ".yardopts"
146
147
  - CHANGELOG.md
147
148
  - LICENSE
149
+ - OVERVIEW.md
150
+ - lib/opentelemetry-api.rb
148
151
  - lib/opentelemetry.rb
149
152
  - lib/opentelemetry/context.rb
150
- - lib/opentelemetry/distributed_context.rb
151
- - lib/opentelemetry/distributed_context/distributed_context.rb
152
- - lib/opentelemetry/distributed_context/entry.rb
153
- - lib/opentelemetry/distributed_context/manager.rb
154
- - lib/opentelemetry/distributed_context/propagation.rb
155
- - lib/opentelemetry/distributed_context/propagation/binary_format.rb
156
- - lib/opentelemetry/distributed_context/propagation/text_format.rb
157
- - lib/opentelemetry/distributed_context/propagation/trace_parent.rb
153
+ - lib/opentelemetry/context/key.rb
154
+ - lib/opentelemetry/context/propagation.rb
155
+ - lib/opentelemetry/context/propagation/composite_propagator.rb
156
+ - lib/opentelemetry/context/propagation/default_getter.rb
157
+ - lib/opentelemetry/context/propagation/default_setter.rb
158
+ - lib/opentelemetry/context/propagation/noop_extractor.rb
159
+ - lib/opentelemetry/context/propagation/noop_injector.rb
160
+ - lib/opentelemetry/context/propagation/propagation.rb
161
+ - lib/opentelemetry/context/propagation/propagator.rb
162
+ - lib/opentelemetry/correlation_context.rb
163
+ - lib/opentelemetry/correlation_context/builder.rb
164
+ - lib/opentelemetry/correlation_context/manager.rb
165
+ - lib/opentelemetry/correlation_context/propagation.rb
166
+ - lib/opentelemetry/correlation_context/propagation/context_keys.rb
167
+ - lib/opentelemetry/correlation_context/propagation/text_extractor.rb
168
+ - lib/opentelemetry/correlation_context/propagation/text_injector.rb
158
169
  - lib/opentelemetry/error.rb
170
+ - lib/opentelemetry/instrumentation.rb
171
+ - lib/opentelemetry/instrumentation/adapter.rb
172
+ - lib/opentelemetry/instrumentation/registry.rb
159
173
  - lib/opentelemetry/internal.rb
160
174
  - lib/opentelemetry/metrics.rb
161
175
  - lib/opentelemetry/metrics/handles.rb
162
176
  - lib/opentelemetry/metrics/instruments.rb
163
177
  - lib/opentelemetry/metrics/meter.rb
164
- - lib/opentelemetry/metrics/meter_factory.rb
178
+ - lib/opentelemetry/metrics/meter_provider.rb
165
179
  - lib/opentelemetry/trace.rb
166
180
  - lib/opentelemetry/trace/event.rb
167
181
  - lib/opentelemetry/trace/link.rb
168
- - lib/opentelemetry/trace/sampling_hint.rb
182
+ - lib/opentelemetry/trace/propagation.rb
183
+ - lib/opentelemetry/trace/propagation/context_keys.rb
184
+ - lib/opentelemetry/trace/propagation/trace_context.rb
185
+ - lib/opentelemetry/trace/propagation/trace_context/text_extractor.rb
186
+ - lib/opentelemetry/trace/propagation/trace_context/text_injector.rb
187
+ - lib/opentelemetry/trace/propagation/trace_context/trace_parent.rb
169
188
  - lib/opentelemetry/trace/span.rb
170
189
  - lib/opentelemetry/trace/span_context.rb
171
190
  - lib/opentelemetry/trace/span_kind.rb
172
191
  - lib/opentelemetry/trace/status.rb
173
192
  - lib/opentelemetry/trace/trace_flags.rb
174
193
  - lib/opentelemetry/trace/tracer.rb
175
- - lib/opentelemetry/trace/tracer_factory.rb
194
+ - lib/opentelemetry/trace/tracer_provider.rb
195
+ - lib/opentelemetry/trace/util/http_to_status.rb
176
196
  - lib/opentelemetry/version.rb
177
197
  homepage: https://github.com/open-telemetry/opentelemetry-ruby
178
198
  licenses:
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- require 'opentelemetry/distributed_context/distributed_context'
8
- require 'opentelemetry/distributed_context/entry'
9
- require 'opentelemetry/distributed_context/manager'
10
- require 'opentelemetry/distributed_context/propagation'
11
-
12
- module OpenTelemetry
13
- # DistributedContext is an abstract data type that represents a collection of entries. Each key of a DistributedContext is
14
- # associated with exactly one value. DistributedContext is serializable, to facilitate propagating it not only inside the
15
- # process but also across process boundaries. DistributedContext is used to annotate telemetry with the name:value pair
16
- # Entry. Those values can be used to add dimensions to the metric or additional context properties to logs and traces.
17
- module DistributedContext
18
- end
19
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module DistributedContext
9
- # An immutable implementation of the DistributedContext that does not contain any entries.
10
- class DistributedContext
11
- EMPTY_ENTRIES = [].freeze
12
-
13
- private_constant(:EMPTY_ENTRIES)
14
-
15
- def entries
16
- EMPTY_ENTRIES
17
- end
18
-
19
- def [](_key)
20
- nil
21
- end
22
- end
23
- end
24
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Copyright 2019 OpenTelemetry Authors
4
- #
5
- # SPDX-License-Identifier: Apache-2.0
6
-
7
- module OpenTelemetry
8
- module DistributedContext
9
- # An Entry consists of Entry::Metadata, Entry::Key, and Entry::Value.
10
- class Entry
11
- attr_reader :metadata, :key, :value
12
-
13
- # Entry::Key is the name of the Entry. Entry::Key along with Entry::Value can be used to aggregate and group stats,
14
- # annotate traces and logs, etc.
15
- #
16
- # Restrictions
17
- # - Must contain only printable ASCII (codes between 32 and 126 inclusive)
18
- # - Must have length greater than zero and less than 256.
19
- # - Must not be empty.
20
- class Key
21
- attr_reader :name
22
-
23
- def initialize(name)
24
- raise ArgumentError unless Internal.printable_ascii?(name) && (1..255).include?(name.length)
25
-
26
- @name = -name
27
- end
28
- end
29
-
30
- # Entry::Value wraps a string. It MUST contain only printable ASCII (codes between 32 and 126).
31
- class Value
32
- def initialize(value)
33
- raise ArgumentError unless Internal.printable_ascii?(value)
34
-
35
- @value = -value
36
- end
37
-
38
- def to_s
39
- @value
40
- end
41
- end
42
-
43
- # Entry::Metadata contains properties associated with an Entry. For now only the property entry_ttl is defined.
44
- # In future, additional properties may be added to address specific situations.
45
- #
46
- # The creator of entries determines metadata of an entry it creates.
47
- class Metadata
48
- attr_reader :entry_ttl
49
-
50
- # An @see Entry with NO_PROPAGATION is considered to have local scope and is used within the process
51
- # where it is created.
52
- NO_PROPAGATION = 0
53
-
54
- # An @see Entry with UNLIMITED_PROPAGATION can propagate unlimited hops. However, it is still subject
55
- # to outgoing and incoming (on remote side) filter criteria.
56
- UNLIMITED_PROPAGATION = -1
57
-
58
- def initialize(entry_ttl)
59
- raise ArgumentError unless entry_ttl.is_a?(Integer)
60
-
61
- @entry_ttl = entry_ttl
62
- end
63
- end
64
- end
65
- end
66
- end