From 5875e843311c4b21488f94bc2a3f516994720131 Mon Sep 17 00:00:00 2001 From: Michael Mantos Date: Wed, 24 Jan 2024 19:07:45 +0800 Subject: [PATCH 1/5] RUBY-13 - Support for Rails 7 and sidekiq --- .gitignore | 7 +++ .ruby-gemset | 1 - .ruby-version | 1 - Gemfile.lock | 84 ----------------------------- lib/stackify/engine.rb | 2 +- lib/stackify/logger_proxy.rb | 5 ++ spec/helpers/dummy_logger.rb | 41 ++++++++++++++ spec/helpers/dummy_logger_client.rb | 4 ++ spec/stackify/logger_proxy_spec.rb | 52 ++++++++++++++++++ stackify-api-ruby.gemspec | 2 +- 10 files changed, 111 insertions(+), 88 deletions(-) delete mode 100644 .ruby-gemset delete mode 100644 .ruby-version delete mode 100644 Gemfile.lock create mode 100644 spec/helpers/dummy_logger.rb create mode 100644 spec/helpers/dummy_logger_client.rb create mode 100644 spec/stackify/logger_proxy_spec.rb diff --git a/.gitignore b/.gitignore index 7c9f4b4..77255ac 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,10 @@ # Ignore IntelliJ files /.idea *.iml + +# Ignore lock file +Gemfile.lock + +# Version specific files +.ruby-version +.ruby-gemset \ No newline at end of file diff --git a/.ruby-gemset b/.ruby-gemset deleted file mode 100644 index 4b1544b..0000000 --- a/.ruby-gemset +++ /dev/null @@ -1 +0,0 @@ -stackify-api-ruby diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index ec6b00f..0000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -ruby-2.1.2 diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 64f8c7e..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,84 +0,0 @@ -PATH - remote: . - specs: - stackify-api-ruby (2.0.0.beta1) - faraday (~> 0.8) - net_http_unix (~> 0.2) - -GEM - remote: https://rubygems.org/ - specs: - concurrent-ruby (1.2.2) - delegate_matcher (0.4.3) - proc_extensions (~> 0.2) - diff-lcs (1.4.4) - et-orbi (1.2.7) - tzinfo - faraday (0.17.4) - multipart-post (>= 1.2, < 3) - file-tail (1.2.0) - tins (~> 1.0) - fugit (1.8.1) - et-orbi (~> 1, >= 1.2.7) - raabro (~> 1.4) - multipart-post (2.1.1) - net_http_unix (0.2.2) - proc_extensions (0.2) - sourcify (~> 0.5) - raabro (1.4.0) - rake (10.5.0) - rspec (3.10.0) - rspec-core (~> 3.10.0) - rspec-expectations (~> 3.10.0) - rspec-mocks (~> 3.10.0) - rspec-core (3.10.1) - rspec-support (~> 3.10.0) - rspec-expectations (3.10.1) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.10.0) - rspec-mocks (3.10.2) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.10.0) - rspec-support (3.10.2) - ruby2ruby (2.5.0) - ruby_parser (~> 3.1) - sexp_processor (~> 4.6) - ruby_parser (3.20.1) - sexp_processor (~> 4.16) - rufus-scheduler (3.8.2) - fugit (~> 1.1, >= 1.1.6) - sexp_processor (4.17.0) - sourcify (0.5.0) - file-tail (>= 1.0.5) - ruby2ruby (>= 1.2.5) - ruby_parser (>= 2.0.5) - sexp_processor (>= 3.0.5) - stackify-ruby-apm (1.16.0.beta1) - concurrent-ruby - delegate_matcher - faraday - net_http_unix - rufus-scheduler - sync (0.5.0) - tins (1.32.1) - sync - tzinfo (2.0.6) - concurrent-ruby (~> 1.0) - tzinfo-data (1.2023.3) - tzinfo (>= 1.0.0) - -PLATFORMS - ruby - x64-mingw-ucrt - x86-mingw32 - -DEPENDENCIES - bundler (~> 2.0) - rake (~> 10.0) - rspec (~> 3.0) - stackify-api-ruby! - stackify-ruby-apm (~> 1.16.0.beta1) - tzinfo-data - -BUNDLED WITH - 2.4.10 diff --git a/lib/stackify/engine.rb b/lib/stackify/engine.rb index 9afe058..cedee93 100644 --- a/lib/stackify/engine.rb +++ b/lib/stackify/engine.rb @@ -3,7 +3,7 @@ module Stackify class Engine < ::Rails::Engine if Rails.version > '3.1' - initializer 'Stackify set up of logger', group: :all do + initializer 'Stackify set up of logger', after: :initialize_logger , group: :all do if Gem::Version.new(Rails::VERSION::STRING) >= Gem::Version.new('4.0') # check if the client app is using the ActiveSupport::Logger is_activesupport_logger = ::Rails.logger.is_a?(ActiveSupport::Logger) diff --git a/lib/stackify/logger_proxy.rb b/lib/stackify/logger_proxy.rb index 0ec9280..e424609 100644 --- a/lib/stackify/logger_proxy.rb +++ b/lib/stackify/logger_proxy.rb @@ -6,6 +6,7 @@ def initialize logger rails_logger = logger num_level = logger.level @logger = rails_logger + %w(debug info warn error fatal unknown).each do |level| stackify_logger = if level == 'debug' -> (msg, caller) { Stackify.logger_client.log(num_level, level.downcase, msg, caller) unless msg.to_s.empty? } @@ -28,6 +29,10 @@ def method_missing(name, *args, **kwargs, &block) @logger.send(name, *args, **kwargs, &block) end + def respond_to_missing?(*args, **kwargs, &block) + @logger.respond_to?(*args, **kwargs, &block) + end + private def message *args, &block diff --git a/spec/helpers/dummy_logger.rb b/spec/helpers/dummy_logger.rb new file mode 100644 index 0000000..458bcc6 --- /dev/null +++ b/spec/helpers/dummy_logger.rb @@ -0,0 +1,41 @@ +class DummyLogger + attr_reader :logs + attr_accessor :level + + def initialize + @logs = [] + end + + def debug(message) + log('debug', message) + end + + def info(message) + log('info', message) + end + + def warn(message) + log('warn', message) + end + + def error(message) + log('error', message) + end + + def fatal(message) + log('fatal', message) + end + + def unknown(message) + log('unknown', message) + end + + def broadcast_to(arg1, arg2) + end + + private + + def log(level, message) + @logs << { level: level, message: message } + end +end \ No newline at end of file diff --git a/spec/helpers/dummy_logger_client.rb b/spec/helpers/dummy_logger_client.rb new file mode 100644 index 0000000..e7e2280 --- /dev/null +++ b/spec/helpers/dummy_logger_client.rb @@ -0,0 +1,4 @@ +class DummyLoggerClient + def log num_level, level, msg, call_trace + end +end \ No newline at end of file diff --git a/spec/stackify/logger_proxy_spec.rb b/spec/stackify/logger_proxy_spec.rb new file mode 100644 index 0000000..77560ff --- /dev/null +++ b/spec/stackify/logger_proxy_spec.rb @@ -0,0 +1,52 @@ +require 'stackify-api-ruby' +require_relative '../helpers/dummy_logger' +require_relative '../helpers/dummy_logger_client' +require 'logger' + +RSpec.describe ::Stackify::LoggerProxy do + let(:proxy_logger) { DummyLogger.new() } + let(:stackify_logger) { instance_double(DummyLoggerClient) } + + before do + allow(stackify_logger).to receive(:log) + allow(::Stackify).to receive(:logger_client).and_return(stackify_logger) + allow(proxy_logger).to receive(:level).and_return(Logger::INFO) + end + + subject { described_class.new(proxy_logger) } + + describe '#initialize' do + it 'sets up the logger methods' do + expect(subject).to respond_to(:debug) + expect(subject).to respond_to(:info) + expect(subject).to respond_to(:warn) + expect(subject).to respond_to(:error) + expect(subject).to respond_to(:fatal) + expect(subject).to respond_to(:unknown) + end + end + + describe 'log forwarding' do + it 'forwards log calls to Stackify and original logger' do + message = 'Test log message' + + expect(Stackify.logger_client).to receive(:log).with(Logger::INFO, 'debug', message, any_args).once + expect(proxy_logger).to receive(:debug).with(message).once + + subject.debug(message) + end + end + + # Add more test cases for other log levels and scenarios + describe 'method_missing and respond_to_missing?' do + it 'forwards undefined methods to the original logger' do + # since broadcast_to is available only on the DummyLogger + expect(proxy_logger).to receive(:broadcast_to).with('arg1', 'arg2').once + subject.broadcast_to('arg1', 'arg2') + end + + it 'correctly responds to defined and undefined methods' do + expect(subject).to respond_to(:broadcast_to) + end + end +end \ No newline at end of file diff --git a/stackify-api-ruby.gemspec b/stackify-api-ruby.gemspec index af48a3f..afeb5b2 100644 --- a/stackify-api-ruby.gemspec +++ b/stackify-api-ruby.gemspec @@ -12,7 +12,7 @@ Gem::Specification.new do |spec| spec.description = 'Stackify Logs and Metrics API for Ruby' spec.homepage = 'http://www.stackify.com/' spec.license = 'Apache-2.0' - spec.required_ruby_version = '>= 3.0' + spec.required_ruby_version = '>= 2.0' spec.files = `git ls-files -z`.split("\x0") spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } From c8239bcbd3ad57881807fa02bbdce3d7eaf4b367 Mon Sep 17 00:00:00 2001 From: Michael Mantos Date: Wed, 24 Jan 2024 19:11:22 +0800 Subject: [PATCH 2/5] RUBY-13 - Add APM Dependency update to point to 1.17 --- Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 7914675..ce8bc24 100644 --- a/Gemfile +++ b/Gemfile @@ -1,8 +1,8 @@ group :test do if ENV['STACKIFY_RUBY_TEST'] - gem 'stackify-ruby-apm', '~> 1.16.0', source: ENV['STACKIFY_RUBY_TEST_REPO'] + gem 'stackify-ruby-apm', '~> 1.17.0.beta1', source: ENV['STACKIFY_RUBY_TEST_REPO'] else - gem 'stackify-ruby-apm', '~> 1.16.0' + gem 'stackify-ruby-apm', '~> 1.17.0.beta1' end end From c8b7db73c3c8f451ee0d016301d65f27a70a1e98 Mon Sep 17 00:00:00 2001 From: Michael Mantos Date: Wed, 24 Jan 2024 23:42:40 +0800 Subject: [PATCH 3/5] Updating version to 2.1.0.beta1 --- lib/stackify/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/stackify/version.rb b/lib/stackify/version.rb index d964481..1536bad 100644 --- a/lib/stackify/version.rb +++ b/lib/stackify/version.rb @@ -1,3 +1,3 @@ module Stackify - VERSION = '2.0.0' + VERSION = '2.1.0.beta1' end From 193750db183dc85763c8b50fb508024b3f59f7d8 Mon Sep 17 00:00:00 2001 From: Michael Mantos Date: Mon, 5 Feb 2024 20:19:48 +0800 Subject: [PATCH 4/5] Updating version to 2.1.0 --- lib/stackify/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/stackify/version.rb b/lib/stackify/version.rb index 1536bad..8187274 100644 --- a/lib/stackify/version.rb +++ b/lib/stackify/version.rb @@ -1,3 +1,3 @@ module Stackify - VERSION = '2.1.0.beta1' + VERSION = '2.1.0' end From 316ec4c75bfd258b51c8b4099d2a82df6f7a3b33 Mon Sep 17 00:00:00 2001 From: Todd Lair Date: Thu, 20 Jun 2024 13:53:17 -0500 Subject: [PATCH 5/5] Removed license from Readme and added a license file --- LICENSE | 202 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 16 ----- 2 files changed, 202 insertions(+), 16 deletions(-) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e06d208 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/README.md b/README.md index 026e597..6380a8c 100644 --- a/README.md +++ b/README.md @@ -149,19 +149,3 @@ If there are problems, you can enable internal logging of the stackify-api-ruby config.logger = Logger.new(Rails.root.join("log", "stackify.log")) config.logger.level = Logger::DEBUG ``` - -## License - -Copyright 2018 Stackify, LLC. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License.