fluent-plugin-google-cloud 0.7.28 → 0.7.29
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +7 -5
- data/fluent-plugin-google-cloud.gemspec +1 -1
- data/lib/fluent/plugin/out_google_cloud.rb +41 -28
- data/test/plugin/base_test.rb +200 -60
- data/test/plugin/constants.rb +0 -4
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e47e2821d1838929cf6b2181462d8c2aed2d4a607b2ad4cd0711a7c2d25a5edd
|
4
|
+
data.tar.gz: 0c2d369dfad54166a1ca2f2810f72e69a252212e9b243a7bea97b2afa231481e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d528607184bfc1beb617f187919c2b390344137cc5c01c0506fede8bef2cd237faf645354d7a957962ffe8263d2c496d712544ce79d6a6c238b91de4942f3ddf
|
7
|
+
data.tar.gz: 96ce50ffcd3df259007bb3b73c1d7301d5ac95f93c4862627125dfcd6d20d43c8b75fa2b07578ad324fc430741f36d76457fd4098d01ec4f3d15437928c04c11
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
fluent-plugin-google-cloud (0.7.
|
4
|
+
fluent-plugin-google-cloud (0.7.29)
|
5
5
|
fluentd (= 1.6.3)
|
6
6
|
google-api-client (= 0.30.8)
|
7
7
|
google-cloud-logging (= 1.6.6)
|
@@ -52,10 +52,12 @@ GEM
|
|
52
52
|
representable (~> 3.0)
|
53
53
|
retriable (>= 2.0, < 4.0)
|
54
54
|
signet (~> 0.10)
|
55
|
-
google-cloud-core (1.
|
55
|
+
google-cloud-core (1.5.0)
|
56
56
|
google-cloud-env (~> 1.0)
|
57
|
+
google-cloud-errors (~> 1.0)
|
57
58
|
google-cloud-env (1.3.0)
|
58
59
|
faraday (~> 0.11)
|
60
|
+
google-cloud-errors (1.0.0)
|
59
61
|
google-cloud-logging (1.6.6)
|
60
62
|
concurrent-ruby (~> 1.1)
|
61
63
|
google-cloud-core (~> 1.2)
|
@@ -113,7 +115,7 @@ GEM
|
|
113
115
|
google-cloud-trace (~> 0.33)
|
114
116
|
opencensus (~> 0.5)
|
115
117
|
os (1.0.1)
|
116
|
-
parser (2.7.0.
|
118
|
+
parser (2.7.0.2)
|
117
119
|
ast (~> 2.4.0)
|
118
120
|
power_assert (1.1.5)
|
119
121
|
powerpack (0.1.2)
|
@@ -161,14 +163,14 @@ GEM
|
|
161
163
|
power_assert
|
162
164
|
thor (1.0.1)
|
163
165
|
thread_safe (0.3.6)
|
164
|
-
tins (1.
|
166
|
+
tins (1.24.0)
|
165
167
|
sync
|
166
168
|
tzinfo (1.2.6)
|
167
169
|
thread_safe (~> 0.1)
|
168
170
|
tzinfo-data (1.2019.3)
|
169
171
|
tzinfo (>= 1.0.0)
|
170
172
|
uber (0.1.0)
|
171
|
-
unicode-display_width (1.6.
|
173
|
+
unicode-display_width (1.6.1)
|
172
174
|
webmock (3.6.2)
|
173
175
|
addressable (>= 2.3.6)
|
174
176
|
crack (>= 0.3.2)
|
@@ -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.29'
|
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')
|
@@ -724,7 +724,10 @@ module Fluent
|
|
724
724
|
end
|
725
725
|
end
|
726
726
|
|
727
|
-
ts_secs, ts_nanos = compute_timestamp(record, time)
|
727
|
+
ts_secs, ts_nanos, timestamp = compute_timestamp(record, time)
|
728
|
+
ts_secs, ts_nanos = adjust_timestamp_if_invalid(timestamp, Time.now) \
|
729
|
+
if @adjust_invalid_timestamps && timestamp
|
730
|
+
|
728
731
|
severity = compute_severity(
|
729
732
|
entry_level_resource.type, record, entry_level_common_labels)
|
730
733
|
|
@@ -1663,7 +1666,6 @@ module Fluent
|
|
1663
1666
|
end
|
1664
1667
|
|
1665
1668
|
def compute_timestamp(record, time)
|
1666
|
-
current_time = Time.now
|
1667
1669
|
if record.key?('timestamp') &&
|
1668
1670
|
record['timestamp'].is_a?(Hash) &&
|
1669
1671
|
record['timestamp'].key?('seconds') &&
|
@@ -1715,32 +1717,43 @@ module Fluent
|
|
1715
1717
|
ts_nanos
|
1716
1718
|
end
|
1717
1719
|
|
1718
|
-
|
1719
|
-
|
1720
|
-
|
1721
|
-
|
1722
|
-
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
|
1730
|
-
|
1731
|
-
|
1732
|
-
|
1733
|
-
|
1734
|
-
|
1735
|
-
|
1736
|
-
|
1737
|
-
|
1738
|
-
|
1739
|
-
|
1740
|
-
|
1741
|
-
|
1742
|
-
|
1743
|
-
|
1720
|
+
[ts_secs, ts_nanos, timestamp]
|
1721
|
+
end
|
1722
|
+
|
1723
|
+
# Adjust timestamps from the future.
|
1724
|
+
# The base case is:
|
1725
|
+
# 0. The parsed timestamp is less than one day into the future.
|
1726
|
+
# This is allowed by the API, and should be left unchanged.
|
1727
|
+
#
|
1728
|
+
# Beyond that, there are two cases:
|
1729
|
+
# 1. The parsed timestamp is later in the current year:
|
1730
|
+
# This can happen when system log lines from previous years are missing
|
1731
|
+
# the year, so the date parser assumes the current year.
|
1732
|
+
# We treat these lines as coming from last year. This could label
|
1733
|
+
# 2-year-old logs incorrectly, but this probably isn't super important.
|
1734
|
+
#
|
1735
|
+
# 2. The parsed timestamp is past the end of the current year:
|
1736
|
+
# Since the year is different from the current year, this isn't the
|
1737
|
+
# missing year in system logs. It is unlikely that users explicitly
|
1738
|
+
# write logs at a future date. This could result from an unsynchronized
|
1739
|
+
# clock on a VM, or some random value being parsed as the timestamp.
|
1740
|
+
# We reset the timestamp on those lines to the default value and let the
|
1741
|
+
# downstream API handle it.
|
1742
|
+
def adjust_timestamp_if_invalid(timestamp, current_time)
|
1743
|
+
ts_secs = timestamp.tv_sec
|
1744
|
+
ts_nanos = timestamp.tv_nsec
|
1745
|
+
|
1746
|
+
next_year = Time.mktime(current_time.year + 1)
|
1747
|
+
one_day_later = current_time.to_datetime.next_day.to_time
|
1748
|
+
if timestamp < one_day_later # Case 0.
|
1749
|
+
# Leave the timestamp as-is.
|
1750
|
+
elsif timestamp >= next_year # Case 2.
|
1751
|
+
ts_secs = 0
|
1752
|
+
ts_nanos = 0
|
1753
|
+
else # Case 1.
|
1754
|
+
adjusted_timestamp = timestamp.to_datetime.prev_year.to_time
|
1755
|
+
ts_secs = adjusted_timestamp.tv_sec
|
1756
|
+
# The value of ts_nanos should not change when subtracting a year.
|
1744
1757
|
end
|
1745
1758
|
|
1746
1759
|
[ts_secs, ts_nanos]
|
data/test/plugin/base_test.rb
CHANGED
@@ -943,77 +943,206 @@ module BaseTest
|
|
943
943
|
end
|
944
944
|
end
|
945
945
|
|
946
|
-
def
|
946
|
+
def test_compute_timestamp
|
947
947
|
setup_gce_metadata_stubs
|
948
|
-
|
948
|
+
d = create_driver(APPLICATION_DEFAULT_CONFIG)
|
949
|
+
|
950
|
+
compute_timestamp = lambda do |driver, record, time|
|
951
|
+
driver.instance.send(:compute_timestamp, record, time)
|
952
|
+
end
|
953
|
+
|
954
|
+
current_time = Time.new(2019, 12, 29, 10, 23, 35, '-08:00')
|
955
|
+
one_day_later = current_time.to_datetime.next_day.to_time
|
956
|
+
just_under_one_day_later = one_day_later - 1
|
949
957
|
next_year = Time.mktime(current_time.year + 1)
|
950
958
|
one_second_before_next_year = next_year - 1
|
951
|
-
adjusted_to_last_year =
|
952
|
-
one_second_before_next_year.to_datetime.prev_year.to_time
|
953
959
|
one_second_into_next_year = next_year + 1
|
954
|
-
one_day_into_next_year = next_year.
|
960
|
+
one_day_into_next_year = next_year.to_datetime.next_day.to_time
|
961
|
+
|
962
|
+
[
|
963
|
+
Time.at(123_456.789),
|
964
|
+
Time.at(0),
|
965
|
+
current_time,
|
966
|
+
just_under_one_day_later,
|
967
|
+
one_second_before_next_year,
|
968
|
+
next_year,
|
969
|
+
one_second_into_next_year,
|
970
|
+
one_day_into_next_year
|
971
|
+
].each do |ts|
|
972
|
+
# Use record collection time.
|
973
|
+
ts_secs, ts_nanos, actual_ts = compute_timestamp[d, {
|
974
|
+
'message' => ''
|
975
|
+
}, ts.to_f]
|
976
|
+
assert_timestamp_matches ts, ts_secs, ts_nanos, actual_ts.iso8601
|
977
|
+
|
978
|
+
# Use the (deprecated) timeNanos key.
|
979
|
+
ts_secs, ts_nanos, actual_ts = compute_timestamp[d, {
|
980
|
+
'message' => '',
|
981
|
+
'timeNanos' => ts.tv_sec * 1_000_000_000 + ts.tv_nsec
|
982
|
+
}, 1.0]
|
983
|
+
assert_timestamp_matches ts, ts_secs, ts_nanos, actual_ts.iso8601
|
984
|
+
|
985
|
+
# Use the structured timestamp key.
|
986
|
+
ts_secs, ts_nanos, actual_ts = compute_timestamp[d, {
|
987
|
+
'message' => '',
|
988
|
+
'timestamp' => { 'seconds' => ts.tv_sec, 'nanos' => ts.tv_nsec }
|
989
|
+
}, 1.0]
|
990
|
+
assert_timestamp_matches ts, ts_secs, ts_nanos, actual_ts.iso8601
|
991
|
+
|
992
|
+
# Use the timestampSeconds/timestampNanos keys.
|
993
|
+
ts_secs, ts_nanos, actual_ts = compute_timestamp[d, {
|
994
|
+
'message' => '',
|
995
|
+
'timestampSeconds' => ts.tv_sec,
|
996
|
+
'timestampNanos' => ts.tv_nsec
|
997
|
+
}, 1.0]
|
998
|
+
assert_timestamp_matches ts, ts_secs, ts_nanos, actual_ts.iso8601
|
999
|
+
|
1000
|
+
# Use the string timestampSeconds/timestampNanos keys.
|
1001
|
+
ts_secs, ts_nanos, actual_ts = compute_timestamp[d, {
|
1002
|
+
'message' => '',
|
1003
|
+
'timestampSeconds' => ts.tv_sec.to_s,
|
1004
|
+
'timestampNanos' => ts.tv_nsec.to_s
|
1005
|
+
}, 1.0]
|
1006
|
+
assert_timestamp_matches ts, ts_secs, ts_nanos, actual_ts.iso8601
|
1007
|
+
end
|
1008
|
+
end
|
1009
|
+
|
1010
|
+
def test_adjust_timestamp
|
1011
|
+
setup_gce_metadata_stubs
|
1012
|
+
d = create_driver(APPLICATION_DEFAULT_CONFIG)
|
1013
|
+
|
1014
|
+
adjust_timestamp_if_invalid = lambda do |driver, timestamp, current_time|
|
1015
|
+
driver.instance.send(:adjust_timestamp_if_invalid, timestamp,
|
1016
|
+
current_time)
|
1017
|
+
end
|
1018
|
+
|
1019
|
+
december_29 = Time.new(2019, 12, 29, 10, 23, 35, '-08:00')
|
1020
|
+
december_31 = Time.new(2019, 12, 31, 10, 23, 35, '-08:00')
|
1021
|
+
january_1 = Time.new(2020, 1, 1, 10, 23, 35, '-08:00')
|
1022
|
+
|
955
1023
|
{
|
956
|
-
|
957
|
-
|
958
|
-
Time.
|
959
|
-
|
960
|
-
|
961
|
-
next_year
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
Time.
|
967
|
-
Time.
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
1024
|
+
# December 29, 2019 (normal operation).
|
1025
|
+
december_29 => begin
|
1026
|
+
one_day_later = Time.new(2019, 12, 30, 10, 23, 35, '-08:00')
|
1027
|
+
one_day_a_year_earlier = Time.new(2018, 12, 30, 10, 23, 35, '-08:00')
|
1028
|
+
just_under_one_day_later = Time.new(2019, 12, 30, 10, 23, 34, '-08:00')
|
1029
|
+
next_year = Time.new(2020, 1, 1, 0, 0, 0, '-08:00')
|
1030
|
+
one_second_before_next_year =
|
1031
|
+
Time.new(2019, 12, 31, 11, 59, 59, '-08:00')
|
1032
|
+
one_second_before_this_year =
|
1033
|
+
Time.new(2018, 12, 31, 11, 59, 59, '-08:00')
|
1034
|
+
one_second_into_next_year = Time.new(2020, 1, 1, 0, 0, 1, '-08:00')
|
1035
|
+
one_day_into_next_year = Time.new(2020, 1, 2, 0, 0, 0, '-08:00')
|
1036
|
+
{
|
1037
|
+
Time.at(123_456.789) => Time.at(123_456.789),
|
1038
|
+
Time.at(0) => Time.at(0),
|
1039
|
+
december_29 => december_29,
|
1040
|
+
one_day_later => one_day_a_year_earlier,
|
1041
|
+
just_under_one_day_later => just_under_one_day_later,
|
1042
|
+
one_second_before_next_year => one_second_before_this_year,
|
1043
|
+
next_year => Time.at(0),
|
1044
|
+
one_second_into_next_year => Time.at(0),
|
1045
|
+
one_day_into_next_year => Time.at(0)
|
1046
|
+
}
|
1047
|
+
end,
|
1048
|
+
# January 1, 2020 (normal operation).
|
1049
|
+
january_1 => begin
|
1050
|
+
one_day_later = Time.new(2020, 1, 2, 10, 23, 35, '-08:00')
|
1051
|
+
one_day_a_year_earlier = Time.new(2019, 1, 2, 10, 23, 35, '-08:00')
|
1052
|
+
just_under_one_day_later = Time.new(2020, 1, 2, 10, 23, 34, '-08:00')
|
1053
|
+
next_year = Time.new(2021, 1, 1, 0, 0, 0, '-08:00')
|
1054
|
+
one_second_before_next_year =
|
1055
|
+
Time.new(2020, 12, 31, 11, 59, 59, '-08:00')
|
1056
|
+
one_second_before_this_year =
|
1057
|
+
Time.new(2019, 12, 31, 11, 59, 59, '-08:00')
|
1058
|
+
one_second_into_next_year = Time.new(2021, 1, 1, 0, 0, 1, '-08:00')
|
1059
|
+
one_day_into_next_year = Time.new(2021, 1, 2, 0, 0, 0, '-08:00')
|
1060
|
+
{
|
1061
|
+
Time.at(123_456.789) => Time.at(123_456.789),
|
1062
|
+
Time.at(0) => Time.at(0),
|
1063
|
+
january_1 => january_1,
|
1064
|
+
one_day_later => one_day_a_year_earlier,
|
1065
|
+
just_under_one_day_later => just_under_one_day_later,
|
1066
|
+
one_second_before_next_year => one_second_before_this_year,
|
1067
|
+
next_year => Time.at(0),
|
1068
|
+
one_second_into_next_year => Time.at(0),
|
1069
|
+
one_day_into_next_year => Time.at(0)
|
1070
|
+
}
|
1071
|
+
end,
|
1072
|
+
# December 31, 2019 (next day overlaps new year).
|
1073
|
+
december_31 => begin
|
1074
|
+
one_day_later = Time.new(2020, 1, 1, 10, 23, 35, '-08:00')
|
1075
|
+
just_under_one_day_later = Time.new(2020, 1, 1, 10, 23, 34, '-08:00')
|
1076
|
+
next_year = Time.new(2020, 1, 1, 0, 0, 0, '-08:00')
|
1077
|
+
one_second_before_next_year =
|
1078
|
+
Time.new(2019, 12, 31, 11, 59, 59, '-08:00')
|
1079
|
+
one_second_into_next_year = Time.new(2020, 1, 1, 0, 0, 1, '-08:00')
|
1080
|
+
one_day_into_next_year = Time.new(2020, 1, 2, 0, 0, 0, '-08:00')
|
1081
|
+
{
|
1082
|
+
Time.at(123_456.789) => Time.at(123_456.789),
|
1083
|
+
Time.at(0) => Time.at(0),
|
1084
|
+
december_31 => december_31,
|
1085
|
+
one_day_later => Time.at(0), # Falls into the next year.
|
1086
|
+
just_under_one_day_later => just_under_one_day_later,
|
1087
|
+
one_second_before_next_year => one_second_before_next_year,
|
1088
|
+
next_year => next_year,
|
1089
|
+
one_second_into_next_year => one_second_into_next_year,
|
1090
|
+
one_day_into_next_year => Time.at(0)
|
1091
|
+
}
|
1092
|
+
end
|
1093
|
+
}.each do |current_time, timestamps|
|
975
1094
|
timestamps.each do |ts, expected_ts|
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
995
|
-
|
996
|
-
|
997
|
-
|
998
|
-
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
|
1004
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
|
1095
|
+
ts_secs, ts_nanos = adjust_timestamp_if_invalid[d, ts, current_time]
|
1096
|
+
adjusted_ts = Time.at(ts_secs, ts_nanos / 1_000.0)
|
1097
|
+
assert_timestamp_matches expected_ts, ts_secs, ts_nanos,
|
1098
|
+
adjusted_ts.iso8601
|
1099
|
+
end
|
1100
|
+
end
|
1101
|
+
end
|
1102
|
+
|
1103
|
+
def test_log_timestamps
|
1104
|
+
setup_gce_metadata_stubs
|
1105
|
+
current_time = Time.now
|
1106
|
+
{
|
1107
|
+
# Verify that timestamps make it through.
|
1108
|
+
Time.at(123_456.789) => Time.at(123_456.789),
|
1109
|
+
Time.at(0) => Time.at(0),
|
1110
|
+
current_time => current_time
|
1111
|
+
}.each do |ts, expected_ts|
|
1112
|
+
emit_index = 0
|
1113
|
+
setup_logging_stubs do
|
1114
|
+
@logs_sent = []
|
1115
|
+
d = create_driver(APPLICATION_DEFAULT_CONFIG)
|
1116
|
+
# Test the "native" fluentd timestamp as well as our nanosecond tags.
|
1117
|
+
d.emit({ 'message' => log_entry(emit_index) }, ts.to_f)
|
1118
|
+
emit_index += 1
|
1119
|
+
d.emit('message' => log_entry(emit_index),
|
1120
|
+
'timeNanos' => ts.tv_sec * 1_000_000_000 + ts.tv_nsec)
|
1121
|
+
emit_index += 1
|
1122
|
+
d.emit('message' => log_entry(emit_index),
|
1123
|
+
'timestamp' => { 'seconds' => ts.tv_sec,
|
1124
|
+
'nanos' => ts.tv_nsec })
|
1125
|
+
emit_index += 1
|
1126
|
+
d.emit('message' => log_entry(emit_index),
|
1127
|
+
'timestampSeconds' => ts.tv_sec,
|
1128
|
+
'timestampNanos' => ts.tv_nsec)
|
1129
|
+
emit_index += 1
|
1130
|
+
d.emit('message' => log_entry(emit_index),
|
1131
|
+
'timestampSeconds' => ts.tv_sec.to_s,
|
1132
|
+
'timestampNanos' => ts.tv_nsec.to_s)
|
1133
|
+
emit_index += 1
|
1134
|
+
d.run
|
1135
|
+
verify_log_entries(emit_index, COMPUTE_PARAMS) do |entry, i|
|
1136
|
+
verify_default_log_entry_text(entry['textPayload'], i, entry)
|
1137
|
+
actual_timestamp = timestamp_parse(entry['timestamp'])
|
1138
|
+
assert_timestamp_matches expected_ts, actual_timestamp['seconds'],
|
1139
|
+
actual_timestamp['nanos'], entry
|
1011
1140
|
end
|
1012
1141
|
end
|
1013
1142
|
end
|
1014
1143
|
end
|
1015
1144
|
|
1016
|
-
def
|
1145
|
+
def test_malformed_timestamp_field
|
1017
1146
|
setup_gce_metadata_stubs
|
1018
1147
|
setup_logging_stubs do
|
1019
1148
|
d = create_driver
|
@@ -2749,6 +2878,17 @@ module BaseTest
|
|
2749
2878
|
_undefined
|
2750
2879
|
end
|
2751
2880
|
|
2881
|
+
# Compare the timestamp seconds and nanoseconds with the expected timestamp.
|
2882
|
+
def assert_timestamp_matches(expected_ts, ts_secs, ts_nanos, entry)
|
2883
|
+
assert_equal expected_ts.tv_sec, ts_secs, entry
|
2884
|
+
# Fluentd v0.14 onwards supports nanosecond timestamp values.
|
2885
|
+
# Added in 600 ns delta to avoid flaky tests introduced
|
2886
|
+
# due to rounding error in double-precision floating-point numbers
|
2887
|
+
# (to account for the missing 9 bits of precision ~ 512 ns).
|
2888
|
+
# See http://wikipedia.org/wiki/Double-precision_floating-point_format.
|
2889
|
+
assert_in_delta expected_ts.tv_nsec, ts_nanos, 600, entry
|
2890
|
+
end
|
2891
|
+
|
2752
2892
|
def assert_prometheus_metric_value(metric_name, expected_value, labels = {})
|
2753
2893
|
metric = Prometheus::Client.registry.get(metric_name)
|
2754
2894
|
assert_not_nil(metric)
|
data/test/plugin/constants.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-google-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.29
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stackdriver Agents Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|