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 +4 -4
- data/fluent-plugin-deskcom.gemspec +1 -1
- data/lib/fluent/plugin/in_deskcom.rb +65 -58
- metadata +14 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8e389008903fec965494fca734fed91ab1bb777
|
4
|
+
data.tar.gz: 534bf1b6679a6741e9bf9fbfe628f94d0a079053
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
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
|
-
#
|
5
|
+
# unsupported yet: nest flat
|
6
6
|
OUTPUT_FORMAT_TYPE = %w(simple)
|
7
|
-
#
|
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 =
|
85
|
-
|
90
|
+
def get_stream
|
91
|
+
page = 1
|
92
|
+
loop do
|
93
|
+
cases = nil
|
86
94
|
begin
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
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
|
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
|
117
|
-
end
|
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
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
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
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
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.
|
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-
|
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.
|
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.
|