google-cloud-logging 2.0.0
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 +7 -0
- data/.yardopts +18 -0
- data/AUTHENTICATION.md +178 -0
- data/CHANGELOG.md +407 -0
- data/CODE_OF_CONDUCT.md +40 -0
- data/CONTRIBUTING.md +188 -0
- data/INSTRUMENTATION.md +71 -0
- data/LICENSE +201 -0
- data/LOGGING.md +32 -0
- data/OVERVIEW.md +321 -0
- data/TROUBLESHOOTING.md +31 -0
- data/lib/google-cloud-logging.rb +161 -0
- data/lib/google/cloud/logging.rb +188 -0
- data/lib/google/cloud/logging/async_writer.rb +513 -0
- data/lib/google/cloud/logging/convert.rb +70 -0
- data/lib/google/cloud/logging/credentials.rb +44 -0
- data/lib/google/cloud/logging/entry.rb +528 -0
- data/lib/google/cloud/logging/entry/http_request.rb +167 -0
- data/lib/google/cloud/logging/entry/list.rb +178 -0
- data/lib/google/cloud/logging/entry/operation.rb +91 -0
- data/lib/google/cloud/logging/entry/source_location.rb +85 -0
- data/lib/google/cloud/logging/errors.rb +101 -0
- data/lib/google/cloud/logging/log/list.rb +156 -0
- data/lib/google/cloud/logging/logger.rb +633 -0
- data/lib/google/cloud/logging/metric.rb +168 -0
- data/lib/google/cloud/logging/metric/list.rb +170 -0
- data/lib/google/cloud/logging/middleware.rb +307 -0
- data/lib/google/cloud/logging/project.rb +838 -0
- data/lib/google/cloud/logging/rails.rb +232 -0
- data/lib/google/cloud/logging/resource.rb +85 -0
- data/lib/google/cloud/logging/resource_descriptor.rb +137 -0
- data/lib/google/cloud/logging/resource_descriptor/list.rb +175 -0
- data/lib/google/cloud/logging/service.rb +239 -0
- data/lib/google/cloud/logging/sink.rb +315 -0
- data/lib/google/cloud/logging/sink/list.rb +168 -0
- data/lib/google/cloud/logging/version.rb +22 -0
- metadata +304 -0
@@ -0,0 +1,175 @@
|
|
1
|
+
# Copyright 2016 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "delegate"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Logging
|
21
|
+
class ResourceDescriptor
|
22
|
+
##
|
23
|
+
# ResourceDescriptor::List is a special case Array with additional
|
24
|
+
# values.
|
25
|
+
class List < DelegateClass(::Array)
|
26
|
+
##
|
27
|
+
# If not empty, indicates that there are more records that match
|
28
|
+
# the request and this value should be passed to continue.
|
29
|
+
attr_accessor :token
|
30
|
+
|
31
|
+
##
|
32
|
+
# @private Create a new ResourceDescriptor::List with an array of
|
33
|
+
# ResourceDescriptor instances.
|
34
|
+
def initialize arr = []
|
35
|
+
super arr
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# Whether there is a next page of resource descriptors.
|
40
|
+
#
|
41
|
+
# @return [Boolean]
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# require "google/cloud/logging"
|
45
|
+
#
|
46
|
+
# logging = Google::Cloud::Logging.new
|
47
|
+
#
|
48
|
+
# resource_descriptors = logging.resource_descriptors
|
49
|
+
# if resource_descriptors.next?
|
50
|
+
# next_resource_descriptors = resource_descriptors.next
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
def next?
|
54
|
+
!token.nil?
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Retrieve the next page of resource descriptors.
|
59
|
+
#
|
60
|
+
# @return [Sink::List]
|
61
|
+
#
|
62
|
+
# @example
|
63
|
+
# require "google/cloud/logging"
|
64
|
+
#
|
65
|
+
# logging = Google::Cloud::Logging.new
|
66
|
+
#
|
67
|
+
# resource_descriptors = logging.resource_descriptors
|
68
|
+
# if resource_descriptors.next?
|
69
|
+
# next_resource_descriptors = resource_descriptors.next
|
70
|
+
# end
|
71
|
+
#
|
72
|
+
def next
|
73
|
+
return nil unless next?
|
74
|
+
ensure_service!
|
75
|
+
list_grpc = @service.list_resource_descriptors(
|
76
|
+
token: token, max: @max
|
77
|
+
)
|
78
|
+
self.class.from_grpc list_grpc, @service, @max
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# Retrieves remaining results by repeatedly invoking {#next} until
|
83
|
+
# {#next?} returns `false`. Calls the given block once for each
|
84
|
+
# result, which is passed as the argument to the block.
|
85
|
+
#
|
86
|
+
# An Enumerator is returned if no block is given.
|
87
|
+
#
|
88
|
+
# This method will make repeated API calls until all remaining results
|
89
|
+
# are retrieved. (Unlike `#each`, for example, which merely iterates
|
90
|
+
# over the results returned by a single API call.) Use with caution.
|
91
|
+
#
|
92
|
+
# @param [Integer] request_limit The upper limit of API requests to
|
93
|
+
# make to load all resource descriptors. Default is no limit.
|
94
|
+
# @yield [resource_descriptor] The block for accessing each resource
|
95
|
+
# descriptor.
|
96
|
+
# @yieldparam [ResourceDescriptor] resource_descriptor The resource
|
97
|
+
# descriptor object.
|
98
|
+
#
|
99
|
+
# @return [Enumerator]
|
100
|
+
#
|
101
|
+
# @example Iterating each resource descriptor by passing a block:
|
102
|
+
# require "google/cloud/logging"
|
103
|
+
#
|
104
|
+
# logging = Google::Cloud::Logging.new
|
105
|
+
# resource_descriptors = logging.resource_descriptors
|
106
|
+
#
|
107
|
+
# resource_descriptors.all do |rd|
|
108
|
+
# puts rd.type
|
109
|
+
# end
|
110
|
+
#
|
111
|
+
# @example Using the enumerator by not passing a block:
|
112
|
+
# require "google/cloud/logging"
|
113
|
+
#
|
114
|
+
# logging = Google::Cloud::Logging.new
|
115
|
+
# resource_descriptors = logging.resource_descriptors
|
116
|
+
#
|
117
|
+
# all_types = resource_descriptors.all.map do |rd|
|
118
|
+
# rd.type
|
119
|
+
# end
|
120
|
+
#
|
121
|
+
# @example Limit the number of API calls made:
|
122
|
+
# require "google/cloud/logging"
|
123
|
+
#
|
124
|
+
# logging = Google::Cloud::Logging.new
|
125
|
+
# resource_descriptors = logging.resource_descriptors
|
126
|
+
#
|
127
|
+
# resource_descriptors.all(request_limit: 10) do |rd|
|
128
|
+
# puts rd.type
|
129
|
+
# end
|
130
|
+
#
|
131
|
+
def all request_limit: nil
|
132
|
+
request_limit = request_limit.to_i if request_limit
|
133
|
+
unless block_given?
|
134
|
+
return enum_for :all, request_limit: request_limit
|
135
|
+
end
|
136
|
+
results = self
|
137
|
+
loop do
|
138
|
+
results.each { |r| yield r }
|
139
|
+
if request_limit
|
140
|
+
request_limit -= 1
|
141
|
+
break if request_limit < 0
|
142
|
+
end
|
143
|
+
break unless results.next?
|
144
|
+
results = results.next
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
##
|
149
|
+
# @private New ResourceDescriptor::List from a
|
150
|
+
# Google::Cloud::Logging::V2::ListMonitoredResourceDescriptorsResponse
|
151
|
+
# object.
|
152
|
+
def self.from_grpc grpc_list, service, max = nil
|
153
|
+
rds = new(Array(grpc_list.resource_descriptors).map do |grpc|
|
154
|
+
ResourceDescriptor.from_grpc grpc
|
155
|
+
end)
|
156
|
+
token = grpc_list.next_page_token
|
157
|
+
token = nil if token == "".freeze
|
158
|
+
rds.instance_variable_set :@token, token
|
159
|
+
rds.instance_variable_set :@service, service
|
160
|
+
rds.instance_variable_set :@max, max
|
161
|
+
rds
|
162
|
+
end
|
163
|
+
|
164
|
+
protected
|
165
|
+
|
166
|
+
##
|
167
|
+
# Raise an error unless an active service is available.
|
168
|
+
def ensure_service!
|
169
|
+
raise "Must have active service" unless @service
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
@@ -0,0 +1,239 @@
|
|
1
|
+
# Copyright 2016 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "google/cloud/errors"
|
17
|
+
require "google/cloud/logging/version"
|
18
|
+
require "google/cloud/logging/v2"
|
19
|
+
require "uri"
|
20
|
+
|
21
|
+
module Google
|
22
|
+
module Cloud
|
23
|
+
module Logging
|
24
|
+
##
|
25
|
+
# @private Represents the gRPC Logging service, including all the API
|
26
|
+
# methods.
|
27
|
+
class Service
|
28
|
+
attr_accessor :project, :credentials, :timeout, :host
|
29
|
+
|
30
|
+
##
|
31
|
+
# Creates a new Service instance.
|
32
|
+
def initialize project, credentials, timeout: nil, host: nil
|
33
|
+
@project = project
|
34
|
+
@credentials = credentials
|
35
|
+
@timeout = timeout
|
36
|
+
@host = host
|
37
|
+
end
|
38
|
+
|
39
|
+
def logging
|
40
|
+
return mocked_logging if mocked_logging
|
41
|
+
@logging ||= \
|
42
|
+
V2::LoggingService::Client.new do |config|
|
43
|
+
config.credentials = credentials if credentials
|
44
|
+
config.timeout = timeout if timeout
|
45
|
+
config.endpoint = host if host
|
46
|
+
config.lib_name = "gccl"
|
47
|
+
config.lib_version = Google::Cloud::Logging::VERSION
|
48
|
+
config.metadata = { "google-cloud-resource-prefix" => "projects/#{@project}" }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
attr_accessor :mocked_logging
|
52
|
+
|
53
|
+
def sinks
|
54
|
+
return mocked_sinks if mocked_sinks
|
55
|
+
@sinks ||= \
|
56
|
+
V2::ConfigService::Client.new do |config|
|
57
|
+
config.credentials = credentials if credentials
|
58
|
+
config.timeout = timeout if timeout
|
59
|
+
config.endpoint = host if host
|
60
|
+
config.lib_name = "gccl"
|
61
|
+
config.lib_version = Google::Cloud::Logging::VERSION
|
62
|
+
config.metadata = { "google-cloud-resource-prefix" => "projects/#{@project}" }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
attr_accessor :mocked_sinks
|
66
|
+
|
67
|
+
def metrics
|
68
|
+
return mocked_metrics if mocked_metrics
|
69
|
+
@metrics ||= \
|
70
|
+
V2::MetricsService::Client.new do |config|
|
71
|
+
config.credentials = credentials if credentials
|
72
|
+
config.timeout = timeout if timeout
|
73
|
+
config.endpoint = host if host
|
74
|
+
config.lib_name = "gccl"
|
75
|
+
config.lib_version = Google::Cloud::Logging::VERSION
|
76
|
+
config.metadata = { "google-cloud-resource-prefix" => "projects/#{@project}" }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
attr_accessor :mocked_metrics
|
80
|
+
|
81
|
+
def list_entries resources: nil, filter: nil, order: nil, token: nil,
|
82
|
+
max: nil, projects: nil
|
83
|
+
|
84
|
+
project_ids = Array(projects).map { |p| "projects/#{p}" }
|
85
|
+
resource_names = Array(resources) + project_ids
|
86
|
+
resource_names = ["projects/#{@project}"] if resource_names.empty?
|
87
|
+
paged_enum = logging.list_log_entries resource_names: resource_names,
|
88
|
+
filter: filter,
|
89
|
+
order_by: order,
|
90
|
+
page_size: max,
|
91
|
+
page_token: token
|
92
|
+
paged_enum.response
|
93
|
+
end
|
94
|
+
|
95
|
+
def write_entries entries, log_name: nil, resource: nil, labels: nil,
|
96
|
+
partial_success: nil
|
97
|
+
# Fix log names so they are the full path
|
98
|
+
entries = Array(entries).each do |entry|
|
99
|
+
entry.log_name = log_path entry.log_name
|
100
|
+
end
|
101
|
+
resource = resource.to_grpc if resource
|
102
|
+
labels = Hash[labels.map { |k, v| [String(k), String(v)] }] if labels
|
103
|
+
logging.write_log_entries entries: entries,
|
104
|
+
log_name: log_path(log_name),
|
105
|
+
resource: resource,
|
106
|
+
labels: labels,
|
107
|
+
partial_success: partial_success
|
108
|
+
end
|
109
|
+
|
110
|
+
def list_logs resource: nil, token: nil, max: nil
|
111
|
+
parent = resource || "projects/#{@project}"
|
112
|
+
paged_enum = logging.list_logs parent: parent,
|
113
|
+
page_size: max,
|
114
|
+
page_token: token
|
115
|
+
paged_enum.response
|
116
|
+
end
|
117
|
+
|
118
|
+
def delete_log name
|
119
|
+
logging.delete_log log_name: log_path(name)
|
120
|
+
end
|
121
|
+
|
122
|
+
def list_resource_descriptors token: nil, max: nil
|
123
|
+
logging.list_monitored_resource_descriptors page_size: max, page_token: token
|
124
|
+
end
|
125
|
+
|
126
|
+
def list_sinks token: nil, max: nil
|
127
|
+
paged_enum = sinks.list_sinks parent: project_path, page_size: max, page_token: token
|
128
|
+
paged_enum.response
|
129
|
+
end
|
130
|
+
|
131
|
+
def create_sink name, destination, filter, unique_writer_identity: nil
|
132
|
+
sink = Google::Cloud::Logging::V2::LogSink.new(
|
133
|
+
{
|
134
|
+
name: name, destination: destination, filter: filter
|
135
|
+
}.delete_if { |_, v| v.nil? }
|
136
|
+
)
|
137
|
+
sinks.create_sink parent: project_path,
|
138
|
+
sink: sink,
|
139
|
+
unique_writer_identity: unique_writer_identity
|
140
|
+
end
|
141
|
+
|
142
|
+
def get_sink name
|
143
|
+
sinks.get_sink sink_name: sink_path(name)
|
144
|
+
end
|
145
|
+
|
146
|
+
def update_sink name, destination, filter, unique_writer_identity: nil
|
147
|
+
sink = Google::Cloud::Logging::V2::LogSink.new(
|
148
|
+
{
|
149
|
+
name: name, destination: destination, filter: filter
|
150
|
+
}.delete_if { |_, v| v.nil? }
|
151
|
+
)
|
152
|
+
sinks.update_sink sink_name: sink_path(name),
|
153
|
+
sink: sink,
|
154
|
+
unique_writer_identity: unique_writer_identity
|
155
|
+
end
|
156
|
+
|
157
|
+
def delete_sink name
|
158
|
+
sinks.delete_sink sink_name: sink_path(name)
|
159
|
+
end
|
160
|
+
|
161
|
+
def list_metrics token: nil, max: nil
|
162
|
+
paged_enum = metrics.list_log_metrics parent: project_path,
|
163
|
+
page_size: max,
|
164
|
+
page_token: token
|
165
|
+
paged_enum.response
|
166
|
+
end
|
167
|
+
|
168
|
+
def create_metric name, filter, description
|
169
|
+
metric = Google::Cloud::Logging::V2::LogMetric.new(
|
170
|
+
{ name: name, description: description,
|
171
|
+
filter: filter }.delete_if { |_, v| v.nil? }
|
172
|
+
)
|
173
|
+
metrics.create_log_metric parent: project_path, metric: metric
|
174
|
+
end
|
175
|
+
|
176
|
+
def get_metric name
|
177
|
+
metrics.get_log_metric metric_name: metric_path(name)
|
178
|
+
end
|
179
|
+
|
180
|
+
def update_metric name, description, filter
|
181
|
+
metric = Google::Cloud::Logging::V2::LogMetric.new(
|
182
|
+
{ name: name, description: description,
|
183
|
+
filter: filter }.delete_if { |_, v| v.nil? }
|
184
|
+
)
|
185
|
+
metrics.update_log_metric metric_name: metric_path(name), metric: metric
|
186
|
+
end
|
187
|
+
|
188
|
+
def delete_metric name
|
189
|
+
metrics.delete_log_metric metric_name: metric_path(name)
|
190
|
+
end
|
191
|
+
|
192
|
+
def log_path log_name
|
193
|
+
return nil if log_name.nil?
|
194
|
+
return log_name if log_name.empty?
|
195
|
+
return log_name if log_name.to_s.include? "/"
|
196
|
+
"#{project_path}/logs/#{log_name}"
|
197
|
+
end
|
198
|
+
|
199
|
+
def inspect
|
200
|
+
"#{self.class}(#{@project})"
|
201
|
+
end
|
202
|
+
|
203
|
+
protected
|
204
|
+
|
205
|
+
def project_path
|
206
|
+
"projects/#{@project}"
|
207
|
+
end
|
208
|
+
|
209
|
+
def sink_path sink_name
|
210
|
+
return sink_name if sink_name.to_s.include? "/"
|
211
|
+
"#{project_path}/sinks/#{sink_name}"
|
212
|
+
end
|
213
|
+
|
214
|
+
def metric_path metric_name
|
215
|
+
return metric_name if metric_name.to_s.include? "/"
|
216
|
+
"#{project_path}/metrics/#{metric_name}"
|
217
|
+
end
|
218
|
+
|
219
|
+
##
|
220
|
+
# @private Get a Google::Protobuf::Timestamp object from a Time object.
|
221
|
+
def time_to_timestamp time
|
222
|
+
return nil if time.nil?
|
223
|
+
# Make sure we have a Time object
|
224
|
+
return nil unless time.respond_to? :to_time
|
225
|
+
time = time.to_time
|
226
|
+
Google::Protobuf::Timestamp.new seconds: time.to_i, nanos: time.nsec
|
227
|
+
end
|
228
|
+
|
229
|
+
##
|
230
|
+
# @private Get a Time object from a Google::Protobuf::Timestamp object.
|
231
|
+
def timestamp_to_time timestamp
|
232
|
+
return nil if timestamp.nil?
|
233
|
+
# Time.at takes microseconds, so convert nano seconds to microseconds
|
234
|
+
Time.at timestamp.seconds, Rational(timestamp.nanos, 1000)
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
@@ -0,0 +1,315 @@
|
|
1
|
+
# Copyright 2016 Google LLC
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
|
16
|
+
require "google/cloud/logging/sink/list"
|
17
|
+
|
18
|
+
module Google
|
19
|
+
module Cloud
|
20
|
+
module Logging
|
21
|
+
##
|
22
|
+
# # Sink
|
23
|
+
#
|
24
|
+
# Used to export log entries outside Stackdriver Logging. When you create
|
25
|
+
# a sink, new log entries are exported. Stackdriver Logging does not send
|
26
|
+
# previously-ingested log entries to the sink's destination.
|
27
|
+
#
|
28
|
+
# A logs filter controls which log entries are exported.
|
29
|
+
#
|
30
|
+
# Before creating the sink, ensure that you have granted the sink's
|
31
|
+
# _unique writer identity_ permission to write logs to the destination.
|
32
|
+
# See [Destination
|
33
|
+
# permissions](https://cloud.google.com/logging/docs/export/configure_export_v2#dest-auth).
|
34
|
+
#
|
35
|
+
# You can retrieve an existing sink with {Project#sink}.
|
36
|
+
#
|
37
|
+
# @see https://cloud.google.com/logging/docs/export
|
38
|
+
# Overview of logs exports
|
39
|
+
# @see https://cloud.google.com/logging/docs/reference/v2/rpc/google.logging.v2#configservicev2
|
40
|
+
# ConfigService API which includes sink methods
|
41
|
+
#
|
42
|
+
# @example
|
43
|
+
# require "google/cloud/storage"
|
44
|
+
#
|
45
|
+
# storage = Google::Cloud::Storage.new
|
46
|
+
# bucket = storage.create_bucket "my-logs-bucket"
|
47
|
+
#
|
48
|
+
# # Grant owner permission to Stackdriver Logging service
|
49
|
+
# email = "cloud-logs@google.com"
|
50
|
+
# bucket.acl.add_owner "group-#{email}"
|
51
|
+
#
|
52
|
+
# require "google/cloud/logging"
|
53
|
+
#
|
54
|
+
# logging = Google::Cloud::Logging.new
|
55
|
+
# sink = logging.create_sink "my-sink",
|
56
|
+
# "storage.googleapis.com/#{bucket.id}"
|
57
|
+
#
|
58
|
+
class Sink
|
59
|
+
##
|
60
|
+
# @private The gRPC Service object.
|
61
|
+
attr_accessor :service
|
62
|
+
|
63
|
+
##
|
64
|
+
# @private The Google API Client object.
|
65
|
+
attr_accessor :grpc
|
66
|
+
|
67
|
+
##
|
68
|
+
# @private Create an empty Sink object.
|
69
|
+
def initialize
|
70
|
+
@service = nil
|
71
|
+
@grpc = Google::Cloud::Logging::V2::LogSink.new
|
72
|
+
end
|
73
|
+
|
74
|
+
##
|
75
|
+
# The client-assigned sink identifier. Sink identifiers are limited to
|
76
|
+
# 1000 characters and can include only the following characters: `A-Z`,
|
77
|
+
# `a-z`, `0-9`, and the special characters `_-.`.
|
78
|
+
def name
|
79
|
+
@grpc.name
|
80
|
+
end
|
81
|
+
|
82
|
+
##
|
83
|
+
# The export destination. See [Properties of
|
84
|
+
# Sinks](https://cloud.google.com/logging/docs/export#sink-terms).
|
85
|
+
def destination
|
86
|
+
@grpc.destination
|
87
|
+
end
|
88
|
+
|
89
|
+
##
|
90
|
+
# Updates the export destination. See [Properties of
|
91
|
+
# Sinks](https://cloud.google.com/logging/docs/export#sink-terms).
|
92
|
+
def destination= destination
|
93
|
+
@grpc.destination = destination
|
94
|
+
end
|
95
|
+
|
96
|
+
##
|
97
|
+
# An [advanced logs
|
98
|
+
# filter](https://cloud.google.com/logging/docs/view/advanced-queries)
|
99
|
+
# that defines the log entries to be exported. The filter must be
|
100
|
+
# consistent with the log entry format designed by the `version`
|
101
|
+
# parameter, regardless of the format of the log entry that was
|
102
|
+
# originally written to Stackdriver Logging.
|
103
|
+
def filter
|
104
|
+
@grpc.filter
|
105
|
+
end
|
106
|
+
|
107
|
+
##
|
108
|
+
# Updates the [advanced logs
|
109
|
+
# filter](https://cloud.google.com/logging/docs/view/advanced-queries)
|
110
|
+
# that defines the log entries to be exported. The filter must be
|
111
|
+
# consistent with the log entry format designed by the `version`
|
112
|
+
# parameter, regardless of the format of the log entry that was
|
113
|
+
# originally written to Stackdriver Logging.
|
114
|
+
def filter= filter
|
115
|
+
@grpc.filter = filter
|
116
|
+
end
|
117
|
+
|
118
|
+
##
|
119
|
+
# **Deprecated.** The log entry version used when exporting log entries
|
120
|
+
# from this sink. This version does not have to correspond to the
|
121
|
+
# version of the log entry when it was written to Stackdriver Logging.
|
122
|
+
#
|
123
|
+
# @deprecated The v2 format is used by default and cannot be changed.
|
124
|
+
def version
|
125
|
+
warn "[DEPRECATION] version is deprecated."
|
126
|
+
:V2
|
127
|
+
end
|
128
|
+
|
129
|
+
##
|
130
|
+
# **Deprecated.** Updates the log entry version used when exporting log
|
131
|
+
# entries from this sink. This version does not have to correspond to
|
132
|
+
# the version of the log entry when it was written to Stackdriver
|
133
|
+
# Logging. Accepted values are `:VERSION_FORMAT_UNSPECIFIED`, `:V2`, and
|
134
|
+
# `:V1`.
|
135
|
+
#
|
136
|
+
# @deprecated The v2 format is used by default and cannot be changed.
|
137
|
+
def version= _version
|
138
|
+
warn "[DEPRECATION] version= is deprecated and will be ignored."
|
139
|
+
end
|
140
|
+
|
141
|
+
##
|
142
|
+
# Helper to determine if the sink's version is
|
143
|
+
# `VERSION_FORMAT_UNSPECIFIED`.
|
144
|
+
#
|
145
|
+
# @deprecated The v2 format is used by default and cannot be changed.
|
146
|
+
def unspecified?
|
147
|
+
warn "[DEPRECATION] unspecified? is deprecated."
|
148
|
+
false
|
149
|
+
end
|
150
|
+
|
151
|
+
##
|
152
|
+
# Helper to determine if the sink's version is `V2`.
|
153
|
+
#
|
154
|
+
# @deprecated The v2 format is used by default and cannot be changed.
|
155
|
+
def v2?
|
156
|
+
warn "[DEPRECATION] v2? is deprecated."
|
157
|
+
true
|
158
|
+
end
|
159
|
+
|
160
|
+
##
|
161
|
+
# Helper to determine if the sink's version is `V1`.
|
162
|
+
#
|
163
|
+
# @deprecated The v2 format is used by default and cannot be changed.
|
164
|
+
def v1?
|
165
|
+
warn "[DEPRECATION] v1? is deprecated."
|
166
|
+
false
|
167
|
+
end
|
168
|
+
|
169
|
+
##
|
170
|
+
# **Deprecated.** The time at which this sink will begin exporting log
|
171
|
+
# entries. If this value is present, then log entries are exported only
|
172
|
+
# if `start_at` is less than the log entry's timestamp. Optional.
|
173
|
+
#
|
174
|
+
# @deprecated This field is ignored when creating or updating sinks.
|
175
|
+
def start_at
|
176
|
+
warn "[DEPRECATION] start_at is deprecated."
|
177
|
+
nil
|
178
|
+
end
|
179
|
+
alias start_time start_at
|
180
|
+
|
181
|
+
##
|
182
|
+
# **Deprecated.** Sets the time at which this sink will begin exporting
|
183
|
+
# log entries. If this value is present, then log entries are exported
|
184
|
+
# only if `start_at` is less than the log entry's timestamp. Optional.
|
185
|
+
#
|
186
|
+
# @deprecated This field is ignored when creating or updating sinks.
|
187
|
+
def start_at= _new_start_at
|
188
|
+
warn "[DEPRECATION] start_at= is deprecated and will be ignored."
|
189
|
+
end
|
190
|
+
alias start_time= start_at=
|
191
|
+
|
192
|
+
##
|
193
|
+
# **Deprecated.** Time at which this sink will stop exporting log
|
194
|
+
# entries. If this value is present, then log entries are exported only
|
195
|
+
# if the log entry's timestamp is less than `end_at`. Optional.
|
196
|
+
#
|
197
|
+
# @deprecated This field is ignored when creating or updating sinks.
|
198
|
+
def end_at
|
199
|
+
warn "[DEPRECATION] end_at is deprecated."
|
200
|
+
nil
|
201
|
+
end
|
202
|
+
alias end_time end_at
|
203
|
+
|
204
|
+
##
|
205
|
+
# **Deprecated.** Sets the time at which this sink will stop exporting
|
206
|
+
# log entries. If this value is present, then log entries are exported
|
207
|
+
# only if the log entry's timestamp is less than `end_at`. Optional.
|
208
|
+
#
|
209
|
+
# @deprecated This field is ignored when creating or updating sinks.
|
210
|
+
def end_at= _new_end_at
|
211
|
+
warn "[DEPRECATION] end_at= is deprecated and will be ignored."
|
212
|
+
end
|
213
|
+
alias end_time= end_at=
|
214
|
+
|
215
|
+
##
|
216
|
+
# An IAM identity (a service account or group) that will write exported
|
217
|
+
# log entries to the destination on behalf of Stackdriver Logging. You
|
218
|
+
# must grant this identity write-access to the destination. Consult the
|
219
|
+
# destination service's documentation to determine the exact role that
|
220
|
+
# must be granted.
|
221
|
+
def writer_identity
|
222
|
+
@grpc.writer_identity
|
223
|
+
end
|
224
|
+
|
225
|
+
##
|
226
|
+
# Updates the logs-based sink.
|
227
|
+
#
|
228
|
+
# @param [Boolean] unique_writer_identity Whether the sink will have a
|
229
|
+
# dedicated service account returned in the sink's `writer_identity`.
|
230
|
+
# Set this field to be true to export logs from one project to a
|
231
|
+
# different project. This field is ignored for non-project sinks
|
232
|
+
# (e.g. organization sinks) because those sinks are required to have
|
233
|
+
# dedicated service accounts. Optional.
|
234
|
+
#
|
235
|
+
# @example
|
236
|
+
# require "google/cloud/logging"
|
237
|
+
#
|
238
|
+
# logging = Google::Cloud::Logging.new
|
239
|
+
# sink = logging.sink "severe_errors"
|
240
|
+
# sink.filter = "logName:syslog AND severity>=ERROR"
|
241
|
+
# sink.save
|
242
|
+
#
|
243
|
+
def save unique_writer_identity: nil
|
244
|
+
ensure_service!
|
245
|
+
@grpc = service.update_sink \
|
246
|
+
name, destination, filter,
|
247
|
+
unique_writer_identity: unique_writer_identity
|
248
|
+
end
|
249
|
+
|
250
|
+
##
|
251
|
+
# Reloads the logs-based sink with current data from the Logging
|
252
|
+
# service.
|
253
|
+
def reload!
|
254
|
+
ensure_service!
|
255
|
+
@grpc = service.get_sink name
|
256
|
+
end
|
257
|
+
alias refresh! reload!
|
258
|
+
|
259
|
+
##
|
260
|
+
# Permanently deletes the logs-based sink.
|
261
|
+
#
|
262
|
+
# @return [Boolean] Returns `true` if the sink was deleted.
|
263
|
+
#
|
264
|
+
# @example
|
265
|
+
# require "google/cloud/logging"
|
266
|
+
#
|
267
|
+
# logging = Google::Cloud::Logging.new
|
268
|
+
# sink = logging.sink "severe_errors"
|
269
|
+
# sink.delete
|
270
|
+
#
|
271
|
+
def delete
|
272
|
+
ensure_service!
|
273
|
+
service.delete_sink name
|
274
|
+
true
|
275
|
+
end
|
276
|
+
|
277
|
+
##
|
278
|
+
# @private New Sink from a Google::Cloud::Logging::V2::LogSink object.
|
279
|
+
def self.from_grpc grpc, service
|
280
|
+
new.tap do |f|
|
281
|
+
f.grpc = grpc
|
282
|
+
f.service = service
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
protected
|
287
|
+
|
288
|
+
##
|
289
|
+
# @private Raise an error unless an active connection to the service is
|
290
|
+
# available.
|
291
|
+
def ensure_service!
|
292
|
+
raise "Must have active connection to service" unless service
|
293
|
+
end
|
294
|
+
|
295
|
+
##
|
296
|
+
# @private Get a Google::Protobuf::Timestamp object from a Time object.
|
297
|
+
def time_to_timestamp time
|
298
|
+
return nil if time.nil?
|
299
|
+
# Make sure we have a Time object
|
300
|
+
return nil unless time.respond_to? :to_time
|
301
|
+
time = time.to_time
|
302
|
+
Google::Protobuf::Timestamp.new seconds: time.to_i, nanos: time.nsec
|
303
|
+
end
|
304
|
+
|
305
|
+
##
|
306
|
+
# @private Get a Time object from a Google::Protobuf::Timestamp object.
|
307
|
+
def timestamp_to_time timestamp
|
308
|
+
return nil if timestamp.nil?
|
309
|
+
# Time.at takes microseconds, so convert nano seconds to microseconds
|
310
|
+
Time.at timestamp.seconds, Rational(timestamp.nanos, 1000)
|
311
|
+
end
|
312
|
+
end
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|