statscloud 1.0.2 → 1.0.4
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/.rubocop.yml +1 -42
- data/Gemfile +1 -1
- data/Gemfile.lock +7 -6
- data/lib/generators/stats_cloud/install_generator.rb +5 -5
- data/lib/statscloud.rb +2 -2
- data/lib/statscloud/cluster_client.rb +5 -9
- data/lib/statscloud/errors/client_error.rb +5 -0
- data/lib/statscloud/helpers/assets_helper.rb +2 -2
- data/lib/statscloud/helpers/logger_helper.rb +4 -4
- data/lib/statscloud/helpers/parsed_response_helper.rb +2 -2
- data/lib/statscloud/helpers/plugins_helper.rb +51 -0
- data/lib/statscloud/helpers/socketio_helper.rb +17 -17
- data/lib/statscloud/helpers/statscloud_helper.rb +32 -5
- data/lib/statscloud/helpers/statsmeter_helper.rb +15 -5
- data/lib/statscloud/statscloud_client.rb +34 -31
- data/lib/statscloud/statsmeter_client.rb +36 -19
- data/lib/statscloud/version.rb +1 -1
- data/statscloud.gemspec +5 -5
- metadata +6 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: eb4636c428d2bdf3e787989de374e1419343363ee91b1abc3dd767dc4f4644a8
|
|
4
|
+
data.tar.gz: 07666f855bad5d68797f24a2342b17875cfa5e99627ab10fe6f51e8995e1805a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 750eb1480dd06068bccfcd0bd54a783094c87e212dc04c957faa5b8f8c6cc6e2547628b3d6ea99203a7e629d709751d08b853e555f2402b82c676119b1318690
|
|
7
|
+
data.tar.gz: 4f1f670bff40b26dd8c906afba20cd041ec9fba6bf53b77f5a2b769d6c086b7c849f15baf75cfa30c0bccc29b7823f9a0dcba3f63def7d7c075f3e7478a93d34
|
data/.rubocop.yml
CHANGED
|
@@ -1,22 +1,6 @@
|
|
|
1
1
|
AllCops:
|
|
2
2
|
TargetRubyVersion: 2.3
|
|
3
3
|
|
|
4
|
-
Layout/ExtraSpacing:
|
|
5
|
-
Exclude:
|
|
6
|
-
- 'statscloud.gemspec'
|
|
7
|
-
|
|
8
|
-
Layout/LeadingBlankLines:
|
|
9
|
-
Exclude:
|
|
10
|
-
- 'statscloud.gemspec'
|
|
11
|
-
|
|
12
|
-
Layout/SpaceAroundOperators:
|
|
13
|
-
Exclude:
|
|
14
|
-
- 'statscloud.gemspec'
|
|
15
|
-
|
|
16
|
-
Layout/SpaceInsideBlockBraces:
|
|
17
|
-
Exclude:
|
|
18
|
-
- 'Gemfile'
|
|
19
|
-
|
|
20
4
|
Metrics/BlockLength:
|
|
21
5
|
Exclude:
|
|
22
6
|
- 'spec/**/*'
|
|
@@ -36,37 +20,12 @@ Style/Documentation:
|
|
|
36
20
|
- 'spec/**/*'
|
|
37
21
|
- 'test/**/*'
|
|
38
22
|
|
|
39
|
-
Style/ExpandPathArguments:
|
|
40
|
-
Exclude:
|
|
41
|
-
- 'statscloud.gemspec'
|
|
42
|
-
|
|
43
|
-
Style/HashSyntax:
|
|
44
|
-
EnforcedStyle: ruby19
|
|
45
|
-
|
|
46
23
|
Style/MutableConstant:
|
|
47
24
|
Exclude:
|
|
48
25
|
- 'lib/statscloud/version.rb'
|
|
49
26
|
|
|
50
|
-
Style/PercentLiteralDelimiters:
|
|
51
|
-
Exclude:
|
|
52
|
-
- 'statscloud.gemspec'
|
|
53
|
-
|
|
54
27
|
Style/StringLiterals:
|
|
55
|
-
|
|
56
|
-
- 'Gemfile'
|
|
57
|
-
- 'Rakefile'
|
|
58
|
-
- 'bin/console'
|
|
59
|
-
- 'lib/statscloud/version.rb'
|
|
60
|
-
- 'spec/spec_helper.rb'
|
|
61
|
-
- 'spec/statscloud_client_spec.rb'
|
|
62
|
-
- 'statscloud.gemspec'
|
|
63
|
-
|
|
64
|
-
Style/FrozenStringLiteralComment:
|
|
65
|
-
Exclude:
|
|
66
|
-
- 'lib/templates/statscloud/statscloud.rb'
|
|
67
|
-
Style/UnneededPercentQ:
|
|
68
|
-
Exclude:
|
|
69
|
-
- 'statscloud.gemspec'
|
|
28
|
+
EnforcedStyle: double_quotes
|
|
70
29
|
|
|
71
30
|
Metrics/LineLength:
|
|
72
31
|
Max: 120
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
statscloud (1.0.
|
|
4
|
+
statscloud (1.0.4)
|
|
5
5
|
activesupport (>= 5.0.0.1)
|
|
6
6
|
crc32 (~> 1.0.1)
|
|
7
7
|
eventmachine (~> 1.2)
|
|
@@ -9,17 +9,17 @@ PATH
|
|
|
9
9
|
leon (~> 1.1)
|
|
10
10
|
logger (~> 1.2)
|
|
11
11
|
rest-client (~> 2.0.2)
|
|
12
|
-
statscloud.io-ruby-socket.io-client-simple (~> 1.2.1.pre.
|
|
12
|
+
statscloud.io-ruby-socket.io-client-simple (~> 1.2.1.pre.3)
|
|
13
13
|
|
|
14
14
|
GEM
|
|
15
15
|
remote: https://rubygems.org/
|
|
16
16
|
specs:
|
|
17
|
-
activesupport (5.2.1)
|
|
17
|
+
activesupport (5.2.1.1)
|
|
18
18
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
19
19
|
i18n (>= 0.7, < 2)
|
|
20
20
|
minitest (~> 5.1)
|
|
21
21
|
tzinfo (~> 1.1)
|
|
22
|
-
concurrent-ruby (1.
|
|
22
|
+
concurrent-ruby (1.1.3)
|
|
23
23
|
crc32 (1.0.1)
|
|
24
24
|
diff-lcs (1.3)
|
|
25
25
|
domain_name (0.5.20180417)
|
|
@@ -29,7 +29,8 @@ GEM
|
|
|
29
29
|
fileutils (1.1.0)
|
|
30
30
|
http-cookie (1.0.3)
|
|
31
31
|
domain_name (~> 0.5)
|
|
32
|
-
httparty (0.16.
|
|
32
|
+
httparty (0.16.3)
|
|
33
|
+
mime-types (~> 3.0)
|
|
33
34
|
multi_xml (>= 0.5.2)
|
|
34
35
|
i18n (1.1.1)
|
|
35
36
|
concurrent-ruby (~> 1.0)
|
|
@@ -60,7 +61,7 @@ GEM
|
|
|
60
61
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
61
62
|
rspec-support (~> 3.8.0)
|
|
62
63
|
rspec-support (3.8.0)
|
|
63
|
-
statscloud.io-ruby-socket.io-client-simple (1.2.1.pre.
|
|
64
|
+
statscloud.io-ruby-socket.io-client-simple (1.2.1.pre.3)
|
|
64
65
|
event_emitter
|
|
65
66
|
httparty
|
|
66
67
|
json
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "rails/generators/base"
|
|
4
4
|
|
|
5
5
|
module StatsCloud
|
|
6
6
|
# Rails generator for statscloud configuration.
|
|
7
7
|
class InstallGenerator < Rails::Generators::Base
|
|
8
|
-
source_root File.expand_path(
|
|
8
|
+
source_root File.expand_path("../../templates/statscloud", __dir__)
|
|
9
9
|
|
|
10
10
|
# Creates rails initializer for simultaneous start with rails server.
|
|
11
11
|
def create_initializer_file
|
|
12
|
-
copy_file
|
|
12
|
+
copy_file "statscloud_template.rb", File.join("config", "initializers", "statscloud.rb")
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
# Creates directory for saving metrics config files.
|
|
16
16
|
def create_config_statscloud_directory
|
|
17
|
-
empty_directory File.join(
|
|
17
|
+
empty_directory File.join("config", "statscloud")
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
# Creates statscloud configuration file.
|
|
21
21
|
def create_config_file
|
|
22
|
-
copy_file
|
|
22
|
+
copy_file ".statscloud_template.yml", ".statscloud.yml"
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
end
|
data/lib/statscloud.rb
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative
|
|
4
|
-
require_relative
|
|
5
|
-
require
|
|
3
|
+
require_relative "./helpers/parsed_response_helper"
|
|
4
|
+
require_relative "./helpers/logger_helper"
|
|
5
|
+
require "rest-client"
|
|
6
6
|
|
|
7
7
|
module StatsCloud
|
|
8
8
|
# statscloud.io cluster-api service client.
|
|
@@ -18,7 +18,7 @@ module StatsCloud
|
|
|
18
18
|
# cluster api host.
|
|
19
19
|
#
|
|
20
20
|
# @api public
|
|
21
|
-
def initialize(env, host =
|
|
21
|
+
def initialize(env, host = "https://cluster-api-v1.statscloud.statscloud.io")
|
|
22
22
|
@environment = env
|
|
23
23
|
@host = host
|
|
24
24
|
end
|
|
@@ -90,7 +90,7 @@ module StatsCloud
|
|
|
90
90
|
|
|
91
91
|
def auth_headers(token)
|
|
92
92
|
{
|
|
93
|
-
|
|
93
|
+
"auth-token" => token
|
|
94
94
|
}
|
|
95
95
|
end
|
|
96
96
|
|
|
@@ -107,9 +107,5 @@ module StatsCloud
|
|
|
107
107
|
def http_client
|
|
108
108
|
RestClient
|
|
109
109
|
end
|
|
110
|
-
|
|
111
|
-
def logger
|
|
112
|
-
@logger ||= ::StatsCloud.logger
|
|
113
|
-
end
|
|
114
110
|
end
|
|
115
111
|
end
|
|
@@ -11,7 +11,7 @@ module StatsCloud
|
|
|
11
11
|
process_match(includes, filename) && !process_match(excludes, filename)
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
def collect_statscloud_assets(config, source_mappings, dir =
|
|
14
|
+
def collect_statscloud_assets(config, source_mappings, dir = ".")
|
|
15
15
|
asset_selector = get_checked_asset_selector(config)
|
|
16
16
|
process_files(dir, config, source_mappings, asset_selector)
|
|
17
17
|
end
|
|
@@ -120,7 +120,7 @@ module StatsCloud
|
|
|
120
120
|
|
|
121
121
|
def value_fields
|
|
122
122
|
%w[token application environment endpoint assetSelector propagateErrors
|
|
123
|
-
passwordProtect retention flushIntervalInSeconds diskSize]
|
|
123
|
+
passwordProtect retention flushIntervalInSeconds diskSize plugins]
|
|
124
124
|
end
|
|
125
125
|
end
|
|
126
126
|
end
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "fileutils"
|
|
4
4
|
|
|
5
5
|
module StatsCloud
|
|
6
6
|
# This helper works to help log errors and info about StatsCloud service work.
|
|
7
7
|
module LoggerHelper
|
|
8
8
|
# Log information about work to standart ouput
|
|
9
9
|
def logger
|
|
10
|
-
file_utils.mkdir_p
|
|
11
|
-
@logger ||= logger_servise.new(File.join(
|
|
12
|
-
log.progname =
|
|
10
|
+
file_utils.mkdir_p "log"
|
|
11
|
+
@logger ||= logger_servise.new(File.join("log", "statscloud.log")).tap do |log|
|
|
12
|
+
log.progname = "StatsCloud"
|
|
13
13
|
end
|
|
14
14
|
end
|
|
15
15
|
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "../errors/client_error"
|
|
4
|
+
require_relative "logger_helper"
|
|
5
|
+
|
|
6
|
+
module StatsCloud
|
|
7
|
+
# This helper configures StatsCloud plugins.
|
|
8
|
+
module PluginsHelper
|
|
9
|
+
def check_plugins(plugins)
|
|
10
|
+
plugins&.each do |plugin|
|
|
11
|
+
plugin[:class_name] = check_plugin_gem_by_name(plugin_class_name_from_plugin(plugin))
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def start_plugins_job(plugins, mutex)
|
|
16
|
+
plugins&.each do |plugin|
|
|
17
|
+
start_plugin(plugin, mutex)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def start_plugin(plugin, mutex)
|
|
24
|
+
plugin[:class_name].start(self, mutex, plugin["settings"])
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def check_plugin_gem_by_name(plugin_name)
|
|
28
|
+
Object.const_get "StatsCloud::Plugin::#{plugin_name}"
|
|
29
|
+
rescue NameError
|
|
30
|
+
raise statscloud_error(no_plugin_error_message(plugin_name))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def no_plugin_error_message(plugin_name)
|
|
34
|
+
"Can not find StatsCloud::Plugin::#{plugin_name}. Please require gem to load this plugin"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def plugin_class_name_from_plugin(plugin)
|
|
38
|
+
plugin_name = get_plugin_name(plugin)
|
|
39
|
+
plugin_name.split("-").map(&:capitalize).join
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def get_plugin_name(plugin)
|
|
43
|
+
plugin.is_a?(Hash) ? plugin["name"] : plugin
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def statscloud_error(message)
|
|
47
|
+
logger.error message
|
|
48
|
+
StatsCloud::ClientError.new(message)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative
|
|
3
|
+
require_relative "logger_helper"
|
|
4
4
|
|
|
5
5
|
module StatsCloud
|
|
6
6
|
# This helper works to create socket connection.
|
|
@@ -13,19 +13,19 @@ module StatsCloud
|
|
|
13
13
|
!@client.nil? && @client.open?
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
-
def connect_client
|
|
16
|
+
def connect_client
|
|
17
17
|
eventmachine.run do
|
|
18
18
|
eventmachine.add_periodic_timer(5) do
|
|
19
|
-
try_connect
|
|
20
|
-
eventmachine.add_timer(3) {
|
|
19
|
+
try_connect
|
|
20
|
+
eventmachine.add_timer(3) { eventmachine.stop if connected? }
|
|
21
21
|
end
|
|
22
|
-
eventmachine.add_timer(300.01) { stop_machine unless @client }
|
|
23
22
|
end
|
|
24
23
|
end
|
|
25
24
|
|
|
26
|
-
def try_connect
|
|
27
|
-
@client = socketio_client.connect url, path:
|
|
25
|
+
def try_connect
|
|
26
|
+
@client = socketio_client.connect @url, path: "/ws", "auth-token" => @token
|
|
28
27
|
listen_connect
|
|
28
|
+
listen_disconnect
|
|
29
29
|
listen_events
|
|
30
30
|
listen_errors
|
|
31
31
|
rescue StandardError => error
|
|
@@ -37,7 +37,16 @@ module StatsCloud
|
|
|
37
37
|
this = self
|
|
38
38
|
|
|
39
39
|
@client.on :connect do
|
|
40
|
-
this.
|
|
40
|
+
emit :tags, this.tags
|
|
41
|
+
this.logger.info "StatsCloud client has connected to StatsCloud server"
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def listen_disconnect
|
|
46
|
+
this = self
|
|
47
|
+
|
|
48
|
+
@client.on :disconnect do
|
|
49
|
+
this.logger.error "StatsCloud client disconnected from the StatsCloud server"
|
|
41
50
|
end
|
|
42
51
|
end
|
|
43
52
|
|
|
@@ -59,15 +68,6 @@ module StatsCloud
|
|
|
59
68
|
end
|
|
60
69
|
end
|
|
61
70
|
|
|
62
|
-
def send_tags
|
|
63
|
-
@client.emit :tags, @tags
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
def stop_machine
|
|
67
|
-
eventmachine.stop
|
|
68
|
-
Thread.stop
|
|
69
|
-
end
|
|
70
|
-
|
|
71
71
|
def eventmachine
|
|
72
72
|
EM
|
|
73
73
|
end
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "leon"
|
|
4
|
+
require "active_support/core_ext"
|
|
5
|
+
require_relative "../errors/client_error"
|
|
4
6
|
|
|
5
7
|
module StatsCloud
|
|
6
8
|
# This helper configures StatsCloud::Client.
|
|
7
9
|
module StatsCloudHelper
|
|
8
10
|
private
|
|
9
11
|
|
|
12
|
+
def validate_configuration
|
|
13
|
+
@app = @config["application"]
|
|
14
|
+
raise error(app_name_missing_error_message) if @app.blank?
|
|
15
|
+
end
|
|
16
|
+
|
|
10
17
|
def config_environment(env)
|
|
11
18
|
@env = env
|
|
12
19
|
end
|
|
@@ -16,25 +23,45 @@ module StatsCloud
|
|
|
16
23
|
end
|
|
17
24
|
|
|
18
25
|
def config_token
|
|
19
|
-
@token = @config[
|
|
26
|
+
@token = @config["token"] || ENV["STATSCLOUD_AUTH_TOKEN"]
|
|
20
27
|
end
|
|
21
28
|
|
|
22
29
|
def env
|
|
23
|
-
@env ||= @config[
|
|
30
|
+
@env ||= @config["environment"] || ENV["RAILS_ENV"] || "default"
|
|
24
31
|
end
|
|
25
32
|
|
|
26
33
|
def tags
|
|
27
|
-
@tags ||= @config[
|
|
34
|
+
@tags ||= @config["tags"] || [os.gethostname]
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def error(message = error_message)
|
|
38
|
+
stop
|
|
39
|
+
statscloud_error(message)
|
|
40
|
+
rescue StandardError
|
|
41
|
+
statscloud_error(message)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def cluster_error_message
|
|
45
|
+
return "Unable to get information about cluster." unless @cluster
|
|
46
|
+
@cluster[:status][:error]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def app_name_missing_error_message
|
|
50
|
+
"Unable to launch StatsCloud. Please configure application_name in path/to/config/file.yml."
|
|
28
51
|
end
|
|
29
52
|
|
|
30
53
|
def error_message
|
|
31
|
-
"statscloud.io #{@app} cluster have failed to deploy. #{
|
|
54
|
+
"statscloud.io #{@app} cluster have failed to deploy. #{cluster_error_message}"
|
|
32
55
|
end
|
|
33
56
|
|
|
34
57
|
def successful_message
|
|
35
58
|
"statscloud.io support configured, dashboard URLs are \n #{(@cluster[:grafanaDashboardsUrls] || []).join("\n")}"
|
|
36
59
|
end
|
|
37
60
|
|
|
61
|
+
def statscloud_error(message)
|
|
62
|
+
StatsCloud::ClientError.new(message)
|
|
63
|
+
end
|
|
64
|
+
|
|
38
65
|
def os
|
|
39
66
|
Socket
|
|
40
67
|
end
|
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
3
|
+
require "leon"
|
|
4
4
|
|
|
5
5
|
module StatsCloud
|
|
6
6
|
# This helper configures StatsmeterClient.
|
|
7
7
|
module StatsmeterHelper
|
|
8
8
|
private
|
|
9
9
|
|
|
10
|
+
def initialize_plugin_threads(plugins)
|
|
11
|
+
@plugins = plugins
|
|
12
|
+
@mutex = mutex_service
|
|
13
|
+
end
|
|
14
|
+
|
|
10
15
|
def set_config(url, token, tags)
|
|
11
16
|
@url = url
|
|
12
17
|
@token = token
|
|
13
|
-
@tags = tags.map { |t| t.gsub(/[^a-z0-9_-]/,
|
|
18
|
+
@tags = tags.map { |t| t.gsub(/[^a-z0-9_-]/, "_") }
|
|
14
19
|
end
|
|
15
20
|
|
|
16
21
|
def set_client_to_nil
|
|
@@ -30,7 +35,8 @@ module StatsCloud
|
|
|
30
35
|
end
|
|
31
36
|
|
|
32
37
|
def record_binary_event(name, measurement, binary_length)
|
|
33
|
-
@pending_binary_events.
|
|
38
|
+
@pending_binary_events.writeInt32LE(@names_map[name], @pending_binary_offset)
|
|
39
|
+
@pending_binary_events = @pending_binary_events.slice(0, @pending_binary_offset + @event_name_size_in_bytes)
|
|
34
40
|
measurement.zero? ? record_binary_zero : record_binary_measurement(measurement)
|
|
35
41
|
@pending_binary_offset += binary_length
|
|
36
42
|
end
|
|
@@ -58,13 +64,17 @@ module StatsCloud
|
|
|
58
64
|
def record_plain_event(name, measurement, plain_length)
|
|
59
65
|
@pending_plain_events.write(name, @pending_plain_offset)
|
|
60
66
|
if measurement
|
|
61
|
-
@pending_plain_events.write(
|
|
67
|
+
@pending_plain_events.write(",", @pending_plain_offset + name.length)
|
|
62
68
|
measurement.zero? ? record_plain_zero(name) : record_plain_measurement(measurement, name)
|
|
63
69
|
end
|
|
64
|
-
@pending_plain_events.write(
|
|
70
|
+
@pending_plain_events.write(";", @pending_plain_offset + plain_length - 1)
|
|
65
71
|
@pending_plain_offset += plain_length
|
|
66
72
|
end
|
|
67
73
|
|
|
74
|
+
def mutex_service
|
|
75
|
+
Mutex.new
|
|
76
|
+
end
|
|
77
|
+
|
|
68
78
|
def buffer
|
|
69
79
|
::LEON::StringBuffer
|
|
70
80
|
end
|
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require
|
|
4
|
-
require
|
|
5
|
-
require
|
|
6
|
-
require
|
|
7
|
-
require
|
|
8
|
-
require_relative
|
|
9
|
-
require_relative
|
|
10
|
-
require_relative
|
|
11
|
-
require_relative
|
|
12
|
-
require_relative
|
|
13
|
-
require_relative
|
|
3
|
+
require "yaml"
|
|
4
|
+
require "json"
|
|
5
|
+
require "eventmachine"
|
|
6
|
+
require "singleton"
|
|
7
|
+
require "socket"
|
|
8
|
+
require_relative "version"
|
|
9
|
+
require_relative "statsmeter_client"
|
|
10
|
+
require_relative "cluster_client"
|
|
11
|
+
require_relative "helpers/assets_helper"
|
|
12
|
+
require_relative "helpers/logger_helper"
|
|
13
|
+
require_relative "helpers/statscloud_helper"
|
|
14
14
|
|
|
15
15
|
module StatsCloud
|
|
16
16
|
# Module which implements StatsCloud framework support.
|
|
17
17
|
class Client
|
|
18
18
|
include Singleton
|
|
19
|
-
include AssetsHelper
|
|
20
|
-
include LoggerHelper
|
|
19
|
+
include StatsCloud::AssetsHelper
|
|
20
|
+
include StatsCloud::LoggerHelper
|
|
21
|
+
include StatsCloud::PluginsHelper
|
|
21
22
|
include StatsCloud::StatsCloudHelper
|
|
22
23
|
|
|
23
24
|
# Configures statsmeter.io support for application and initializes a statscloud.io client.
|
|
@@ -37,6 +38,7 @@ module StatsCloud
|
|
|
37
38
|
collect_statscloud_assets(@config, @source_mappings)
|
|
38
39
|
config_values
|
|
39
40
|
clear_data
|
|
41
|
+
configure_statscloud_plugins
|
|
40
42
|
configure_cluster
|
|
41
43
|
connect_to_cluster
|
|
42
44
|
end
|
|
@@ -74,6 +76,7 @@ module StatsCloud
|
|
|
74
76
|
def cluster_status
|
|
75
77
|
return unless @cluster_client
|
|
76
78
|
cluster = @cluster_client.get_cluster(@token, @app)&.body
|
|
79
|
+
check_cluster_status(cluster)
|
|
77
80
|
cluster[:status][:status] if cluster
|
|
78
81
|
end
|
|
79
82
|
|
|
@@ -94,28 +97,33 @@ module StatsCloud
|
|
|
94
97
|
attr_reader :config, :source_mappings, :statsmeter_client, :cluster, :token, :app, :graphite_url
|
|
95
98
|
|
|
96
99
|
def initialize_values
|
|
100
|
+
stop
|
|
97
101
|
@config = {}
|
|
98
102
|
@source_mappings = { metrics: [], admins: [], dashboards: [], alerts: [] }
|
|
99
103
|
end
|
|
100
104
|
|
|
101
105
|
def generate_configuration(base_config)
|
|
102
106
|
if base_config
|
|
103
|
-
join_configs(@config, base_config, @source_mappings,
|
|
107
|
+
join_configs(@config, base_config, @source_mappings, "")
|
|
104
108
|
else
|
|
105
|
-
base_config = get_config_from_file(File.join(__dir__,
|
|
106
|
-
join_configs(@config, base_config, @source_mappings,
|
|
109
|
+
base_config = get_config_from_file(File.join(__dir__, ".statscloud.yml"))
|
|
110
|
+
join_configs(@config, base_config, @source_mappings, ".statscloud.yml")
|
|
107
111
|
end
|
|
108
112
|
end
|
|
109
113
|
|
|
110
114
|
def config_values
|
|
111
|
-
@config[
|
|
115
|
+
@config["sourceMaps"] = source_mappings
|
|
112
116
|
config_token
|
|
113
|
-
|
|
117
|
+
validate_configuration
|
|
114
118
|
end
|
|
115
119
|
|
|
116
120
|
def clear_data
|
|
117
|
-
@config.delete(
|
|
118
|
-
@config.delete(
|
|
121
|
+
@config.delete("propagateErrors")
|
|
122
|
+
@config.delete("token")
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def configure_statscloud_plugins
|
|
126
|
+
@plugins = check_plugins(@config["plugins"])
|
|
119
127
|
end
|
|
120
128
|
|
|
121
129
|
def configure_cluster
|
|
@@ -123,21 +131,16 @@ module StatsCloud
|
|
|
123
131
|
@cluster_client.deploy_cluster(@token, @app, @config)
|
|
124
132
|
@cluster = @cluster_client.get_cluster(@token, @app).body
|
|
125
133
|
@graphite_url = @cluster[:graphiteUrl]
|
|
126
|
-
check_cluster_status
|
|
134
|
+
check_cluster_status(@cluster)
|
|
127
135
|
logger.info successful_message
|
|
128
136
|
end
|
|
129
137
|
|
|
130
|
-
def check_cluster_status
|
|
131
|
-
raise error if
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def error
|
|
135
|
-
logger.error error_message
|
|
136
|
-
StandardError.new(error_message)
|
|
138
|
+
def check_cluster_status(cluster)
|
|
139
|
+
raise error(cluster_error_message) if cluster.nil? || cluster[:status][:status] == "ERROR"
|
|
137
140
|
end
|
|
138
141
|
|
|
139
142
|
def connect_to_cluster
|
|
140
|
-
@statsmeter_client = create_statsmeter_client(@cluster, @token, tags)
|
|
143
|
+
@statsmeter_client = create_statsmeter_client(@cluster, @token, @plugins, tags)
|
|
141
144
|
@statsmeter_client.connect
|
|
142
145
|
end
|
|
143
146
|
|
|
@@ -145,9 +148,9 @@ module StatsCloud
|
|
|
145
148
|
StatsCloud::ClusterClient.new(env)
|
|
146
149
|
end
|
|
147
150
|
|
|
148
|
-
def create_statsmeter_client(cluster, token, tags)
|
|
151
|
+
def create_statsmeter_client(cluster, token, plugins, tags)
|
|
149
152
|
host = cluster[:statsmeterUrl]
|
|
150
|
-
StatsCloud::StatsmeterClient.new(host, token, tags)
|
|
153
|
+
StatsCloud::StatsmeterClient.new(host, token, plugins, tags)
|
|
151
154
|
rescue StandardError => e
|
|
152
155
|
logger.error e
|
|
153
156
|
end
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require_relative
|
|
4
|
-
require_relative
|
|
5
|
-
require_relative
|
|
6
|
-
require_relative
|
|
7
|
-
|
|
8
|
-
require
|
|
9
|
-
require
|
|
10
|
-
require
|
|
3
|
+
require_relative "helpers/socketio_helper"
|
|
4
|
+
require_relative "helpers/statsmeter_helper"
|
|
5
|
+
require_relative "helpers/logger_helper"
|
|
6
|
+
require_relative "helpers/event_helper"
|
|
7
|
+
require_relative "helpers/plugins_helper"
|
|
8
|
+
require "leon"
|
|
9
|
+
require "eventmachine"
|
|
10
|
+
require "statscloud.io-ruby-socket.io-client-simple"
|
|
11
|
+
require "crc32"
|
|
11
12
|
|
|
12
13
|
module StatsCloud
|
|
13
14
|
# Client for Statsmeter.
|
|
@@ -16,6 +17,7 @@ module StatsCloud
|
|
|
16
17
|
include StatsCloud::SocketIOHelper
|
|
17
18
|
include StatsCloud::StatsmeterHelper
|
|
18
19
|
include StatsCloud::EventHelper
|
|
20
|
+
include StatsCloud::PluginsHelper
|
|
19
21
|
|
|
20
22
|
# Maximum size of pending binary events buffer.
|
|
21
23
|
BINARY_BUFFER_SIZE = 1024
|
|
@@ -28,6 +30,11 @@ module StatsCloud
|
|
|
28
30
|
# Type: *String*
|
|
29
31
|
attr_reader :url
|
|
30
32
|
|
|
33
|
+
# Statscloud client tags.
|
|
34
|
+
#
|
|
35
|
+
# Type: *String*
|
|
36
|
+
attr_reader :tags
|
|
37
|
+
|
|
31
38
|
# Socket connection with statscloud cluster which is used to record events.
|
|
32
39
|
#
|
|
33
40
|
# Type: *SocketIO::Client::Simple*
|
|
@@ -49,7 +56,8 @@ module StatsCloud
|
|
|
49
56
|
# statsmeter url.
|
|
50
57
|
# @param [+String+] token
|
|
51
58
|
# authorization token.
|
|
52
|
-
def initialize(url, token, tags = [])
|
|
59
|
+
def initialize(url, token, plugins, tags = [])
|
|
60
|
+
initialize_plugin_threads(plugins)
|
|
53
61
|
set_config(url, token, tags)
|
|
54
62
|
set_client_to_nil
|
|
55
63
|
set_pending_values
|
|
@@ -59,8 +67,9 @@ module StatsCloud
|
|
|
59
67
|
# Connects to the server and starts periodic sending events.
|
|
60
68
|
def connect
|
|
61
69
|
Thread.new do
|
|
62
|
-
connect_client
|
|
63
|
-
|
|
70
|
+
connect_client
|
|
71
|
+
start_plugins
|
|
72
|
+
flush_events_loop.join
|
|
64
73
|
end
|
|
65
74
|
end
|
|
66
75
|
|
|
@@ -115,20 +124,19 @@ module StatsCloud
|
|
|
115
124
|
@pending_binary_events.writeInt32BE(checksum, @pending_binary_offset)
|
|
116
125
|
send_message @pending_binary_events
|
|
117
126
|
set_pending_values
|
|
118
|
-
rescue StandardError => error
|
|
119
|
-
logger.error error
|
|
120
|
-
close
|
|
121
|
-
connect.join
|
|
122
127
|
end
|
|
123
128
|
|
|
124
129
|
# Shows statsmeter state.
|
|
125
130
|
def connected?
|
|
126
|
-
@client
|
|
131
|
+
return false unless @client
|
|
132
|
+
@client.state == :connect
|
|
127
133
|
end
|
|
128
134
|
|
|
129
135
|
# Stops socket.io connection.
|
|
130
136
|
def close
|
|
131
|
-
|
|
137
|
+
stop_eventmachine
|
|
138
|
+
client.auto_reconnection = false
|
|
139
|
+
client.disconnect
|
|
132
140
|
set_client_to_nil
|
|
133
141
|
end
|
|
134
142
|
|
|
@@ -138,13 +146,18 @@ module StatsCloud
|
|
|
138
146
|
Thread.new do
|
|
139
147
|
eventmachine.run do
|
|
140
148
|
eventmachine.add_periodic_timer(0.5) do
|
|
141
|
-
|
|
142
|
-
|
|
149
|
+
@mutex.synchronize do
|
|
150
|
+
flush_events if connected?
|
|
151
|
+
end
|
|
143
152
|
end
|
|
144
153
|
end
|
|
145
154
|
end
|
|
146
155
|
end
|
|
147
156
|
|
|
157
|
+
def start_plugins
|
|
158
|
+
start_plugins_job(@plugins, @mutex)
|
|
159
|
+
end
|
|
160
|
+
|
|
148
161
|
def send_message(string_buffer)
|
|
149
162
|
@client.emit :metric, binary_packet(string_buffer.buffer.bytes)
|
|
150
163
|
end
|
|
@@ -157,6 +170,10 @@ module StatsCloud
|
|
|
157
170
|
@pending_binary_offset + binary > BINARY_BUFFER_SIZE || @pending_plain_offset + plain > PLAIN_BUFFER_SIZE
|
|
158
171
|
end
|
|
159
172
|
|
|
173
|
+
def stop_eventmachine
|
|
174
|
+
eventmachine.stop_event_loop
|
|
175
|
+
end
|
|
176
|
+
|
|
160
177
|
def crc32
|
|
161
178
|
Crc32
|
|
162
179
|
end
|
data/lib/statscloud/version.rb
CHANGED
data/statscloud.gemspec
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
lib = File.expand_path("
|
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
5
5
|
require "statscloud/version"
|
|
6
6
|
|
|
@@ -10,8 +10,8 @@ Gem::Specification.new do |spec|
|
|
|
10
10
|
spec.authors = ["Roman Ovcharov"]
|
|
11
11
|
spec.email = ["roman.o.as@agiliumlabs.com"]
|
|
12
12
|
|
|
13
|
-
spec.summary =
|
|
14
|
-
spec.description =
|
|
13
|
+
spec.summary = "StatsCloud service."
|
|
14
|
+
spec.description = "PaaS application monitoring system."
|
|
15
15
|
spec.homepage = "https://statscloud.io"
|
|
16
16
|
spec.license = "MIT"
|
|
17
17
|
|
|
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
|
|
|
26
26
|
|
|
27
27
|
# Specify which files should be added to the gem when it is released.
|
|
28
28
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
|
29
|
-
spec.files
|
|
29
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
|
30
30
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
|
31
31
|
end
|
|
32
32
|
spec.bindir = "exe"
|
|
@@ -43,5 +43,5 @@ Gem::Specification.new do |spec|
|
|
|
43
43
|
spec.add_development_dependency "rake", "~> 10.0"
|
|
44
44
|
spec.add_dependency "rest-client", "~> 2.0.2"
|
|
45
45
|
spec.add_development_dependency "rspec", "~> 3.0"
|
|
46
|
-
spec.add_dependency "statscloud.io-ruby-socket.io-client-simple", "~> 1.2.1.pre.
|
|
46
|
+
spec.add_dependency "statscloud.io-ruby-socket.io-client-simple", "~> 1.2.1.pre.3"
|
|
47
47
|
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.0.4
|
|
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-
|
|
11
|
+
date: 2018-12-03 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activesupport
|
|
@@ -156,14 +156,14 @@ dependencies:
|
|
|
156
156
|
requirements:
|
|
157
157
|
- - "~>"
|
|
158
158
|
- !ruby/object:Gem::Version
|
|
159
|
-
version: 1.2.1.pre.
|
|
159
|
+
version: 1.2.1.pre.3
|
|
160
160
|
type: :runtime
|
|
161
161
|
prerelease: false
|
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
|
163
163
|
requirements:
|
|
164
164
|
- - "~>"
|
|
165
165
|
- !ruby/object:Gem::Version
|
|
166
|
-
version: 1.2.1.pre.
|
|
166
|
+
version: 1.2.1.pre.3
|
|
167
167
|
description: PaaS application monitoring system.
|
|
168
168
|
email:
|
|
169
169
|
- roman.o.as@agiliumlabs.com
|
|
@@ -184,10 +184,12 @@ files:
|
|
|
184
184
|
- lib/generators/stats_cloud/install_generator.rb
|
|
185
185
|
- lib/statscloud.rb
|
|
186
186
|
- lib/statscloud/cluster_client.rb
|
|
187
|
+
- lib/statscloud/errors/client_error.rb
|
|
187
188
|
- lib/statscloud/helpers/assets_helper.rb
|
|
188
189
|
- lib/statscloud/helpers/event_helper.rb
|
|
189
190
|
- lib/statscloud/helpers/logger_helper.rb
|
|
190
191
|
- lib/statscloud/helpers/parsed_response_helper.rb
|
|
192
|
+
- lib/statscloud/helpers/plugins_helper.rb
|
|
191
193
|
- lib/statscloud/helpers/socketio_helper.rb
|
|
192
194
|
- lib/statscloud/helpers/statscloud_helper.rb
|
|
193
195
|
- lib/statscloud/helpers/statsmeter_helper.rb
|