lib/fluent/plugin/monitoring.rb in fluent-plugin-google-cloud-0.7.23 vs lib/fluent/plugin/monitoring.rb in fluent-plugin-google-cloud-0.7.24
- old
+ new
@@ -31,17 +31,19 @@
end
end
# OpenCensus implementation of counters.
class OpenCensusCounter < BaseCounter
- def initialize(recorder, measure)
+ def initialize(recorder, measure, translator)
raise ArgumentError, 'measure must not be nil' if measure.nil?
@recorder = recorder
@measure = measure
+ @translator = translator
end
def increment(by: 1, labels: {})
+ labels = @translator.translate_labels(labels)
tag_map = OpenCensus::Tags::TagMap.new(
labels.map { |k, v| [k.to_s, v.to_s] }.to_h)
@recorder.record(@measure.create_measurement(value: by, tags: tag_map))
end
end
@@ -72,12 +74,16 @@
require 'prometheus/client'
@registry = Prometheus::Client.registry
end
# Exception-driven behavior to avoid synchronization errors.
- def counter(name, labels, docstring)
- return PrometheusCounter.new(@registry.counter(name, docstring, labels))
+ def counter(name, _labels, docstring)
+ # When we upgrade to Prometheus client 0.10.0 or higher, pass the
+ # labels in the metric constructor. The 'labels' field in
+ # Prometheus client 0.9.0 has a different function and will not
+ # work as intended.
+ return PrometheusCounter.new(@registry.counter(name, docstring))
rescue Prometheus::Client::Registry::AlreadyRegisteredError
return PrometheusCounter.new(@registry.get(name))
end
end
@@ -103,52 +109,32 @@
end
@log.debug "OpenCensus config=#{OpenCensus.config}"
end
def counter(name, labels, docstring)
- name = OpenCensusMonitoringRegistry.translate_metric_name(name)
- measure = OpenCensus::Stats::MeasureRegistry.get(name)
+ translator = MetricTranslator.new(name, labels)
+ measure = OpenCensus::Stats::MeasureRegistry.get(translator.name)
if measure.nil?
measure = OpenCensus::Stats.create_measure_int(
- name: name,
+ name: translator.name,
unit: OpenCensus::Stats::Measure::UNIT_NONE,
description: docstring
)
end
OpenCensus::Stats.create_and_register_view(
- name: name,
+ name: translator.name,
measure: measure,
aggregation: OpenCensus::Stats.create_sum_aggregation,
description: docstring,
- columns: labels.map(&:to_s)
+ columns: translator.view_labels.map(&:to_s)
)
- OpenCensusCounter.new(@recorder, measure)
+ OpenCensusCounter.new(@recorder, measure, translator)
end
def export
@exporter.export @recorder.views_data
end
-
- class << self
- # Translate the internal metrics to the curated metrics in Stackdriver.
- # The Prometheus metrics are collected by Google Kubernetes Engine's
- # monitoring, so we can't redefine them.
- def translate_metric_name(name)
- case name
- when :stackdriver_successful_requests_count,
- :stackdriver_failed_requests_count
- :request_count
- when :stackdriver_ingested_entries_count,
- :stackdriver_dropped_entries_count
- :log_entry_count
- when :stackdriver_retried_entries_count
- :log_entry_retry_count
- else
- name
- end
- end
- end
end
# Factory that is used to create a monitoring registry based on
# the monitoring solution name.
class MonitoringRegistryFactory
@@ -164,8 +150,43 @@
end
def self.create(name, project_id, monitored_resource)
registry = @known_registry_types[name] || BaseMonitoringRegistry
registry.new(project_id, monitored_resource)
+ end
+ end
+
+ # Translate the internal metrics to the curated metrics in Stackdriver. The
+ # Prometheus metrics are collected by Google Kubernetes Engine's monitoring,
+ # so we can't redefine them.
+ # Avoid this mechanism for new metrics by defining them in their final form,
+ # so they don't need translation.
+ class MetricTranslator
+ attr_reader :name
+ attr_reader :view_labels
+
+ def initialize(name, metric_labels)
+ @legacy = true
+ case name
+ when :stackdriver_successful_requests_count,
+ :stackdriver_failed_requests_count
+ @name = :request_count
+ when :stackdriver_ingested_entries_count,
+ :stackdriver_dropped_entries_count
+ @name = :log_entry_count
+ when :stackdriver_retried_entries_count
+ @name = :log_entry_retry_count
+ else
+ @name = name
+ @legacy = false
+ end
+ # Collapsed from [:response_code, :grpc]
+ @view_labels = @legacy ? [:response_code] : metric_labels
+ end
+
+ def translate_labels(labels)
+ return labels unless @legacy
+ translation = { code: :response_code, grpc: :grpc }
+ labels.map { |k, v| [translation[k], v] }.to_h
end
end
end