Skip to content

Commit

Permalink
Merge pull request #275 from alphagov/freshness-metrics
Browse files Browse the repository at this point in the history
Freshness metrics
  • Loading branch information
KludgeKML authored Oct 4, 2023
2 parents e15f27e + b06fe4d commit e83385b
Show file tree
Hide file tree
Showing 4 changed files with 60 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 oldest postcode was last updated via OS Places API (Expected in prod: ~7)")
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
3 changes: 3 additions & 0 deletions spec/service_consumer/pact_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ def url_encode(str)
set_up do
ENV["OS_PLACES_API_KEY"] = "some_key"
ENV["OS_PLACES_API_SECRET"] = "some_secret"
end

tear_down do
postcode = Postcode.find_by(postcode: "SW1A1AA")
postcode.destroy unless postcode.nil?
end
Expand Down

0 comments on commit e83385b

Please sign in to comment.