opencensus 0.3.1 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +23 -0
- data/README.md +14 -3
- data/lib/opencensus.rb +12 -0
- data/lib/opencensus/common.rb +1 -0
- data/lib/opencensus/common/config.rb +1 -0
- data/lib/opencensus/config.rb +5 -3
- data/lib/opencensus/context.rb +1 -0
- data/lib/opencensus/stats.rb +1 -0
- data/lib/opencensus/tags.rb +1 -0
- data/lib/opencensus/trace.rb +31 -11
- data/lib/opencensus/trace/annotation.rb +1 -0
- data/lib/opencensus/trace/config.rb +13 -11
- data/lib/opencensus/trace/exporters.rb +1 -0
- data/lib/opencensus/trace/exporters/logger.rb +4 -3
- data/lib/opencensus/trace/exporters/multi.rb +1 -0
- data/lib/opencensus/trace/formatters.rb +3 -2
- data/lib/opencensus/trace/formatters/binary.rb +1 -0
- data/lib/opencensus/trace/formatters/cloud_trace.rb +1 -0
- data/lib/opencensus/trace/formatters/trace_context.rb +3 -2
- data/lib/opencensus/trace/integrations.rb +1 -0
- data/lib/opencensus/trace/integrations/faraday_middleware.rb +57 -21
- data/lib/opencensus/trace/integrations/rack_middleware.rb +11 -19
- data/lib/opencensus/trace/integrations/rails.rb +1 -0
- data/lib/opencensus/trace/link.rb +17 -7
- data/lib/opencensus/trace/message_event.rb +13 -3
- data/lib/opencensus/trace/samplers.rb +11 -7
- data/lib/opencensus/trace/samplers/always_sample.rb +1 -0
- data/lib/opencensus/trace/samplers/never_sample.rb +1 -0
- data/lib/opencensus/trace/samplers/probability.rb +13 -5
- data/lib/opencensus/trace/samplers/rate_limiting.rb +74 -0
- data/lib/opencensus/trace/span.rb +11 -5
- data/lib/opencensus/trace/span_builder.rb +84 -27
- data/lib/opencensus/trace/span_context.rb +76 -40
- data/lib/opencensus/trace/status.rb +227 -5
- data/lib/opencensus/trace/time_event.rb +1 -0
- data/lib/opencensus/trace/trace_context_data.rb +1 -0
- data/lib/opencensus/trace/truncatable_string.rb +1 -0
- data/lib/opencensus/version.rb +2 -1
- metadata +6 -6
- data/lib/opencensus/trace/samplers/max_qps.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 536fa079d66a3bb4bef7a0e70439d5e9cc016f25e86e775a74d7426c4ef3a7e7
|
4
|
+
data.tar.gz: '00688752f3c40bd18f08d4b0f311b8bd16435798647b1c09b70ad3c9240fb233'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50ef3104c577f850c1b4dc8b7bbe9da6030eab510f413c9cec5934da88f0b80232a97b77b7a50f5997925b53601f8796089ab7587c011bb28f2cf593171f37ea
|
7
|
+
data.tar.gz: 8f4735b8955070ea7cbec12fd9260fe0a6f0647c0702837e7e74691e05b8f8bebaf2e7be92b3065b89e865cc2d2b4f100cf8ff2b6a2a1e57dceafbd9e9746da4
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
# Release History
|
2
2
|
|
3
|
+
### 0.4.0 / 2018-10-22
|
4
|
+
|
5
|
+
This is an important update that includes a number of fixes and brings the
|
6
|
+
library up to date with the latest OpenCensus specification.
|
7
|
+
|
8
|
+
Backward-incompatible changes:
|
9
|
+
|
10
|
+
* Local parent span's sampling decision is propagated to children by default, to match the current sampling spec.
|
11
|
+
* It is no longer possible to change a sampling decision after a SpanBuilder has been created, to match the current sampling spec.
|
12
|
+
* Renamed MaxQPS sampler to RateLimiting, and modified the implementation to match the current spec.
|
13
|
+
* Probability sampler defaults to 1 in 10,000.
|
14
|
+
* `true` or `false` may be passed as a sampler, as shortcuts for AlwaysSample or NeverSample.
|
15
|
+
* Standard samplers are now thread-safe.
|
16
|
+
* HTTP status codes are properly translated to OpenCensus status codes, in particular for spans generated by the Faraday and Rack middleware.
|
17
|
+
* Faraday and Rack middleware produce attributes matching the OpenCensus HTTP spec instead of the Stackdriver Trace service spec. The Stackdriver exporter now translates these attributes accordingly.
|
18
|
+
* Update standard trace context HTTP header to "traceparent" following updated spec.
|
19
|
+
|
20
|
+
Other fixes:
|
21
|
+
|
22
|
+
* Allow requiring "opencensus/trace" directly.
|
23
|
+
* Return SpanContext objects when block not given.
|
24
|
+
* FaradayMiddleware closes span if Faraday raises an exception.
|
25
|
+
|
3
26
|
### 0.3.1 / 2018-04-13
|
4
27
|
|
5
28
|
* Clean unneeded files from the gem
|
data/README.md
CHANGED
@@ -98,7 +98,7 @@ additional custom spans to the request trace:
|
|
98
98
|
```ruby
|
99
99
|
OpenCensus::Trace.in_span "my_task" do |span|
|
100
100
|
# Do stuff...
|
101
|
-
|
101
|
+
|
102
102
|
OpenCensus::Trace.in_span "my_subtask" do |subspan|
|
103
103
|
# Do other stuff
|
104
104
|
end
|
@@ -112,8 +112,15 @@ module for more info.
|
|
112
112
|
### Exporting traces
|
113
113
|
|
114
114
|
By default, OpenCensus will log request trace data as JSON. To export traces to
|
115
|
-
your favorite analytics backend, install an export plugin.
|
116
|
-
|
115
|
+
your favorite analytics backend, install an export plugin.
|
116
|
+
|
117
|
+
The provided exporters are:
|
118
|
+
|
119
|
+
| Class | Description |
|
120
|
+
| ----- | ----------- |
|
121
|
+
| [LoggerExporter][logger-exporter] | Exporter JSON encoded spans to a standard Ruby Logger interface |
|
122
|
+
| [StackdriverExporter][stackdriver-exporter] | Report traces to Google Cloud Stackdriver Trace |
|
123
|
+
| [ZipkinExporter][zipkin-exporter] | Report collected spans to a Zipkin server |
|
117
124
|
|
118
125
|
You may also create your own
|
119
126
|
[Exporter](http://www.rubydoc.info/gems/opencensus/OpenCensus/Trace/Exporters)
|
@@ -193,3 +200,7 @@ This library is licensed under Apache 2.0. Full license text is available in
|
|
193
200
|
## Disclaimer
|
194
201
|
|
195
202
|
This is not an official Google product.
|
203
|
+
|
204
|
+
[logger-exporter]: https://www.rubydoc.info/gems/opencensus/OpenCensus/Trace/Exporters/Logger
|
205
|
+
[stackdriver-exporter]: https://github.com/census-ecosystem/opencensus-ruby-exporter-stackdriver
|
206
|
+
[zipkin-exporter]: https://github.com/census-ecosystem/opencensus-ruby-exporter-zipkin
|
data/lib/opencensus.rb
CHANGED
@@ -12,6 +12,18 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
|
16
|
+
##
|
17
|
+
# OpenCensus is a vendor-agnostic single distribution of libraries to provide
|
18
|
+
# metrics collection and tracing for your services. See https://opencensus.io/
|
19
|
+
# for general information on OpenCensus.
|
20
|
+
#
|
21
|
+
# The OpenCensus module provides a namespace for the Ruby implementation of
|
22
|
+
# OpenCensus, including the core libraries for OpenCensus metrics and tracing.
|
23
|
+
#
|
24
|
+
module OpenCensus
|
25
|
+
end
|
26
|
+
|
15
27
|
require "opencensus/common"
|
16
28
|
require "opencensus/config"
|
17
29
|
require "opencensus/context"
|
data/lib/opencensus/common.rb
CHANGED
data/lib/opencensus/config.rb
CHANGED
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
|
15
16
|
require "opencensus/common/config"
|
16
17
|
|
17
18
|
module OpenCensus
|
@@ -20,8 +21,9 @@ module OpenCensus
|
|
20
21
|
|
21
22
|
class << self
|
22
23
|
##
|
23
|
-
# Configure OpenCensus. Most configuration parameters are
|
24
|
-
# subconfigurations that live under this main configuration.
|
24
|
+
# Configure OpenCensus. Most configuration parameters are defined in
|
25
|
+
# subconfigurations that live under this main configuration. See, for
|
26
|
+
# example, {OpenCensus::Trace.configure}.
|
25
27
|
#
|
26
28
|
# If the OpenCensus Railtie is installed in a Rails application, the
|
27
29
|
# toplevel configuration object is also exposed as `config.opencensus`.
|
@@ -33,7 +35,7 @@ module OpenCensus
|
|
33
35
|
#
|
34
36
|
# OpenCensus.configure do |config|
|
35
37
|
# config.trace.default_sampler =
|
36
|
-
# OpenCensus::Trace::Samplers::
|
38
|
+
# OpenCensus::Trace::Samplers::RateLimiting.new
|
37
39
|
# config.trace.default_max_attributes = 16
|
38
40
|
# end
|
39
41
|
#
|
data/lib/opencensus/context.rb
CHANGED
data/lib/opencensus/stats.rb
CHANGED
data/lib/opencensus/tags.rb
CHANGED
data/lib/opencensus/trace.rb
CHANGED
@@ -12,6 +12,8 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
|
16
|
+
require "opencensus/context"
|
15
17
|
require "opencensus/trace/annotation"
|
16
18
|
require "opencensus/trace/config"
|
17
19
|
require "opencensus/trace/exporters"
|
@@ -77,7 +79,7 @@ module OpenCensus
|
|
77
79
|
# Starts tracing a request in the current thread, by creating a new
|
78
80
|
# SpanContext and setting it as the current thread-local context.
|
79
81
|
# Generally you should call this when beginning the handling of a
|
80
|
-
# request. If there is a rack environment or a provided
|
82
|
+
# request. If there is a rack environment or a provided traceparent
|
81
83
|
# header, pass it in so the SpanContext is constructed accordingly.
|
82
84
|
#
|
83
85
|
# If you pass a block, this method will yield the SpanContext to the
|
@@ -103,13 +105,15 @@ module OpenCensus
|
|
103
105
|
ensure
|
104
106
|
unset_span_context
|
105
107
|
end
|
108
|
+
else
|
109
|
+
span_context
|
106
110
|
end
|
107
111
|
end
|
108
112
|
|
109
113
|
##
|
110
114
|
# Create a new span in the current thread-local context.
|
111
115
|
# You must pass a name for the span. All other span attributes should
|
112
|
-
# be set using
|
116
|
+
# be set using {OpenCensus::Trace::SpanBuilder} methods.
|
113
117
|
#
|
114
118
|
# The span will be started automatically with the current timestamp.
|
115
119
|
# However, you are responsible for finishing the span yourself.
|
@@ -123,10 +127,18 @@ module OpenCensus
|
|
123
127
|
#
|
124
128
|
# Will throw an exception if there is no current SpanContext.
|
125
129
|
#
|
126
|
-
# @param [String] name Name of the span
|
127
|
-
# @param [Symbol] kind Kind of span. Defaults to unspecified.
|
128
|
-
#
|
129
|
-
#
|
130
|
+
# @param [String] name Name of the span. Required.
|
131
|
+
# @param [Symbol] kind Kind of span. Optional. Defaults to unspecified.
|
132
|
+
# Other allowed values are {OpenCensus::Trace::SpanBuilder::SERVER}
|
133
|
+
# and {OpenCensus::Trace::SpanBuilder::CLIENT}.
|
134
|
+
# @param [Sampler,Boolean,nil] sampler Span-scoped sampler. Optional.
|
135
|
+
# If provided, the sampler may be a sampler object as defined in the
|
136
|
+
# {OpenCensus::Trace::Samplers} module docs, or the values `true` or
|
137
|
+
# `false` as shortcuts for {OpenCensus::Trace::Samplers::AlwaysSample}
|
138
|
+
# or {OpenCensus::Trace::Samplers::NeverSample}, respectively. If no
|
139
|
+
# span-scoped sampler is provided, the local parent span's sampling
|
140
|
+
# decision is used. If there is no local parent span, the configured
|
141
|
+
# default sampler is used to make a sampling decision.
|
130
142
|
#
|
131
143
|
# @return [SpanBuilder] A SpanBuilder object that you can use to
|
132
144
|
# set span attributes and create children.
|
@@ -144,7 +156,7 @@ module OpenCensus
|
|
144
156
|
##
|
145
157
|
# Create a new span in this context.
|
146
158
|
# You must pass a name for the span. All other span attributes should
|
147
|
-
# be set using
|
159
|
+
# be set using {OpenCensus::Trace::SpanBuilder} methods.
|
148
160
|
#
|
149
161
|
# The span will be started automatically with the current timestamp. The
|
150
162
|
# SpanBuilder will then be passed to the block you provide. The span will
|
@@ -152,10 +164,18 @@ module OpenCensus
|
|
152
164
|
# the thread-local SpanContext will be updated so calls to `start_span`
|
153
165
|
# will create subspans.
|
154
166
|
#
|
155
|
-
# @param [String] name Name of the span
|
156
|
-
# @param [Symbol] kind Kind of span. Defaults to unspecified.
|
157
|
-
#
|
158
|
-
#
|
167
|
+
# @param [String] name Name of the span. Required.
|
168
|
+
# @param [Symbol] kind Kind of span. Optional. Defaults to unspecified.
|
169
|
+
# Other allowed values are {OpenCensus::Trace::SpanBuilder::SERVER}
|
170
|
+
# and {OpenCensus::Trace::SpanBuilder::CLIENT}.
|
171
|
+
# @param [Sampler,Boolean,nil] sampler Span-scoped sampler. Optional.
|
172
|
+
# If provided, the sampler may be a sampler object as defined in the
|
173
|
+
# {OpenCensus::Trace::Samplers} module docs, or the values `true` or
|
174
|
+
# `false` as shortcuts for {OpenCensus::Trace::Samplers::AlwaysSample}
|
175
|
+
# or {OpenCensus::Trace::Samplers::NeverSample}, respectively. If no
|
176
|
+
# span-scoped sampler is provided, the local parent span's sampling
|
177
|
+
# decision is used. If there is no local parent span, the configured
|
178
|
+
# default sampler is used to make a sampling decision.
|
159
179
|
#
|
160
180
|
def in_span name, kind: nil, skip_frames: 0, sampler: nil
|
161
181
|
span = start_span name, kind: kind, skip_frames: skip_frames + 1,
|
@@ -12,6 +12,8 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
|
16
|
+
require "opencensus/config"
|
15
17
|
require "opencensus/trace/exporters"
|
16
18
|
require "opencensus/trace/formatters"
|
17
19
|
require "opencensus/trace/samplers"
|
@@ -21,16 +23,16 @@ module OpenCensus
|
|
21
23
|
# Schema of the Trace configuration. See Trace#configure for more info.
|
22
24
|
@config = Common::Config.new do |config|
|
23
25
|
default_sampler = Samplers::AlwaysSample.new
|
26
|
+
exporter_logger = ::Logger.new STDOUT, ::Logger::INFO
|
27
|
+
default_exporter = Exporters::Logger.new exporter_logger
|
28
|
+
default_formatter = Formatters::TraceContext.new
|
29
|
+
|
24
30
|
config.add_option! :default_sampler, default_sampler do |value|
|
25
31
|
value.respond_to? :call
|
26
32
|
end
|
27
|
-
default_exporter =
|
28
|
-
Exporters::Logger.new ::Logger.new(STDOUT, ::Logger::INFO)
|
29
33
|
config.add_option! :exporter, default_exporter do |value|
|
30
34
|
value.respond_to? :export
|
31
35
|
end
|
32
|
-
default_formatter =
|
33
|
-
Formatters::TraceContext.new
|
34
36
|
config.add_option! :http_formatter, default_formatter do |value|
|
35
37
|
value.respond_to?(:serialize) &&
|
36
38
|
value.respond_to?(:deserialize) &&
|
@@ -67,7 +69,7 @@ module OpenCensus
|
|
67
69
|
#
|
68
70
|
# OpenCensus::Trace.configure do |config|
|
69
71
|
# config.default_sampler =
|
70
|
-
# OpenCensus::Trace::Samplers::
|
72
|
+
# OpenCensus::Trace::Samplers::RateLimiting.new
|
71
73
|
# config.default_max_attributes = 16
|
72
74
|
# end
|
73
75
|
#
|
@@ -75,17 +77,17 @@ module OpenCensus
|
|
75
77
|
#
|
76
78
|
# * `default_sampler` The default sampler to use. Must be a sampler,
|
77
79
|
# an object with a `call` method that takes a single options hash.
|
78
|
-
# See OpenCensus::Trace::Samplers. The initial value is
|
79
|
-
#
|
80
|
+
# See {OpenCensus::Trace::Samplers}. The initial value is an instance
|
81
|
+
# of {OpenCensus::Trace::Samplers::AlwaysSample}.
|
80
82
|
# * `exporter` The exporter to use. Must be an exporter, an object with
|
81
83
|
# an export method that takes an array of Span objects. See
|
82
|
-
# OpenCensus::Trace::Exporters. The initial value is a
|
83
|
-
# that logs to STDOUT.
|
84
|
+
# {OpenCensus::Trace::Exporters}. The initial value is a
|
85
|
+
# {OpenCensus::Trace::Exporters::Logger} that logs to STDOUT.
|
84
86
|
# * `http_formatter` The trace context propagation formatter to use.
|
85
87
|
# Must be a formatter, an object with `serialize`, `deserialize`,
|
86
88
|
# `header_name`, and `rack_header_name` methods. See
|
87
|
-
# OpenCensus::Trace::
|
88
|
-
#
|
89
|
+
# {OpenCensus::Trace::Formatters}. The initial value is a
|
90
|
+
# {OpenCensus::Trace::Formatters::TraceContext}.
|
89
91
|
# * `default_max_attributes` The maximum number of attributes to add to
|
90
92
|
# a span. Initial value is 32. Use 0 for no maximum.
|
91
93
|
# * `default_max_stack_frames` The maximum number of stack frames to
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
|
15
16
|
require "logger"
|
16
17
|
require "json"
|
17
18
|
|
@@ -27,9 +28,9 @@ module OpenCensus
|
|
27
28
|
# Create a new Logger exporter
|
28
29
|
#
|
29
30
|
# @param [#log] logger The logger to write to.
|
30
|
-
# @param [
|
31
|
-
# defined by
|
32
|
-
# Logger
|
31
|
+
# @param [Integer] level The log level. This should be a log level
|
32
|
+
# defined by the Logger standard library. Default is
|
33
|
+
# `::Logger::INFO`.
|
33
34
|
#
|
34
35
|
def initialize logger, level: ::Logger::INFO
|
35
36
|
@logger = logger
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
|
15
16
|
require "opencensus/trace/formatters/binary"
|
16
17
|
require "opencensus/trace/formatters/cloud_trace"
|
17
18
|
require "opencensus/trace/formatters/trace_context"
|
@@ -20,8 +21,8 @@ module OpenCensus
|
|
20
21
|
module Trace
|
21
22
|
##
|
22
23
|
# The Formatters module contains several implementations of cross-service
|
23
|
-
#
|
24
|
-
# TraceContextData instance.
|
24
|
+
# context propagation. Each formatter can serialize and deserialize a
|
25
|
+
# {OpenCensus::Trace::TraceContextData} instance.
|
25
26
|
#
|
26
27
|
module Formatters
|
27
28
|
end
|
@@ -12,6 +12,7 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
|
15
16
|
module OpenCensus
|
16
17
|
module Trace
|
17
18
|
module Formatters
|
@@ -41,7 +42,7 @@ module OpenCensus
|
|
41
42
|
#
|
42
43
|
# @private
|
43
44
|
#
|
44
|
-
HEADER_NAME = "
|
45
|
+
HEADER_NAME = "traceparent".freeze
|
45
46
|
|
46
47
|
##
|
47
48
|
# The rack environment header used for the TraceContext header
|
@@ -49,7 +50,7 @@ module OpenCensus
|
|
49
50
|
#
|
50
51
|
# @private
|
51
52
|
#
|
52
|
-
RACK_HEADER_NAME = "
|
53
|
+
RACK_HEADER_NAME = "HTTP_TRACEPARENT".freeze
|
53
54
|
|
54
55
|
##
|
55
56
|
# Returns the name of the header used for context propagation.
|
@@ -12,8 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
require "faraday"
|
16
15
|
|
16
|
+
require "faraday"
|
17
|
+
require "uri"
|
17
18
|
require "opencensus"
|
18
19
|
|
19
20
|
module OpenCensus
|
@@ -88,8 +89,11 @@ module OpenCensus
|
|
88
89
|
# }
|
89
90
|
# end
|
90
91
|
#
|
91
|
-
class FaradayMiddleware < Faraday::Middleware
|
92
|
-
##
|
92
|
+
class FaradayMiddleware < ::Faraday::Middleware
|
93
|
+
##
|
94
|
+
# Fallback span name
|
95
|
+
# @return [String]
|
96
|
+
#
|
93
97
|
DEFAULT_SPAN_NAME = "faraday_request".freeze
|
94
98
|
|
95
99
|
##
|
@@ -101,8 +105,8 @@ module OpenCensus
|
|
101
105
|
# current thread-local span context.
|
102
106
|
# @param [String, #call] span_name The name of the span to create.
|
103
107
|
# Can be a string or a callable that takes a faraday request env
|
104
|
-
# and returns a string. Optional: If omitted, uses
|
105
|
-
#
|
108
|
+
# and returns a string. Optional: If omitted, uses the request path
|
109
|
+
# as recommended in the OpenCensus spec.
|
106
110
|
# @param [#call] sampler The sampler to use when creating spans.
|
107
111
|
# Optional: If omitted, uses the sampler in the current config.
|
108
112
|
# @param [#serialize,#header_name] formatter The formatter to use when
|
@@ -113,7 +117,7 @@ module OpenCensus
|
|
113
117
|
formatter: nil
|
114
118
|
@app = app
|
115
119
|
@span_context = span_context || OpenCensus::Trace
|
116
|
-
@
|
120
|
+
@default_span_name = span_name
|
117
121
|
@sampler = sampler
|
118
122
|
@formatter = formatter || OpenCensus::Trace.config.http_formatter
|
119
123
|
end
|
@@ -128,36 +132,60 @@ module OpenCensus
|
|
128
132
|
return @app.call request_env
|
129
133
|
end
|
130
134
|
|
131
|
-
span_name = request_env
|
135
|
+
span_name = extract_span_name(request_env) || @default_span_name ||
|
136
|
+
DEFAULT_SPAN_NAME
|
132
137
|
span_name = span_name.call request_env if span_name.respond_to? :call
|
133
138
|
|
134
139
|
span = span_context.start_span span_name, sampler: @sampler
|
135
140
|
start_request span, request_env
|
136
|
-
|
137
|
-
|
141
|
+
begin
|
142
|
+
@app.call(request_env).on_complete do |response_env|
|
143
|
+
finish_request span, response_env
|
144
|
+
end
|
145
|
+
rescue StandardError => e
|
146
|
+
span.set_status 2, e.message
|
147
|
+
raise
|
148
|
+
ensure
|
138
149
|
span_context.end_span span
|
139
150
|
end
|
140
151
|
end
|
141
152
|
|
142
153
|
protected
|
143
154
|
|
155
|
+
##
|
156
|
+
# @private Get the span name from the request object
|
157
|
+
#
|
158
|
+
def extract_span_name env
|
159
|
+
name = env[:span_name]
|
160
|
+
return name if name
|
161
|
+
uri = build_uri env
|
162
|
+
return nil unless uri
|
163
|
+
path = uri.path.to_s
|
164
|
+
path.start_with?("/") ? path : "/#{path}"
|
165
|
+
end
|
166
|
+
|
144
167
|
##
|
145
168
|
# @private Set span attributes from request object
|
146
169
|
#
|
147
170
|
def start_request span, env
|
148
171
|
span.kind = SpanBuilder::CLIENT
|
149
172
|
req_method = env[:method]
|
150
|
-
span.put_attribute "
|
151
|
-
|
152
|
-
|
173
|
+
span.put_attribute "http.method", req_method.upcase if req_method
|
174
|
+
uri = build_uri env
|
175
|
+
if uri
|
176
|
+
span.put_attribute "http.host", uri.hostname.to_s
|
177
|
+
span.put_attribute "http.path", uri.path.to_s
|
178
|
+
end
|
153
179
|
body = env[:body]
|
154
|
-
body_size = body.bytesize
|
155
|
-
span.
|
180
|
+
body_size = body.respond_to?(:bytesize) ? body.bytesize : 0
|
181
|
+
span.put_message_event SpanBuilder::SENT, 1, body_size
|
156
182
|
|
157
183
|
formatter = env[:formatter] || @formatter
|
158
|
-
|
159
|
-
|
160
|
-
|
184
|
+
if formatter.respond_to? :header_name
|
185
|
+
headers = env[:request_headers] ||= {}
|
186
|
+
trace_context = formatter.serialize span.context.trace_context
|
187
|
+
headers[formatter.header_name] = trace_context
|
188
|
+
end
|
161
189
|
end
|
162
190
|
|
163
191
|
##
|
@@ -166,12 +194,20 @@ module OpenCensus
|
|
166
194
|
def finish_request span, env
|
167
195
|
status = env[:status].to_i
|
168
196
|
if status > 0
|
169
|
-
span.
|
170
|
-
span.put_attribute "
|
197
|
+
span.set_http_status status
|
198
|
+
span.put_attribute "http.status_code", status
|
171
199
|
end
|
172
200
|
body = env[:body]
|
173
|
-
body_size = body.bytesize
|
174
|
-
span.
|
201
|
+
body_size = body.respond_to?(:bytesize) ? body.bytesize : 0
|
202
|
+
span.put_message_event SpanBuilder::RECEIVED, 1, body_size
|
203
|
+
end
|
204
|
+
|
205
|
+
private
|
206
|
+
|
207
|
+
def build_uri env
|
208
|
+
::URI.parse env[:url]
|
209
|
+
rescue ::URI::InvalidURIError
|
210
|
+
nil
|
175
211
|
end
|
176
212
|
end
|
177
213
|
end
|