logister-ruby 0.1.0 → 0.1.2
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 +4 -4
- data/README.md +26 -0
- data/lib/generators/logister/templates/logister.rb +5 -0
- data/lib/logister/configuration.rb +6 -1
- data/lib/logister/railtie.rb +7 -0
- data/lib/logister/sql_subscriber.rb +57 -0
- data/lib/logister/version.rb +1 -1
- data/lib/logister-ruby.rb +1 -0
- data/lib/logister.rb +1 -0
- data/logister-ruby.gemspec +2 -1
- metadata +18 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c3ffbd6d90538c5e0cf39deab256aaf1b0c5c15f5899051e67cfedc6657ac4b5
|
|
4
|
+
data.tar.gz: af860be23dab9bd73c8d394e9b1b91b6076f62a6a5f67272991afafba75d83a6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 59875a74fdee52e22b697b80e4840ba070db495eb905b47d6522576f2e745d4f64081bf0fbf5f8e7cfc48917466c1a8724a389fe36f728b29080ff71dcb79165
|
|
7
|
+
data.tar.gz: fb8e6d1898621e57f2fdb9c66a3e08b655151f3f06ed830e5e2a8c96313c4b1e181c1281846a2a62ada0d7332d8a9631630bb5b9abe9bf7a4fc4f14e04a781a3
|
data/README.md
CHANGED
|
@@ -56,6 +56,20 @@ end
|
|
|
56
56
|
|
|
57
57
|
If Rails is present, the gem installs middleware that reports unhandled exceptions automatically.
|
|
58
58
|
|
|
59
|
+
## Database load metrics (ActiveRecord)
|
|
60
|
+
|
|
61
|
+
You can capture SQL timing metrics using ActiveSupport notifications:
|
|
62
|
+
|
|
63
|
+
```ruby
|
|
64
|
+
Logister.configure do |config|
|
|
65
|
+
config.capture_db_metrics = true
|
|
66
|
+
config.db_metric_min_duration_ms = 10.0
|
|
67
|
+
config.db_metric_sample_rate = 1.0
|
|
68
|
+
end
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
This emits metric events with `message: "db.query"` and context fields such as `duration_ms`, `name`, `sql`, and `binds_count`.
|
|
72
|
+
|
|
59
73
|
## Manual reporting
|
|
60
74
|
|
|
61
75
|
```ruby
|
|
@@ -68,3 +82,15 @@ Logister.report_metric(
|
|
|
68
82
|
tags: { region: "us-east-1" }
|
|
69
83
|
)
|
|
70
84
|
```
|
|
85
|
+
|
|
86
|
+
## Release
|
|
87
|
+
|
|
88
|
+
Use Bundler's built-in release flow:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
# 1) bump version in lib/logister/version.rb
|
|
92
|
+
# 2) commit changes
|
|
93
|
+
bundle exec rake release
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`rake release` will build the gem, create a git tag, push commits/tags, and push to RubyGems.
|
|
@@ -17,6 +17,11 @@ Logister.configure do |config|
|
|
|
17
17
|
config.ignore_exceptions = []
|
|
18
18
|
config.ignore_paths = []
|
|
19
19
|
|
|
20
|
+
# Optional ActiveRecord SQL instrumentation.
|
|
21
|
+
config.capture_db_metrics = false
|
|
22
|
+
config.db_metric_min_duration_ms = 10.0
|
|
23
|
+
config.db_metric_sample_rate = 1.0
|
|
24
|
+
|
|
20
25
|
config.before_notify = lambda do |payload|
|
|
21
26
|
payload
|
|
22
27
|
end
|
|
@@ -4,7 +4,8 @@ module Logister
|
|
|
4
4
|
class Configuration
|
|
5
5
|
attr_accessor :api_key, :endpoint, :environment, :service, :release, :enabled, :timeout_seconds, :logger,
|
|
6
6
|
:ignore_exceptions, :ignore_environments, :ignore_paths, :before_notify,
|
|
7
|
-
:async, :queue_size, :max_retries, :retry_base_interval
|
|
7
|
+
:async, :queue_size, :max_retries, :retry_base_interval,
|
|
8
|
+
:capture_db_metrics, :db_metric_min_duration_ms, :db_metric_sample_rate
|
|
8
9
|
|
|
9
10
|
def initialize
|
|
10
11
|
@api_key = ENV['LOGISTER_API_KEY']
|
|
@@ -26,6 +27,10 @@ module Logister
|
|
|
26
27
|
@queue_size = 1000
|
|
27
28
|
@max_retries = 3
|
|
28
29
|
@retry_base_interval = 0.5
|
|
30
|
+
|
|
31
|
+
@capture_db_metrics = false
|
|
32
|
+
@db_metric_min_duration_ms = 0.0
|
|
33
|
+
@db_metric_sample_rate = 1.0
|
|
29
34
|
end
|
|
30
35
|
end
|
|
31
36
|
end
|
data/lib/logister/railtie.rb
CHANGED
|
@@ -21,6 +21,9 @@ module Logister
|
|
|
21
21
|
copy_setting(app, config, :queue_size)
|
|
22
22
|
copy_setting(app, config, :max_retries)
|
|
23
23
|
copy_setting(app, config, :retry_base_interval)
|
|
24
|
+
copy_setting(app, config, :capture_db_metrics)
|
|
25
|
+
copy_setting(app, config, :db_metric_min_duration_ms)
|
|
26
|
+
copy_setting(app, config, :db_metric_sample_rate)
|
|
24
27
|
end
|
|
25
28
|
end
|
|
26
29
|
|
|
@@ -28,6 +31,10 @@ module Logister
|
|
|
28
31
|
app.middleware.use Logister::Middleware
|
|
29
32
|
end
|
|
30
33
|
|
|
34
|
+
initializer 'logister.sql_subscriber' do
|
|
35
|
+
Logister::SqlSubscriber.install!
|
|
36
|
+
end
|
|
37
|
+
|
|
31
38
|
private
|
|
32
39
|
|
|
33
40
|
def copy_setting(app, config, key)
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module Logister
|
|
2
|
+
class SqlSubscriber
|
|
3
|
+
IGNORED_SQL_NAMES = %w[SCHEMA TRANSACTION].freeze
|
|
4
|
+
|
|
5
|
+
class << self
|
|
6
|
+
def install!
|
|
7
|
+
return if @installed
|
|
8
|
+
|
|
9
|
+
ActiveSupport::Notifications.subscribe('sql.active_record') do |name, started, finished, _id, payload|
|
|
10
|
+
handle_sql_event(name, started, finished, payload)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
@installed = true
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
private
|
|
17
|
+
|
|
18
|
+
def handle_sql_event(_name, started, finished, payload)
|
|
19
|
+
config = Logister.configuration
|
|
20
|
+
return unless config.capture_db_metrics
|
|
21
|
+
return if payload[:cached]
|
|
22
|
+
return if IGNORED_SQL_NAMES.include?(payload[:name].to_s)
|
|
23
|
+
|
|
24
|
+
duration_ms = (finished - started) * 1000.0
|
|
25
|
+
return if duration_ms < config.db_metric_min_duration_ms.to_f
|
|
26
|
+
return if sampled_out?(config.db_metric_sample_rate)
|
|
27
|
+
|
|
28
|
+
level = duration_ms >= 500 ? 'warn' : 'info'
|
|
29
|
+
|
|
30
|
+
Logister.report_metric(
|
|
31
|
+
message: 'db.query',
|
|
32
|
+
level: level,
|
|
33
|
+
context: {
|
|
34
|
+
duration_ms: duration_ms.round(2),
|
|
35
|
+
name: payload[:name].to_s,
|
|
36
|
+
sql: payload[:sql].to_s,
|
|
37
|
+
cached: false,
|
|
38
|
+
binds_count: Array(payload[:binds]).size
|
|
39
|
+
},
|
|
40
|
+
tags: {
|
|
41
|
+
category: 'database'
|
|
42
|
+
}
|
|
43
|
+
)
|
|
44
|
+
rescue StandardError => e
|
|
45
|
+
config.logger.warn("logister sql subscriber failed: #{e.class} #{e.message}")
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def sampled_out?(sample_rate)
|
|
49
|
+
rate = sample_rate.to_f
|
|
50
|
+
return true if rate <= 0.0
|
|
51
|
+
return false if rate >= 1.0
|
|
52
|
+
|
|
53
|
+
rand > rate
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
data/lib/logister/version.rb
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
require_relative 'logister'
|
data/lib/logister.rb
CHANGED
data/logister-ruby.gemspec
CHANGED
|
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
|
|
|
13
13
|
spec.required_ruby_version = '>= 3.1.0'
|
|
14
14
|
|
|
15
15
|
spec.metadata['homepage_uri'] = spec.homepage
|
|
16
|
-
spec.metadata['source_code_uri'] = 'https://logister
|
|
16
|
+
spec.metadata['source_code_uri'] = 'https://github.com/taimoorq/logister-ruby'
|
|
17
17
|
|
|
18
18
|
spec.files = Dir.chdir(__dir__) do
|
|
19
19
|
Dir.glob('lib/**/*') + ['README.md', 'logister-ruby.gemspec']
|
|
@@ -22,4 +22,5 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
spec.require_paths = ['lib']
|
|
23
23
|
|
|
24
24
|
spec.add_dependency 'activesupport', '>= 6.1'
|
|
25
|
+
spec.add_development_dependency 'rake', '>= 13.0'
|
|
25
26
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: logister-ruby
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Logister
|
|
@@ -23,6 +23,20 @@ dependencies:
|
|
|
23
23
|
- - ">="
|
|
24
24
|
- !ruby/object:Gem::Version
|
|
25
25
|
version: '6.1'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: rake
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - ">="
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '13.0'
|
|
33
|
+
type: :development
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - ">="
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '13.0'
|
|
26
40
|
description: Client gem for reporting errors and custom metrics from Ruby and Rails
|
|
27
41
|
apps to logister.org
|
|
28
42
|
email:
|
|
@@ -34,12 +48,14 @@ files:
|
|
|
34
48
|
- README.md
|
|
35
49
|
- lib/generators/logister/install_generator.rb
|
|
36
50
|
- lib/generators/logister/templates/logister.rb
|
|
51
|
+
- lib/logister-ruby.rb
|
|
37
52
|
- lib/logister.rb
|
|
38
53
|
- lib/logister/client.rb
|
|
39
54
|
- lib/logister/configuration.rb
|
|
40
55
|
- lib/logister/middleware.rb
|
|
41
56
|
- lib/logister/railtie.rb
|
|
42
57
|
- lib/logister/reporter.rb
|
|
58
|
+
- lib/logister/sql_subscriber.rb
|
|
43
59
|
- lib/logister/version.rb
|
|
44
60
|
- logister-ruby.gemspec
|
|
45
61
|
homepage: https://logister.org
|
|
@@ -47,7 +63,7 @@ licenses:
|
|
|
47
63
|
- MIT
|
|
48
64
|
metadata:
|
|
49
65
|
homepage_uri: https://logister.org
|
|
50
|
-
source_code_uri: https://logister
|
|
66
|
+
source_code_uri: https://github.com/taimoorq/logister-ruby
|
|
51
67
|
rdoc_options: []
|
|
52
68
|
require_paths:
|
|
53
69
|
- lib
|