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