statscloud 1.0.9 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|