diff --git a/config/initializers/prometheus.rb b/config/initializers/prometheus.rb index 4b842d84..7c2d4274 100644 --- a/config/initializers/prometheus.rb +++ b/config/initializers/prometheus.rb @@ -1,2 +1,4 @@ require "govuk_app_config/govuk_prometheus_exporter" -GovukPrometheusExporter.configure +require "collectors/global_prometheus_collector" + +GovukPrometheusExporter.configure(collectors: [Collectors::GlobalPrometheusCollector]) diff --git a/lib/collectors/global_prometheus_collector.rb b/lib/collectors/global_prometheus_collector.rb new file mode 100644 index 00000000..9be0b6d0 --- /dev/null +++ b/lib/collectors/global_prometheus_collector.rb @@ -0,0 +1,28 @@ +require "prometheus_exporter" +require "prometheus_exporter/server" + +module Collectors + class GlobalPrometheusCollector < PrometheusExporter::Server::TypeCollector + SECONDS_PER_DAY = 86_400 + + def type + "locations_api_global" + end + + def metrics + oldest_os_places_postcode = PrometheusExporter::Metric::Gauge.new("locations_api_oldest_os_places_postcode_age_days", "Days since last update of oldest postcode OS Places postcode") + oldest_os_places_postcode.observe(get_oldest_postcode / SECONDS_PER_DAY) + + [oldest_os_places_postcode] + end + + private + + def get_oldest_postcode + # Cache metric to prevent needless expensive calls to the database + Rails.cache.fetch("metrics:oldest_postcode", expires_in: 1.hour) do + (Time.zone.now.to_i - Postcode.os_places.order(updated_at: :asc).first.updated_at.to_i) + end + end + end +end diff --git a/spec/lib/collectors/global_prometheus_collector_spec.rb b/spec/lib/collectors/global_prometheus_collector_spec.rb new file mode 100644 index 00000000..279c5e6c --- /dev/null +++ b/spec/lib/collectors/global_prometheus_collector_spec.rb @@ -0,0 +1,26 @@ +require "spec_helper" + +RSpec.describe Collectors::GlobalPrometheusCollector do + before do + @collector = Collectors::GlobalPrometheusCollector.new + Rails.cache.delete("metrics:oldest_postcode") + end + + describe "#type" do + it "has the correct value" do + expect(@collector.type).to eq("locations_api_global") + end + end + + describe "#metrics" do + before do + @postcode = Postcode.create!(postcode: "E18QS", updated_at: Time.zone.now - 2.days) + end + + it "records the time in days since the oldest postcode's update timestamp" do + metrics = @collector.metrics + + expect(metrics.first.data.first.last).to eq(2) + end + end +end