helios-opentelemetry-sdk 0.1.11 → 0.1.14

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 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