fluent-plugin-stackdriver-monitoring 0.0.3 → 0.0.4
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0840d73e9fb3fb65918eecaf78b02e6e969e2ad9
|
4
|
+
data.tar.gz: 48731da8b94611bb1fde363e3a9b8aaf82f04be6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 35bd642a6ccd1883e438de46febffe778300c033efe3ee577cc411cef6438156990f92c347aa077fb298214cad97ee4145593cf7f917ae9c4ea4c7a95765adc5
|
7
|
+
data.tar.gz: 00ea14ff7803677ed925da418c3fc785f5381a3012c0dd0c4f614d269ee2b630692d307f0d2f514f1360fe76642acf8ecc5f096f4e70b4689562aabb1057864b
|
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
|
|
6
6
|
gem.license = 'MIT'
|
7
7
|
gem.homepage = 'https://github.com/mia-0032/fluent-plugin-stackdriver-monitoring'
|
8
8
|
gem.summary = gem.description
|
9
|
-
gem.version = '0.0.
|
9
|
+
gem.version = '0.0.4'
|
10
10
|
gem.authors = ['Yoshihiro MIYAI']
|
11
11
|
gem.email = 'msparrow17@gmail.com'
|
12
12
|
gem.has_rdoc = false
|
@@ -1,8 +1,5 @@
|
|
1
1
|
require 'fluent/output'
|
2
|
-
|
3
|
-
require 'google/cloud/monitoring/v3/metric_service_client'
|
4
|
-
require 'google/protobuf/repeated_field'
|
5
|
-
require 'google/protobuf/timestamp_pb'
|
2
|
+
require_relative 'stackdriver/client'
|
6
3
|
|
7
4
|
module Fluent
|
8
5
|
class StackdriverMonitoringOutput < BufferedOutput
|
@@ -18,6 +15,7 @@ module Fluent
|
|
18
15
|
end
|
19
16
|
|
20
17
|
TYPE_PREFIX = 'custom.googleapis.com/'.freeze
|
18
|
+
PAST_DATA_TIME_LIMIT = 60 * 60 * 24 # 24h
|
21
19
|
|
22
20
|
def configure(conf)
|
23
21
|
super
|
@@ -35,15 +33,12 @@ module Fluent
|
|
35
33
|
end
|
36
34
|
end
|
37
35
|
|
38
|
-
@
|
39
|
-
@metric_name = Google::Cloud::Monitoring::V3::MetricServiceClient.metric_descriptor_path @project, @custom_metrics.type
|
36
|
+
@client = Fluent::StackdriverMonitoring::Writer.new @project, @custom_metrics, log
|
40
37
|
end
|
41
38
|
|
42
39
|
def start
|
43
40
|
super
|
44
|
-
|
45
|
-
@metric_service_client = Google::Cloud::Monitoring::V3::MetricServiceClient.new
|
46
|
-
@metric_descriptor = create_metric_descriptor
|
41
|
+
@client.start
|
47
42
|
end
|
48
43
|
|
49
44
|
def format(tag, time, record)
|
@@ -51,18 +46,17 @@ module Fluent
|
|
51
46
|
end
|
52
47
|
|
53
48
|
def write(chunk)
|
54
|
-
|
55
|
-
time_series = create_time_series
|
56
|
-
value = record[@custom_metrics.key]
|
49
|
+
current_time = Time.now.to_i
|
57
50
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
chunk.msgpack_each do |tag, time, record|
|
52
|
+
if (current_time - time) >= PAST_DATA_TIME_LIMIT
|
53
|
+
log.warn 'Drop data point because it cannot be written more than 24h in the past', time: Time.at(time).to_s, metric_name: @metric_name
|
54
|
+
next
|
55
|
+
end
|
62
56
|
|
63
|
-
|
64
|
-
|
65
|
-
@
|
57
|
+
value = record[@custom_metrics.key]
|
58
|
+
start_time = time - @custom_metrics.time_interval
|
59
|
+
@client.write start_time, time, value
|
66
60
|
end
|
67
61
|
end
|
68
62
|
|
@@ -70,61 +64,5 @@ module Fluent
|
|
70
64
|
def is_custom_metric?(metric_type)
|
71
65
|
metric_type.start_with? TYPE_PREFIX
|
72
66
|
end
|
73
|
-
|
74
|
-
def create_metric_descriptor
|
75
|
-
begin
|
76
|
-
metric_descriptor = @metric_service_client.get_metric_descriptor(@metric_name)
|
77
|
-
log.info "Succeed to get metric descripter", metric_name: @metric_name
|
78
|
-
return metric_descriptor
|
79
|
-
rescue Google::Gax::RetryError
|
80
|
-
log.info "Failed to get metric descripter", metric_name: @metric_name
|
81
|
-
end
|
82
|
-
|
83
|
-
metric_descriptor = Google::Api::MetricDescriptor.new
|
84
|
-
metric_descriptor.type = @custom_metrics.type
|
85
|
-
metric_descriptor.metric_kind = @custom_metrics.metric_kind
|
86
|
-
metric_descriptor.value_type = @custom_metrics.value_type
|
87
|
-
metric_descriptor = @metric_service_client.create_metric_descriptor(@project_name, metric_descriptor)
|
88
|
-
log.info "Succeed to create metric descripter", metric_name: @metric_name
|
89
|
-
|
90
|
-
metric_descriptor
|
91
|
-
end
|
92
|
-
|
93
|
-
def create_time_series
|
94
|
-
time_series = Google::Monitoring::V3::TimeSeries.new
|
95
|
-
|
96
|
-
metric = Google::Api::Metric.new
|
97
|
-
metric.type = @metric_descriptor.type
|
98
|
-
time_series.metric = metric
|
99
|
-
|
100
|
-
time_series.metric_kind = @metric_descriptor.metric_kind
|
101
|
-
time_series.value_type = @metric_descriptor.value_type
|
102
|
-
|
103
|
-
time_series
|
104
|
-
end
|
105
|
-
|
106
|
-
def create_time_interval(time, interval)
|
107
|
-
time_interval = Google::Monitoring::V3::TimeInterval.new
|
108
|
-
time_interval.start_time = Google::Protobuf::Timestamp.new seconds: (time - interval)
|
109
|
-
time_interval.end_time = Google::Protobuf::Timestamp.new seconds: time
|
110
|
-
|
111
|
-
time_interval
|
112
|
-
end
|
113
|
-
|
114
|
-
def create_typed_value(value)
|
115
|
-
typed_value = Google::Monitoring::V3::TypedValue.new
|
116
|
-
case @metric_descriptor.value_type
|
117
|
-
when :BOOL
|
118
|
-
typed_value.bool_value = !!value
|
119
|
-
when :INT64
|
120
|
-
typed_value.int64_value = value.to_i
|
121
|
-
when :DOUBLE
|
122
|
-
typed_value.double_value = value.to_f
|
123
|
-
else
|
124
|
-
raise 'Unknown value_type!'
|
125
|
-
end
|
126
|
-
|
127
|
-
typed_value
|
128
|
-
end
|
129
67
|
end
|
130
68
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'google/api/metric_pb'
|
2
|
+
require 'google/cloud/monitoring/v3/metric_service_client'
|
3
|
+
require 'google/protobuf/repeated_field'
|
4
|
+
require 'google/protobuf/timestamp_pb'
|
5
|
+
|
6
|
+
module Fluent
|
7
|
+
module StackdriverMonitoring
|
8
|
+
class Error < StandardError
|
9
|
+
end
|
10
|
+
|
11
|
+
class Writer
|
12
|
+
def initialize(project, custom_metrics, log)
|
13
|
+
@custom_metrics = custom_metrics
|
14
|
+
@project_name = Google::Cloud::Monitoring::V3::MetricServiceClient.project_path project
|
15
|
+
@metric_name = Google::Cloud::Monitoring::V3::MetricServiceClient.metric_descriptor_path project, custom_metrics.type
|
16
|
+
@log = log
|
17
|
+
end
|
18
|
+
|
19
|
+
def start
|
20
|
+
@metric_service_client = Google::Cloud::Monitoring::V3::MetricServiceClient.new
|
21
|
+
@metric_descriptor = create_metric_descriptor
|
22
|
+
end
|
23
|
+
|
24
|
+
def write(start_time, end_time, value)
|
25
|
+
time_series = create_time_series
|
26
|
+
point = Google::Monitoring::V3::Point.new
|
27
|
+
point.interval = create_time_interval start_time, end_time
|
28
|
+
point.value = create_typed_value value
|
29
|
+
time_series.points.push point
|
30
|
+
|
31
|
+
log.debug "Create time series", start_time: Time.at(start_time).to_s, end_time: Time.at(end_time).to_s, value: value, metric_name: @metric_name
|
32
|
+
# Only one point can be written per TimeSeries per request.
|
33
|
+
@metric_service_client.create_time_series @project_name, [time_series]
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
def log
|
38
|
+
@log
|
39
|
+
end
|
40
|
+
|
41
|
+
def create_metric_descriptor
|
42
|
+
begin
|
43
|
+
metric_descriptor = @metric_service_client.get_metric_descriptor(@metric_name)
|
44
|
+
log.info "Succeed to get metric descripter", metric_name: @metric_name
|
45
|
+
return metric_descriptor
|
46
|
+
rescue Google::Gax::RetryError
|
47
|
+
log.info "Failed to get metric descripter", metric_name: @metric_name
|
48
|
+
end
|
49
|
+
|
50
|
+
metric_descriptor = Google::Api::MetricDescriptor.new
|
51
|
+
metric_descriptor.type = @custom_metrics.type
|
52
|
+
metric_descriptor.metric_kind = @custom_metrics.metric_kind
|
53
|
+
metric_descriptor.value_type = @custom_metrics.value_type
|
54
|
+
metric_descriptor = @metric_service_client.create_metric_descriptor(@project_name, metric_descriptor)
|
55
|
+
log.info "Succeed to create metric descripter", metric_name: @metric_name
|
56
|
+
|
57
|
+
metric_descriptor
|
58
|
+
end
|
59
|
+
|
60
|
+
def create_time_series
|
61
|
+
time_series = Google::Monitoring::V3::TimeSeries.new
|
62
|
+
|
63
|
+
metric = Google::Api::Metric.new
|
64
|
+
metric.type = @metric_descriptor.type
|
65
|
+
|
66
|
+
time_series.metric = metric
|
67
|
+
time_series.metric_kind = @metric_descriptor.metric_kind
|
68
|
+
time_series.value_type = @metric_descriptor.value_type
|
69
|
+
|
70
|
+
time_series
|
71
|
+
end
|
72
|
+
|
73
|
+
def create_time_interval(start_time, end_time)
|
74
|
+
time_interval = Google::Monitoring::V3::TimeInterval.new
|
75
|
+
time_interval.start_time = Google::Protobuf::Timestamp.new seconds: start_time
|
76
|
+
time_interval.end_time = Google::Protobuf::Timestamp.new seconds: end_time
|
77
|
+
time_interval
|
78
|
+
end
|
79
|
+
|
80
|
+
def create_typed_value(value)
|
81
|
+
typed_value = Google::Monitoring::V3::TypedValue.new
|
82
|
+
case @metric_descriptor.value_type
|
83
|
+
when :BOOL
|
84
|
+
typed_value.bool_value = !!value
|
85
|
+
when :INT64
|
86
|
+
typed_value.int64_value = value.to_i
|
87
|
+
when :DOUBLE
|
88
|
+
typed_value.double_value = value.to_f
|
89
|
+
else
|
90
|
+
raise Error.new 'Unknown value_type!'
|
91
|
+
end
|
92
|
+
|
93
|
+
typed_value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -4,7 +4,7 @@ class StackdriverMonitoringOutputTest < Test::Unit::TestCase
|
|
4
4
|
CONFIG = %[
|
5
5
|
project project-test
|
6
6
|
<custom_metrics>
|
7
|
-
key
|
7
|
+
key test_key
|
8
8
|
type custom.googleapis.com/hoge_type
|
9
9
|
metric_kind GAUGE
|
10
10
|
value_type INT64
|
@@ -24,7 +24,7 @@ class StackdriverMonitoringOutputTest < Test::Unit::TestCase
|
|
24
24
|
d = create_driver
|
25
25
|
|
26
26
|
assert_equal('project-test', d.instance.project)
|
27
|
-
assert_equal('
|
27
|
+
assert_equal('test_key', d.instance.custom_metrics.key)
|
28
28
|
assert_equal('custom.googleapis.com/hoge_type', d.instance.custom_metrics.type)
|
29
29
|
assert_equal(:GAUGE, d.instance.custom_metrics.metric_kind)
|
30
30
|
assert_equal(:INT64, d.instance.custom_metrics.value_type)
|
@@ -36,7 +36,7 @@ class StackdriverMonitoringOutputTest < Test::Unit::TestCase
|
|
36
36
|
create_driver(%[
|
37
37
|
project project-test
|
38
38
|
<custom_metrics>
|
39
|
-
key
|
39
|
+
key test_key
|
40
40
|
type invalid_type
|
41
41
|
metric_kind GAUGE
|
42
42
|
value_type INT64
|
@@ -50,7 +50,7 @@ class StackdriverMonitoringOutputTest < Test::Unit::TestCase
|
|
50
50
|
create_driver(%[
|
51
51
|
project project-test
|
52
52
|
<custom_metrics>
|
53
|
-
key
|
53
|
+
key test_key
|
54
54
|
type invalid_type
|
55
55
|
metric_kind CUMULATIVE
|
56
56
|
value_type INT64
|
@@ -65,7 +65,7 @@ class StackdriverMonitoringOutputTest < Test::Unit::TestCase
|
|
65
65
|
create_driver(%[
|
66
66
|
project project-test
|
67
67
|
<custom_metrics>
|
68
|
-
key
|
68
|
+
key test_key
|
69
69
|
type invalid_type
|
70
70
|
metric_kind CUMULATIVE
|
71
71
|
value_type BOOL
|
@@ -74,4 +74,48 @@ class StackdriverMonitoringOutputTest < Test::Unit::TestCase
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
77
|
+
|
78
|
+
sub_test_case 'write' do
|
79
|
+
setup do
|
80
|
+
@client = mock!
|
81
|
+
@client.start.once
|
82
|
+
stub(Fluent::StackdriverMonitoring::Writer).new(anything, anything, anything).once { @client }
|
83
|
+
end
|
84
|
+
|
85
|
+
test 'basic data' do
|
86
|
+
now = Time.now.to_i
|
87
|
+
@client.write(now, now, 1).once
|
88
|
+
|
89
|
+
d = create_driver
|
90
|
+
d.emit({'test_key' => 1}, now)
|
91
|
+
d.run
|
92
|
+
end
|
93
|
+
|
94
|
+
test 'data with time_interval' do
|
95
|
+
now = Time.now.to_i
|
96
|
+
@client.write(now - 10, now, 1).once
|
97
|
+
|
98
|
+
d = create_driver(%[
|
99
|
+
project project-test
|
100
|
+
<custom_metrics>
|
101
|
+
key test_key
|
102
|
+
type custom.googleapis.com/hoge_type
|
103
|
+
metric_kind GAUGE
|
104
|
+
value_type INT64
|
105
|
+
time_interval 10s
|
106
|
+
</custom_metrics>
|
107
|
+
])
|
108
|
+
d.emit({'test_key' => 1}, now)
|
109
|
+
d.run
|
110
|
+
end
|
111
|
+
|
112
|
+
test 'past data are dropped' do
|
113
|
+
past_time = Time.now.to_i - (60 * 60 * 24 + 1)
|
114
|
+
@client.write.times(0)
|
115
|
+
|
116
|
+
d = create_driver
|
117
|
+
d.emit({'test_key' => 1}, past_time)
|
118
|
+
d.run
|
119
|
+
end
|
120
|
+
end
|
77
121
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-stackdriver-monitoring
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yoshihiro MIYAI
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -115,6 +115,7 @@ files:
|
|
115
115
|
- Rakefile
|
116
116
|
- fluent-plugin-stackdriver-monitoring.gemspec
|
117
117
|
- lib/fluent/plugin/out_stackdriver_monitoring.rb
|
118
|
+
- lib/fluent/plugin/stackdriver/client.rb
|
118
119
|
- test/plugin/test_out_stackdriver_monitoring.rb
|
119
120
|
- test/test_helper.rb
|
120
121
|
homepage: https://github.com/mia-0032/fluent-plugin-stackdriver-monitoring
|