acfs 2.0.0 → 2.1.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +8 -0
  3. data/README.md +1 -1
  4. data/acfs.gemspec +2 -0
  5. data/lib/acfs/global.rb +10 -6
  6. data/lib/acfs/request.rb +4 -3
  7. data/lib/acfs/runner.rb +46 -8
  8. data/lib/acfs/telemetry.rb +19 -0
  9. data/lib/acfs/version.rb +1 -1
  10. data/lib/acfs.rb +4 -0
  11. data/vendor/bundle/ruby/3.4.0/bundler/gems/rubocop-config-67802c9d1826/rubocop-config.gemspec +1 -1
  12. data/vendor/bundle/ruby/3.4.0/gems/diff-lcs-1.6.0/CHANGELOG.md +491 -0
  13. data/vendor/bundle/ruby/3.4.0/gems/diff-lcs-1.6.0/README.md +92 -0
  14. data/vendor/bundle/ruby/3.4.0/gems/{json-2.9.1 → json-2.10.1}/README.md +75 -2
  15. data/vendor/bundle/ruby/3.4.0/gems/{json-2.9.1 → json-2.10.1}/json.gemspec +3 -4
  16. data/vendor/bundle/ruby/3.4.0/gems/opentelemetry-api-1.4.0/CHANGELOG.md +188 -0
  17. data/vendor/bundle/ruby/3.4.0/gems/opentelemetry-api-1.4.0/LICENSE +201 -0
  18. data/vendor/bundle/ruby/3.4.0/gems/opentelemetry-api-1.4.0/README.md +69 -0
  19. data/vendor/bundle/ruby/3.4.0/gems/opentelemetry-common-0.21.0/CHANGELOG.md +94 -0
  20. data/vendor/bundle/ruby/3.4.0/gems/opentelemetry-common-0.21.0/LICENSE +201 -0
  21. data/vendor/bundle/ruby/3.4.0/gems/opentelemetry-common-0.21.0/README.md +62 -0
  22. data/vendor/bundle/ruby/3.4.0/gems/{rack-3.1.8 → rack-3.1.10}/CHANGELOG.md +14 -0
  23. data/vendor/bundle/ruby/3.4.0/gems/{rspec-core-3.13.2 → rspec-core-3.13.3}/Changelog.md +271 -261
  24. data/vendor/bundle/ruby/3.4.0/gems/{webmock-3.24.0 → webmock-3.25.0}/CHANGELOG.md +6 -0
  25. data/vendor/bundle/ruby/3.4.0/gems/{webmock-3.24.0 → webmock-3.25.0}/README.md +1 -0
  26. data/vendor/bundle/ruby/3.4.0/specifications/{diff-lcs-1.5.1.gemspec → diff-lcs-1.6.0.gemspec} +11 -10
  27. data/vendor/bundle/ruby/3.4.0/specifications/{i18n-1.14.6.gemspec → i18n-1.14.7.gemspec} +4 -5
  28. data/vendor/bundle/ruby/3.4.0/specifications/{json-2.9.1.gemspec → json-2.10.1.gemspec} +0 -0
  29. data/vendor/bundle/ruby/3.4.0/specifications/{logger-1.6.5.gemspec → logger-1.6.6.gemspec} +3 -3
  30. data/vendor/bundle/ruby/3.4.0/specifications/{nokogiri-1.18.1-x86_64-linux-gnu.gemspec → nokogiri-1.18.2-x86_64-linux-gnu.gemspec} +3 -3
  31. data/vendor/bundle/ruby/3.4.0/specifications/opentelemetry-api-1.4.0.gemspec +35 -0
  32. data/vendor/bundle/ruby/3.4.0/specifications/opentelemetry-common-0.21.0.gemspec +34 -0
  33. data/vendor/bundle/ruby/3.4.0/specifications/{rack-3.1.8.gemspec → rack-3.1.10.gemspec} +4 -4
  34. data/vendor/bundle/ruby/3.4.0/specifications/{rspec-core-3.13.2.gemspec → rspec-core-3.13.3.gemspec} +7 -15
  35. data/vendor/bundle/ruby/3.4.0/specifications/{webmock-3.24.0.gemspec → webmock-3.25.0.gemspec} +5 -5
  36. metadata +67 -30
  37. data/vendor/bundle/ruby/3.4.0/gems/diff-lcs-1.5.1/License.md +0 -41
  38. data/vendor/bundle/ruby/3.4.0/gems/diff-lcs-1.5.1/README.rdoc +0 -84
  39. /data/vendor/bundle/ruby/3.4.0/gems/{i18n-1.14.6 → i18n-1.14.7}/MIT-LICENSE +0 -0
  40. /data/vendor/bundle/ruby/3.4.0/gems/{i18n-1.14.6 → i18n-1.14.7}/README.md +0 -0
  41. /data/vendor/bundle/ruby/3.4.0/gems/{logger-1.6.5 → logger-1.6.6}/README.md +0 -0
  42. /data/vendor/bundle/ruby/3.4.0/gems/{logger-1.6.5 → logger-1.6.6}/logger.gemspec +0 -0
  43. /data/vendor/bundle/ruby/3.4.0/gems/{nokogiri-1.18.1-x86_64-linux-gnu → nokogiri-1.18.2-x86_64-linux-gnu}/LICENSE-DEPENDENCIES.md +0 -0
  44. /data/vendor/bundle/ruby/3.4.0/gems/{nokogiri-1.18.1-x86_64-linux-gnu → nokogiri-1.18.2-x86_64-linux-gnu}/LICENSE.md +0 -0
  45. /data/vendor/bundle/ruby/3.4.0/gems/{nokogiri-1.18.1-x86_64-linux-gnu → nokogiri-1.18.2-x86_64-linux-gnu}/README.md +0 -0
  46. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.1.8 → rack-3.1.10}/MIT-LICENSE +0 -0
  47. /data/vendor/bundle/ruby/3.4.0/gems/{rack-3.1.8 → rack-3.1.10}/README.md +0 -0
  48. /data/vendor/bundle/ruby/3.4.0/gems/{rspec-core-3.13.2 → rspec-core-3.13.3}/LICENSE.md +0 -0
  49. /data/vendor/bundle/ruby/3.4.0/gems/{rspec-core-3.13.2 → rspec-core-3.13.3}/README.md +0 -0
  50. /data/vendor/bundle/ruby/3.4.0/gems/{webmock-3.24.0 → webmock-3.25.0}/LICENSE +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 45e81963e8044fcd6dbb2c5b3e8026de90c77d35e8ec5de2e73a8a3afaa839a5
4
- data.tar.gz: 3507a04d6fcae2bfb6e637c3ef67eeaa9f9d02a154a635fe6b767e0d53669220
3
+ metadata.gz: 1a8433e212c204d4d4cfac1240933f0db9205e1c7290dd8f22a3cf0f17f41ad2
4
+ data.tar.gz: e89a53d16da8d2899ec89bbca9d4cf818e820dc7bb7887a34314faa6eaa60ad1
5
5
  SHA512:
6
- metadata.gz: 2b0fc88443461e879c6c5b10375b7cef376d9690961935165d72be6acc91038a9101ea9073f2ff63f8f3efe1d19656ce7c431b37562ecf4d93deec78a0cbcfc2
7
- data.tar.gz: 6518c3f15372487c8d3d4af937c0e9cb97e53f6aea08d5f2bd0a18da3043f105e7300c59b85ca154f7f7d20962587fe4812e8dc36e37bda082172c7e06d03223
6
+ metadata.gz: a752de373a4d503da9de34886bb4d5e5988c0d04fd40afd95d3570d24f6ccc70136ef487491301d25f0b50120b7e81b38c2f79cf12492d016498c768ed7bb1dd
7
+ data.tar.gz: fa18f22c3cbb3dddf61d96e660a4c869cbe58efb991a6d2d4460c2b4a2a9388e77ad7f5b54210eb8829c6865d920e3e45ad34f09ece63ecbe0045f7a2d020a28
data/CHANGELOG.md CHANGED
@@ -12,6 +12,14 @@
12
12
 
13
13
  ### Breaks
14
14
 
15
+ ## 2.1.0 - (2025-02-14)
16
+
17
+ ---
18
+
19
+ ### New
20
+
21
+ - Experimental support for OpenTelemetry
22
+
15
23
  ## 2.0.0 - (2025-01-17)
16
24
 
17
25
  ---
data/README.md CHANGED
@@ -14,7 +14,7 @@ Acfs covers model and service abstraction, convenient query and filter methods,
14
14
  Add this line to your application's Gemfile:
15
15
 
16
16
  ```ruby
17
- gem 'acfs', '~> 2.0'
17
+ gem 'acfs', '~> 2.1'
18
18
  ```
19
19
 
20
20
  And then execute:
data/acfs.gemspec CHANGED
@@ -32,6 +32,8 @@ Gem::Specification.new do |spec|
32
32
  spec.add_dependency 'activemodel', '>= 7.0'
33
33
  spec.add_dependency 'activesupport', '>= 7.0'
34
34
  spec.add_dependency 'multi_json', '~> 1.0'
35
+ spec.add_dependency 'opentelemetry-api', '~> 1.0'
36
+ spec.add_dependency 'opentelemetry-common'
35
37
  spec.add_dependency 'rack'
36
38
  spec.add_dependency 'typhoeus', '~> 1.0'
37
39
  end
data/lib/acfs/global.rb CHANGED
@@ -28,9 +28,11 @@ module Acfs
28
28
  # @return [undefined]
29
29
  #
30
30
  def run
31
- ::ActiveSupport::Notifications.instrument 'acfs.before_run'
32
- ::ActiveSupport::Notifications.instrument 'acfs.run' do
33
- runner.start
31
+ Telemetry.in_span('acfs.run', attributes: {'code.stacktrace' => caller.join("\n")}) do
32
+ ::ActiveSupport::Notifications.instrument 'acfs.before_run'
33
+ ::ActiveSupport::Notifications.instrument 'acfs.run' do
34
+ runner.start
35
+ end
34
36
  end
35
37
  end
36
38
 
@@ -50,9 +52,11 @@ module Acfs
50
52
  # Reset all queues, stubs and internal state.
51
53
  #
52
54
  def reset
53
- ::ActiveSupport::Notifications.instrument 'acfs.reset' do
54
- runner.clear
55
- Acfs::Stub.clear
55
+ Telemetry.in_span('acfs.reset') do
56
+ ::ActiveSupport::Notifications.instrument 'acfs.reset' do
57
+ runner.clear
58
+ Acfs::Stub.clear
59
+ end
56
60
  end
57
61
  end
58
62
 
data/lib/acfs/request.rb CHANGED
@@ -8,17 +8,18 @@ module Acfs
8
8
  #
9
9
  class Request
10
10
  attr_accessor :body, :format
11
- attr_reader :url, :headers, :params, :data, :method, :operation
11
+ attr_reader :uri, :url, :headers, :params, :data, :method, :operation
12
12
 
13
13
  include Request::Callbacks
14
14
  def initialize(url, **options, &block)
15
- @url = URI.parse(url.to_s).tap do |_url|
15
+ @uri = URI.parse(url.to_s).tap do |_url|
16
16
  @data = options.delete(:data) || nil
17
17
  @format = options.delete(:format) || :json
18
18
  @headers = options.delete(:headers) || {}
19
19
  @params = options.delete(:params) || {}
20
20
  @method = options.delete(:method) || :get
21
- end.to_s
21
+ end
22
+ @url = @uri.to_s
22
23
 
23
24
  @operation = options.delete(:operation) || nil
24
25
 
data/lib/acfs/runner.rb CHANGED
@@ -7,6 +7,8 @@ module Acfs
7
7
  #
8
8
  class Runner
9
9
  include Service::Middleware
10
+ include Acfs::Telemetry
11
+
10
12
  attr_reader :adapter
11
13
 
12
14
  def initialize(adapter)
@@ -25,8 +27,10 @@ module Acfs
25
27
  # Run operation right now skipping queue.
26
28
  #
27
29
  def run(operation)
28
- ::ActiveSupport::Notifications.instrument('acfs.runner.sync_run', operation: operation) do
29
- operation_request(operation) {|req| adapter.run req }
30
+ tracer.in_span('acfs.runner.sync_run') do
31
+ ::ActiveSupport::Notifications.instrument('acfs.runner.sync_run', operation: operation) do
32
+ operation_request(operation) {|req| adapter.run req }
33
+ end
30
34
  end
31
35
  end
32
36
 
@@ -39,11 +43,13 @@ module Acfs
39
43
  # Enqueue operation to be run later.
40
44
  #
41
45
  def enqueue(operation)
42
- ::ActiveSupport::Notifications.instrument('acfs.runner.enqueue', operation: operation) do
43
- if running?
44
- operation_request(operation) {|req| adapter.queue req }
45
- else
46
- queue << operation
46
+ tracer.in_span('acfs.runner.enqueue') do
47
+ ::ActiveSupport::Notifications.instrument('acfs.runner.enqueue', operation: operation) do
48
+ if running?
49
+ operation_request(operation) {|req| adapter.queue req }
50
+ else
51
+ queue << operation
52
+ end
47
53
  end
48
54
  end
49
55
  end
@@ -93,10 +99,42 @@ module Acfs
93
99
  req = operation.service.prepare(operation.request)
94
100
  return unless req.is_a? Acfs::Request
95
101
 
96
- req = prepare req
102
+ req = prepare(req)
97
103
  return unless req.is_a? Acfs::Request
98
104
 
99
105
  yield req
100
106
  end
107
+
108
+ def prepare(request)
109
+ method = request.method.to_s.upcase
110
+ template = request.operation.location&.raw_uri.to_s
111
+
112
+ name = "HTTP #{method}"
113
+ name = "#{method} #{template}" if template
114
+
115
+ attributes = {
116
+ 'http.request.method' => method,
117
+ 'server.address' => request.uri.host,
118
+ 'server.port' => request.uri.port,
119
+ 'url.full' => request.uri.to_s,
120
+ 'url.scheme' => request.uri.scheme,
121
+ 'url.template' => template,
122
+ }
123
+
124
+ span = tracer.start_span(name, attributes:, kind: :client)
125
+ OpenTelemetry::Trace.with_span(span) do
126
+ OpenTelemetry.propagation.inject(request.headers)
127
+
128
+ request.on_complete do |response, nxt|
129
+ span.set_attribute('http.response.status_code', response.status_code)
130
+ span.status = OpenTelemetry::Trace::Status.error unless (100..399).cover?(response.status_code)
131
+
132
+ span.finish
133
+ nxt.call(response)
134
+ end
135
+
136
+ super
137
+ end
138
+ end
101
139
  end
102
140
  end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Acfs
4
+ module Telemetry
5
+ class << self
6
+ delegate :in_span, :start_span, to: :tracer
7
+
8
+ def tracer
9
+ @tracer ||= OpenTelemetry.tracer_provider.tracer('acfs', Acfs::VERSION.to_s)
10
+ end
11
+ end
12
+
13
+ protected
14
+
15
+ def tracer
16
+ Acfs::Telemetry.tracer
17
+ end
18
+ end
19
+ end
data/lib/acfs/version.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  module Acfs
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 0
6
+ MINOR = 1
7
7
  PATCH = 0
8
8
  STAGE = nil
9
9
 
data/lib/acfs.rb CHANGED
@@ -7,12 +7,16 @@ require 'active_support/core_ext/string'
7
7
  require 'active_support/core_ext/module'
8
8
  require 'active_support/notifications'
9
9
 
10
+ require 'opentelemetry'
11
+ require 'opentelemetry/common'
12
+
10
13
  module Acfs
11
14
  extend ActiveSupport::Autoload
12
15
  require 'acfs/version'
13
16
  require 'acfs/errors'
14
17
  require 'acfs/global'
15
18
  require 'acfs/util'
19
+ require 'acfs/telemetry'
16
20
 
17
21
  require 'acfs/collection'
18
22
  require 'acfs/configuration'
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
9
9
  s.metadata = { "allowed_push_host" => ".", "rubygems_mfa_required" => "true" } if s.respond_to? :metadata=
10
10
  s.require_paths = ["lib".freeze]
11
11
  s.authors = ["Jan Graichen".freeze]
12
- s.date = "2025-01-17"
12
+ s.date = "2025-02-14"
13
13
  s.email = ["jgraichen@altimos.de".freeze]
14
14
  s.files = ["LICENSE".freeze, "README.md".freeze, "default.yml".freeze]
15
15
  s.homepage = "https://github.com/jgraichen/rubocop-config".freeze