viaduct_metric_catcher 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: efe9f3767f8a61f166f873b6a9a62fbbab64c476
|
4
|
+
data.tar.gz: d4acc7d0ba5644d00a1e15eadf8d99e2ac7d68db
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2fcca53f5dc5686f4501ab8ac18e2af3a14ecb9c0d83d2942b654035cfcdc3fec8f7cefb797d1b29dde517fcb9362dfc5c925e6f5049c411f7271f28798d0024
|
7
|
+
data.tar.gz: 2d209baed32f52a0897e9e51bde9f34a2bb33655bd8dc1e6baa577d71397e650ff667f3abb69650702180df658b26956c9ec8f2d5d02c8d03195397180e3bbec
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'viaduct/metric_catcher/railtie' if defined?(Rails)
|
2
|
+
require 'viaduct/metric_catcher/client'
|
3
|
+
require 'viaduct/metric_catcher/error'
|
4
|
+
require 'socket'
|
5
|
+
require 'logger'
|
6
|
+
|
7
|
+
module Viaduct
|
8
|
+
module MetricCatcher
|
9
|
+
class << self
|
10
|
+
|
11
|
+
attr_accessor :framework, :hostname
|
12
|
+
attr_reader :client
|
13
|
+
attr_writer :logger
|
14
|
+
|
15
|
+
def logger
|
16
|
+
@logger ||= Logger.new(STDOUT)
|
17
|
+
end
|
18
|
+
|
19
|
+
def token=(token)
|
20
|
+
if token =~ /\A[a-zA-Z0-9]{20}\z/
|
21
|
+
@client = Client.new(token)
|
22
|
+
elsif token.nil?
|
23
|
+
@client = nil
|
24
|
+
else
|
25
|
+
raise Error, "Invalid token provided. Tokens must be 20 characters and only include letters & numbers."
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def hostname
|
30
|
+
hostname_for_viaduct_process || hostname_from_socket
|
31
|
+
end
|
32
|
+
|
33
|
+
def hostname_for_viaduct_process
|
34
|
+
@hostname_for_viaduct_process ||= ENV['VDT_PROC'] ? "#{ENV['VDT_PROC']}/#{ENV['VDT_DEPLOYMENT']}" : nil
|
35
|
+
end
|
36
|
+
|
37
|
+
def hostname_from_socket
|
38
|
+
@hostname_from_socket ||= Socket.gethostname rescue nil
|
39
|
+
end
|
40
|
+
|
41
|
+
def send_payload(event, payload)
|
42
|
+
if self.client
|
43
|
+
hash = {
|
44
|
+
'event' => event.to_s,
|
45
|
+
'framework' => self.framework,
|
46
|
+
'hostname' => self.hostname,
|
47
|
+
'payload' => payload
|
48
|
+
}
|
49
|
+
self.client.send_to_udp(hash)
|
50
|
+
else
|
51
|
+
false
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'socket'
|
2
|
+
require 'json'
|
3
|
+
|
4
|
+
module Viaduct
|
5
|
+
module MetricCatcher
|
6
|
+
class Client
|
7
|
+
|
8
|
+
class << self
|
9
|
+
attr_writer :host, :port
|
10
|
+
|
11
|
+
def host
|
12
|
+
@host ||= "metrics.viaduct.io"
|
13
|
+
end
|
14
|
+
|
15
|
+
def port
|
16
|
+
@port ||= 21100
|
17
|
+
end
|
18
|
+
|
19
|
+
def socket
|
20
|
+
@socket ||= UDPSocket.new
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :token
|
25
|
+
|
26
|
+
def initialize(token)
|
27
|
+
@token = token
|
28
|
+
end
|
29
|
+
|
30
|
+
def pack_hash_for_udp(hash)
|
31
|
+
time = Time.now.utc
|
32
|
+
[1, time.to_i, time.nsec, @token, hash.to_json].pack('NNNa20a*')
|
33
|
+
end
|
34
|
+
|
35
|
+
def send_to_udp(hash)
|
36
|
+
self.class.socket.send(pack_hash_for_udp(hash), 0, self.class.host, self.class.port)
|
37
|
+
rescue => e
|
38
|
+
Viaduct::MetricCatcher.logger.warn "[Viaduct Metrics] Exception while sending metrics. #{e.class} #{e.message}"
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Viaduct
|
2
|
+
module MetricCatcher
|
3
|
+
class Railtie < ::Rails::Railtie
|
4
|
+
|
5
|
+
initializer 'viaduct.metric-catcher.notifications' do
|
6
|
+
# Set the framework to 'rails'
|
7
|
+
Viaduct::MetricCatcher.framework = 'rails'
|
8
|
+
# Set the logger to use the standard Rails logger
|
9
|
+
Viaduct::MetricCatcher.logger = Rails.logger
|
10
|
+
# Subscribe to all requests and send request details whenever a request
|
11
|
+
# happens.
|
12
|
+
ActiveSupport::Notifications.subscribe "process_action.action_controller" do |*args|
|
13
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
14
|
+
Viaduct::MetricCatcher.send_payload(:request, {
|
15
|
+
'method' => event.payload[:method],
|
16
|
+
'path' => event.payload[:path],
|
17
|
+
'status' => event.payload[:status],
|
18
|
+
'time' => event.duration,
|
19
|
+
'extra' => {
|
20
|
+
'db_runtime' => event.payload[:db_runtime],
|
21
|
+
'view_runtime' => event.payload[:view_runtime],
|
22
|
+
'controller' => event.payload[:controller],
|
23
|
+
'action' => event.payload[:action]
|
24
|
+
}
|
25
|
+
})
|
26
|
+
end
|
27
|
+
# Subscribe to all database queries and send quer details whenever a
|
28
|
+
# query is executed.
|
29
|
+
ActiveSupport::Notifications.subscribe "sql.active_record" do |*args|
|
30
|
+
event = ActiveSupport::Notifications::Event.new(*args)
|
31
|
+
Viaduct::MetricCatcher.send_payload(:database_query, {
|
32
|
+
'query' => event.payload[:sql],
|
33
|
+
'time' => event.duration,
|
34
|
+
'extra' => {
|
35
|
+
'name' => event.payload[:name]
|
36
|
+
}
|
37
|
+
})
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'viaduct/metric_catcher'
|
metadata
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: viaduct_metric_catcher
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Cooke
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-03-20 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Automatically catch metrics and send them to the Viaduct Metrics service
|
14
|
+
email:
|
15
|
+
- adam@viaduct.io
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/viaduct/metric_catcher.rb
|
21
|
+
- lib/viaduct/metric_catcher/client.rb
|
22
|
+
- lib/viaduct/metric_catcher/error.rb
|
23
|
+
- lib/viaduct/metric_catcher/railtie.rb
|
24
|
+
- lib/viaduct_metric_catcher.rb
|
25
|
+
homepage: https://github.com/viaduct/metric-catcher
|
26
|
+
licenses:
|
27
|
+
- MIT
|
28
|
+
metadata: {}
|
29
|
+
post_install_message:
|
30
|
+
rdoc_options: []
|
31
|
+
require_paths:
|
32
|
+
- lib
|
33
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
34
|
+
requirements:
|
35
|
+
- - ">="
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: '0'
|
43
|
+
requirements: []
|
44
|
+
rubyforge_project:
|
45
|
+
rubygems_version: 2.4.5
|
46
|
+
signing_key:
|
47
|
+
specification_version: 4
|
48
|
+
summary: Automatically catch metrics and send them to the Viaduct Metrics service
|
49
|
+
test_files: []
|