cloudinsight-sdk 0.0.1

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 ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDgxMTQxOTFiZTU2MDgxN2M0NGY2MjRmNjRmM2NiZDA2NzM2MTE3NA==
5
+ data.tar.gz: !binary |-
6
+ N2Q0YjBlMGQzZWI5Mzg2M2UyNTA3ZGQzNTRlNmFmZDBjNzQ1YzZiYQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ ZTVjOTkwZDY5NzAwMmE5MGVkNGY0ZWQxNDJkY2M2Y2NlYTk2YTZhNTNhMWI5
10
+ ZDUxODgwZDc4MDcyYTc0ZDQwZGYzMzBjY2UzZWM2OGIwNDAyYTU2ZDRhYTJl
11
+ NWE5ZDc2YjUyNjA4MTg1MDI1ZThjYzU1YzRjZTg5NjJmZmQxYzA=
12
+ data.tar.gz: !binary |-
13
+ MWI5NjhlMjNhYzgyZWFhYjM0NDcyNGM4Yzk0NDYxNzg2ZDViMTcwZTA2Y2Jl
14
+ M2Y4ZGVjNzdmMzU5MjE1NWU3ZmUwOTEzY2E4Mzg2MDRlODZlYTFhMjFkMGNk
15
+ ZDUzOGNlNWZkMjM4YWE5ZmNhMTY1OWU4OWM1NGFkMjQ0YzVmMjE=
@@ -0,0 +1,29 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'cloudinsight-sdk'
4
+
5
+ statsd = CloudInsight::Statsd.new
6
+
7
+ # Increment a counter.(default: 1)
8
+ statsd.increment('page.views')
9
+
10
+ # Increment a counter by 5 steps.
11
+ statsd.increment('page.views', 5)
12
+
13
+ # Increment a counter by 5, 50% sample
14
+ statsd.increment('page.views', 5, ['page.tag'], 0.5)
15
+
16
+ # Decrement a counter.
17
+ statsd.decrement('page.views')
18
+
19
+ # Decrement a counter by 5 steps.
20
+ statsd.decrement('page.views', 5)
21
+
22
+ # Decrement a counter by 5, 50% sample
23
+ statsd.decrement('page.views', 5, ['page.tag'], 0.5)
24
+
25
+ # Record a gauge 100 of replies
26
+ statsd.gauge('blogs.replies', 100)
27
+
28
+ # Record a gauge by 100, 50% sample
29
+ statsd.gauge('users.online', 100, ['users.cloudinsight'], 0.5)
@@ -0,0 +1,119 @@
1
+ # encoding: utf-8
2
+
3
+ require 'socket'
4
+ require 'logger'
5
+
6
+ module CloudInsight
7
+ class Statsd
8
+ attr_reader :socket, :buffer
9
+
10
+ ENCODING = 'utf-8'.freeze
11
+
12
+ # Init Statsd
13
+ # @statsd = CloudInsight::Statsd.new
14
+ # <String> host: the host of the OneStatsd server (default: 'localhost')
15
+ # <Fixnum> port: the port of the OneStatsd server (default: 8251)
16
+ # <Hash> option:
17
+ # <Fixnum> option[:max_buffer_size]: Maximum number of metrics to buffer before sending to the server (default: 50)
18
+ # <Array> option[:constant_tags]: Tags to attach to every metric reported by this client (default: [])
19
+ # <Boolean> option[:use_ms]: Report timed values in milliseconds instead of seconds (default: false)
20
+ def initialize(host = 'localhost', port = 8251, option = {})
21
+ @host = host
22
+ @port = port
23
+ @buffer = []
24
+ @socket = nil
25
+ @max_buffer_size = option[:max_buffer_size] || 50
26
+ @constant_tags = option[:constant_tags] || []
27
+ @use_ms = option[:use_ms] || false
28
+ exit_handler
29
+ end
30
+
31
+ # Record the value of a gauge, optionally setting a list of tags and a sample rate.
32
+ # @statsd.gauge('test.online', 8080)
33
+ # @statsd.gauge('test.online', 8080, ['test:online'], 0.8)
34
+ def gauge(metric, value = 1, tags = [], sample_rate = 1)
35
+ report(metric, 'g', value, tags, sample_rate)
36
+ end
37
+
38
+ # Increment a counter, optionally setting a value, tags and a sample rate.
39
+ # @statsd.increment('test.online', 1)
40
+ # @statsd.increment('test.online', 1, ['test:online'], 0.8)
41
+ def increment(metric, value = 1, tags = [], sample_rate = 1)
42
+ report(metric, 'c', value, tags, sample_rate)
43
+ end
44
+
45
+ # Decrement a counter, optionally setting a value, tags and a sample rate.
46
+ # @statsd.decrement('test.online', 1)
47
+ # @statsd.decrement('test.online', 1, ['test:online'], 0.8)
48
+ def decrement(metric, value = 1, tags = [], sample_rate = 1)
49
+ report(metric, 'c', -value, tags, sample_rate)
50
+ end
51
+
52
+ private
53
+
54
+ def report(metric, mtype, value, tags, sample_rate)
55
+ return if sample_rate.to_f != 1.0 && rand > sample_rate.to_f
56
+ data = convert(metric, mtype, value, tags, sample_rate)
57
+ store_to_buffer data if data
58
+ end
59
+
60
+ def convert(metric, mtype, value, tags, sample_rate)
61
+ data = []
62
+ data << "#{metric}:#{value}"
63
+ data << mtype.to_s
64
+ data << "@#{sample_rate.to_f}"
65
+ data << "##{tags.join(',')}" unless (tags += @constant_tags).empty?
66
+ begin
67
+ data.join('|').encode(ENCODING)
68
+ rescue
69
+ nil
70
+ end
71
+ end
72
+
73
+ def store_to_buffer(data)
74
+ @buffer << data
75
+ flush_buffer if @buffer.size >= @max_buffer_size
76
+ end
77
+
78
+ def flush_buffer
79
+ buffer_old = @buffer
80
+ @buffer = []
81
+ send_to_agent { |socket| socket.send(buffer_old.join("\n"), 0) } unless buffer_old.empty?
82
+ end
83
+
84
+ def send_to_agent
85
+ yield socket
86
+ rescue => e
87
+ logger.error "send to agent server error: #{e.inspect}"
88
+ end
89
+
90
+ def socket
91
+ @socket ||= begin
92
+ UDPSocket.new.tap do |udp_socket|
93
+ udp_socket.connect @host, @port
94
+ end
95
+ end
96
+ end
97
+
98
+ def logger
99
+ @logger ||= begin
100
+ Logger.new(STDOUT).tap do |log|
101
+ log.level = Logger::INFO
102
+ log.datetime_format = '%Y-%m-%d %H:%M:%S'
103
+ end
104
+ end
105
+ end
106
+
107
+ # flush buffer on exit
108
+ def exit_handler
109
+ at_exit do
110
+ begin
111
+ flush_buffer
112
+ socket.close
113
+ rescue => e
114
+ logger.error "close sokcet error: #{e.inspect}"
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,5 @@
1
+ # encoding: utf-8
2
+
3
+ module CloudInsight
4
+ VERSION = '0.0.1'.freeze
5
+ end
@@ -0,0 +1,4 @@
1
+ # encoding: utf-8
2
+
3
+ require 'cloud_insight/version'
4
+ require 'cloud_insight/statsd'
metadata ADDED
@@ -0,0 +1,133 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cloudinsight-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - cloudinsight
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-04-26 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '10.1'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '10.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: minitest
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest-reporters
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '0.13'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '0.13'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '0.9'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '0.9'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '0.39'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '0.39'
97
+ description: Cloud Insight SDK. (http://www.oneapm.com/ci/feature.html)
98
+ email: support@oneapm.com
99
+ executables: []
100
+ extensions: []
101
+ extra_rdoc_files: []
102
+ files:
103
+ - examples/example.rb
104
+ - lib/cloud_insight/statsd.rb
105
+ - lib/cloud_insight/version.rb
106
+ - lib/cloudinsight-sdk.rb
107
+ homepage: http://www.oneapm.com/ci/feature.html
108
+ licenses:
109
+ - CloudInsight
110
+ - MIT
111
+ - Ruby
112
+ metadata: {}
113
+ post_install_message:
114
+ rdoc_options: []
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '1.9'
122
+ required_rubygems_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ! '>='
125
+ - !ruby/object:Gem::Version
126
+ version: '0'
127
+ requirements: []
128
+ rubyforge_project:
129
+ rubygems_version: 2.4.5
130
+ signing_key:
131
+ specification_version: 4
132
+ summary: Cloud Insight SDK
133
+ test_files: []