helios-opentelemetry-sdk 0.1.11 → 0.1.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1adbd46e6a58a91a55e6b5f174e706564141dcbeb65d5b1c5d855632ffdb3b7c
4
- data.tar.gz: 76577730e1f13b6c9f2d60aa86906cca431e90f8253d50bfb0edcb0181450c76
3
+ metadata.gz: 3e7f2f77a8b66880739f7a053fd1e0ac0ed6a9330d9d9068ccbeb060460ba7db
4
+ data.tar.gz: 806da26e71661cb27095bcc616d098b1a36af5ffbb4699e461cdeae5d0e077f4
5
5
  SHA512:
6
- metadata.gz: 99f28108bf45d3a29cfdc76aafcb21330d3a25ae1567460df3173af4b1705b42cc4ac8173cf3815be7270d85d60f292f967fa1255b0f676549762db670039705
7
- data.tar.gz: 66297d9845f19cd5158c7e6e14436169c96d328efe17d4cafc504fa72b7d54b0784249cfdbcdcc12961454585cc65db1101b66ff760e5e3d59657568293d8ae1
6
+ metadata.gz: 4dd2dac65944039de49814d7958161bcd5317864bc1bc3b35c89024691739ce4dd4bdfbd168fcd9a2a2df75212dea7c7a7c81e716156880c5e5ce6bc8618aee0
7
+ data.tar.gz: f5ae7746690135bf149d897fcb61fe53709a5b7bc0f8f7ed32c48116b686a2a74e4b3d79f762ce0c16425cbfb5b7cc760da4f9d23c69a848c97fa03132e03df5
data/.rubocop.yml CHANGED
@@ -18,3 +18,6 @@ AllCops:
18
18
 
19
19
  Style/HashSyntax:
20
20
  Enabled: false
21
+
22
+ Metrics/BlockLength:
23
+ Enabled: false
data/Gemfile CHANGED
@@ -8,3 +8,5 @@ gem 'opentelemetry-instrumentation-all', '~> 0.25.0'
8
8
  gem 'opentelemetry-instrumentation-rspec', '~> 0.2.0'
9
9
  gem 'rubocop', '~> 1.30.1', group: [:development, :test]
10
10
  gem 'bundler', '~> 2.3.16', group: [:development, :test]
11
+ gem 'faraday', '~> 2.3.0', group: [:development, :test]
12
+ gem 'rack', '~> 2.2.4', group: [:development, :test]
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- helios-opentelemetry-sdk (0.1.11)
4
+ helios-opentelemetry-sdk (0.1.14)
5
5
  opentelemetry-exporter-otlp (~> 0.22.0)
6
6
  opentelemetry-instrumentation-all (~> 0.25.0)
7
7
  opentelemetry-instrumentation-rspec (~> 0.2.0)
@@ -12,6 +12,10 @@ GEM
12
12
  specs:
13
13
  ast (2.4.2)
14
14
  diff-lcs (1.5.0)
15
+ faraday (2.3.0)
16
+ faraday-net_http (~> 2.0)
17
+ ruby2_keywords (>= 0.0.4)
18
+ faraday-net_http (2.0.3)
15
19
  google-protobuf (3.21.1)
16
20
  googleapis-common-protos-types (1.3.1)
17
21
  google-protobuf (~> 3.14)
@@ -201,6 +205,7 @@ GEM
201
205
  parallel (1.22.1)
202
206
  parser (3.1.2.0)
203
207
  ast (~> 2.4.1)
208
+ rack (2.2.4)
204
209
  rainbow (3.1.1)
205
210
  rake (13.0.6)
206
211
  regexp_parser (2.5.0)
@@ -238,11 +243,13 @@ PLATFORMS
238
243
 
239
244
  DEPENDENCIES
240
245
  bundler (~> 2.3.16)
246
+ faraday (~> 2.3.0)
241
247
  helios-opentelemetry-sdk!
242
248
  opentelemetry-exporter-otlp (~> 0.22.0)
243
249
  opentelemetry-instrumentation-all (~> 0.25.0)
244
250
  opentelemetry-instrumentation-rspec (~> 0.2.0)
245
251
  opentelemetry-sdk (~> 1.1.0)
252
+ rack (~> 2.2.4)
246
253
  rake (~> 13.0)
247
254
  rspec (~> 3.0)
248
255
  rubocop (~> 1.30.1)
@@ -32,7 +32,7 @@ SUPPORTED_INSTRUMENTATIONS = {
32
32
  'OpenTelemetry::Instrumentation::Que' => { propagation_style: :child },
33
33
  'OpenTelemetry::Instrumentation::Rack' => {},
34
34
  'OpenTelemetry::Instrumentation::Rdkafka' => {},
35
- 'OpenTelemetry::Instrumentation::Redis' => {},
35
+ 'OpenTelemetry::Instrumentation::Redis' => { db_statement: :include },
36
36
  'OpenTelemetry::Instrumentation::Resque' => { propagation_style: :child },
37
37
  'OpenTelemetry::Instrumentation::RestClient' => {},
38
38
  'OpenTelemetry::Instrumentation::RSpec' => nil, # Disabled for now
@@ -48,4 +48,37 @@ def apply_instrumentations(otel_config)
48
48
 
49
49
  otel_config.use(instrumentation, config)
50
50
  end
51
+
52
+ additional_patches
53
+ end
54
+
55
+ def patch_net_http
56
+ require_relative 'patches/net_http_patch'
57
+ ::Net::HTTP.prepend(NetHttpPatch::Instrumentation)
58
+ end
59
+
60
+ def patch_faraday
61
+ return unless defined?(::Faraday)
62
+
63
+ require 'opentelemetry/instrumentation/faraday/middlewares/tracer_middleware'
64
+ require_relative 'patches/faraday_patch'
65
+ ::OpenTelemetry::Instrumentation::Faraday::Middlewares::TracerMiddleware.prepend(
66
+ FaradayPatch::HeliosFaradayMiddleware
67
+ )
68
+ end
69
+
70
+ def patch_rack
71
+ return unless defined?(::Rack)
72
+
73
+ require 'opentelemetry/instrumentation/rack/middlewares/tracer_middleware'
74
+ require_relative 'patches/rack_patch'
75
+ ::OpenTelemetry::Instrumentation::Rack::Middlewares::TracerMiddleware.prepend(
76
+ RackPatch::HeliosRackMiddleware
77
+ )
78
+ end
79
+
80
+ def additional_patches
81
+ patch_net_http
82
+ patch_faraday
83
+ patch_rack
51
84
  end
@@ -0,0 +1,19 @@
1
+ require 'faraday'
2
+ require 'json'
3
+ require_relative '../../semantic_attributes'
4
+
5
+ module FaradayPatch
6
+ module HeliosFaradayMiddleware
7
+ def trace_response(span, env)
8
+ request_headers = env.request_headers
9
+ semantic_attributes = Helios::OpenTelemetry::SemanticAttributes
10
+ span.set_attribute(semantic_attributes::HTTP_REQUEST_HEADERS, request_headers.to_json)
11
+ span.set_attribute(semantic_attributes::HTTP_REQUEST_BODY, env.body) unless env.body.nil?
12
+ response_headers = env.response_headers
13
+ span.set_attribute(semantic_attributes::HTTP_RESPONSE_HEADERS, response_headers.to_json)
14
+ span.set_attribute(semantic_attributes::HTTP_RESPONSE_BODY, env.response_body) unless env.response_body.nil?
15
+
16
+ super(span, env)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,31 @@
1
+ require 'json'
2
+ require_relative '../../semantic_attributes'
3
+
4
+ module NetHttpPatch
5
+ # Module to prepend to Net::HTTP for instrumentation
6
+ module Instrumentation
7
+ def request(req, body = nil, &block)
8
+ current_span = OpenTelemetry::Trace.current_span
9
+ current_span.set_attribute(Helios::OpenTelemetry::SemanticAttributes::HTTP_REQUEST_HEADERS, collect_headers(req))
10
+ unless body.nil?
11
+ current_span.set_attribute(Helios::OpenTelemetry::SemanticAttributes::HTTP_REQUEST_BODY,
12
+ body.is_a?(String) ? body : body.to_s)
13
+ end
14
+
15
+ super(req, body, &block).tap do |response|
16
+ current_span.set_attribute(Helios::OpenTelemetry::SemanticAttributes::HTTP_RESPONSE_HEADERS,
17
+ collect_headers(response))
18
+ current_span.set_attribute(Helios::OpenTelemetry::SemanticAttributes::HTTP_RESPONSE_BODY, response.body)
19
+ end
20
+ end
21
+
22
+ def collect_headers(obj)
23
+ headers = {}
24
+ obj.each_header do |k, v|
25
+ headers[k] = v
26
+ end
27
+
28
+ headers.to_json
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ require 'rack'
2
+ require 'json'
3
+ require_relative '../../semantic_attributes'
4
+
5
+ module RackPatch
6
+ module HeliosRackMiddleware
7
+ def request_span_attributes(env:)
8
+ res = super(env: env)
9
+ # Request headers are attributes in the env hash that start with HTTP_
10
+ request_headers = env.select { |k, _v| k.start_with? 'HTTP_' }.transform_keys { |k| k.sub(/^HTTP_/, '').downcase }
11
+ semantic_attributes = Helios::OpenTelemetry::SemanticAttributes
12
+ res[semantic_attributes::HTTP_REQUEST_HEADERS] = request_headers.to_json
13
+ request_body = env['rack.input']&.read
14
+ env['rack.input']&.rewind
15
+ if request_body&.length&.positive?
16
+ res[semantic_attributes::HTTP_REQUEST_BODY] = request_body
17
+ end
18
+
19
+ res
20
+ end
21
+
22
+ def set_attributes_after_request(span, status, headers, response)
23
+ semantic_attributes = Helios::OpenTelemetry::SemanticAttributes
24
+ span.set_attribute(semantic_attributes::HTTP_RESPONSE_HEADERS, headers.to_json)
25
+ span.set_attribute(semantic_attributes::HTTP_RESPONSE_BODY, response[0]) if response[0]&.length&.positive?
26
+ super(span, status, headers, response)
27
+ end
28
+ end
29
+ end
@@ -1,7 +1,7 @@
1
1
  module Helios
2
2
  module OpenTelemetry
3
3
  module SDK
4
- VERSION = '0.1.11'
4
+ VERSION = '0.1.14'
5
5
  end
6
6
  end
7
7
  end
@@ -0,0 +1,10 @@
1
+ module Helios
2
+ module OpenTelemetry
3
+ class SemanticAttributes
4
+ HTTP_REQUEST_BODY = 'http.request.body'
5
+ HTTP_REQUEST_HEADERS = 'http.request.headers'
6
+ HTTP_RESPONSE_BODY = 'http.response.body'
7
+ HTTP_RESPONSE_HEADERS = 'http.response.headers'
8
+ end
9
+ end
10
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: helios-opentelemetry-sdk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Team Helios
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-08-04 00:00:00.000000000 Z
11
+ date: 2022-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -130,7 +130,11 @@ files:
130
130
  - helios-opentelemetry-sdk.gemspec
131
131
  - lib/helios/opentelemetry/sdk.rb
132
132
  - lib/helios/opentelemetry/sdk/instrumentations.rb
133
+ - lib/helios/opentelemetry/sdk/patches/faraday_patch.rb
134
+ - lib/helios/opentelemetry/sdk/patches/net_http_patch.rb
135
+ - lib/helios/opentelemetry/sdk/patches/rack_patch.rb
133
136
  - lib/helios/opentelemetry/sdk/version.rb
137
+ - lib/helios/opentelemetry/semantic_attributes.rb
134
138
  homepage: https://gethelios.dev
135
139
  licenses:
136
140
  - Apache-2.0