Skip to content

Commit

Permalink
Add prometheus collector for oldest OS Places postcode
Browse files Browse the repository at this point in the history
  • Loading branch information
KludgeKML committed Oct 3, 2023
1 parent cef27e5 commit 16aa9bc
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
4 changes: 3 additions & 1 deletion config/initializers/prometheus.rb
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
require "govuk_app_config/govuk_prometheus_exporter"
GovukPrometheusExporter.configure
require "collectors/global_prometheus_collector"

GovukPrometheusExporter.configure(collectors: [Collectors::GlobalPrometheusCollector])
28 changes: 28 additions & 0 deletions lib/collectors/global_prometheus_collector.rb
Original file line number Diff line number Diff line change
@@ -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
26 changes: 26 additions & 0 deletions spec/lib/collectors/global_prometheus_collector_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 16aa9bc

Please sign in to comment.