lib/pghero/methods/system.rb in pghero-2.8.2 vs lib/pghero/methods/system.rb in pghero-2.8.3
- old
+ new
@@ -131,12 +131,10 @@
end
private
def gcp_stats(metric_name, duration: nil, period: nil, offset: nil, series: false)
- require "google/cloud/monitoring/v3"
-
# TODO DRY with RDS stats
duration = (duration || 1.hour).to_i
period = (period || 1.minute).to_i
offset = (offset || 0).to_i
end_time = Time.at(((Time.now - offset).to_f / period).ceil * period)
@@ -144,14 +142,24 @@
# validate input since we need to interpolate below
raise Error, "Invalid metric name" unless metric_name =~ /\A[a-z\/_]+\z/i
raise Error, "Invalid database id" unless gcp_database_id =~ /\A[a-z0-9\-:]+\z/i
- # we handle three situations:
+ # we handle four situations:
# 1. google-cloud-monitoring-v3
# 2. google-cloud-monitoring >= 1
# 3. google-cloud-monitoring < 1
+ # 4. google-apis-monitoring_v3
+ begin
+ require "google/cloud/monitoring/v3"
+ rescue LoadError
+ begin
+ require "google/cloud/monitoring"
+ rescue LoadError
+ require "google/apis/monitoring_v3"
+ end
+ end
# for situations 1 and 2
# Google::Cloud::Monitoring.metric_service is documented
# but doesn't work for situation 1
if defined?(Google::Cloud::Monitoring::V3::MetricService::Client)
@@ -173,11 +181,11 @@
filter: "metric.type = \"cloudsql.googleapis.com/database/#{metric_name}\" AND resource.label.database_id = \"#{gcp_database_id}\"",
interval: interval,
view: Google::Cloud::Monitoring::V3::ListTimeSeriesRequest::TimeSeriesView::FULL,
aggregation: aggregation
})
- else
+ elsif defined?(Google::Cloud::Monitoring)
require "google/cloud/monitoring"
client = Google::Cloud::Monitoring::Metric.new
interval = Google::Monitoring::V3::TimeInterval.new
@@ -196,16 +204,34 @@
"metric.type = \"cloudsql.googleapis.com/database/#{metric_name}\" AND resource.label.database_id = \"#{gcp_database_id}\"",
interval,
Google::Monitoring::V3::ListTimeSeriesRequest::TimeSeriesView::FULL,
aggregation: aggregation
)
+ else
+ client = Google::Apis::MonitoringV3::MonitoringService.new
+
+ scope = Google::Apis::MonitoringV3::AUTH_MONITORING_READ
+ client.authorization = Google::Auth.get_application_default([scope])
+
+ # default logging is very verbose, but use app default
+ results = client.list_project_time_series(
+ "projects/#{gcp_database_id.split(":").first}",
+ filter: "metric.type = \"cloudsql.googleapis.com/database/#{metric_name}\" AND resource.label.database_id = \"#{gcp_database_id}\"",
+ interval_start_time: (start_time - period).iso8601,
+ interval_end_time: end_time.iso8601,
+ view: 0, # full
+ aggregation_alignment_period: "#{period}s",
+ aggregation_per_series_aligner: 12 # mean
+ ).time_series
end
data = {}
result = results.first
if result
result.points.each do |point|
- time = Time.at(point.interval.start_time.seconds)
+ time = point.interval.start_time
+ # string with google-apis-monitoring_v3
+ time = time.is_a?(String) ? Time.parse(time) : Time.at(time.seconds)
value = point.value.double_value
value *= 100 if metric_name == "cpu/utilization"
data[time] = value
end
end