fluent-plugin-deskcom 0.0.2 → 0.0.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 952794ba64a64955c3fbd9f599c5faedc81c3374
4
- data.tar.gz: 8619e94793db9f42d657b19e0f30207233a7e8bc
3
+ metadata.gz: f8e389008903fec965494fca734fed91ab1bb777
4
+ data.tar.gz: 534bf1b6679a6741e9bf9fbfe628f94d0a079053
5
5
  SHA512:
6
- metadata.gz: b2e0bc35b53bfdb8fd92fee8ffe933ded9d45c3d2d276d6202542ac0bacf5e4dfcac526df97ca32f805806df8037db295ff4d5264cb0edd6b43a0fb5bc9bcd29
7
- data.tar.gz: 55e0f6aba3af35167ff91d506b0faa0a516cf3b18cc7908d4beb2779da639327f84267557dec8982310d32c9a1257763491aae21ab339242457113cd9714b1d0
6
+ metadata.gz: ef1ef41f236a754ee61035bf4e80864e2bf77c06ae982b5092d40b17daa3bce0b261ed976097c7b7331402cc6f865a7481600b4c4540894b4ea0c6ee7b6766fe
7
+ data.tar.gz: 297c61cec432104e6142b4e0e13c747717f4dac00c29f4e1141bdac7d2a106b84c7d0f7cf640804db568fbc06f2a656c9346d2ae51e0dc20fba4cf4f37b5d42f
@@ -3,7 +3,7 @@ $:.push File.expand_path('../lib', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |spec|
5
5
  spec.name = "fluent-plugin-deskcom"
6
- spec.version = "0.0.2"
6
+ spec.version = "0.0.3"
7
7
  spec.authors = ["Toru Takahashi"]
8
8
  spec.email = ["torutakahashi.ayashi@gmail.com"]
9
9
  spec.summary = %q{Input plugin to collect data from Deskcom.}
@@ -2,12 +2,14 @@ module Fluent
2
2
  class DeskcomInput < Fluent::Input
3
3
  Fluent::Plugin.register_input('deskcom', self)
4
4
 
5
- # un-support yet: nest flat
5
+ # unsupported yet: nest flat
6
6
  OUTPUT_FORMAT_TYPE = %w(simple)
7
- # un-support yet: brand article reply ~
7
+ # unsupported yet: brand article reply ~
8
8
  INPUT_API_TYPE = %w(cases replies)
9
9
  DEFAULT_PER_PAGE = 50
10
10
 
11
+ SORT_DIRECTION_TYPE=%w(asc desc)
12
+
11
13
  config_param :subdomain, :string, :default => nil
12
14
  config_param :consumer_key, :string, :default => nil
13
15
  config_param :consumer_secret, :string, :default => nil
@@ -19,6 +21,7 @@ class DeskcomInput < Fluent::Input
19
21
  config_param :tag, :string, :default => nil
20
22
  config_param :time_column, :string, :default => nil
21
23
  config_param :interval, :integer,:default => 5
24
+ config_param :sort_direction, :string, :default => 'asc'
22
25
 
23
26
  def initialize
24
27
  super
@@ -38,6 +41,10 @@ class DeskcomInput < Fluent::Input
38
41
  raise Fluent::ConfigError, "input_api value undefined #{@input_api}"
39
42
  end
40
43
 
44
+ if !SORT_DIRECTION_TYPE.include?(@sort_direction)
45
+ raise Fluent::ConfigError, "sort_direction value undefined #{@sort_direction}"
46
+ end
47
+
41
48
  if !@consumer_key || !@consumer_secret || !@oauth_token || !@oauth_token_secret
42
49
  raise Fluent::ConfigError, "missing values in consumer_key or consumer_secret or oauth_token or oauth_token_secret"
43
50
  end
@@ -48,7 +55,6 @@ class DeskcomInput < Fluent::Input
48
55
 
49
56
  @tick = @interval * 60
50
57
 
51
- @stored_time = load_store_file
52
58
  @per_page = DEFAULT_PER_PAGE
53
59
 
54
60
  Desk.configure do |config|
@@ -74,47 +80,61 @@ class DeskcomInput < Fluent::Input
74
80
  def run
75
81
  while true
76
82
  @started_time = Time.now.to_i
83
+ @stored_time = load_store_file(@store_file)
77
84
  get_stream
78
- save_store_file unless !@store_file
85
+ save_store_file(@store_file, @started_time) unless !@store_file
79
86
  sleep @tick
80
87
  end
81
88
  end
82
89
 
83
- def get_stream()
84
- page = 0
85
- if @input_api == 'cases' then
90
+ def get_stream
91
+ page = 1
92
+ loop do
93
+ cases = nil
86
94
  begin
87
- page = page + 1
88
- cases = Desk.cases(:since_updated_at => @stored_time, :page => page, :per_page => @per_page)
89
- # Sleep for rate limit
90
- # ToDo: Check body "Too Many Requests" and Sleep
91
- sleep(2)
95
+ cases = Desk.cases(:since_updated_at => @stored_time, :max_updated_at => @started_time,
96
+ :page => page, :per_page => @per_page,
97
+ :sort_field => 'updated_at', :sort_direction => @sort_direction)
98
+ rescue Desk::NotFound => e
99
+ $log.info "No more records: #{e.message}"
100
+ break
101
+ end
92
102
 
103
+ if @input_api == 'cases' then
93
104
  cases.each do |c|
94
105
  get_content(c)
95
106
  end
96
- $log.info "Case total entry: #{cases.total_entries} page: #{page}"
97
- end while (cases.total_entries/@per_page.to_f).ceil > page
98
- elsif @input_api == 'replies'
99
- begin
100
- page = page + 1
101
- cases = Desk.cases(:since_updated_at => @stored_time, :page => page, :per_page => @per_page)
102
- # Sleep for rate limit
103
- # ToDo: Check body "Too Many Requests" and Sleep
104
- sleep(2)
107
+ $log.info "Case total entries: #{cases.total_entries} page: #{page}"
105
108
 
109
+ elsif @input_api == 'replies'
106
110
  cases.each do |c|
107
111
  Desk.case_replies(c.id).each do |r|
108
- # Sleep for rate limit
109
- # ToDo: Check body "Too Many Requests" and Sleep
110
- sleep(2)
111
-
112
112
  r[:case_id] = c.id
113
113
  get_content(r) if c.count > 0
114
114
  end
115
115
  end
116
- $log.info "Case total entry include reply #{cases.total_entries} page: #{page}"
117
- end while (cases.total_entries/@per_page.to_f).ceil > page
116
+ $log.info "Case total entries with replies: #{cases.total_entries} page: #{page}"
117
+ end
118
+
119
+ page = page + 1
120
+ # if getting above 500 pages limit for a search
121
+ # (http://dev.desk.com/API/cases/#list), reset the reference point and
122
+ # the page count to 1
123
+ if page >= 500
124
+ require 'time'
125
+ if @sort_direction == 'asc'
126
+ # if sorting by ascending 'updated_at', reset the lower filter limit
127
+ # to focus on the upper part of the records that would reside in the
128
+ # 'pages' past 500
129
+ @stored_time = Time.parse(cases.map(&:updated_at).sort.last).to_i
130
+ else
131
+ # if sorting by descending 'updated_at', reset the upper filter limit
132
+ # to focus on the lower part of the records that would reside in the
133
+ # 'pages' past 500
134
+ @started_time = Time.parse(cases.map(&:updated_at).sort.first).to_i
135
+ end
136
+ page = 1
137
+ end
118
138
  end
119
139
  rescue => e
120
140
  $log.error "deskcom run: #{e.message}"
@@ -125,14 +145,6 @@ class DeskcomInput < Fluent::Input
125
145
  when 'simple'
126
146
  record = Hash.new
127
147
  status.each_pair do |k,v|
128
- # @stored_time <= store data's updated time < @started_time
129
- if (k == 'updated_at') then
130
- at_time = Time.parse(v).to_i
131
- if (at_time >= @started_time) || (at_time < @stored_time) then
132
- next
133
- end
134
- end
135
-
136
148
  if (!@time_column.nil? && k == "#{@time_column}") then
137
149
  @time_value = Time.parse(v).to_i rescue nil
138
150
  end
@@ -158,34 +170,29 @@ class DeskcomInput < Fluent::Input
158
170
  $log.error "deskcom get_content: #{e.message}"
159
171
  end
160
172
 
161
- # => int
162
- def load_store_file
163
- begin
164
- f = Pathname.new(@store_file)
165
- stored_time = 0
166
- f.open('r') do |f|
167
- stored = YAML.load_file(f)
168
- stored_time = stored[:time].to_i
169
- end
170
- $log.info "deskcom: Load #{@store_file}: #{@stored_time}"
171
- rescue => e
172
- $log.warn "deskcom: Can't load store_file #{e.message}"
173
- return 0
173
+ def load_store_file(store_file)
174
+ f = Pathname.new(store_file)
175
+ stored_time = 0
176
+ f.open('r') do |f|
177
+ stored = YAML.load_file(f)
178
+ stored_time = stored[:time].to_i
174
179
  end
180
+ $log.info "deskcom: Load #{store_file}: #{stored_time}"
175
181
  return stored_time
182
+ rescue => e
183
+ $log.warn "deskcom: Can't load store_file #{e.message}"
184
+ return 0
176
185
  end
177
186
 
178
- def save_store_file
179
- begin
180
- f = Pathname.new(@store_file)
181
- f.open('w') do |f|
182
- data = {:time => @started_time}
183
- YAML.dump(data, f)
184
- end
185
- $log.info "deskcom: Save started_time: #{@started_time} to #{@store_file}"
186
- rescue => e
187
- $log.warn "deskcom: Can't save store_file #{e.message}"
187
+ def save_store_file(store_file, time)
188
+ f = Pathname.new(store_file)
189
+ f.open('w') do |f|
190
+ data = {:time => time}
191
+ YAML.dump(data, f)
188
192
  end
193
+ $log.info "deskcom: Save started_time: #{time} to #{store_file}"
194
+ rescue => e
195
+ $log.warn "deskcom: Can't save store_file #{e.message}"
189
196
  end
190
197
 
191
198
  end
metadata CHANGED
@@ -1,69 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-deskcom
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Toru Takahashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-19 00:00:00.000000000 Z
11
+ date: 2015-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.7'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.7'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '10.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '10.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: fluentd
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: desk
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  description: fluent Input plugin to collect data from Deskcom.
@@ -73,7 +73,7 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
- - .gitignore
76
+ - ".gitignore"
77
77
  - Gemfile
78
78
  - LICENSE.txt
79
79
  - README.md
@@ -92,17 +92,17 @@ require_paths:
92
92
  - lib
93
93
  required_ruby_version: !ruby/object:Gem::Requirement
94
94
  requirements:
95
- - - '>='
95
+ - - ">="
96
96
  - !ruby/object:Gem::Version
97
97
  version: '0'
98
98
  required_rubygems_version: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - '>='
100
+ - - ">="
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
103
  requirements: []
104
104
  rubyforge_project:
105
- rubygems_version: 2.0.14
105
+ rubygems_version: 2.2.2
106
106
  signing_key:
107
107
  specification_version: 4
108
108
  summary: Input plugin to collect data from Deskcom.