statscloud 1.0.9 → 1.1.0
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/.gitlab-ci.yml +8 -0
- data/Gemfile.lock +32 -1
- data/README.md +35 -24
- data/lib/statscloud/cluster_client.rb +5 -4
- data/lib/statscloud/helpers/assets_helper.rb +10 -8
- data/lib/statscloud/helpers/plugins_helper.rb +3 -3
- data/lib/statscloud/helpers/socketio_helper.rb +2 -0
- data/lib/statscloud/helpers/statscloud_helper.rb +27 -3
- data/lib/statscloud/helpers/statsmeter_helper.rb +14 -0
- data/lib/statscloud/jobs/register_connection_job.rb +1 -0
- data/lib/statscloud/statscloud_client.rb +55 -34
- data/lib/statscloud/statsmeter_client.rb +9 -18
- data/lib/statscloud/version.rb +1 -1
- data/lib/statscloud.rb +1 -108
- data/lib/templates/statscloud/statscloud_template.rb +5 -2
- data/statscloud.gemspec +2 -0
- metadata +31 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46395a60038b7f3886bc4e79275fe98156940690f73acee7ab8061a28164e82e
|
4
|
+
data.tar.gz: dc1d83819866769fb18f48f732f5e8db2ed2d2c732c2929d949cbdc1f21de96d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 016af1b77dd8c472abea59ec7737735581ae9e6b3ffdd7e9f1cd32bf6cc36d59ffd54219cd163a460fcbce5771433c333afb7847ebcc20ad11d518d420c80edd
|
7
|
+
data.tar.gz: 1c79fd2b558d124c645dc4c3f9e1f29082f2d83fd696ce5966a9c9e641d797f6f1a557cfac66c0c1a5518d20f8c44a4316fa68939d3fb58c61a1fba022bc8d1f
|
data/.gitlab-ci.yml
ADDED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
statscloud (1.0
|
4
|
+
statscloud (1.1.0)
|
5
5
|
crc32 (~> 1.0.1)
|
6
6
|
eventmachine (~> 1.2)
|
7
7
|
fileutils
|
@@ -13,6 +13,13 @@ PATH
|
|
13
13
|
GEM
|
14
14
|
remote: https://rubygems.org/
|
15
15
|
specs:
|
16
|
+
activesupport (5.2.2)
|
17
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
18
|
+
i18n (>= 0.7, < 2)
|
19
|
+
minitest (~> 5.1)
|
20
|
+
tzinfo (~> 1.1)
|
21
|
+
ast (2.4.0)
|
22
|
+
concurrent-ruby (1.1.4)
|
16
23
|
crc32 (1.0.1)
|
17
24
|
diff-lcs (1.3)
|
18
25
|
domain_name (0.5.20180417)
|
@@ -25,14 +32,23 @@ GEM
|
|
25
32
|
httparty (0.16.3)
|
26
33
|
mime-types (~> 3.0)
|
27
34
|
multi_xml (>= 0.5.2)
|
35
|
+
i18n (1.2.0)
|
36
|
+
concurrent-ruby (~> 1.0)
|
37
|
+
jaro_winkler (1.5.1)
|
28
38
|
json (2.1.0)
|
29
39
|
leon (1.1.2)
|
30
40
|
logger (1.3.0)
|
31
41
|
mime-types (3.2.2)
|
32
42
|
mime-types-data (~> 3.2015)
|
33
43
|
mime-types-data (3.2018.0812)
|
44
|
+
minitest (5.11.3)
|
34
45
|
multi_xml (0.6.0)
|
35
46
|
netrc (0.11.0)
|
47
|
+
parallel (1.12.1)
|
48
|
+
parser (2.5.3.0)
|
49
|
+
ast (~> 2.4.0)
|
50
|
+
powerpack (0.1.2)
|
51
|
+
rainbow (3.0.0)
|
36
52
|
rake (10.5.0)
|
37
53
|
rest-client (2.0.2)
|
38
54
|
http-cookie (>= 1.0.2, < 2.0)
|
@@ -51,14 +67,27 @@ GEM
|
|
51
67
|
diff-lcs (>= 1.2.0, < 2.0)
|
52
68
|
rspec-support (~> 3.8.0)
|
53
69
|
rspec-support (3.8.0)
|
70
|
+
rubocop (0.61.1)
|
71
|
+
jaro_winkler (~> 1.5.1)
|
72
|
+
parallel (~> 1.10)
|
73
|
+
parser (>= 2.5, != 2.5.1.1)
|
74
|
+
powerpack (~> 0.1)
|
75
|
+
rainbow (>= 2.2.2, < 4.0)
|
76
|
+
ruby-progressbar (~> 1.7)
|
77
|
+
unicode-display_width (~> 1.4.0)
|
78
|
+
ruby-progressbar (1.10.0)
|
54
79
|
statscloud.io-ruby-socket.io-client-simple (1.2.1.pre.3)
|
55
80
|
event_emitter
|
56
81
|
httparty
|
57
82
|
json
|
58
83
|
websocket-client-simple (~> 0.3.0)
|
84
|
+
thread_safe (0.3.6)
|
85
|
+
tzinfo (1.2.5)
|
86
|
+
thread_safe (~> 0.1)
|
59
87
|
unf (0.1.4)
|
60
88
|
unf_ext
|
61
89
|
unf_ext (0.0.7.5)
|
90
|
+
unicode-display_width (1.4.0)
|
62
91
|
websocket (1.2.8)
|
63
92
|
websocket-client-simple (0.3.0)
|
64
93
|
event_emitter
|
@@ -68,9 +97,11 @@ PLATFORMS
|
|
68
97
|
ruby
|
69
98
|
|
70
99
|
DEPENDENCIES
|
100
|
+
activesupport (~> 5.2.2)
|
71
101
|
bundler (~> 1.16)
|
72
102
|
rake (~> 10.0)
|
73
103
|
rspec (~> 3.0)
|
104
|
+
rubocop (~> 0.61.1)
|
74
105
|
statscloud!
|
75
106
|
|
76
107
|
BUNDLED WITH
|
data/README.md
CHANGED
@@ -28,32 +28,38 @@ Or install it yourself as:
|
|
28
28
|
|
29
29
|
StatsCloud auth token is a required parameter for getting access to StatsCloud service. The best way to configure this auth token in your application is using environment variable `STATSCLOUD_AUTH_TOKEN`. StatsCloud add-on at Heroku configures this environment variable automatically during adding this add-on to your application. If you want to use statscloud service in your development process (or somewhere else) you can [copy Heroku config vars to your local .env file](https://devcenter.heroku.com/articles/heroku-local).
|
30
30
|
|
31
|
-
3. You can change `statscloud.rb` intializer file if you want to start StatsCloud service with a different environment or add some tags to your StatsmeterClient.
|
31
|
+
3. You can change `statscloud.rb` intializer file if you want to start StatsCloud service with a different environment, create several instances of StatsCloud::Client with different configurations or add some tags to your StatsmeterClient.
|
32
32
|
|
33
33
|
#### `with_environment('env')`
|
34
34
|
This method allows you to record metrics from different environments (like `test`, `development`, `production`) separately, so
|
35
35
|
```ruby
|
36
|
-
StatsCloud.with_environment('production')
|
36
|
+
StatsCloud::Client.new.with_environment('production')
|
37
37
|
```
|
38
38
|
would start StatsCloud service at `production` environment. Without this method, the environment would be chosen from the configuration file. If you don't configure it service would try to find env in the RAILS_ENV and if it is also missing it would set the value as the `default`.
|
39
39
|
|
40
40
|
#### `with_tags(array[string])`
|
41
|
-
|
41
|
+
You can start service with sending some tags to the cluster. Tags are used to group metrics. By default, the host name is used as a tag, which allows you to track metrics for both the application as a whole and for each host individually. In the cloud, an array of tags `['region', 'server_name']` can be used, which allows you to track metrics for the application as a whole, separate regions or separate servers.
|
42
42
|
```ruby
|
43
|
-
StatsCloud.with_tags(['region', 'server_name'])
|
43
|
+
StatsCloud::Client.new.with_tags(['region', 'server_name'])
|
44
44
|
```
|
45
|
+
#### `with_config_file(file)`
|
46
|
+
Also, it's available to set up several StatsCloud clients with different configuration files via `with_config_file` method.
|
47
|
+
```ruby
|
48
|
+
StatsCloud::Client.new.with_config_file('.production_statscloud.yml')
|
49
|
+
```
|
50
|
+
|
45
51
|
You can combine these methods calling them as a chain.
|
46
52
|
|
47
|
-
4.
|
53
|
+
4. StatsCloud initializer defines `StatsCloudClient` constant which you can use to record metrics with `record_event` method for recording one event or `record_events` to send multiple events to cluster from any place of your application:
|
48
54
|
|
49
55
|
```ruby
|
50
|
-
|
51
|
-
|
56
|
+
StatsCloudClient.meter.record_event('event', 1)
|
57
|
+
StatsCloudClient.meter.record_events({name: 'gauge', measurement: 123}, {name: 'counter'})
|
52
58
|
```
|
53
|
-
Also, you can use these methods directly from
|
59
|
+
Also, you can use these methods directly from StatsCloudClient:
|
54
60
|
```ruby
|
55
|
-
|
56
|
-
|
61
|
+
StatsCloudClient.record_event('event', 1)
|
62
|
+
StatsCloudClient.record_events({name: 'gauge', measurement: 123}, {name: 'counter'})
|
57
63
|
```
|
58
64
|
### Ruby
|
59
65
|
1. Install `statscloud` gem:
|
@@ -64,28 +70,29 @@ Or install it yourself as:
|
|
64
70
|
|
65
71
|
2. Require `statscloud` in the project and set up your application structure, with `.statscloud.yml` configuration file (at the root of the project) and metrics configs (read more about StatsCloud configuration [here](https://medium.com/@roman.kisilenko/software-application-monitoring-how-to-or-how-not-to-let-your-production-fail-9481dd0ef6de)).
|
66
72
|
|
67
|
-
3. Customize statscloud run with `with_environment` and `
|
73
|
+
3. Customize statscloud run with `with_environment`, `with_tags` and `with_config_file` methods and start it where you need it.
|
68
74
|
|
69
75
|
```ruby
|
70
|
-
StatsCloud.
|
76
|
+
statscloud_client = StatsCloud::Client.new
|
77
|
+
statscloud_client.with_environment('test').with_tags(['usa', 'server_1']).start
|
71
78
|
```
|
72
|
-
4. Send metrics via
|
79
|
+
4. Send metrics via statscloud_client.meter or directly via StatsCloud::Client instance:
|
73
80
|
|
74
81
|
```ruby
|
75
|
-
meter =
|
82
|
+
meter = statscloud_client.meter
|
76
83
|
meter.record_event('event', 1)
|
77
84
|
meter.record_events({name: 'gauge', measurement: 123}, {name: 'counter'})
|
78
85
|
|
79
|
-
# also available
|
86
|
+
# also available and preferable
|
80
87
|
|
81
|
-
|
82
|
-
|
88
|
+
statscloud_client.record_event('some_event', 4)
|
89
|
+
statscloud_client.record_events({name: 'some_gauge', measurement: 321})
|
83
90
|
|
84
91
|
```
|
85
92
|
|
86
|
-
5. Stop work of StatsCloud service when 'time is over'
|
93
|
+
5. Stop work of StatsCloud service when 'time is over':
|
87
94
|
```ruby
|
88
|
-
|
95
|
+
statscloud_client.stop
|
89
96
|
```
|
90
97
|
|
91
98
|
The full version of pure ruby example takes the form:
|
@@ -93,14 +100,18 @@ The full version of pure ruby example takes the form:
|
|
93
100
|
require 'statscloud' # import gem
|
94
101
|
|
95
102
|
# start the module, returns a thread
|
96
|
-
StatsCloud.
|
103
|
+
statscloud_client = StatsCloud::Client.new
|
104
|
+
statscloud_client.start
|
97
105
|
|
106
|
+
meter = statscloud_client.meter
|
98
107
|
# track events (remember that you have to wait for the socket connection to the cluster before record any metrics)
|
99
|
-
|
100
|
-
|
108
|
+
meter.record_event('numeric', 123)
|
109
|
+
meter.record_events({name: 'gauge', measurement: 123}, {name: 'counter'})
|
110
|
+
|
111
|
+
statscloud_client.record_event('some_event', 123)
|
101
112
|
|
102
|
-
# stop
|
103
|
-
|
113
|
+
# stop cluster work
|
114
|
+
statscloud_client.stop
|
104
115
|
|
105
116
|
```
|
106
117
|
|
@@ -1,9 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "./helpers/parsed_response_helper"
|
4
|
-
require_relative "./helpers/logger_helper"
|
5
3
|
require "rest-client"
|
6
4
|
|
5
|
+
require_relative "./helpers/logger_helper"
|
6
|
+
require_relative "./helpers/parsed_response_helper"
|
7
|
+
|
7
8
|
module StatsCloud
|
8
9
|
# statscloud.io cluster-api service client.
|
9
10
|
class ClusterClient
|
@@ -18,9 +19,9 @@ module StatsCloud
|
|
18
19
|
# cluster api host.
|
19
20
|
#
|
20
21
|
# @api public
|
21
|
-
def initialize(env, host
|
22
|
+
def initialize(env, host)
|
22
23
|
@environment = env
|
23
|
-
@host = host
|
24
|
+
@host = host || "https://cluster-api-v1.statscloud.statscloud.io"
|
24
25
|
end
|
25
26
|
|
26
27
|
# Schedules cluster instance to be retrieved.
|
@@ -1,13 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "yaml"
|
4
|
+
|
3
5
|
module StatsCloud
|
4
6
|
# This helper works to gather and merge the configuration from files.
|
5
7
|
module AssetsHelper
|
6
8
|
private
|
7
9
|
|
8
10
|
def asset_selector_matches(filename, asset_selector)
|
9
|
-
includes = asset_selector[
|
10
|
-
excludes = asset_selector[
|
11
|
+
includes = asset_selector["include"]
|
12
|
+
excludes = asset_selector["exclude"]
|
11
13
|
process_match(includes, filename) && !process_match(excludes, filename)
|
12
14
|
end
|
13
15
|
|
@@ -23,11 +25,11 @@ module StatsCloud
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def get_checked_asset_selector(config)
|
26
|
-
asset_selector = config[
|
27
|
-
include
|
28
|
+
asset_selector = config["assetSelector"] || {
|
29
|
+
"include" => ['.*\.statscloud.yml'], "exclude" => []
|
28
30
|
}
|
29
|
-
asset_selector[
|
30
|
-
asset_selector[
|
31
|
+
asset_selector["include"] = put_to_array_if_needed(asset_selector["include"])
|
32
|
+
asset_selector["exclude"] = put_to_array_if_needed(asset_selector["exclude"])
|
31
33
|
asset_selector
|
32
34
|
end
|
33
35
|
|
@@ -51,7 +53,7 @@ module StatsCloud
|
|
51
53
|
end
|
52
54
|
|
53
55
|
def process_match(list, filename)
|
54
|
-
list
|
56
|
+
list&.reduce(false) do |match, pattern|
|
55
57
|
match || Regexp.new(pattern).match(filename)
|
56
58
|
end
|
57
59
|
end
|
@@ -85,7 +87,7 @@ module StatsCloud
|
|
85
87
|
end
|
86
88
|
|
87
89
|
def put_to_array_if_needed(object)
|
88
|
-
object.is_a?(Array) ? object : [object]
|
90
|
+
object.is_a?(Array) ? object : [object].compact
|
89
91
|
end
|
90
92
|
|
91
93
|
def it_directory?(file_name, entry)
|
@@ -1,11 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../errors/client_error"
|
4
3
|
require_relative "logger_helper"
|
4
|
+
require_relative "../errors/client_error"
|
5
5
|
|
6
6
|
module StatsCloud
|
7
7
|
# This helper configures StatsCloud plugins.
|
8
8
|
module PluginsHelper
|
9
|
+
private
|
10
|
+
|
9
11
|
def build_plugins(plugins)
|
10
12
|
plugins&.each do |plugin|
|
11
13
|
plugin = plugin.is_a?(Hash) ? plugin : simple_plugin_config(plugin)
|
@@ -19,8 +21,6 @@ module StatsCloud
|
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
|
-
private
|
23
|
-
|
24
24
|
def simple_plugin_config(plugin)
|
25
25
|
{
|
26
26
|
"name": plugin
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "socket"
|
4
4
|
require_relative "../errors/client_error"
|
5
5
|
|
6
6
|
module StatsCloud
|
@@ -8,6 +8,26 @@ module StatsCloud
|
|
8
8
|
module StatsCloudHelper
|
9
9
|
private
|
10
10
|
|
11
|
+
def initialize_values
|
12
|
+
@config = {}
|
13
|
+
@source_mappings = { metrics: [], admins: [], dashboards: [], alerts: [] }
|
14
|
+
update_config_file(".statscloud.yml")
|
15
|
+
end
|
16
|
+
|
17
|
+
def generate_configuration(base_config)
|
18
|
+
if base_config
|
19
|
+
join_configs(@config, base_config, @source_mappings, "")
|
20
|
+
else
|
21
|
+
base_config = get_config_from_file(@config_file)
|
22
|
+
join_configs(@config, base_config, @source_mappings, @config_file)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def clear_data
|
27
|
+
@config.delete("propagateErrors")
|
28
|
+
@config.delete("token")
|
29
|
+
end
|
30
|
+
|
11
31
|
def config_values
|
12
32
|
@config["sourceMaps"] = source_mappings
|
13
33
|
config_token
|
@@ -27,6 +47,10 @@ module StatsCloud
|
|
27
47
|
@tags = tags
|
28
48
|
end
|
29
49
|
|
50
|
+
def update_config_file(file)
|
51
|
+
@config_file = file
|
52
|
+
end
|
53
|
+
|
30
54
|
def config_token
|
31
55
|
@token = @config["token"] || ENV["STATSCLOUD_AUTH_TOKEN"]
|
32
56
|
end
|
@@ -49,7 +73,7 @@ module StatsCloud
|
|
49
73
|
def cluster_error_message
|
50
74
|
return "Unable to get information about cluster." unless @cluster
|
51
75
|
|
52
|
-
@cluster[
|
76
|
+
@cluster["status"]["error"]
|
53
77
|
end
|
54
78
|
|
55
79
|
def app_name_missing_error_message
|
@@ -61,7 +85,7 @@ module StatsCloud
|
|
61
85
|
end
|
62
86
|
|
63
87
|
def successful_message
|
64
|
-
"statscloud.io support configured, dashboard URLs are \n
|
88
|
+
"statscloud.io support configured, dashboard URLs are \n#{(@cluster['grafanaDashboardsUrls'] || []).join("\n")}"
|
65
89
|
end
|
66
90
|
|
67
91
|
def statscloud_error(message)
|
@@ -34,6 +34,20 @@ module StatsCloud
|
|
34
34
|
@event_name_size_in_bytes = 0
|
35
35
|
end
|
36
36
|
|
37
|
+
def process_single_event(event)
|
38
|
+
name = get_event_name(event)
|
39
|
+
measurement = get_event_measurement(event)&.to_f
|
40
|
+
|
41
|
+
return unless @names_map && @names_map[name]
|
42
|
+
|
43
|
+
binary_length = get_binary_length(@event_name_size_in_bytes)
|
44
|
+
plain_length = get_plain_length(name, measurement)
|
45
|
+
|
46
|
+
flush_events if flush_condition(binary_length, plain_length)
|
47
|
+
record_binary_event(name, measurement, binary_length)
|
48
|
+
record_plain_event(name, measurement, plain_length)
|
49
|
+
end
|
50
|
+
|
37
51
|
def record_binary_event(name, measurement, binary_length)
|
38
52
|
@pending_binary_events.writeInt32LE(@names_map[name], @pending_binary_offset)
|
39
53
|
@pending_binary_events = @pending_binary_events.slice(0, @pending_binary_offset + @event_name_size_in_bytes)
|
@@ -1,10 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "yaml"
|
4
|
-
require "json"
|
5
|
-
require "eventmachine"
|
6
|
-
require "singleton"
|
7
|
-
require "socket"
|
8
3
|
require_relative "version"
|
9
4
|
require_relative "statsmeter_client"
|
10
5
|
require_relative "cluster_client"
|
@@ -16,12 +11,20 @@ require_relative "jobs/register_connection_job"
|
|
16
11
|
module StatsCloud
|
17
12
|
# Module which implements StatsCloud framework support.
|
18
13
|
class Client
|
19
|
-
include Singleton
|
20
14
|
include StatsCloud::AssetsHelper
|
21
15
|
include StatsCloud::LoggerHelper
|
22
16
|
include StatsCloud::PluginsHelper
|
23
17
|
include StatsCloud::StatsCloudHelper
|
24
18
|
|
19
|
+
# Creates new StatsCloud::Client instance with empty configuration.
|
20
|
+
#
|
21
|
+
# @return instance of StatsCloud::Client
|
22
|
+
#
|
23
|
+
# @api public
|
24
|
+
def initialize
|
25
|
+
initialize_values
|
26
|
+
end
|
27
|
+
|
25
28
|
# Configures statsmeter.io support for application and initializes a statscloud.io client.
|
26
29
|
#
|
27
30
|
# @param [+String] env
|
@@ -34,19 +37,22 @@ module StatsCloud
|
|
34
37
|
#
|
35
38
|
# @api public
|
36
39
|
def start(base_config = nil)
|
37
|
-
|
38
|
-
generate_configuration(base_config)
|
39
|
-
collect_statscloud_assets(@config, @source_mappings)
|
40
|
-
config_values
|
41
|
-
clear_data
|
40
|
+
process_configuration(base_config)
|
42
41
|
configure_statscloud_plugins
|
43
42
|
configure_cluster
|
44
43
|
connect_to_cluster
|
44
|
+
rescue StandardError => error
|
45
|
+
log_error error
|
45
46
|
end
|
46
47
|
|
47
48
|
# Configures Statscloud environment.
|
48
49
|
#
|
49
|
-
# @
|
50
|
+
# @param [+String+] env
|
51
|
+
# Environment
|
52
|
+
#
|
53
|
+
# @return instance of StatsCloud::Client
|
54
|
+
#
|
55
|
+
# @api public
|
50
56
|
def with_environment(env)
|
51
57
|
config_environment(env)
|
52
58
|
self
|
@@ -54,15 +60,33 @@ module StatsCloud
|
|
54
60
|
|
55
61
|
# Configures Statscloud tags.
|
56
62
|
#
|
57
|
-
# @
|
63
|
+
# @param [+Array+] tags
|
64
|
+
# List of tags
|
65
|
+
#
|
66
|
+
# @return instance of StatsCloud::Client
|
67
|
+
#
|
68
|
+
# @api public
|
58
69
|
def with_tags(tags)
|
59
70
|
config_tags(tags)
|
60
71
|
self
|
61
72
|
end
|
62
73
|
|
74
|
+
# Allows to start several instances of StatsCloud::Client with different confifurations.
|
75
|
+
#
|
76
|
+
# @param [+String+] file
|
77
|
+
# Main configuration file for StatsCloud::Client
|
78
|
+
#
|
79
|
+
# @return instance of StatsCloud::Client
|
80
|
+
#
|
81
|
+
# @api public
|
82
|
+
def with_config_file(file)
|
83
|
+
update_config_file(file)
|
84
|
+
self
|
85
|
+
end
|
86
|
+
|
63
87
|
# Returns statscloud.io client aka Statsmeter client
|
64
88
|
#
|
65
|
-
# @return
|
89
|
+
# @return instance of StatsCloud::StatsmeterClient
|
66
90
|
#
|
67
91
|
# @api public
|
68
92
|
def meter
|
@@ -77,6 +101,8 @@ module StatsCloud
|
|
77
101
|
# optional measurement, depending on metrics type.
|
78
102
|
#
|
79
103
|
# Calls statsmeter client record_event method.
|
104
|
+
#
|
105
|
+
# @api public
|
80
106
|
def record_event(name, measurement = 0)
|
81
107
|
@statsmeter_client&.record_event(name, measurement)
|
82
108
|
end
|
@@ -87,6 +113,8 @@ module StatsCloud
|
|
87
113
|
# events to send (each should have name and optional measurement fields).
|
88
114
|
#
|
89
115
|
# Calls statsmeter record_events method.
|
116
|
+
#
|
117
|
+
# @api public
|
90
118
|
def record_events(*events)
|
91
119
|
@statsmeter_client&.record_events(*events)
|
92
120
|
end
|
@@ -97,6 +125,8 @@ module StatsCloud
|
|
97
125
|
# array of events to send (each shoud have name and optional measurement fields).
|
98
126
|
#
|
99
127
|
# Calls statsmeter client record_events_array method.
|
128
|
+
#
|
129
|
+
# @api public
|
100
130
|
def record_events_array(events)
|
101
131
|
@statsmeter_client&.record_events_array(events)
|
102
132
|
end
|
@@ -111,12 +141,14 @@ module StatsCloud
|
|
111
141
|
|
112
142
|
cluster = @cluster_client.get_cluster(@token, @app)&.body
|
113
143
|
check_cluster_status(cluster)
|
114
|
-
cluster[
|
144
|
+
cluster["status"]["status"] if cluster
|
145
|
+
rescue StandardError => error
|
146
|
+
log_error error
|
115
147
|
end
|
116
148
|
|
117
149
|
# Stops statscloud.io service.
|
118
150
|
#
|
119
|
-
# @return
|
151
|
+
# @return nil
|
120
152
|
#
|
121
153
|
# @api public
|
122
154
|
def stop
|
@@ -124,30 +156,19 @@ module StatsCloud
|
|
124
156
|
@statsmeter_client = nil
|
125
157
|
@cluster_client&.undeploy_cluster(@token, @app)
|
126
158
|
@cluster_client = nil
|
159
|
+
rescue StandardError => error
|
160
|
+
log_error error
|
127
161
|
end
|
128
162
|
|
129
163
|
private
|
130
164
|
|
131
165
|
attr_reader :config, :source_mappings, :statsmeter_client, :cluster, :token, :app, :graphite_url
|
132
166
|
|
133
|
-
def
|
134
|
-
|
135
|
-
@config
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
def generate_configuration(base_config)
|
140
|
-
if base_config
|
141
|
-
join_configs(@config, base_config, @source_mappings, "")
|
142
|
-
else
|
143
|
-
base_config = get_config_from_file(File.join(__dir__, ".statscloud.yml"))
|
144
|
-
join_configs(@config, base_config, @source_mappings, ".statscloud.yml")
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def clear_data
|
149
|
-
@config.delete("propagateErrors")
|
150
|
-
@config.delete("token")
|
167
|
+
def process_configuration(base_config)
|
168
|
+
generate_configuration(base_config)
|
169
|
+
collect_statscloud_assets(@config, @source_mappings)
|
170
|
+
config_values
|
171
|
+
clear_data
|
151
172
|
end
|
152
173
|
|
153
174
|
def configure_statscloud_plugins
|
@@ -1,14 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "crc32"
|
4
|
+
require "eventmachine"
|
5
|
+
|
3
6
|
require_relative "helpers/socketio_helper"
|
4
7
|
require_relative "helpers/statsmeter_helper"
|
5
8
|
require_relative "helpers/logger_helper"
|
6
9
|
require_relative "helpers/event_helper"
|
7
10
|
require_relative "helpers/plugins_helper"
|
8
|
-
require "leon"
|
9
|
-
require "eventmachine"
|
10
|
-
require "statscloud.io-ruby-socket.io-client-simple"
|
11
|
-
require "crc32"
|
12
11
|
|
13
12
|
module StatsCloud
|
14
13
|
# Client for Statsmeter.
|
@@ -104,18 +103,10 @@ module StatsCloud
|
|
104
103
|
# Save events in pending binary and plain arrays. Check flush condition.
|
105
104
|
def record_events_array(events)
|
106
105
|
events.each do |event|
|
107
|
-
|
108
|
-
measurement = get_event_measurement(event)&.to_f
|
109
|
-
|
110
|
-
next unless @names_map && @names_map[name]
|
111
|
-
|
112
|
-
binary_length = get_binary_length(@event_name_size_in_bytes)
|
113
|
-
plain_length = get_plain_length(name, measurement)
|
114
|
-
|
115
|
-
flush_events if flush_condition(binary_length, plain_length)
|
116
|
-
record_binary_event(name, measurement, binary_length)
|
117
|
-
record_plain_event(name, measurement, plain_length)
|
106
|
+
process_single_event(event)
|
118
107
|
end
|
108
|
+
rescue StandardError => error
|
109
|
+
log_error error
|
119
110
|
end
|
120
111
|
|
121
112
|
# Sends all pending events to statscloud.
|
@@ -140,8 +131,8 @@ module StatsCloud
|
|
140
131
|
# Stops socket.io connection.
|
141
132
|
def close
|
142
133
|
stop_eventmachine
|
143
|
-
client
|
144
|
-
client
|
134
|
+
client&.auto_reconnection = false
|
135
|
+
client&.disconnect
|
145
136
|
set_client_to_nil
|
146
137
|
end
|
147
138
|
|
@@ -176,7 +167,7 @@ module StatsCloud
|
|
176
167
|
end
|
177
168
|
|
178
169
|
def stop_eventmachine
|
179
|
-
eventmachine.stop_event_loop
|
170
|
+
eventmachine.stop_event_loop if eventmachine.reactor_running?
|
180
171
|
end
|
181
172
|
|
182
173
|
def crc32
|
data/lib/statscloud/version.rb
CHANGED
data/lib/statscloud.rb
CHANGED
@@ -1,111 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "statscloud/statscloud_client"
|
4
|
-
require "statscloud/
|
5
|
-
|
6
|
-
# StatsCloud.io ruby client
|
7
|
-
module StatsCloud
|
8
|
-
class << self
|
9
|
-
include LoggerHelper
|
10
|
-
|
11
|
-
# Configures statsmeter.io support for application and initializes a statscloud.io client.
|
12
|
-
#
|
13
|
-
# @param [+String+] env
|
14
|
-
# statsmeter.io cluster environment
|
15
|
-
#
|
16
|
-
# @param [+Hash+] base_config
|
17
|
-
# statsmeter.io configuration
|
18
|
-
#
|
19
|
-
# @return [Thread]
|
20
|
-
#
|
21
|
-
# @api public
|
22
|
-
def start(base_config = nil)
|
23
|
-
stats_cloud_instance.start(base_config)
|
24
|
-
rescue StandardError => error
|
25
|
-
log_error error
|
26
|
-
end
|
27
|
-
|
28
|
-
# Configures Statscloud environment.
|
29
|
-
#
|
30
|
-
# @return StatsCloud::Client
|
31
|
-
def with_environment(env)
|
32
|
-
stats_cloud_instance.with_environment(env)
|
33
|
-
rescue StandardError => error
|
34
|
-
log_error error
|
35
|
-
end
|
36
|
-
|
37
|
-
# Configures Statscloud tags.
|
38
|
-
#
|
39
|
-
# @return StatsCloud::Client
|
40
|
-
def with_tags(tags)
|
41
|
-
stats_cloud_instance.with_tags(tags)
|
42
|
-
rescue StandardError => error
|
43
|
-
log_error error
|
44
|
-
end
|
45
|
-
|
46
|
-
# Returns statscloud.io client aka Statsmeter client
|
47
|
-
#
|
48
|
-
# @return [StatsCloud::StatsmeterClient]
|
49
|
-
#
|
50
|
-
# @api public
|
51
|
-
def meter
|
52
|
-
stats_cloud_instance.meter
|
53
|
-
rescue StandardError => error
|
54
|
-
log_error error
|
55
|
-
end
|
56
|
-
|
57
|
-
# Records a single event.
|
58
|
-
#
|
59
|
-
# @param [+String+] name
|
60
|
-
# name of the event to record.
|
61
|
-
# @param [+Integer+] measurement
|
62
|
-
# optional measurement, depending on metrics type.
|
63
|
-
def record_event(name, measurement = 0)
|
64
|
-
stats_cloud_instance.record_event(name, measurement)
|
65
|
-
end
|
66
|
-
|
67
|
-
# Records several events at once.
|
68
|
-
#
|
69
|
-
# @param [+Array+] events
|
70
|
-
# events to send (each should have name and optional measurement fields).
|
71
|
-
def record_events(*events)
|
72
|
-
stats_cloud_instance.record_events(*events)
|
73
|
-
end
|
74
|
-
|
75
|
-
# Records an array of events at once.
|
76
|
-
#
|
77
|
-
# @param [+Array+] events
|
78
|
-
# array of events to send (each shoud have name and optional measurement fields).
|
79
|
-
def record_events_array(events)
|
80
|
-
stats_cloud_instance.record_events_array(events)
|
81
|
-
end
|
82
|
-
|
83
|
-
# Returns cluster status.
|
84
|
-
#
|
85
|
-
# @return [Hash]
|
86
|
-
#
|
87
|
-
# @api public
|
88
|
-
def cluster_status
|
89
|
-
stats_cloud_instance.cluster_status
|
90
|
-
rescue StandardError => error
|
91
|
-
log_error error
|
92
|
-
end
|
93
|
-
|
94
|
-
# Stops statscloud.io service.
|
95
|
-
#
|
96
|
-
# @return [NilClass]
|
97
|
-
#
|
98
|
-
# @api public
|
99
|
-
def stop
|
100
|
-
stats_cloud_instance.stop
|
101
|
-
rescue StandardError => error
|
102
|
-
log_error error
|
103
|
-
end
|
104
|
-
|
105
|
-
private
|
106
|
-
|
107
|
-
def stats_cloud_instance
|
108
|
-
StatsCloud::Client.instance
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
4
|
+
require "statscloud/version"
|
data/statscloud.gemspec
CHANGED
@@ -41,7 +41,9 @@ Gem::Specification.new do |spec|
|
|
41
41
|
spec.add_dependency "rest-client", "~> 2.0.2"
|
42
42
|
spec.add_dependency "statscloud.io-ruby-socket.io-client-simple", "~> 1.2.1.pre.3"
|
43
43
|
|
44
|
+
spec.add_development_dependency "activesupport", "~> 5.2.2"
|
44
45
|
spec.add_development_dependency "bundler", "~> 1.16"
|
45
46
|
spec.add_development_dependency "rake", "~> 10.0"
|
46
47
|
spec.add_development_dependency "rspec", "~> 3.0"
|
48
|
+
spec.add_development_dependency "rubocop", "~> 0.61.1"
|
47
49
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: statscloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roman Ovcharov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-12-
|
11
|
+
date: 2018-12-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: crc32
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: 1.2.1.pre.3
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: activesupport
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - "~>"
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 5.2.2
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - "~>"
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 5.2.2
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: bundler
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +164,20 @@ dependencies:
|
|
150
164
|
- - "~>"
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: '3.0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: rubocop
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.61.1
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.61.1
|
153
181
|
description: PaaS application monitoring system.
|
154
182
|
email:
|
155
183
|
- roman.o.as@agiliumlabs.com
|
@@ -158,6 +186,7 @@ extensions: []
|
|
158
186
|
extra_rdoc_files: []
|
159
187
|
files:
|
160
188
|
- ".gitignore"
|
189
|
+
- ".gitlab-ci.yml"
|
161
190
|
- ".rspec"
|
162
191
|
- ".rubocop.yml"
|
163
192
|
- Gemfile
|