skylight 1.0.0.beta4 → 1.0.0.beta5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -20
- data/bin/skylight +1 -1
- data/lib/skylight/api.rb +69 -29
- data/lib/skylight/cli.rb +78 -109
- data/lib/skylight/cli/doctor.rb +132 -0
- data/lib/skylight/cli/helpers.rb +32 -0
- data/lib/skylight/config.rb +131 -68
- data/lib/skylight/core.rb +3 -1
- data/lib/skylight/instrumenter.rb +5 -32
- data/lib/skylight/normalizers/action_controller/process_action.rb +12 -4
- data/lib/skylight/normalizers/active_record/sql.rb +0 -17
- data/lib/skylight/normalizers/grape/endpoint.rb +1 -1
- data/lib/skylight/probes/action_controller.rb +9 -2
- data/lib/skylight/probes/sequel.rb +8 -5
- data/lib/skylight/probes/sinatra.rb +3 -1
- data/lib/skylight/railtie.rb +2 -4
- data/lib/skylight/subscriber.rb +5 -2
- data/lib/skylight/util/logging.rb +8 -2
- data/lib/skylight/util/native_ext_fetcher.rb +4 -3
- data/lib/skylight/util/proxy.rb +12 -0
- data/lib/skylight/version.rb +1 -1
- metadata +6 -7
- data/lib/sql_lexer.rb +0 -6
- data/lib/sql_lexer/lexer.rb +0 -579
- data/lib/sql_lexer/string_scanner.rb +0 -11
- data/lib/sql_lexer/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cc154a1ba48ba4464fde882dc8fe46dc8134613
|
4
|
+
data.tar.gz: 4e6ad10d34bdc717cb73a3df2bb96ef6df8e7dd9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f29f9b1c1a8fd5d33e27bb0aa9593fa2cda1971661f2bb2e485bbcb462a4c2a65cbc7ae4ac99effaae3d089810781ee89c3bdc5c68abaddd2e5f318b95b037d8
|
7
|
+
data.tar.gz: 8affdbb2297f3aa1d18927d7a63aefabab7a244c7884935d248fe96f5536aec494a35aab42a79112d7727405da0501753fa2c636eb91aa60f262d0cb7cf9ba2d
|
data/CHANGELOG.md
CHANGED
@@ -1,23 +1,36 @@
|
|
1
|
-
## 1.0.0
|
2
|
-
|
3
|
-
* [FEATURE] Track
|
4
|
-
* [
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
* [
|
9
|
-
* [BUGFIX]
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
* [BUGFIX] Fix
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
* [BUGFIX]
|
1
|
+
## 1.0.0-beta5 (June 29, 2016)
|
2
|
+
|
3
|
+
* [BETA FEATURE] Track separate segments for endpoints. Contact support@skylight.io to have this feature enabled for your account.
|
4
|
+
* [FEATURE] Initial 'skylight doctor' command
|
5
|
+
* [BREAKING] Removed old `skylight setup` without creation token
|
6
|
+
* [BREAKING] Remove Ruby based SQL lexer
|
7
|
+
* [IMPROVEMENT] Internal refactors
|
8
|
+
* [IMPROVEMENT] On Heroku, log to STDOUT instead of logfile
|
9
|
+
* [BUGFIX] Correctly pass 'false' config values to Rust agent
|
10
|
+
|
11
|
+
## 0.10.5 (June 22, 2016)
|
12
|
+
|
13
|
+
* [BUGFIX] Fix issue with Grape multi-method naming
|
14
|
+
* [BUGFIX] Add http to proxy_url for native fetching
|
15
|
+
* [BUGFIX] Fix setting `proxy_url` in config YML
|
16
|
+
* [IMPROVEMENT] Log errors during authentication validation
|
17
|
+
|
18
|
+
## 0.10.4 (June 3, 2016)
|
19
|
+
|
20
|
+
* [BUGFIX] Sinatra instrumenation now works for latest master
|
21
|
+
* [BUGFIX] Sequel support for 4.35.0
|
22
|
+
* [BUGFIX] Handle latest ActiveModel::Serializers version
|
23
|
+
* [BUGFIX] More precise check for existence of Rails
|
24
|
+
* [BREAKING] Drop official support for Sinatra 1.2 (it likely never worked correctly)
|
25
|
+
* [IMPROVEMENT] On Heroku, logs are now written to STDOUT
|
26
|
+
* [IMPROVEMENT] Allow Skylight to raise on logged errors, useful for testing and debugging
|
27
|
+
* [IMPROVEMENT] Finish Rack::Responses in Middleware
|
28
|
+
* [IMRPOVEMENT] Better message when config/skylight.yml already exists
|
29
|
+
* [IMPROVEMENT] Update Rust Agent with SQL improvements, including handling for arrays and WITH
|
30
|
+
|
31
|
+
## 0.10.3 (February 2, 2016)
|
32
|
+
|
33
|
+
* [BUGFIX] Don't validate configuration on disabled environments.
|
21
34
|
|
22
35
|
## 0.10.2 (January 19, 2016)
|
23
36
|
|
data/bin/skylight
CHANGED
data/lib/skylight/api.rb
CHANGED
@@ -3,7 +3,9 @@ require 'uri'
|
|
3
3
|
module Skylight
|
4
4
|
# @api private
|
5
5
|
class Api
|
6
|
-
|
6
|
+
include Util::Logging
|
7
|
+
|
8
|
+
attr_reader :config
|
7
9
|
|
8
10
|
class CreateFailed < StandardError
|
9
11
|
attr_reader :res
|
@@ -29,51 +31,89 @@ module Skylight
|
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
|
-
|
33
|
-
@config = config
|
34
|
-
@http = Util::HTTP.new(config, service)
|
35
|
-
end
|
34
|
+
class ConfigValidationResults
|
36
35
|
|
37
|
-
|
38
|
-
@http.authentication
|
39
|
-
end
|
36
|
+
include Util::Logging
|
40
37
|
|
41
|
-
|
42
|
-
@http.authentication = token
|
43
|
-
end
|
38
|
+
attr_reader :raw_response
|
44
39
|
|
45
|
-
|
46
|
-
|
40
|
+
def initialize(config, raw_response)
|
41
|
+
@config = config
|
42
|
+
@raw_response = raw_response
|
43
|
+
end
|
47
44
|
|
48
|
-
|
45
|
+
def is_error_response?
|
46
|
+
raw_response.is_a?(Util::HTTP::ErrorResponse) || status > 499
|
47
|
+
end
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
:ok
|
53
|
-
when 400...500
|
54
|
-
:invalid
|
55
|
-
else
|
56
|
-
:unknown
|
49
|
+
def status
|
50
|
+
raw_response.status
|
57
51
|
end
|
58
|
-
rescue
|
59
|
-
:unknown
|
60
|
-
end
|
61
52
|
|
62
|
-
|
63
|
-
|
53
|
+
def body
|
54
|
+
return nil if is_error_response?
|
64
55
|
|
65
|
-
|
66
|
-
|
56
|
+
unless raw_response.body.is_a?(Hash)
|
57
|
+
warn("Unable to parse server response: status=%s, body=%s", raw_response.status, raw_response.body)
|
58
|
+
return {}
|
59
|
+
end
|
60
|
+
|
61
|
+
raw_response.body
|
62
|
+
end
|
63
|
+
|
64
|
+
def token_valid?
|
65
|
+
# Don't prevent boot if it's an error response, so assume token is valid
|
66
|
+
return true if is_error_response?
|
67
|
+
# A 2xx response means everything is good!
|
68
|
+
return true if raw_response.success?
|
69
|
+
# A 422 means an invalid config, but the token must be valid if we got this far
|
70
|
+
return true if status === 422
|
67
71
|
end
|
72
|
+
|
73
|
+
def config_valid?
|
74
|
+
# Only assume config is good if we have positive confirmation
|
75
|
+
raw_response.success?
|
76
|
+
end
|
77
|
+
|
78
|
+
def validation_errors
|
79
|
+
return if config_valid?
|
80
|
+
body ? body['errors'] : nil
|
81
|
+
end
|
82
|
+
|
83
|
+
def corrected_config
|
84
|
+
return if config_valid?
|
85
|
+
body ? body['corrected'] : nil
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
def initialize(config)
|
91
|
+
@config = config
|
68
92
|
end
|
69
93
|
|
70
94
|
def create_app(name, token=nil)
|
71
95
|
params = { app: { name: name } }
|
72
96
|
params[:token] = token if token
|
73
|
-
|
97
|
+
|
98
|
+
res = http_request(:app_create, :post, params)
|
99
|
+
|
74
100
|
raise CreateFailed, res unless res.success?
|
75
101
|
res
|
76
102
|
end
|
77
103
|
|
104
|
+
def validate_config
|
105
|
+
res = http_request(:validation, :post, config)
|
106
|
+
ConfigValidationResults.new(config, res)
|
107
|
+
end
|
108
|
+
|
109
|
+
private
|
110
|
+
|
111
|
+
# TODO: Improve handling here: https://github.com/tildeio/direwolf-agent/issues/274
|
112
|
+
def http_request(service, method, *args)
|
113
|
+
http = Util::HTTP.new(config, service)
|
114
|
+
uri = URI.parse(config.get("#{service}_url"))
|
115
|
+
http.send(method, uri.path, *args)
|
116
|
+
end
|
117
|
+
|
78
118
|
end
|
79
119
|
end
|
data/lib/skylight/cli.rb
CHANGED
@@ -6,34 +6,37 @@ require 'yaml'
|
|
6
6
|
require 'highline'
|
7
7
|
require 'active_support/inflector'
|
8
8
|
|
9
|
+
require 'skylight/cli/helpers'
|
10
|
+
require 'skylight/cli/doctor'
|
11
|
+
|
9
12
|
module Skylight
|
10
|
-
|
11
|
-
|
13
|
+
module CLI
|
14
|
+
# @api private
|
15
|
+
class Base < Thor
|
16
|
+
include Helpers
|
17
|
+
|
18
|
+
register(Doctor, "doctor", "doctor", "Run some basic tests to look out for common problems")
|
12
19
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
20
|
+
desc "setup TOKEN", "Sets up a new app using the provided token"
|
21
|
+
def setup(token)
|
22
|
+
if File.exist?(config_path)
|
23
|
+
say <<-OUT, :green
|
17
24
|
A config/skylight.yml already exists for your application.
|
18
25
|
|
19
26
|
Visit your app at https://www.skylight.io/app or remove config/skylight.yml
|
20
27
|
to set it up as a new app in Skylight.
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
unless token
|
26
|
-
api.authentication = login
|
27
|
-
end
|
28
|
+
OUT
|
29
|
+
return
|
30
|
+
end
|
28
31
|
|
29
|
-
|
32
|
+
res = api.create_app(app_name, token)
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
+
config[:application] = res.get('app.id')
|
35
|
+
config[:authentication] = res.get('app.token')
|
36
|
+
config.write(config_path)
|
34
37
|
|
35
|
-
|
36
|
-
|
38
|
+
say "Congratulations. Your application is on Skylight! http://www.skylight.io", :green
|
39
|
+
say <<-OUT
|
37
40
|
|
38
41
|
The application was registered for you and we generated a config file
|
39
42
|
containing your API token at:
|
@@ -51,113 +54,79 @@ you should set the `SKYLIGHT_AUTHENTICATION` variable to:
|
|
51
54
|
|
52
55
|
#{config[:authentication]}
|
53
56
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
desc "disable_dev_warning", "Disables warning about running Skylight in development mode for all local apps"
|
62
|
-
def disable_dev_warning
|
63
|
-
user_config.disable_dev_warning = true
|
64
|
-
user_config.save
|
65
|
-
|
66
|
-
say "Development mode warning disabled", :green
|
67
|
-
end
|
57
|
+
OUT
|
58
|
+
rescue Api::CreateFailed => e
|
59
|
+
say "Could not create the application", :red
|
60
|
+
say e.to_s, :yellow
|
61
|
+
rescue Interrupt
|
62
|
+
end
|
68
63
|
|
69
|
-
|
64
|
+
desc "disable_dev_warning", "Disables warning about running Skylight in development mode for all local apps"
|
65
|
+
def disable_dev_warning
|
66
|
+
user_config.disable_dev_warning = true
|
67
|
+
user_config.save
|
70
68
|
|
71
|
-
|
72
|
-
|
73
|
-
begin
|
74
|
-
name = nil
|
69
|
+
say "Development mode warning disabled", :green
|
70
|
+
end
|
75
71
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
72
|
+
private
|
73
|
+
|
74
|
+
def app_name
|
75
|
+
@app_name ||=
|
76
|
+
begin
|
77
|
+
name = nil
|
78
|
+
|
79
|
+
if is_rails?
|
80
|
+
# Get the name in a process so that we don't pollute our environment here
|
81
|
+
# This is especially important since users may have things like WebMock that
|
82
|
+
# will prevent us from communicating with the Skylight API
|
83
|
+
begin
|
84
|
+
namefile = Tempfile.new('skylight-app-name')
|
85
|
+
# Windows appears to need double quotes for `rails runner`
|
86
|
+
`rails runner "File.open('#{namefile.path}', 'w') {|f| f.write(Rails.application.class.name) rescue '' }"`
|
87
|
+
name = namefile.read.split("::").first.underscore.titleize
|
88
|
+
name = nil if name.empty?
|
89
|
+
rescue => e
|
90
|
+
if ENV['DEBUG']
|
91
|
+
puts e.class.name
|
92
|
+
puts e.to_s
|
93
|
+
puts e.backtrace.join("\n")
|
94
|
+
end
|
95
|
+
ensure
|
96
|
+
namefile.close
|
97
|
+
namefile.unlink
|
98
|
+
end
|
84
99
|
|
85
|
-
|
86
|
-
|
87
|
-
# will prevent us from communicating with the Skylight API
|
88
|
-
begin
|
89
|
-
namefile = Tempfile.new('skylight-app-name')
|
90
|
-
# Windows appears to need double quotes for `rails runner`
|
91
|
-
`rails runner "File.open('#{namefile.path}', 'w') {|f| f.write(Rails.application.class.name) rescue '' }"`
|
92
|
-
name = namefile.read.split("::").first.underscore.titleize
|
93
|
-
name = nil if name.empty?
|
94
|
-
rescue => e
|
95
|
-
if ENV['DEBUG']
|
96
|
-
puts e.class.name
|
97
|
-
puts e.to_s
|
98
|
-
puts e.backtrace.join("\n")
|
100
|
+
unless name
|
101
|
+
warn "Unable to determine Rails application name. Using directory name."
|
99
102
|
end
|
100
|
-
ensure
|
101
|
-
namefile.close
|
102
|
-
namefile.unlink
|
103
103
|
end
|
104
104
|
|
105
105
|
unless name
|
106
|
-
|
106
|
+
name = File.basename(File.expand_path('.')).titleize
|
107
107
|
end
|
108
|
-
end
|
109
108
|
|
110
|
-
|
111
|
-
name = File.basename(File.expand_path('.')).titleize
|
109
|
+
name
|
112
110
|
end
|
113
|
-
|
114
|
-
name
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
def login
|
119
|
-
say "Please enter your email and password below or get a token from https://www.skylight.io/app/setup.", :cyan
|
120
|
-
|
121
|
-
10.times do
|
122
|
-
email = highline.ask("Email: ")
|
123
|
-
password = highline.ask("Password: ") { |q| q.echo = "*" }
|
124
|
-
|
125
|
-
if token = api.login(email, password)
|
126
|
-
return token
|
127
|
-
end
|
128
|
-
|
129
|
-
say "Sorry. That email and password was invalid. Please try again", :red
|
130
|
-
puts
|
131
111
|
end
|
132
112
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
def relative_config_path
|
138
|
-
'config/skylight.yml'
|
139
|
-
end
|
140
|
-
|
141
|
-
def config_path
|
142
|
-
File.expand_path(relative_config_path)
|
143
|
-
end
|
113
|
+
# Is this duplicated?
|
114
|
+
def relative_config_path
|
115
|
+
'config/skylight.yml'
|
116
|
+
end
|
144
117
|
|
145
|
-
|
146
|
-
|
147
|
-
|
118
|
+
def config_path
|
119
|
+
File.expand_path(relative_config_path)
|
120
|
+
end
|
148
121
|
|
149
|
-
|
150
|
-
|
151
|
-
|
122
|
+
def api
|
123
|
+
config.api
|
124
|
+
end
|
152
125
|
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
end
|
126
|
+
def user_config
|
127
|
+
UserConfig.instance
|
128
|
+
end
|
157
129
|
|
158
|
-
def user_config
|
159
|
-
UserConfig.instance
|
160
130
|
end
|
161
|
-
|
162
131
|
end
|
163
132
|
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Skylight
|
2
|
+
module CLI
|
3
|
+
class Doctor < Thor::Group
|
4
|
+
include Helpers
|
5
|
+
|
6
|
+
desc "Run some basic tests to look out for common errors"
|
7
|
+
|
8
|
+
def check_rails
|
9
|
+
say "Checking for Rails"
|
10
|
+
|
11
|
+
indent do
|
12
|
+
if is_rails?
|
13
|
+
say "Rails application detected", :green
|
14
|
+
|
15
|
+
# Normally auto-loaded, but we haven't loaded Rails by the time Skylight is loaded
|
16
|
+
require 'skylight/railtie'
|
17
|
+
require File.expand_path('config/application', Dir.pwd)
|
18
|
+
else
|
19
|
+
say "No Rails application detected", :red
|
20
|
+
abort "Currently `skylight doctor` only works with Rails applications"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
say "\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
def check_native
|
28
|
+
say "Checking for native agent"
|
29
|
+
|
30
|
+
indent do
|
31
|
+
if Skylight.native?
|
32
|
+
say "Native agent installed", :green
|
33
|
+
else
|
34
|
+
say "Unable to load native extension", :yellow
|
35
|
+
|
36
|
+
indent do
|
37
|
+
install_log = File.expand_path("../../../ext/install.log", __FILE__)
|
38
|
+
if File.exist?(install_log)
|
39
|
+
File.readlines(install_log).each do |line|
|
40
|
+
say line, :red
|
41
|
+
end
|
42
|
+
else
|
43
|
+
say "Reason unknown", :red
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
abort
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
say "\n"
|
52
|
+
end
|
53
|
+
|
54
|
+
def check_config
|
55
|
+
say "Checking for valid configuration"
|
56
|
+
|
57
|
+
# MEGAHAX
|
58
|
+
railtie = Skylight::Railtie.send(:new)
|
59
|
+
config = railtie.send(:load_skylight_config, Rails.application)
|
60
|
+
|
61
|
+
indent do
|
62
|
+
begin
|
63
|
+
config.validate!
|
64
|
+
say "Configuration is valid", :green
|
65
|
+
rescue ConfigError => e
|
66
|
+
say "Configuration is invalid", :red
|
67
|
+
say " #{e.message}", :red
|
68
|
+
abort
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
puts "\n"
|
73
|
+
end
|
74
|
+
|
75
|
+
def check_daemon
|
76
|
+
say "Checking Skylight startup"
|
77
|
+
|
78
|
+
indent do
|
79
|
+
# Set this after we validate. It will give us more detailed information on start.
|
80
|
+
logger = Logger.new("/dev/null") # Rely on `say` in the formatter instead
|
81
|
+
# Log everything
|
82
|
+
logger.level = Logger::DEBUG
|
83
|
+
# Remove excess formatting
|
84
|
+
logger.formatter = proc { |severity, datetime, progname, msg|
|
85
|
+
msg = msg.sub("[SKYLIGHT] [#{Skylight::VERSION}] ", '')
|
86
|
+
say "#{severity} - #{msg}" # Definitely non-standard
|
87
|
+
}
|
88
|
+
config.logger = logger
|
89
|
+
|
90
|
+
config.set(:'daemon.lazy_start', false)
|
91
|
+
|
92
|
+
started = Skylight.start!(config)
|
93
|
+
|
94
|
+
if started
|
95
|
+
say "Successfully started", :green
|
96
|
+
else
|
97
|
+
say "Failed to start", :red
|
98
|
+
abort
|
99
|
+
end
|
100
|
+
|
101
|
+
say "Waiting for daemon... "
|
102
|
+
|
103
|
+
# Doesn't start immediately
|
104
|
+
tries = 0
|
105
|
+
daemon_running = false
|
106
|
+
while tries < 5
|
107
|
+
`ps cax | grep skylightd`
|
108
|
+
if $?.success?
|
109
|
+
daemon_running = true
|
110
|
+
break
|
111
|
+
end
|
112
|
+
|
113
|
+
tries += 1
|
114
|
+
sleep 1
|
115
|
+
end
|
116
|
+
|
117
|
+
if daemon_running
|
118
|
+
say "Success", :green
|
119
|
+
else
|
120
|
+
say "Failed", :red
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
say "\n"
|
125
|
+
end
|
126
|
+
|
127
|
+
def status
|
128
|
+
say "All checks passed!", :green
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|