callcounter 0.0.0 → 0.1.0

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: c1296edd2bdff7494496219c2806b20a63ca53e4edd01c5162e7d1cbae08421e
4
- data.tar.gz: 6bd1af03dd43ae43fddd6c86168bce112ba5ceb1d3d546cb0c030787257f178b
3
+ metadata.gz: c162b867a3b3a0050d698462603b089142c29460c49254bae7e78705eef1b0ff
4
+ data.tar.gz: 8613f4d81bf8e88f3bf083dd7360ab8e7255ecacc1fac0e4d74ff555fadfb579
5
5
  SHA512:
6
- metadata.gz: ea1a95f4179f2818cf9f68802ea54954010db5def0b3f0f7385a263222dd2239d63bcc63241a4d97dbc62e663c1c0e547014b4ff96b33b6f72eb3fab8bbb1819
7
- data.tar.gz: 20aeb37e0ee4b67d11e29d1e66f059eee6a016ed630d7159556715ee98541c9f73149b83a0953b9aa8a07d47b50427d235837642cd47ed270e47e180434640e7
6
+ metadata.gz: a0513ed8e497d09a4c5c14735415b5b054546cf0bccbfa86e6e006420852f1c1107a9cc50b7bdc6781dfcd4e9f892c66f36ec2f801fc36e9ead53b8ed4416b3c
7
+ data.tar.gz: 7f0d38080e754246ca32f73f2cd2ff7a37e1bd9ca5737fdb8a21143d8effd8dca48a79c0a396a00b53b8c229e076f51c1eea125ea7f6bce0f6f0f5fdb640f97d
data/LICENSE ADDED
@@ -0,0 +1,23 @@
1
+ Copyright (c) 2021, Webindie
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+
7
+ * Redistributions of source code must retain the above copyright notice, this
8
+ list of conditions and the following disclaimer.
9
+
10
+ * Redistributions in binary form must reproduce the above copyright notice,
11
+ this list of conditions and the following disclaimer in the documentation
12
+ and/or other materials provided with the distribution.
13
+
14
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
18
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md ADDED
@@ -0,0 +1,44 @@
1
+ [![builds.sr.ht status](https://builds.sr.ht/~webindie/callcounter-gem.svg)](https://builds.sr.ht/~webindie/callcounter-gem?)
2
+
3
+ # Callcounter Ruby integration gem
4
+
5
+ This gem can be used to gather API request & response data from Rack based applications.
6
+
7
+ ## Install
8
+
9
+ When using bundler, simply add the following line to your Gemfile:
10
+
11
+ ```ruby
12
+ gem 'callcounter'
13
+ ```
14
+
15
+ Run `bundle install` in your project directory and create an initializer
16
+ `config/initializers/callcounter.rb` with the following content:
17
+
18
+ ```ruby
19
+ Callcounter.configure do |config|
20
+ config.project_token = '' # TODO: fill with your unique project token
21
+ end
22
+ ```
23
+
24
+ After deploying you should start seeing data in Callcounter. Note that this might take some time
25
+ because this gems only sends data every few requests or every few minutes.
26
+
27
+ ## Configure what to capture
28
+
29
+ You can add a lambda that will be called for every request to determine whether it was a request to your API.
30
+ For example, the default lambda is shown below:
31
+
32
+ ```ruby
33
+ Callcounter.configure do |config|
34
+ config.project_token = '' # TODO: fill with your unique project token
35
+ config.track = lambda { |request|
36
+ return request.hostname.start_with?('api') || request.path.start_with?('/api')
37
+ }
38
+ end
39
+ ```
40
+
41
+ ## About Callcounter
42
+
43
+ [Callcounter](https://callcounter.eu) is a service built by [Webindie](https://webindie.nl) that
44
+ helps API providers with debugging and optimising the usage of their APIs.
data/lib/callcounter.rb CHANGED
@@ -1,2 +1,21 @@
1
- class Callcounter
1
+ # frozen_string_literal: true
2
+
3
+ require 'callcounter/capturer'
4
+ require 'callcounter/configuration'
5
+ require 'callcounter/railtie' if defined?(Rails::Railtie)
6
+ require 'callcounter/version'
7
+
8
+ # rack middleware that captures incoming api requests and sends them to callcounter.eu
9
+ module Callcounter
10
+ class << self
11
+ attr_writer :configuration
12
+ end
13
+
14
+ def self.configuration
15
+ @configuration ||= Callcounter::Configuration.new
16
+ end
17
+
18
+ def self.configure
19
+ yield(configuration)
20
+ end
2
21
  end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Callcounter
4
+ # class that captures the rack requests and sends them to callcounter.eu
5
+ class Capturer
6
+ attr_accessor :buffer
7
+
8
+ def initialize(app)
9
+ @app = app
10
+ @buffer = []
11
+ end
12
+
13
+ def call(env)
14
+ start = Time.now
15
+ result = @app.call(env)
16
+ finish = Time.now
17
+
18
+ return result if project_token.nil?
19
+
20
+ threading do
21
+ background_work(start, finish, env, result)
22
+ end
23
+
24
+ result
25
+ end
26
+
27
+ def debug?
28
+ Callcounter.configuration.debug
29
+ end
30
+
31
+ def track?(request)
32
+ Callcounter.configuration.track.call(request)
33
+ end
34
+
35
+ def project_token
36
+ Callcounter.configuration.project_token
37
+ end
38
+
39
+ def async?
40
+ Callcounter.configuration.async
41
+ end
42
+
43
+ def threading(&block)
44
+ if async?
45
+ Thread.new(&block)
46
+ else
47
+ yield
48
+ end
49
+ end
50
+
51
+ def send_buffer
52
+ http = Net::HTTP.new('api.callcounter.eu', 443)
53
+ http.use_ssl = true
54
+ track = Net::HTTP::Post.new('/api/v1/events')
55
+ track['content-type'] = 'application/json'
56
+ track['user-agent'] = "callcounter-gem (#{Callcounter::VERSION})"
57
+ track.body = { project_token: project_token, events: @buffer }.to_json
58
+
59
+ http.request(track)
60
+
61
+ puts 'sent request' if debug?
62
+ rescue StandardError
63
+ puts 'failed to send request' if debug?
64
+ end
65
+
66
+ def should_send_buffer?
67
+ @buffer.first[:created_at] < Time.now - Random.rand(300..359) || @buffer.size > 25
68
+ end
69
+
70
+ def event_attributes(start, finish, request, result)
71
+ {
72
+ created_at: start,
73
+ elapsed_time: ((finish - start) * 1000).round,
74
+ method: request.request_method,
75
+ path: request.path,
76
+ user_agent: request.user_agent,
77
+ status: result.first
78
+ }
79
+ end
80
+
81
+ def background_work(start, finish, env, result)
82
+ request = Rack::Request.new(env)
83
+ return unless track?(request)
84
+
85
+ @buffer << event_attributes(start, finish, request, result)
86
+
87
+ return unless should_send_buffer?
88
+
89
+ send_buffer
90
+ @buffer = []
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Callcounter
4
+ # configuration class for callcounter middleware
5
+ class Configuration
6
+ attr_accessor :debug, :project_token, :track, :async
7
+
8
+ def initialize
9
+ @debug = false
10
+ @project_token = nil
11
+ @track = lambda { |request|
12
+ return request.hostname.start_with?('api') || request.path.start_with?('/api')
13
+ }
14
+ @async = true
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Callcounter
4
+ # enable the callcounter rack middleware automatically in rails
5
+ class Railtie < Rails::Railtie
6
+ initializer 'callcounter.middleware' do |app|
7
+ app.middleware.use(Callcounter::Capturer)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Callcounter
4
+ VERSION = '0.1.0'
5
+ end
metadata CHANGED
@@ -1,43 +1,51 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callcounter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Webindie
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-02-26 00:00:00.000000000 Z
11
+ date: 2021-04-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: callcounter
13
+ description: Callcounter is a service that helps API providers with debugging and
14
+ optimising the usage of their APIs.
14
15
  email: frank@webindie.nl
15
16
  executables: []
16
17
  extensions: []
17
18
  extra_rdoc_files: []
18
19
  files:
20
+ - LICENSE
21
+ - README.md
19
22
  - lib/callcounter.rb
20
- homepage: https://rubygems.org/gems/callcounter
23
+ - lib/callcounter/capturer.rb
24
+ - lib/callcounter/configuration.rb
25
+ - lib/callcounter/railtie.rb
26
+ - lib/callcounter/version.rb
27
+ homepage: https://callcounter.eu
21
28
  licenses:
22
29
  - BSD-2-Clause
23
- metadata: {}
30
+ metadata:
31
+ source_code_uri: https://git.sr.ht/~webindie/callcounter-gem
24
32
  post_install_message:
25
33
  rdoc_options: []
26
34
  require_paths:
27
35
  - lib
28
36
  required_ruby_version: !ruby/object:Gem::Requirement
29
37
  requirements:
30
- - - ">="
38
+ - - ">"
31
39
  - !ruby/object:Gem::Version
32
- version: '0'
40
+ version: 2.4.0
33
41
  required_rubygems_version: !ruby/object:Gem::Requirement
34
42
  requirements:
35
43
  - - ">="
36
44
  - !ruby/object:Gem::Version
37
45
  version: '0'
38
46
  requirements: []
39
- rubygems_version: 3.1.4
47
+ rubygems_version: 3.2.15
40
48
  signing_key:
41
49
  specification_version: 4
42
- summary: callcounter
50
+ summary: Callcounter integration gem to gather API request statistics
43
51
  test_files: []