fluent-plugin-google-cloud 0.7.15 → 0.7.16
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/Gemfile.lock +36 -38
- data/fluent-plugin-google-cloud.gemspec +20 -15
- data/lib/fluent/plugin/monitoring.rb +5 -1
- data/lib/fluent/plugin/out_google_cloud.rb +27 -5
- data/lib/fluent/plugin/statusz.rb +106 -10
- data/test/plugin/base_test.rb +158 -188
- data/test/plugin/constants.rb +71 -6
- data/test/plugin/test_out_google_cloud.rb +72 -63
- data/test/plugin/test_out_google_cloud_grpc.rb +41 -98
- metadata +40 -40
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfb019175c35271448646b370774c129b48096dac9a1dfb5a1904776ba0af63c
|
4
|
+
data.tar.gz: 07ffca87bc262f3a29b964b47ccefd69551ad3b11384b54295f1270d101d4633
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4f2584f87ab91bd87d75b7139555928e3d5daaa073170258a7125468a5a2b24bcce968b2f3120f13f8f6ef5328029c2a5ac6171fab0e0b2b8654eb3436f6941
|
7
|
+
data.tar.gz: 7d917d3ecbd2d946e8c712a2c686a5322465b3154fc2c5b889f87fa299b53dd17a5396509315d8cb89a40b55c8960dffe41995c342df01baa50cc3c1a287bc7d
|
data/Gemfile.lock
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fluent-plugin-google-cloud (0.7.
|
5
|
-
fluentd (= 1.
|
6
|
-
google-api-client (= 0.
|
7
|
-
google-cloud-logging (= 1.6.
|
8
|
-
google-protobuf (= 3.
|
9
|
-
googleapis-common-protos (= 1.3.
|
10
|
-
googleauth (= 0.
|
11
|
-
grpc (= 1.
|
12
|
-
json (= 2.
|
4
|
+
fluent-plugin-google-cloud (0.7.16)
|
5
|
+
fluentd (= 1.6.3)
|
6
|
+
google-api-client (= 0.30.8)
|
7
|
+
google-cloud-logging (= 1.6.6)
|
8
|
+
google-protobuf (= 3.9.0)
|
9
|
+
googleapis-common-protos (= 1.3.9)
|
10
|
+
googleauth (= 0.9.0)
|
11
|
+
grpc (= 1.22.0)
|
12
|
+
json (= 2.2.0)
|
13
13
|
|
14
14
|
GEM
|
15
15
|
remote: https://rubygems.org/
|
@@ -26,7 +26,7 @@ GEM
|
|
26
26
|
dig_rb (1.0.1)
|
27
27
|
faraday (0.15.4)
|
28
28
|
multipart-post (>= 1.2, < 3)
|
29
|
-
fluentd (1.
|
29
|
+
fluentd (1.6.3)
|
30
30
|
cool.io (>= 1.4.5, < 2.0.0)
|
31
31
|
dig_rb (~> 1.0.0)
|
32
32
|
http_parser.rb (>= 0.5.1, < 0.7.0)
|
@@ -37,11 +37,11 @@ GEM
|
|
37
37
|
tzinfo (~> 1.0)
|
38
38
|
tzinfo-data (~> 1.0)
|
39
39
|
yajl-ruby (~> 1.0)
|
40
|
-
google-api-client (0.
|
40
|
+
google-api-client (0.30.8)
|
41
41
|
addressable (~> 2.5, >= 2.5.1)
|
42
42
|
googleauth (>= 0.5, < 0.10.0)
|
43
43
|
httpclient (>= 2.8.1, < 3.0)
|
44
|
-
|
44
|
+
mini_mime (~> 1.0)
|
45
45
|
representable (~> 3.0)
|
46
46
|
retriable (>= 2.0, < 4.0)
|
47
47
|
signet (~> 0.10)
|
@@ -49,10 +49,10 @@ GEM
|
|
49
49
|
google-cloud-env (~> 1.0)
|
50
50
|
google-cloud-env (1.2.0)
|
51
51
|
faraday (~> 0.11)
|
52
|
-
google-cloud-logging (1.6.
|
53
|
-
concurrent-ruby (~> 1.
|
52
|
+
google-cloud-logging (1.6.6)
|
53
|
+
concurrent-ruby (~> 1.1)
|
54
54
|
google-cloud-core (~> 1.2)
|
55
|
-
google-gax (~> 1.
|
55
|
+
google-gax (~> 1.7)
|
56
56
|
googleapis-common-protos-types (>= 1.0.2)
|
57
57
|
stackdriver-core (~> 1.3)
|
58
58
|
google-gax (1.7.0)
|
@@ -61,45 +61,43 @@ GEM
|
|
61
61
|
googleauth (>= 0.6.2, < 0.10.0)
|
62
62
|
grpc (>= 1.7.2, < 2.0)
|
63
63
|
rly (~> 0.2.3)
|
64
|
-
google-protobuf (3.
|
65
|
-
googleapis-common-protos (1.3.
|
64
|
+
google-protobuf (3.9.0)
|
65
|
+
googleapis-common-protos (1.3.9)
|
66
66
|
google-protobuf (~> 3.0)
|
67
67
|
googleapis-common-protos-types (~> 1.0)
|
68
68
|
grpc (~> 1.0)
|
69
69
|
googleapis-common-protos-types (1.0.4)
|
70
70
|
google-protobuf (~> 3.0)
|
71
|
-
googleauth (0.
|
71
|
+
googleauth (0.9.0)
|
72
72
|
faraday (~> 0.12)
|
73
73
|
jwt (>= 1.4, < 3.0)
|
74
74
|
memoist (~> 0.16)
|
75
75
|
multi_json (~> 1.11)
|
76
76
|
os (>= 0.9, < 2.0)
|
77
77
|
signet (~> 0.7)
|
78
|
-
grpc (1.
|
79
|
-
google-protobuf (~> 3.
|
80
|
-
googleapis-common-protos-types (~> 1.0
|
81
|
-
hashdiff (0.
|
78
|
+
grpc (1.22.0)
|
79
|
+
google-protobuf (~> 3.8)
|
80
|
+
googleapis-common-protos-types (~> 1.0)
|
81
|
+
hashdiff (1.0.0)
|
82
82
|
http_parser.rb (0.6.0)
|
83
83
|
httpclient (2.8.3)
|
84
|
-
json (2.
|
84
|
+
json (2.2.0)
|
85
85
|
jwt (2.2.1)
|
86
86
|
memoist (0.16.0)
|
87
87
|
metaclass (0.0.4)
|
88
|
-
|
89
|
-
mime-types-data (~> 3.2015)
|
90
|
-
mime-types-data (3.2019.0331)
|
88
|
+
mini_mime (1.0.2)
|
91
89
|
mocha (1.9.0)
|
92
90
|
metaclass (~> 0.0.1)
|
93
|
-
msgpack (1.3.
|
91
|
+
msgpack (1.3.1)
|
94
92
|
multi_json (1.13.1)
|
95
93
|
multipart-post (2.1.1)
|
96
94
|
os (1.0.1)
|
97
95
|
parser (2.6.3.0)
|
98
96
|
ast (~> 2.4.0)
|
99
|
-
power_assert (1.1.
|
97
|
+
power_assert (1.1.5)
|
100
98
|
powerpack (0.1.2)
|
101
|
-
prometheus-client (0.
|
102
|
-
quantile (~> 0.2.
|
99
|
+
prometheus-client (0.9.0)
|
100
|
+
quantile (~> 0.2.1)
|
103
101
|
public_suffix (3.1.1)
|
104
102
|
quantile (0.2.1)
|
105
103
|
rainbow (2.2.2)
|
@@ -139,10 +137,10 @@ GEM
|
|
139
137
|
tzinfo (>= 1.0.0)
|
140
138
|
uber (0.1.0)
|
141
139
|
unicode-display_width (1.6.0)
|
142
|
-
webmock (
|
140
|
+
webmock (3.6.2)
|
143
141
|
addressable (>= 2.3.6)
|
144
142
|
crack (>= 0.3.2)
|
145
|
-
hashdiff
|
143
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
146
144
|
yajl-ruby (1.4.1)
|
147
145
|
|
148
146
|
PLATFORMS
|
@@ -150,12 +148,12 @@ PLATFORMS
|
|
150
148
|
|
151
149
|
DEPENDENCIES
|
152
150
|
fluent-plugin-google-cloud!
|
153
|
-
mocha (
|
154
|
-
prometheus-client (
|
155
|
-
rake (
|
156
|
-
rubocop (
|
157
|
-
test-unit (
|
158
|
-
webmock (
|
151
|
+
mocha (= 1.9.0)
|
152
|
+
prometheus-client (= 0.9.0)
|
153
|
+
rake (= 10.5.0)
|
154
|
+
rubocop (= 0.39.0)
|
155
|
+
test-unit (= 3.3.3)
|
156
|
+
webmock (= 3.6.2)
|
159
157
|
|
160
158
|
BUNDLED WITH
|
161
159
|
1.16.6
|
@@ -10,7 +10,7 @@ eos
|
|
10
10
|
gem.homepage =
|
11
11
|
'https://github.com/GoogleCloudPlatform/fluent-plugin-google-cloud'
|
12
12
|
gem.license = 'Apache-2.0'
|
13
|
-
gem.version = '0.7.
|
13
|
+
gem.version = '0.7.16'
|
14
14
|
gem.authors = ['Stackdriver Agents Team']
|
15
15
|
gem.email = ['stackdriver-agents@google.com']
|
16
16
|
gem.required_ruby_version = Gem::Requirement.new('>= 2.2')
|
@@ -19,19 +19,24 @@ eos
|
|
19
19
|
gem.test_files = gem.files.grep(/^(test)/)
|
20
20
|
gem.require_paths = ['lib']
|
21
21
|
|
22
|
-
gem.add_runtime_dependency 'fluentd', '1.
|
23
|
-
gem.add_runtime_dependency 'googleapis-common-protos', '1.3.
|
24
|
-
gem.add_runtime_dependency 'googleauth', '0.
|
25
|
-
gem.add_runtime_dependency 'google-api-client', '0.
|
26
|
-
gem.add_runtime_dependency 'google-cloud-logging', '1.6.
|
27
|
-
gem.add_runtime_dependency 'google-protobuf', '3.
|
28
|
-
gem.add_runtime_dependency 'grpc', '1.
|
29
|
-
gem.add_runtime_dependency 'json', '2.
|
22
|
+
gem.add_runtime_dependency 'fluentd', '1.6.3'
|
23
|
+
gem.add_runtime_dependency 'googleapis-common-protos', '1.3.9'
|
24
|
+
gem.add_runtime_dependency 'googleauth', '0.9.0'
|
25
|
+
gem.add_runtime_dependency 'google-api-client', '0.30.8'
|
26
|
+
gem.add_runtime_dependency 'google-cloud-logging', '1.6.6'
|
27
|
+
gem.add_runtime_dependency 'google-protobuf', '3.9.0'
|
28
|
+
gem.add_runtime_dependency 'grpc', '1.22.0'
|
29
|
+
gem.add_runtime_dependency 'json', '2.2.0'
|
30
30
|
|
31
|
-
gem.add_development_dependency 'mocha', '
|
32
|
-
gem.add_development_dependency 'prometheus-client', '
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
gem.add_development_dependency 'mocha', '1.9.0'
|
32
|
+
gem.add_development_dependency 'prometheus-client', '0.9.0'
|
33
|
+
# TODO(qingling128): Upgrade rake to 11.0+ after the following issues are
|
34
|
+
# fixed because rake (11.0+) requires ALL variables to be explicitly
|
35
|
+
# initialized.
|
36
|
+
# https://github.com/googleapis/google-auth-library-ruby/issues/227
|
37
|
+
# https://github.com/farcaller/rly/issues/2
|
38
|
+
gem.add_development_dependency 'rake', '10.5.0'
|
39
|
+
gem.add_development_dependency 'rubocop', '0.39.0'
|
40
|
+
gem.add_development_dependency 'test-unit', '3.3.3'
|
41
|
+
gem.add_development_dependency 'webmock', '3.6.2'
|
37
42
|
end
|
@@ -16,7 +16,7 @@ module Monitoring
|
|
16
16
|
# Base class for the monitoring registry.
|
17
17
|
class BaseMonitoringRegistry
|
18
18
|
def counter(_name, _desc)
|
19
|
-
|
19
|
+
nil
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
@@ -48,6 +48,10 @@ module Monitoring
|
|
48
48
|
PrometheusMonitoringRegistry
|
49
49
|
}
|
50
50
|
|
51
|
+
def self.supports_monitoring_type(name)
|
52
|
+
@known_registry_types.key?(name)
|
53
|
+
end
|
54
|
+
|
51
55
|
def self.create(name)
|
52
56
|
(@known_registry_types[name] || BaseMonitoringRegistry).new
|
53
57
|
end
|
@@ -36,6 +36,7 @@ module Google
|
|
36
36
|
# Alias the has_key? method to have the same interface as a regular map.
|
37
37
|
class Map
|
38
38
|
alias key? has_key?
|
39
|
+
alias to_hash to_h
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
@@ -460,6 +461,14 @@ module Fluent
|
|
460
461
|
super
|
461
462
|
# use the global logger
|
462
463
|
@log = $log # rubocop:disable Style/GlobalVars
|
464
|
+
|
465
|
+
@failed_requests_count = nil
|
466
|
+
@successful_requests_count = nil
|
467
|
+
@dropped_entries_count = nil
|
468
|
+
@ingested_entries_count = nil
|
469
|
+
@retried_entries_count = nil
|
470
|
+
|
471
|
+
@ok_code = nil
|
463
472
|
end
|
464
473
|
|
465
474
|
def configure(conf)
|
@@ -491,6 +500,11 @@ module Fluent
|
|
491
500
|
# If monitoring is enabled, register metrics in the default registry
|
492
501
|
# and store metric objects for future use.
|
493
502
|
if @enable_monitoring
|
503
|
+
unless Monitoring::MonitoringRegistryFactory.supports_monitoring_type(
|
504
|
+
@monitoring_type)
|
505
|
+
@log.warn "monitoring_type '#{@monitoring_type}' is unknown; "\
|
506
|
+
'there will be no metrics'
|
507
|
+
end
|
494
508
|
registry = Monitoring::MonitoringRegistryFactory.create @monitoring_type
|
495
509
|
@successful_requests_count = registry.counter(
|
496
510
|
:stackdriver_successful_requests_count,
|
@@ -592,7 +606,7 @@ module Fluent
|
|
592
606
|
@statusz_port,
|
593
607
|
bind: '127.0.0.1') do |data, conn|
|
594
608
|
if data.split(' ')[1] == '/statusz'
|
595
|
-
write_html_response(data, conn, 200, Statusz.response)
|
609
|
+
write_html_response(data, conn, 200, Statusz.response(self))
|
596
610
|
else
|
597
611
|
write_html_response(data, conn, 404, "Not found\n")
|
598
612
|
end
|
@@ -624,8 +638,14 @@ module Fluent
|
|
624
638
|
# Save the following fields if available, then clear them out to
|
625
639
|
# allow for determining whether we should parse the log or message
|
626
640
|
# field.
|
641
|
+
# This list should be in sync with
|
642
|
+
# https://cloud.google.com/logging/docs/agent/configuration#special-fields.
|
627
643
|
preserved_keys = [
|
628
644
|
'time',
|
645
|
+
'timeNanos',
|
646
|
+
'timestamp',
|
647
|
+
'timestampNanos',
|
648
|
+
'timestampSeconds',
|
629
649
|
'severity',
|
630
650
|
@http_request_key,
|
631
651
|
@insert_id_key,
|
@@ -1031,7 +1051,7 @@ module Fluent
|
|
1031
1051
|
end
|
1032
1052
|
|
1033
1053
|
begin
|
1034
|
-
open('http://' + METADATA_SERVICE_ADDR) do |f|
|
1054
|
+
open('http://' + METADATA_SERVICE_ADDR, proxy: false) do |f|
|
1035
1055
|
if f.meta['metadata-flavor'] == 'Google'
|
1036
1056
|
@log.info 'Detected GCE platform'
|
1037
1057
|
return Platform::GCE
|
@@ -1054,7 +1074,8 @@ module Fluent
|
|
1054
1074
|
@platform == Platform::GCE
|
1055
1075
|
# See https://cloud.google.com/compute/docs/metadata
|
1056
1076
|
open('http://' + METADATA_SERVICE_ADDR + '/computeMetadata/v1/' +
|
1057
|
-
metadata_path, 'Metadata-Flavor' => 'Google',
|
1077
|
+
metadata_path, 'Metadata-Flavor' => 'Google', :proxy => false,
|
1078
|
+
&:read)
|
1058
1079
|
end
|
1059
1080
|
|
1060
1081
|
# EC2 Metadata server returns everything in one call. Store it after the
|
@@ -1065,7 +1086,7 @@ module Fluent
|
|
1065
1086
|
unless @ec2_metadata
|
1066
1087
|
# See http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
|
1067
1088
|
open('http://' + METADATA_SERVICE_ADDR +
|
1068
|
-
'/latest/dynamic/instance-identity/document') do |f|
|
1089
|
+
'/latest/dynamic/instance-identity/document', proxy: false) do |f|
|
1069
1090
|
contents = f.read
|
1070
1091
|
@ec2_metadata = JSON.parse(contents)
|
1071
1092
|
end
|
@@ -2242,7 +2263,6 @@ module Fluent
|
|
2242
2263
|
def construct_error_details_map_grpc(gax_error)
|
2243
2264
|
return {} unless @partial_success
|
2244
2265
|
error_details_map = Hash.new { |h, k| h[k] = [] }
|
2245
|
-
|
2246
2266
|
error_details = ensure_array(gax_error.status_details)
|
2247
2267
|
raise JSON::ParserError, 'The error details are empty.' if
|
2248
2268
|
error_details.empty?
|
@@ -2330,10 +2350,12 @@ module Fluent
|
|
2330
2350
|
constructed_resource
|
2331
2351
|
end
|
2332
2352
|
|
2353
|
+
# Convert the value to a Ruby array.
|
2333
2354
|
def ensure_array(value)
|
2334
2355
|
Array.try_convert(value) || (raise JSON::ParserError, value.class.to_s)
|
2335
2356
|
end
|
2336
2357
|
|
2358
|
+
# Convert the value to a Ruby hash.
|
2337
2359
|
def ensure_hash(value)
|
2338
2360
|
Hash.try_convert(value) || (raise JSON::ParserError, value.class.to_s)
|
2339
2361
|
end
|
@@ -12,20 +12,116 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
+
require 'erb'
|
16
|
+
|
15
17
|
# Module for collecting diagnostic information and formatting it as an
|
16
18
|
# HTML page to serve on the /statusz endpoint.
|
17
19
|
module Statusz
|
18
20
|
module_function
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
'</html>'
|
29
|
-
].join("\n") + "\n"
|
22
|
+
# Note: The plugin parameter is referenced in STATUSZ_TMPL.
|
23
|
+
def response(plugin)
|
24
|
+
uptime = Time.now - SERVER_START
|
25
|
+
uptime_str = format('%d hr %02d min %02d sec',
|
26
|
+
uptime / 3600,
|
27
|
+
(uptime / 60) % 60,
|
28
|
+
uptime % 60)
|
29
|
+
ERB.new(STATUSZ_TMPL).result(binding)
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
SERVER_START = Time.now
|
34
|
+
|
35
|
+
# Does not include the following deprecated config params:
|
36
|
+
# auth_method, private_key_email, private_key_passphrase, private_key_path
|
37
|
+
CONFIG_KEYS = %w(
|
38
|
+
adjust_invalid_timestamps
|
39
|
+
autoformat_stackdriver_trace
|
40
|
+
coerce_to_utf8
|
41
|
+
detect_json
|
42
|
+
detect_subservice
|
43
|
+
enable_metadata_agent
|
44
|
+
enable_monitoring
|
45
|
+
http_request_key
|
46
|
+
insert_id_key
|
47
|
+
k8s_cluster_location
|
48
|
+
k8s_cluster_name
|
49
|
+
kubernetes_tag_regexp
|
50
|
+
label_map
|
51
|
+
labels_key
|
52
|
+
labels
|
53
|
+
logging_api_url
|
54
|
+
metadata_agent_url
|
55
|
+
monitoring_type
|
56
|
+
non_utf8_replacement_string
|
57
|
+
operation_key
|
58
|
+
partial_success
|
59
|
+
project_id
|
60
|
+
require_valid_tags
|
61
|
+
source_location_key
|
62
|
+
span_id_key
|
63
|
+
split_logs_by_tag
|
64
|
+
statusz_port
|
65
|
+
subservice_name
|
66
|
+
trace_key
|
67
|
+
trace_sampled_key
|
68
|
+
use_aws_availability_zone
|
69
|
+
use_grpc
|
70
|
+
use_metadata_service
|
71
|
+
vm_id
|
72
|
+
vm_name
|
73
|
+
zone
|
74
|
+
).freeze
|
75
|
+
|
76
|
+
# rubocop:disable LineLength
|
77
|
+
STATUSZ_TMPL = %(\
|
78
|
+
<!DOCTYPE html>
|
79
|
+
<html>
|
80
|
+
<head>
|
81
|
+
<title>Status for <%= File.basename($PROGRAM_NAME) %></title>
|
82
|
+
<style>
|
83
|
+
body {
|
84
|
+
font-family: sans-serif;
|
85
|
+
}
|
86
|
+
h1 {
|
87
|
+
clear: both;
|
88
|
+
width: 100%;
|
89
|
+
text-align: center;
|
90
|
+
font-size: 120%;
|
91
|
+
background: #eef;
|
92
|
+
}
|
93
|
+
.lefthand {
|
94
|
+
float: left;
|
95
|
+
width: 80%;
|
96
|
+
}
|
97
|
+
.righthand {
|
98
|
+
text-align: right;
|
99
|
+
}
|
100
|
+
td, th {
|
101
|
+
background-color: rgba(0, 0, 0, 0.05);
|
102
|
+
}
|
103
|
+
th {
|
104
|
+
text-align: left;
|
105
|
+
}
|
106
|
+
</style>
|
107
|
+
</head>
|
108
|
+
|
109
|
+
<body>
|
110
|
+
<h1>Status for <%= File.basename($PROGRAM_NAME) %></h1>
|
111
|
+
|
112
|
+
<div>
|
113
|
+
<div class="lefthand">
|
114
|
+
Started: <%= SERVER_START %><br>
|
115
|
+
Up <%= uptime_str %><br>
|
116
|
+
</div>
|
117
|
+
</div>
|
118
|
+
|
119
|
+
<h1>Parsed configuration</h1>
|
120
|
+
|
121
|
+
<table>
|
122
|
+
#{CONFIG_KEYS.map { |k| " <tr><th>#{k}</th><td><%= plugin.#{k} %></td></tr>" }.join("\n")}
|
123
|
+
</table>
|
124
|
+
</body>
|
125
|
+
</html>
|
126
|
+
).freeze
|
127
|
+
# rubocop:enable LineLength
|