rack_middleware_metrics 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 98990077c946511fb1f4b12324b71802b2b7d0a5541c598e1f4396698f545fa3
4
+ data.tar.gz: 9f209425500a239563c966cf4ceaaf29d5d831d6c5df2e6f4dfcc559ef189b56
5
+ SHA512:
6
+ metadata.gz: e00125579f4516e61a798ff8f69b04446ea0e2803a3953ea5bdf83fb90638c87f6edc7095e416a39e7ccc79272007d2b019422cecef1653865ac2e14b1916632
7
+ data.tar.gz: a7c14ed40b52f708e33ea7538c1a01c40e86b096d4c3dbd2dbb1968ce5182fc561c6bfb5cc0295984e254c0f3e1148dfbf5e2fd637ffc973ab8d28dd94289588
@@ -0,0 +1,60 @@
1
+ *.gem
2
+ *.rbc
3
+ /.config
4
+ /coverage/
5
+ /InstalledFiles
6
+ /pkg/
7
+ /spec/reports/
8
+ /spec/examples.txt
9
+ /test/tmp/
10
+ /test/version_tmp/
11
+ /tmp/
12
+
13
+ # Used by dotenv library to load environment variables.
14
+ # .env
15
+
16
+ # Ignore Byebug command history file.
17
+ .byebug_history
18
+
19
+ ## Specific to RubyMotion:
20
+ .dat*
21
+ .repl_history
22
+ build/
23
+ *.bridgesupport
24
+ build-iPhoneOS/
25
+ build-iPhoneSimulator/
26
+
27
+ ## Specific to RubyMotion (use of CocoaPods):
28
+ #
29
+ # We recommend against adding the Pods directory to your .gitignore. However
30
+ # you should judge for yourself, the pros and cons are mentioned at:
31
+ # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
32
+ #
33
+ # vendor/Pods/
34
+
35
+ ## Documentation cache and generated files:
36
+ /.yardoc/
37
+ /_yardoc/
38
+ /doc/
39
+ /rdoc/
40
+
41
+ ## Environment normalization:
42
+ .bundle/
43
+ vendor
44
+ lib/bundler/man/
45
+
46
+ # for a library or gem, you might want to ignore these files since the code is
47
+ # intended to run in multiple environments; otherwise, check them in:
48
+ Gemfile.lock
49
+ .ruby-version
50
+ .ruby-gemset
51
+
52
+ # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
53
+ .rvmrc
54
+
55
+ # Used by RuboCop. Remote config files pulled in from inherit_from directive.
56
+ # .rubocop-https?--*
57
+
58
+ *.csv
59
+ target
60
+ lib/md5_ruby_ext
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --require spec_helper
@@ -0,0 +1,3 @@
1
+ #--------1---------2---------3---------4---------5---------6---------7---------8---------9---------0
2
+ require:
3
+ - rubocop-performance
@@ -0,0 +1,72 @@
1
+ #--------1---------2---------3---------4---------5---------6---------7---------8---------9---------0
2
+ require:
3
+ - rubocop-rspec
4
+ # The idea is to bring this file in line with the default configuration:
5
+ # https://github.com/rubocop-hq/rubocop-rspec/blob/master/config/default.yml.
6
+ # We're not quite at a point to do that yet.
7
+ AllCops:
8
+ TargetRubyVersion: 2.5
9
+ RSpec/AnyInstance:
10
+ Enabled: false
11
+ RSpec/ContextWording:
12
+ Prefixes:
13
+ - and
14
+ - before
15
+ - but
16
+ - can
17
+ - for
18
+ - in
19
+ - is
20
+ - such
21
+ - that
22
+ - when # default
23
+ - which
24
+ - while
25
+ - will
26
+ - with # default
27
+ - without # default
28
+ RSpec/DescribeClass:
29
+ Exclude:
30
+ - spec/contrast/core_extensions/assess/rules/*_spec.rb # assess rules don't have concrete classes
31
+ - spec/contrast/rails_extensions/**/*_spec.rb
32
+ - spec/contrast/sinatra_extensions/**/*_spec.rb
33
+ RSpec/ExampleLength:
34
+ Enabled: false
35
+ RSpec/FilePath:
36
+ CustomTransform:
37
+ Activity: inventory_activity
38
+ AppContext: app_context
39
+ ApplicationSettings: application_settings
40
+ CmdInjection: cmd_injection
41
+ ContrastService: contrast_service
42
+ EntityWrapper: entity_wrapper
43
+ PreShift: preshift
44
+ TraceEvent: trace_event
45
+ Exclude:
46
+ - spec/contrast/core_extensions/assess/freeze_spec.rb
47
+ - spec/contrast/core_extensions/postgresql_spec.rb
48
+ - spec/contrast/core_extensions/protect/sqlite3_spec.rb
49
+ - spec/contrast/rack_extensions/*.rb
50
+ - spec/contrast/sinatra_extensions/sinatra_base_spec.rb
51
+ RSpec/MessageSpies:
52
+ Enabled: false
53
+ RSpec/MultipleExpectations:
54
+ Max: 22
55
+ RSpec/NestedGroups:
56
+ Max: 5 # Target around 3 or 4. Drop as we have more spec helpers. -ajm
57
+ RSpec/VerifiedDoubles:
58
+ Enabled: false
59
+ #
60
+ # ...
61
+ #
62
+ # And to then enable the default disabled cops.
63
+ # These cops are off by default, but should be audited to see if they're worth
64
+ # enabling as they're recommended, but hard to implement or controversial.
65
+ RSpec/DescribedClassModuleWrapping:
66
+ Enabled: false
67
+ RSpec/Dialect:
68
+ Enabled: false
69
+ RSpec/MessageExpectation:
70
+ Enabled: false
71
+ RSpec/Pending:
72
+ Enabled: false
@@ -0,0 +1,53 @@
1
+ #--------1---------2---------3---------4---------5---------6---------7---------8---------9---------0
2
+ # The idea is to bring this file in line with the default configuration:
3
+ # https://github.com/rubocop-hq/rubocop/blob/master/config/default.yml
4
+ # We're not quite at a point to do that yet.
5
+ AllCops:
6
+ EnabledByDefault: true
7
+ NewCops: enable
8
+ TargetRubyVersion: 2.5
9
+ Bundler/DuplicatedGem:
10
+ Enabled: false
11
+ Bundler/GemComment:
12
+ Enabled: false
13
+ Layout/DotPosition:
14
+ EnforcedStyle: trailing
15
+ Layout/FirstArgumentIndentation:
16
+ IndentationWidth: 4
17
+ Layout/FirstHashElementIndentation:
18
+ IndentationWidth: 4
19
+ Layout/FirstParameterIndentation:
20
+ IndentationWidth: 4
21
+ Layout/LineLength:
22
+ IgnoredPatterns:
23
+ - '^\s*# http' # allow URLs, standalone, in comments
24
+ Layout/MultilineMethodCallBraceLayout:
25
+ EnforcedStyle: same_line
26
+ Layout/MultilineMethodCallIndentation:
27
+ EnforcedStyle: indented
28
+ IndentationWidth: 4
29
+ Layout/MultilineMethodDefinitionBraceLayout:
30
+ EnforcedStyle: same_line
31
+ Layout/MultilineOperationIndentation:
32
+ EnforcedStyle: indented
33
+ IndentationWidth: 4
34
+ Layout/SpaceInsideStringInterpolation:
35
+ EnforcedStyle: space
36
+ Lint/ConstantResolution:
37
+ Enabled: false
38
+ Naming/MemoizedInstanceVariableName:
39
+ EnforcedStyleForLeadingUnderscores: required
40
+ Style/Alias:
41
+ EnforcedStyle: prefer_alias_method
42
+ Style/DisableCopsWithinSourceCodeDirective:
43
+ Enabled: false
44
+ Style/DoubleNegation: # team prefers !!var over !var.nil? syntax, so we are leaving this cop off
45
+ Enabled: false
46
+ Style/MethodDefParentheses:
47
+ EnforcedStyle: require_no_parentheses_except_multiline
48
+ Style/Copyright:
49
+ Enabled: false
50
+ Style/DocumentationMethod:
51
+ Enabled: false
52
+ Style/MissingElse:
53
+ Enabled: false
@@ -0,0 +1,15 @@
1
+ ---
2
+ include:
3
+ - "**/*.rb"
4
+ exclude:
5
+ - spec/**/*
6
+ - test/**/*
7
+ - vendor/**/*
8
+ - ".bundle/**/*"
9
+ require: []
10
+ domains: []
11
+ reporters:
12
+ - rubocop
13
+ require_paths: []
14
+ plugins: []
15
+ max_files: 5000
@@ -0,0 +1,19 @@
1
+ language: ruby
2
+ cache: bundler
3
+ rvm:
4
+ - 2.5
5
+ - 2.6
6
+ - 2.7
7
+ before_install:
8
+ - curl https://sh.rustup.rs -sSf | sh -s -- -y
9
+ - source $HOME/.cargo/env
10
+ deploy:
11
+ provider: rubygems
12
+ api_key:
13
+ secure: cJgoY38KR4cqoVCbNsQaXbqKMbXCSh/JOxHXpKIodP0IzdqBwO2+JyuUnIKW9oq4CMlj7V8bNUMmY3Bce0NZoSFDc+A1SbogWFDn7BHcHjU5zgC0XiPcY04u3/oK2iI6zmZN+ANg3JWqTKcF1pBN/y5u8S8Q5S1ZWsnwg7/VzDZseDRLJVR7r8g83Bnus7oD+nGU8Cibi7I4rJNjfp3k9flKSzysm9EMs+GBuw52ESUyfUpqoMWVlz4KljWWUjgV3dX4OV6bH/UlVHg7I0hcNUkQepweNydiT6J3eQmDLN2msYZs/os8ivZPrsMY4V1SZYtn8iXPzeaW7keCJNtcjh4I9WFf00NE/R0/IWBl6fPOqTfddxgBd7lst+3N47R/pGJBVayRhskYTUPmIBymo065oGoVQiPUKQ3F5cz6OCjuW40GSyxmW5AL+hKQWPqBJossv5RgXP/pYPWW1pluwdCYRbROYfH+JrxWuU5VQJZ49Q7otK+/KEamJwbFg5R115aJS3rrQ4cTmH5uTwvDkQfCJ2VDVvGy5zzLGl96ewY+uOd7HoykjyBUkEe52V01B+MublXrzgXmd5VFcpFPXF6aQ9jxrb6SD5YOXjYneZd20omeOzzKAbFPvuFyYL5dktf75pFqis13z5CleLs7/MupgT8BFuC7cxuZk+tglLQ=
14
+ gem: rack_middleware_metrics
15
+ on:
16
+ tags: true
17
+ repo: reedjosh/RackMiddlewareMetrics
18
+ branch: main
19
+ skip_cleanup: 'true'
@@ -0,0 +1 @@
1
+ ,jreed,jayr.localdomain,14.07.2017 13:50,file:///home/jreed/.config/libreoffice/4;
@@ -0,0 +1,47 @@
1
+ # This file is automatically @generated by Cargo.
2
+ # It is not intended for manual editing.
3
+ [[package]]
4
+ name = "cstr-macro"
5
+ version = "0.1.0"
6
+ source = "registry+https://github.com/rust-lang/crates.io-index"
7
+ checksum = "db53fddba18cdd35477a7213a3ef6acfbfa333c31b42ce019e544c4a1420a06f"
8
+
9
+ [[package]]
10
+ name = "helix"
11
+ version = "0.7.5"
12
+ source = "registry+https://github.com/rust-lang/crates.io-index"
13
+ checksum = "49a017e3e798ad9386e0a0584e66fd6c04a80ccc1242eb8f689c62ce6f408240"
14
+ dependencies = [
15
+ "cstr-macro",
16
+ "libc",
17
+ "libcruby-sys",
18
+ ]
19
+
20
+ [[package]]
21
+ name = "libc"
22
+ version = "0.2.79"
23
+ source = "registry+https://github.com/rust-lang/crates.io-index"
24
+ checksum = "2448f6066e80e3bfc792e9c98bf705b4b0fc6e8ef5b43e5889aff0eaa9c58743"
25
+
26
+ [[package]]
27
+ name = "libcruby-sys"
28
+ version = "0.7.5"
29
+ source = "registry+https://github.com/rust-lang/crates.io-index"
30
+ checksum = "fef6028cdce0c8d55676fd1d66bb810facef8cade0dd71d28511d375e84da4c0"
31
+ dependencies = [
32
+ "libc",
33
+ ]
34
+
35
+ [[package]]
36
+ name = "md5"
37
+ version = "0.7.0"
38
+ source = "registry+https://github.com/rust-lang/crates.io-index"
39
+ checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
40
+
41
+ [[package]]
42
+ name = "md5_ruby_ext"
43
+ version = "0.1.0"
44
+ dependencies = [
45
+ "helix",
46
+ "md5",
47
+ ]
@@ -0,0 +1,14 @@
1
+ [package]
2
+ name = "md5_ruby_ext"
3
+ version = "0.1.0"
4
+ authors = ["Reed, Joshua <joshua.reed@intel.com>"]
5
+ edition = "2018"
6
+
7
+ # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8
+ [lib]
9
+ crate-type = ["cdylib"]
10
+
11
+
12
+ [dependencies]
13
+ md5 = "0.7.0"
14
+ helix = "*"
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in RackMiddlewareMetrics.gemspec
4
+ gemspec
5
+
6
+ group :development, :test do
7
+ gem "rspec", "~> 3.9"
8
+ gem 'solargraph', '~> 0.39.12'
9
+ gem "rubocop", "~> 0.93.1"
10
+ gem "thin", "~> 1.7"
11
+ end
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2020 reedjosh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,54 @@
1
+ # Metrics Reporter
2
+ A minimalist Application Performance Monitoring (APM) library for Ruby on Rails.
3
+
4
+ [![Build Status](https://travis-ci.com/reedjosh/RackMiddlewareMetrics.svg?branch=main)](https://travis-ci.com/reedjosh/RackMiddlewareMetrics)
5
+
6
+ Reports:
7
+ - The time that the request enters the middleware.
8
+ - The time that it leaves the middleware.
9
+ - Request path
10
+ - The request's parameter list.
11
+ - MD5 hash value of the rendered output.
12
+ - Current thread and process ids.
13
+
14
+ Appends to a CSV file.
15
+
16
+ The location and name of the file are configurable by the user.
17
+
18
+ Adds itself to the hosting Ruby on Rails application using Railties AND the agent
19
+
20
+ Does MD5 calculation in Rust.
21
+
22
+ Getting Started
23
+
24
+
25
+ ## Etc... Notes
26
+ TODO: Add the Gem to an open source Ruby on Rails project (RedMine, Discourse, etc) and generate
27
+ a performance metrics CSV file.
28
+
29
+ TODO: The Rack middleware should be implemented as a Railtie
30
+
31
+ The middleware should generate a CSV file with the following fields:
32
+ - Request Time: the timestamp when the request enters the middleware
33
+ - Response Time: the timestamp when the request leaves the middleware
34
+ - Elapsed Time: the time betwen request and response
35
+ - Path: the URI of the request
36
+ - Params: a semi-colon delimited list of GET parameters
37
+ - MD5: the hashed value of the response body
38
+ - Process ID: the process ID of the current request
39
+ - Thread ID: the thread ID of the current request
40
+
41
+ Done: The filename and path of the generated CSV file should be configurable by the user of the Gem
42
+ Almost Done: generate the MD5 hash in Rust using Helix
43
+ Flesh out further: Write unit tests in RSpec.
44
+ Done: Add Travis CI.
45
+ Partially: Write a README that explains what you built and how to use it.
46
+
47
+ Goals:
48
+ - Write idiomatic and well-tested ruby code in a gem.
49
+ - Make sharable among many Ruby on Rails projects even with MD5 generation in rust.
50
+ - Use rvm/Travis to test many ruby versions.
51
+
52
+ ### Build Gem via:
53
+ `gem build metrics_reporter.gemspec`
54
+
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Rakefile
4
+ require 'rake'
5
+ require 'rspec/core/rake_task'
6
+ import 'lib/tasks/helix_runtime.rake'
7
+
8
+ RSpec::Core::RakeTask.new(:spec) do |t|
9
+ t.pattern = Dir.glob('spec/**/*_spec.rb')
10
+ t.rspec_opts = '--format documentation'
11
+ end
12
+
13
+ task :spec => :build
14
+ task default: :spec
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ #
5
+ # This file was generated by Bundler.
6
+ #
7
+ # The application 'bundle' is installed as part of a gem, and
8
+ # this file is here to facilitate running it.
9
+ #
10
+
11
+ require "rubygems"
12
+
13
+ m = Module.new do
14
+ module_function
15
+
16
+ def invoked_as_script?
17
+ File.expand_path($0) == File.expand_path(__FILE__)
18
+ end
19
+
20
+ def env_var_version
21
+ ENV["BUNDLER_VERSION"]
22
+ end
23
+
24
+ def cli_arg_version
25
+ return unless invoked_as_script? # don't want to hijack other binstubs
26
+ return unless "update".start_with?(ARGV.first || " ") # must be running `bundle update`
27
+ bundler_version = nil
28
+ update_index = nil
29
+ ARGV.each_with_index do |a, i|
30
+ if update_index && update_index.succ == i && a =~ Gem::Version::ANCHORED_VERSION_PATTERN
31
+ bundler_version = a
32
+ end
33
+ next unless a =~ /\A--bundler(?:[= ](#{Gem::Version::VERSION_PATTERN}))?\z/
34
+ bundler_version = $1 || ">= 0.a"
35
+ update_index = i
36
+ end
37
+ bundler_version
38
+ end
39
+
40
+ def gemfile
41
+ gemfile = ENV["BUNDLE_GEMFILE"]
42
+ return gemfile if gemfile && !gemfile.empty?
43
+
44
+ File.expand_path("../../Gemfile", __FILE__)
45
+ end
46
+
47
+ def lockfile
48
+ lockfile =
49
+ case File.basename(gemfile)
50
+ when "gems.rb" then gemfile.sub(/\.rb$/, gemfile)
51
+ else "#{gemfile}.lock"
52
+ end
53
+ File.expand_path(lockfile)
54
+ end
55
+
56
+ def lockfile_version
57
+ return unless File.file?(lockfile)
58
+ lockfile_contents = File.read(lockfile)
59
+ return unless lockfile_contents =~ /\n\nBUNDLED WITH\n\s{2,}(#{Gem::Version::VERSION_PATTERN})\n/
60
+ Regexp.last_match(1)
61
+ end
62
+
63
+ def bundler_version
64
+ @bundler_version ||= begin
65
+ env_var_version || cli_arg_version ||
66
+ lockfile_version || "#{Gem::Requirement.default}.a"
67
+ end
68
+ end
69
+
70
+ def load_bundler!
71
+ ENV["BUNDLE_GEMFILE"] ||= gemfile
72
+
73
+ # must dup string for RG < 1.8 compatibility
74
+ activate_bundler(bundler_version.dup)
75
+ end
76
+
77
+ def activate_bundler(bundler_version)
78
+ if Gem::Version.correct?(bundler_version) && Gem::Version.new(bundler_version).release < Gem::Version.new("2.0")
79
+ bundler_version = "< 2"
80
+ end
81
+ gem_error = activation_error_handling do
82
+ gem "bundler", bundler_version
83
+ end
84
+ return if gem_error.nil?
85
+ require_error = activation_error_handling do
86
+ require "bundler/version"
87
+ end
88
+ return if require_error.nil? && Gem::Requirement.new(bundler_version).satisfied_by?(Gem::Version.new(Bundler::VERSION))
89
+ warn "Activating bundler (#{bundler_version}) failed:\n#{gem_error.message}\n\nTo install the version of bundler this project requires, run `gem install bundler -v '#{bundler_version}'`"
90
+ exit 42
91
+ end
92
+
93
+ def activation_error_handling
94
+ yield
95
+ nil
96
+ rescue StandardError, LoadError => e
97
+ e
98
+ end
99
+ end
100
+
101
+ m.load_bundler!
102
+
103
+ if m.invoked_as_script?
104
+ load Gem.bin_path("bundler", "bundle")
105
+ end