yabeda 0.9.0 → 0.10.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: 1a4867a0d04b93eebd708a3fcf4b21797194066c26e2a96809b85c2139926be9
4
- data.tar.gz: 78a8e47cf194e30641c285505a199465518d5f6e0d1b73c07b4f4222bc2e5f31
3
+ metadata.gz: df5873bc79b044f45361239ef207d63f8a97776d39908652b11629dbb67fd317
4
+ data.tar.gz: d6d170503bfbc5ea7a2e1b2ce4415710efc1e68487350a67e270ae4b2f77c102
5
5
  SHA512:
6
- metadata.gz: 9f05aeeec7451c222ebe6713da7ddca289b1922ff294f3acd0ad8350647e996173ac5c2a642445011cf8549cfc3db4e9a8d804ab74da4cc946e536b14ffa773e
7
- data.tar.gz: d8e3b98d6889f4af3af3273c9e8abfc876b778eeb2bddd94babf9489dcb421d4ab5412f58b293026e6ecffc066ea3eaa42b6965192a5fa22b928a246e9a75de2
6
+ metadata.gz: a8bde67925e08a45425963e778c1e6cd5dcc9a24c46cce96abeb84d56adc99529ecc58556cb930652be64d7cea604563181b69abc1157388e896d9eb76af53a8
7
+ data.tar.gz: 77d9400f003c06e387b3b75cf42d95a52546c2b240021905e649198fe78f0ff2b502da771dbce50c95e837608218026bbea5e310334371cc417567ee67c60392
data/CHANGELOG.md CHANGED
@@ -5,6 +5,20 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
6
6
  and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## Unreleased
9
+
10
+ ## 0.10.0 - 2021-07-21
11
+
12
+ ### Added
13
+
14
+ - Ability to pass a block to `Yabeda::Histogram#measure` to automatically measure its runtime in seconds using [monotonic time](https://blog.dnsimple.com/2018/03/elapsed-time-with-ruby-the-right-way/).
15
+ - Debug mode that will enable some additional metrics to help debug performance issues with your usage of Yabeda (or Yabeda itself). Use environment variable `YABEDA_DEBUG` to enable it or call `Yabeda.debug!`.
16
+ - Debugging histogram `yabeda_collect_duration` that measures duration of every collect block, as they are used for collecting metrics of application state and usually makes some potentially slow queries to databases, network requests, etc.
17
+
18
+ ### Changed
19
+
20
+ - Adapters now should use method `Yabeda.collect!` instead of manual calling of every collector block.
21
+
8
22
  ## 0.9.0 - 2021-05-07
9
23
 
10
24
  ### Added
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Yabeda
1
+ # ![Yabeda](./yabeda-logo.png)
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/yabeda.svg)](https://rubygems.org/gems/yabeda)
4
4
 
@@ -147,6 +147,20 @@ These are developed and maintained by other awesome folks:
147
147
  - [yabeda-gc](https://github.com/ianks/yabeda-gc) — metrics for Ruby garbage collection.
148
148
  - _…and more! You can write your own adapter and open a pull request to add it into this list._
149
149
 
150
+ ## Configuration
151
+
152
+ Configuration is handled by [anyway_config] gem. With it you can load settings from environment variables (which names are constructed from config key upcased and prefixed with `YABEDA_`), YAML files, and other sources. See [anyway_config] docs for details.
153
+
154
+ Config key | Type | Default | Description |
155
+ ---------- | -------- | ------- | ----------- |
156
+ `debug` | boolean | `false` | Collects metrics measuring Yabeda performance |
157
+
158
+ ## Debugging metrics
159
+
160
+ - Time of collector block run: `yabeda_collect_duration` (segmented by block source location). Collector blocks are used for collecting metrics of application state and usually makes some potentially slow queries to databases, network requests, etc.
161
+
162
+ These are only enabled in debug mode. To enable it either set `debug` config key to `true` (e.g. by specifying `YABEDA_DEBUG=true` in your environment variables or executing `Yabeda.debug!` in your code).
163
+
150
164
  ## Roadmap (aka TODO or Help wanted)
151
165
 
152
166
  - Ability to change metric settings for individual adapters
@@ -220,3 +234,4 @@ The gem is available as open source under the terms of the [MIT License](https:/
220
234
  [yabeda-puma-plugin]: https://github.com/yabeda-rb/yabeda-puma-plugin/ "Collects Puma web-server metrics from puma control application"
221
235
  [yabeda-http_requests]: https://github.com/yabeda-rb/yabeda-http_requests/ "Builtin metrics to monitor external HTTP requests"
222
236
  [yabeda-schked]: https://github.com/yabeda-rb/yabeda-schked/ "Built-in metrics for monitoring Schked recurring jobs out of the box"
237
+ [anyway_config]: https://github.com/palkan/anyway_config "Configuration library for Ruby gems and applications"
data/lib/yabeda.rb CHANGED
@@ -1,8 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "concurrent"
4
+ require "forwardable"
4
5
 
5
6
  require "yabeda/version"
7
+ require "yabeda/config"
6
8
  require "yabeda/dsl"
7
9
  require "yabeda/tags"
8
10
  require "yabeda/errors"
@@ -13,6 +15,8 @@ module Yabeda
13
15
  include DSL
14
16
 
15
17
  class << self
18
+ extend Forwardable
19
+
16
20
  # @return [Hash<String, Yabeda::Metric>] All registered metrics
17
21
  def metrics
18
22
  @metrics ||= Concurrent::Hash.new
@@ -35,6 +39,25 @@ module Yabeda
35
39
  @collectors ||= Concurrent::Array.new
36
40
  end
37
41
 
42
+ def config
43
+ @config ||= Config.new
44
+ end
45
+
46
+ def_delegators :config, :debug?
47
+
48
+ # Execute all collector blocks for periodical retrieval of metrics
49
+ #
50
+ # This method is intended to be used by monitoring systems adapters
51
+ def collect!
52
+ collectors.each do |collector|
53
+ if config.debug?
54
+ yabeda.collect_duration.measure({ location: collector.source_location.join(":") }, &collector)
55
+ else
56
+ collector.call
57
+ end
58
+ end
59
+ end
60
+
38
61
  # @return [Hash<Symbol, Symbol>] All added global default tags
39
62
  def default_tags
40
63
  @default_tags ||= Concurrent::Hash.new
@@ -67,6 +90,8 @@ module Yabeda
67
90
  def configure!
68
91
  raise(AlreadyConfiguredError, @configured_by) if already_configured?
69
92
 
93
+ debug! if config.debug?
94
+
70
95
  configurators.each do |(group, block)|
71
96
  group group
72
97
  class_eval(&block)
@@ -83,6 +108,27 @@ module Yabeda
83
108
 
84
109
  @configured_by = caller_locations(1, 1)[0].to_s
85
110
  end
111
+
112
+ # Enable and setup service metrics to monitor yabeda performance
113
+ def debug!
114
+ return false if @debug_was_enabled_by # Prevent multiple calls
115
+
116
+ config.debug ||= true # Enable debug mode in config if it wasn't enabled from other sources
117
+ @debug_was_enabled_by = caller_locations(1, 1)[0].to_s
118
+
119
+ configure do
120
+ group :yabeda
121
+
122
+ histogram :collect_duration,
123
+ tags: %i[location], unit: :seconds,
124
+ buckets: [0.0001, 0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10, 30, 60].freeze,
125
+ comment: "A histogram for the time required to evaluate collect blocks"
126
+ end
127
+
128
+ adapters.each_value(&:debug!)
129
+
130
+ true
131
+ end
86
132
  # rubocop: enable Metrics/MethodLength, Metrics/AbcSize
87
133
 
88
134
  # Forget all the configuration.
@@ -99,6 +145,7 @@ module Yabeda
99
145
  collectors.clear
100
146
  configurators.clear
101
147
  instance_variable_set(:@configured_by, nil)
148
+ instance_variable_set(:@debug_was_enabled_by, nil)
102
149
  end
103
150
  # rubocop: enable Metrics/AbcSize
104
151
  end
@@ -35,5 +35,8 @@ module Yabeda
35
35
  def perform_histogram_measure!(_metric, _tags, _value)
36
36
  raise NotImplementedError, "#{self.class} doesn't support measuring histograms"
37
37
  end
38
+
39
+ # Hook to enable debug mode in adapters when it is enabled in Yabeda itself
40
+ def debug!; end
38
41
  end
39
42
  end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "anyway"
4
+
5
+ module Yabeda
6
+ # Runtime configuration for the main yabeda gem
7
+ class Config < ::Anyway::Config
8
+ config_name :yabeda
9
+
10
+ # Declare and collect metrics about Yabeda performance
11
+ attr_config debug: false
12
+ end
13
+ end
@@ -6,7 +6,18 @@ module Yabeda
6
6
  class Histogram < Metric
7
7
  option :buckets
8
8
 
9
- def measure(tags, value)
9
+ # rubocop: disable Metrics/MethodLength
10
+ def measure(tags, value = nil)
11
+ if value.nil? ^ block_given?
12
+ raise ArgumentError, "You must provide either numeric value or block for Yabeda::Histogram#measure!"
13
+ end
14
+
15
+ if block_given?
16
+ starting = Process.clock_gettime(Process::CLOCK_MONOTONIC)
17
+ yield
18
+ value = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - starting)
19
+ end
20
+
10
21
  all_tags = ::Yabeda::Tags.build(tags, group)
11
22
  values[all_tags] = value
12
23
  ::Yabeda.adapters.each do |_, adapter|
@@ -14,5 +25,6 @@ module Yabeda
14
25
  end
15
26
  value
16
27
  end
28
+ # rubocop: enable Metrics/MethodLength
17
29
  end
18
30
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Yabeda
4
- VERSION = "0.9.0"
4
+ VERSION = "0.10.0"
5
5
  end
data/yabeda-logo.png ADDED
Binary file
data/yabeda.gemspec CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
26
26
  spec.require_paths = ["lib"]
27
27
 
28
+ spec.add_dependency "anyway_config", ">= 1.3", "< 3"
28
29
  spec.add_dependency "concurrent-ruby"
29
30
  spec.add_dependency "dry-initializer"
30
31
 
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yabeda
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrey Novikov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-05-07 00:00:00.000000000 Z
11
+ date: 2021-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: anyway_config
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '3'
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: concurrent-ruby
15
35
  requirement: !ruby/object:Gem::Requirement
@@ -133,6 +153,7 @@ files:
133
153
  - bin/setup
134
154
  - lib/yabeda.rb
135
155
  - lib/yabeda/base_adapter.rb
156
+ - lib/yabeda/config.rb
136
157
  - lib/yabeda/counter.rb
137
158
  - lib/yabeda/dsl.rb
138
159
  - lib/yabeda/dsl/class_methods.rb
@@ -147,6 +168,7 @@ files:
147
168
  - lib/yabeda/railtie.rb
148
169
  - lib/yabeda/tags.rb
149
170
  - lib/yabeda/version.rb
171
+ - yabeda-logo.png
150
172
  - yabeda.gemspec
151
173
  homepage: https://github.com/yabeda-rb/yabeda
152
174
  licenses: