From cfa5c6a86c6e56fc194e0c36dedc2e6eb78a852d Mon Sep 17 00:00:00 2001 From: zhouyu Date: Mon, 12 Jan 2026 12:58:45 -0800 Subject: [PATCH 1/8] Add http head check etc. --- config/application.rb | 9 ++++ config/initializers/okcomputer.rb | 73 +++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/config/application.rb b/config/application.rb index b3a084e..182d3bc 100644 --- a/config/application.rb +++ b/config/application.rb @@ -20,6 +20,15 @@ class Application < Rails::Application config.action_mailer.default_options = { from: 'fake@berkeley.edu' } config.lit_gtag_id = ENV.fetch('LIT_GTAG_ID', nil) + config.geoserver_url = ENV.fetch('GEOSERVER_URL', 'https://geoserver-public.ucblib.org/geoserver') + config.spatialserver_url = ENV.fetch('SPATIAL_URL', 'https://spatial.ucblib.org') + + config.x.servers ||= {} + + # config.x.servers[:geoserver] = ENV.fetch('GEOSERVER_URL', nil) + # config.x.servers[:secure_geoserver] = ENV.fetch('GEOSERVER_URL', nil) + # config.x.servers[:spatial_server] = ENV.fetch('SPATIAL_URL', nil) + # The Base URL for the generated sitemap config.x.sitemap.base_url = ENV.fetch('GEODATA_BASE_URL', 'http://localhost:3000') # Silenced by default to minimize log noise diff --git a/config/initializers/okcomputer.rb b/config/initializers/okcomputer.rb index 2a41f10..a5061bf 100644 --- a/config/initializers/okcomputer.rb +++ b/config/initializers/okcomputer.rb @@ -11,3 +11,76 @@ # Requires the ping handler on the solr core (/admin/ping). core_baseurl = Blacklight.default_index.connection.uri.to_s.chomp('/') OkComputer::Registry.register 'solr', OkComputer::SolrCheck.new(core_baseurl) + +def check_geoserver(server_name) + url = host_url(server_name) + # geoserver_url = url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" + geoserver_url = 'https://geoservices.lib.berkeley.edu/geoserver/UCB/wms?service=WMS&version=1.1.0&request=GetMap&layers=UCB%3Af7b68n&bbox=-122.836485%2C37.808713%2C-122.409565%2C38.190532&width=768&height=686&srs=EPSG%3A4326&styles=&format=format=image/png' + OkComputer::Registry.register clr_name(server_name), HttpHeadCheck.new(geoserver_url) +end + +def check_spatial_server(server_name, type) + message = "#{type} #{clr_name(server_name)}" + url = host_url(server_name) + spatial_url = url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" + OkComputer::Registry.register message, HttpHeadCheck.new(spatial_url) +end + +def host_url(server_name) + Rails.configuration.x.servers[server_name.to_sym] +end + +def clr_name(server_name) + server_name.gsub('_', ' ') +end +# geoserver_url = geoserver_capabilty_url(Rails.application.config.geoserver_url) +# OkComputer::Registry.register 'Check public geoserver', HttpHeadCheck.new(geoserver_url) +# pubilc_download_url = spatial_download_url(Rails.application.config.spatialserver_url) +# OkComputer::Registry.register 'Check public download', HttpHeadCheck.new(pubilc_download_url) +# secure_download_url = spatial_download_url(Rails.application.config.spatialserver_url, 'UCB') +# OkComputer::Registry.register 'Check public download', HttpHeadCheck.new(secure_download_url) + +class HttpHeadCheck < OkComputer::Check + ConnectionFailed = Class.new(StandardError) + attr_accessor :url + + def initialize(url) + self.url = url + end + + def check + return skip_check unless url + + response = perform_http_head_request + if response.is_a?(Net::HTTPOK) + mark_message 'Check succeeded.' + else + mark_failure + mark_message "Error: Http head check endpoint responded, but returned unexpeced HTTP status: #{response.code} #{response.class}. Expected 200 Net::HTTPOK." + end + rescue StandardError => e + mark_message "Error: '#{e}'" + mark_failure + end + + private + + def perform_http_head_request + uri = URI(url) + Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https', verify_mode: OpenSSL::SSL::VERIFY_PEER) do |http| + http.head(uri.request_uri) + end + rescue StandardError => e + raise ConnectionFailed, e + end + + def skip_check + mark_failure + mark_message 'No URL configured; health check was skipped...' + end +end + +check_geoserver 'geoserver' +# check_geoserver 'secure_geoserver' +# check_spatial_server 'spatial_server', 'public' +# check_spatial_server 'spatial_server', 'UCB' From b8fed475d7238ee984c03c41d86391794cc16543 Mon Sep 17 00:00:00 2001 From: zhouyu Date: Wed, 14 Jan 2026 13:37:29 -0800 Subject: [PATCH 2/8] consolidated --- config/application.rb | 6 +++ config/initializers/okcomputer.rb | 81 ++++--------------------------- lib/http_client.rb | 41 ++++++++++++++++ lib/http_head_check.rb | 37 ++++++++++++++ lib/server_check.rb | 24 +++++++++ spec/requests/okcomputer_spec.rb | 4 ++ 6 files changed, 122 insertions(+), 71 deletions(-) create mode 100644 lib/http_client.rb create mode 100644 lib/http_head_check.rb create mode 100644 lib/server_check.rb diff --git a/config/application.rb b/config/application.rb index 182d3bc..7146672 100644 --- a/config/application.rb +++ b/config/application.rb @@ -25,6 +25,12 @@ class Application < Rails::Application config.x.servers ||= {} + # These will be removed before merging code + config.x.servers[:geoserver] = ENV.fetch('GEOSERVER_URL', 'https://geoserver-public.ucblib.org/geoserver') + config.x.servers[:secure_geoserver] = ENV.fetch('GEOSERVER_URL', 'https://geoserver-secure.ucblib.org/geoserver') + config.x.servers[:spatial_server] = ENV.fetch('SPATIAL_URL', 'https://spatial.ucblib.org') + + # These comments will be removed before merging code # config.x.servers[:geoserver] = ENV.fetch('GEOSERVER_URL', nil) # config.x.servers[:secure_geoserver] = ENV.fetch('GEOSERVER_URL', nil) # config.x.servers[:spatial_server] = ENV.fetch('SPATIAL_URL', nil) diff --git a/config/initializers/okcomputer.rb b/config/initializers/okcomputer.rb index a5061bf..8b1726b 100644 --- a/config/initializers/okcomputer.rb +++ b/config/initializers/okcomputer.rb @@ -1,5 +1,8 @@ # initializers/okcomputer.rb # Health checks configuration +require_relative '../../lib/http_client' +require_relative '../../lib/http_head_check' +require_relative '../../lib/server_check' OkComputer.logger = Rails.logger OkComputer.check_in_parallel = true @@ -12,75 +15,11 @@ core_baseurl = Blacklight.default_index.connection.uri.to_s.chomp('/') OkComputer::Registry.register 'solr', OkComputer::SolrCheck.new(core_baseurl) -def check_geoserver(server_name) - url = host_url(server_name) - # geoserver_url = url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" - geoserver_url = 'https://geoservices.lib.berkeley.edu/geoserver/UCB/wms?service=WMS&version=1.1.0&request=GetMap&layers=UCB%3Af7b68n&bbox=-122.836485%2C37.808713%2C-122.409565%2C38.190532&width=768&height=686&srs=EPSG%3A4326&styles=&format=format=image/png' - OkComputer::Registry.register clr_name(server_name), HttpHeadCheck.new(geoserver_url) -end +SERVER_NAME_GEOSERVER = 'geoserver'.freeze +SERVER_NAME_SECUREGEOSERVER = 'secure_geoserver'.freeze +SERVER_NAME_SPATIAL = 'spatial_server'.freeze -def check_spatial_server(server_name, type) - message = "#{type} #{clr_name(server_name)}" - url = host_url(server_name) - spatial_url = url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" - OkComputer::Registry.register message, HttpHeadCheck.new(spatial_url) -end - -def host_url(server_name) - Rails.configuration.x.servers[server_name.to_sym] -end - -def clr_name(server_name) - server_name.gsub('_', ' ') -end -# geoserver_url = geoserver_capabilty_url(Rails.application.config.geoserver_url) -# OkComputer::Registry.register 'Check public geoserver', HttpHeadCheck.new(geoserver_url) -# pubilc_download_url = spatial_download_url(Rails.application.config.spatialserver_url) -# OkComputer::Registry.register 'Check public download', HttpHeadCheck.new(pubilc_download_url) -# secure_download_url = spatial_download_url(Rails.application.config.spatialserver_url, 'UCB') -# OkComputer::Registry.register 'Check public download', HttpHeadCheck.new(secure_download_url) - -class HttpHeadCheck < OkComputer::Check - ConnectionFailed = Class.new(StandardError) - attr_accessor :url - - def initialize(url) - self.url = url - end - - def check - return skip_check unless url - - response = perform_http_head_request - if response.is_a?(Net::HTTPOK) - mark_message 'Check succeeded.' - else - mark_failure - mark_message "Error: Http head check endpoint responded, but returned unexpeced HTTP status: #{response.code} #{response.class}. Expected 200 Net::HTTPOK." - end - rescue StandardError => e - mark_message "Error: '#{e}'" - mark_failure - end - - private - - def perform_http_head_request - uri = URI(url) - Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https', verify_mode: OpenSSL::SSL::VERIFY_PEER) do |http| - http.head(uri.request_uri) - end - rescue StandardError => e - raise ConnectionFailed, e - end - - def skip_check - mark_failure - mark_message 'No URL configured; health check was skipped...' - end -end - -check_geoserver 'geoserver' -# check_geoserver 'secure_geoserver' -# check_spatial_server 'spatial_server', 'public' -# check_spatial_server 'spatial_server', 'UCB' +ServerCheck.geoserver SERVER_NAME_GEOSERVER +ServerCheck.geoserver SERVER_NAME_SECUREGEOSERVER +ServerCheck.spatial_server SERVER_NAME_SPATIAL, 'public' +ServerCheck.spatial_server SERVER_NAME_SPATIAL, 'UCB' diff --git a/lib/http_client.rb b/lib/http_client.rb new file mode 100644 index 0000000..e909766 --- /dev/null +++ b/lib/http_client.rb @@ -0,0 +1,41 @@ +require 'net/http' +require 'uri' +require 'openssl' + +module GeoDataHealthCheck + class HttpClient + ConnectionFailed = Class.new(StandardError) + + class << self + def request(method, url, timeout: 5) + uri = URI(url) + + Net::HTTP.start( + uri.host, + uri.port, + use_ssl: uri.scheme == 'https', + verify_mode: OpenSSL::SSL::VERIFY_PEER, + open_timeout: timeout, + read_timeout: timeout # or just skip checking reading timeout? + ) do |http| + req = build_request(method, uri) + http.request(req) + end + rescue Net::OpenTimeout, Net::ReadTimeout => e + msg = "Http #{method} #{url} did not respond within #{request_timeout} seconds: " + raise ConnectionFailed, msg + e.message + rescue StandardError => e + raise ConnectionFailed, e.message + end + + def build_request(method, uri) + req_method = method.downcase.to_sym + raise ConnectionFailed, "Incorrect http request method: #{method}" unless %i[head get].include?(req_method) + + req_klass = method == :head ? Net::HTTP::Head : Net::HTTP::Get + req_klass.new(uri) + end + end + + end +end diff --git a/lib/http_head_check.rb b/lib/http_head_check.rb new file mode 100644 index 0000000..7c30e2e --- /dev/null +++ b/lib/http_head_check.rb @@ -0,0 +1,37 @@ +module GeoDataHealthCheck + class HttpHeadCheck < OkComputer::Check + attr_accessor :url, :request_timeout + + def initialize(url, request_timeout = 5) + self.url = url + self.request_timeout = request_timeout + end + + def check + return skip_check unless url + + response = HttpClient.request( + :head, + url, + timeout: request_timeout + ) + # sleep 14 + if response.is_a?(Net::HTTPOK) || response.is_a?(Net::HTTPRedirection) + mark_message 'Check succeeded.' + else + mark_failure + mark_message "Error: Http head check endpoint responded, but returned unexpeced HTTP status: #{response.code} #{response.class}. Expected 200 Net::HTTPOK." + end + rescue StandardError => e + mark_message "Error: '#{e}'" + mark_failure + end + + private + + def skip_check + mark_failure + mark_message 'No URL configured; health check was skipped...' + end + end +end diff --git a/lib/server_check.rb b/lib/server_check.rb new file mode 100644 index 0000000..2b01b9a --- /dev/null +++ b/lib/server_check.rb @@ -0,0 +1,24 @@ +class ServerCheck + class << self + def geoserver(server_name) + url = host_url(server_name) + geoserver_url = url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" + OkComputer::Registry.register clr_msg(server_name), GeoDataHealthCheck::HttpHeadCheck.new(geoserver_url) + end + + def spatial_server(server_name, type) + msg = "#{type} #{server_name}" + url = host_url(server_name) + spatial_url = url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" + OkComputer::Registry.register clr_msg(msg), GeoDataHealthCheck::HttpHeadCheck.new(spatial_url) + end + + def host_url(server_name) + Rails.configuration.x.servers[server_name.to_sym] + end + + def clr_msg(msg) + msg.downcase.strip.gsub(/\s+/, '_') + end + end +end diff --git a/spec/requests/okcomputer_spec.rb b/spec/requests/okcomputer_spec.rb index a04d1c8..039d7cb 100644 --- a/spec/requests/okcomputer_spec.rb +++ b/spec/requests/okcomputer_spec.rb @@ -14,6 +14,10 @@ database database-migrations solr + geoserver + secure_geoserver + public_spatial_server + ucb_spatial_server ] end end From 5c6fbc07b5ced796cf759daf16d663a560f1bf3d Mon Sep 17 00:00:00 2001 From: zhouyu Date: Wed, 14 Jan 2026 14:48:34 -0800 Subject: [PATCH 3/8] uncheck Lint/MissingSuper rule --- lib/http_head_check.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/http_head_check.rb b/lib/http_head_check.rb index 7c30e2e..7a20d2f 100644 --- a/lib/http_head_check.rb +++ b/lib/http_head_check.rb @@ -2,10 +2,12 @@ module GeoDataHealthCheck class HttpHeadCheck < OkComputer::Check attr_accessor :url, :request_timeout + # rubocop:disable Lint/MissingSuper def initialize(url, request_timeout = 5) self.url = url self.request_timeout = request_timeout end + # rubocop:enable Lint/MissingSuper def check return skip_check unless url From abc3ad67c09b28c4b85526436d989a089c7868ae Mon Sep 17 00:00:00 2001 From: zhouyu Date: Wed, 14 Jan 2026 15:46:21 -0800 Subject: [PATCH 4/8] code formating --- config/application.rb | 3 --- config/initializers/okcomputer.rb | 15 ++++++--------- lib/{server_check.rb => check_server.rb} | 21 ++++++++++++++++----- 3 files changed, 22 insertions(+), 17 deletions(-) rename lib/{server_check.rb => check_server.rb} (51%) diff --git a/config/application.rb b/config/application.rb index 7146672..116b8cd 100644 --- a/config/application.rb +++ b/config/application.rb @@ -20,9 +20,6 @@ class Application < Rails::Application config.action_mailer.default_options = { from: 'fake@berkeley.edu' } config.lit_gtag_id = ENV.fetch('LIT_GTAG_ID', nil) - config.geoserver_url = ENV.fetch('GEOSERVER_URL', 'https://geoserver-public.ucblib.org/geoserver') - config.spatialserver_url = ENV.fetch('SPATIAL_URL', 'https://spatial.ucblib.org') - config.x.servers ||= {} # These will be removed before merging code diff --git a/config/initializers/okcomputer.rb b/config/initializers/okcomputer.rb index 8b1726b..8a79d60 100644 --- a/config/initializers/okcomputer.rb +++ b/config/initializers/okcomputer.rb @@ -2,7 +2,7 @@ # Health checks configuration require_relative '../../lib/http_client' require_relative '../../lib/http_head_check' -require_relative '../../lib/server_check' +require_relative '../../lib/check_server' OkComputer.logger = Rails.logger OkComputer.check_in_parallel = true @@ -15,11 +15,8 @@ core_baseurl = Blacklight.default_index.connection.uri.to_s.chomp('/') OkComputer::Registry.register 'solr', OkComputer::SolrCheck.new(core_baseurl) -SERVER_NAME_GEOSERVER = 'geoserver'.freeze -SERVER_NAME_SECUREGEOSERVER = 'secure_geoserver'.freeze -SERVER_NAME_SPATIAL = 'spatial_server'.freeze - -ServerCheck.geoserver SERVER_NAME_GEOSERVER -ServerCheck.geoserver SERVER_NAME_SECUREGEOSERVER -ServerCheck.spatial_server SERVER_NAME_SPATIAL, 'public' -ServerCheck.spatial_server SERVER_NAME_SPATIAL, 'UCB' +# Check geoservers and spatial servers +CheckServer.geoserver 'public' +CheckServer.geoserver 'UCB' +CheckServer.spatial_server 'public' +CheckServer.spatial_server 'UCB' diff --git a/lib/server_check.rb b/lib/check_server.rb similarity index 51% rename from lib/server_check.rb rename to lib/check_server.rb index 2b01b9a..9479331 100644 --- a/lib/server_check.rb +++ b/lib/check_server.rb @@ -1,14 +1,21 @@ -class ServerCheck +class CheckServer + GEOSERVER_NAME = 'geoserver'.freeze + SECURE_GEOSERVER_NAME = 'secure_geoserver'.freeze + SPATIAL_SERVER_NAME = 'spatial_server'.freeze + class << self - def geoserver(server_name) + def geoserver(type) + check_type(type) + server_name = type == 'public' ? GEOSERVER_NAME : SECURE_GEOSERVER_NAME url = host_url(server_name) geoserver_url = url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" OkComputer::Registry.register clr_msg(server_name), GeoDataHealthCheck::HttpHeadCheck.new(geoserver_url) end - def spatial_server(server_name, type) - msg = "#{type} #{server_name}" - url = host_url(server_name) + def spatial_server(type) + check_type(type) + msg = "#{type} #{SPATIAL_SERVER_NAME}" + url = host_url(SPATIAL_SERVER_NAME) spatial_url = url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" OkComputer::Registry.register clr_msg(msg), GeoDataHealthCheck::HttpHeadCheck.new(spatial_url) end @@ -20,5 +27,9 @@ def host_url(server_name) def clr_msg(msg) msg.downcase.strip.gsub(/\s+/, '_') end + + def check_type(type) + raise StandardError, "Incorrect server type #{type}, expect either 'public' or 'UCB'" unless %w[public UCB].include? type + end end end From b3fb91efec628ce65c2423b0b4177ad00dbc7770 Mon Sep 17 00:00:00 2001 From: zhouyu Date: Wed, 14 Jan 2026 16:16:27 -0800 Subject: [PATCH 5/8] Handling incorrect server type --- lib/check_server.rb | 11 +++++++---- lib/http_head_check.rb | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/check_server.rb b/lib/check_server.rb index 9479331..1aaa634 100644 --- a/lib/check_server.rb +++ b/lib/check_server.rb @@ -5,7 +5,8 @@ class CheckServer class << self def geoserver(type) - check_type(type) + return wrong_type(type) unless %w[public UCB].include? type + server_name = type == 'public' ? GEOSERVER_NAME : SECURE_GEOSERVER_NAME url = host_url(server_name) geoserver_url = url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" @@ -13,7 +14,8 @@ def geoserver(type) end def spatial_server(type) - check_type(type) + return wrong_type(type) unless %w[public UCB].include? type + msg = "#{type} #{SPATIAL_SERVER_NAME}" url = host_url(SPATIAL_SERVER_NAME) spatial_url = url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" @@ -28,8 +30,9 @@ def clr_msg(msg) msg.downcase.strip.gsub(/\s+/, '_') end - def check_type(type) - raise StandardError, "Incorrect server type #{type}, expect either 'public' or 'UCB'" unless %w[public UCB].include? type + def wrong_type(type) + msg = "Incorrect Geoserver or Spatial server type '#{type}', expect either 'public' or 'UCB" + OkComputer::Registry.register msg, GeoDataHealthCheck::HttpHeadCheck.new(' ') end end end diff --git a/lib/http_head_check.rb b/lib/http_head_check.rb index 7a20d2f..c88b18d 100644 --- a/lib/http_head_check.rb +++ b/lib/http_head_check.rb @@ -10,7 +10,7 @@ def initialize(url, request_timeout = 5) # rubocop:enable Lint/MissingSuper def check - return skip_check unless url + return skip_check if url.strip.empty? response = HttpClient.request( :head, From b47424290579036adce061a9335370c5712085a4 Mon Sep 17 00:00:00 2001 From: zhouyu Date: Thu, 15 Jan 2026 07:57:50 -0800 Subject: [PATCH 6/8] change url check --- lib/http_head_check.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/http_head_check.rb b/lib/http_head_check.rb index c88b18d..468d99b 100644 --- a/lib/http_head_check.rb +++ b/lib/http_head_check.rb @@ -10,7 +10,7 @@ def initialize(url, request_timeout = 5) # rubocop:enable Lint/MissingSuper def check - return skip_check if url.strip.empty? + return skip_check if url.blank? response = HttpClient.request( :head, From 36a1dfc95b8793f86ede380319b2fce5557bdb86 Mon Sep 17 00:00:00 2001 From: zhouyu Date: Fri, 16 Jan 2026 14:19:18 -0800 Subject: [PATCH 7/8] Refactor to follow the same registry call style in okcomputer.rb --- config/initializers/okcomputer.rb | 24 +++++++++++----- lib/check_server.rb | 38 ------------------------- lib/endpoint_url.rb | 13 +++++++++ lib/http_client.rb | 41 --------------------------- lib/http_head_check.rb | 46 +++++++++++++++++-------------- 5 files changed, 55 insertions(+), 107 deletions(-) delete mode 100644 lib/check_server.rb create mode 100644 lib/endpoint_url.rb delete mode 100644 lib/http_client.rb diff --git a/config/initializers/okcomputer.rb b/config/initializers/okcomputer.rb index 8a79d60..7ab660a 100644 --- a/config/initializers/okcomputer.rb +++ b/config/initializers/okcomputer.rb @@ -1,8 +1,8 @@ # initializers/okcomputer.rb # Health checks configuration -require_relative '../../lib/http_client' + require_relative '../../lib/http_head_check' -require_relative '../../lib/check_server' +require_relative '../../lib/endpoint_url' OkComputer.logger = Rails.logger OkComputer.check_in_parallel = true @@ -15,8 +15,18 @@ core_baseurl = Blacklight.default_index.connection.uri.to_s.chomp('/') OkComputer::Registry.register 'solr', OkComputer::SolrCheck.new(core_baseurl) -# Check geoservers and spatial servers -CheckServer.geoserver 'public' -CheckServer.geoserver 'UCB' -CheckServer.spatial_server 'public' -CheckServer.spatial_server 'UCB' +# Perform a Head request to check geoserver endpoint +geoserver_url = EndpointUrl.geoserver(:geoserver) +OkComputer::Registry.register 'geoserver', GeoDataHealthCheck::HttpHeadCheck.new(geoserver_url) + +# Perform a Head request to check secure_geoserver endpoint +secure_geoserver_url = EndpointUrl.geoserver(:secure_geoserver) +OkComputer::Registry.register 'secure_geoserver', GeoDataHealthCheck::HttpHeadCheck.new(secure_geoserver_url) + +# Perform a Head request to check spatial server endpoint +spatial_server_url = EndpointUrl.spatial_server(:spatial_server, 'public') +OkComputer::Registry.register 'public_spatial_server', GeoDataHealthCheck::HttpHeadCheck.new(spatial_server_url) + +# Perform a Head request to check UCB spatial server endpoint +ucb_spatial_server_url = EndpointUrl.spatial_server(:spatial_server, 'UCB') +OkComputer::Registry.register 'ucb_spatial_server', GeoDataHealthCheck::HttpHeadCheck.new(ucb_spatial_server_url) diff --git a/lib/check_server.rb b/lib/check_server.rb deleted file mode 100644 index 1aaa634..0000000 --- a/lib/check_server.rb +++ /dev/null @@ -1,38 +0,0 @@ -class CheckServer - GEOSERVER_NAME = 'geoserver'.freeze - SECURE_GEOSERVER_NAME = 'secure_geoserver'.freeze - SPATIAL_SERVER_NAME = 'spatial_server'.freeze - - class << self - def geoserver(type) - return wrong_type(type) unless %w[public UCB].include? type - - server_name = type == 'public' ? GEOSERVER_NAME : SECURE_GEOSERVER_NAME - url = host_url(server_name) - geoserver_url = url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" - OkComputer::Registry.register clr_msg(server_name), GeoDataHealthCheck::HttpHeadCheck.new(geoserver_url) - end - - def spatial_server(type) - return wrong_type(type) unless %w[public UCB].include? type - - msg = "#{type} #{SPATIAL_SERVER_NAME}" - url = host_url(SPATIAL_SERVER_NAME) - spatial_url = url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" - OkComputer::Registry.register clr_msg(msg), GeoDataHealthCheck::HttpHeadCheck.new(spatial_url) - end - - def host_url(server_name) - Rails.configuration.x.servers[server_name.to_sym] - end - - def clr_msg(msg) - msg.downcase.strip.gsub(/\s+/, '_') - end - - def wrong_type(type) - msg = "Incorrect Geoserver or Spatial server type '#{type}', expect either 'public' or 'UCB" - OkComputer::Registry.register msg, GeoDataHealthCheck::HttpHeadCheck.new(' ') - end - end -end diff --git a/lib/endpoint_url.rb b/lib/endpoint_url.rb new file mode 100644 index 0000000..a98dea1 --- /dev/null +++ b/lib/endpoint_url.rb @@ -0,0 +1,13 @@ +class EndpointUrl + class << self + def geoserver(server_name) + url = Rails.configuration.x.servers[server_name] + url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" + end + + def spatial_server(server_name, type) + url = Rails.configuration.x.servers[server_name] + url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" + end + end +end diff --git a/lib/http_client.rb b/lib/http_client.rb deleted file mode 100644 index e909766..0000000 --- a/lib/http_client.rb +++ /dev/null @@ -1,41 +0,0 @@ -require 'net/http' -require 'uri' -require 'openssl' - -module GeoDataHealthCheck - class HttpClient - ConnectionFailed = Class.new(StandardError) - - class << self - def request(method, url, timeout: 5) - uri = URI(url) - - Net::HTTP.start( - uri.host, - uri.port, - use_ssl: uri.scheme == 'https', - verify_mode: OpenSSL::SSL::VERIFY_PEER, - open_timeout: timeout, - read_timeout: timeout # or just skip checking reading timeout? - ) do |http| - req = build_request(method, uri) - http.request(req) - end - rescue Net::OpenTimeout, Net::ReadTimeout => e - msg = "Http #{method} #{url} did not respond within #{request_timeout} seconds: " - raise ConnectionFailed, msg + e.message - rescue StandardError => e - raise ConnectionFailed, e.message - end - - def build_request(method, uri) - req_method = method.downcase.to_sym - raise ConnectionFailed, "Incorrect http request method: #{method}" unless %i[head get].include?(req_method) - - req_klass = method == :head ? Net::HTTP::Head : Net::HTTP::Get - req_klass.new(uri) - end - end - - end -end diff --git a/lib/http_head_check.rb b/lib/http_head_check.rb index 468d99b..0f0995a 100644 --- a/lib/http_head_check.rb +++ b/lib/http_head_check.rb @@ -1,39 +1,43 @@ module GeoDataHealthCheck - class HttpHeadCheck < OkComputer::Check - attr_accessor :url, :request_timeout - - # rubocop:disable Lint/MissingSuper - def initialize(url, request_timeout = 5) - self.url = url - self.request_timeout = request_timeout - end - # rubocop:enable Lint/MissingSuper + class HttpHeadCheck < OkComputer::HttpCheck def check - return skip_check if url.blank? + response = perform_request - response = HttpClient.request( - :head, - url, - timeout: request_timeout - ) - # sleep 14 if response.is_a?(Net::HTTPOK) || response.is_a?(Net::HTTPRedirection) - mark_message 'Check succeeded.' + mark_message 'Http head check successful.' else mark_failure - mark_message "Error: Http head check endpoint responded, but returned unexpeced HTTP status: #{response.code} #{response.class}. Expected 200 Net::HTTPOK." + mark_message "Error: '#{url.request_uri}' http head check responded, but returned unexpeced HTTP status: #{response.code} #{response.class}. Expected 200 Net::HTTPOK." end rescue StandardError => e mark_message "Error: '#{e}'" mark_failure end + def perform_request + head_request + rescue Net::OpenTimeout, Net::ReadTimeout => e + msg = "#{url.request_uri} did not respond within #{request_timeout} seconds: " + raise ConnectionFailed, msg + e.message + rescue StandardError => e + raise ConnectionFailed, e.message + end + private - def skip_check - mark_failure - mark_message 'No URL configured; health check was skipped...' + def head_request + Net::HTTP.start( + url.host, + url.port, + use_ssl: url.scheme == 'https', + verify_mode: OpenSSL::SSL::VERIFY_PEER, + open_timeout: request_timeout, + read_timeout: request_timeout + ) do |http| + http.head(url.request_uri) + end end + end end From bb8d737846b0a47a87ca9576c8ff39db07595275 Mon Sep 17 00:00:00 2001 From: zhouyu Date: Fri, 16 Jan 2026 15:25:13 -0800 Subject: [PATCH 8/8] Remove spatial server ucb endpoint check --- config/initializers/okcomputer.rb | 8 ++------ lib/endpoint_url.rb | 4 ++-- spec/requests/okcomputer_spec.rb | 3 +-- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/config/initializers/okcomputer.rb b/config/initializers/okcomputer.rb index 7ab660a..12c3d77 100644 --- a/config/initializers/okcomputer.rb +++ b/config/initializers/okcomputer.rb @@ -24,9 +24,5 @@ OkComputer::Registry.register 'secure_geoserver', GeoDataHealthCheck::HttpHeadCheck.new(secure_geoserver_url) # Perform a Head request to check spatial server endpoint -spatial_server_url = EndpointUrl.spatial_server(:spatial_server, 'public') -OkComputer::Registry.register 'public_spatial_server', GeoDataHealthCheck::HttpHeadCheck.new(spatial_server_url) - -# Perform a Head request to check UCB spatial server endpoint -ucb_spatial_server_url = EndpointUrl.spatial_server(:spatial_server, 'UCB') -OkComputer::Registry.register 'ucb_spatial_server', GeoDataHealthCheck::HttpHeadCheck.new(ucb_spatial_server_url) +spatial_server_url = EndpointUrl.spatial_server(:spatial_server) +OkComputer::Registry.register 'spatial_server', GeoDataHealthCheck::HttpHeadCheck.new(spatial_server_url) diff --git a/lib/endpoint_url.rb b/lib/endpoint_url.rb index a98dea1..e3771a7 100644 --- a/lib/endpoint_url.rb +++ b/lib/endpoint_url.rb @@ -5,9 +5,9 @@ def geoserver(server_name) url && "#{url.chomp('/')}/wms?service=WMS&request=GetCapabilities" end - def spatial_server(server_name, type) + def spatial_server(server_name) url = Rails.configuration.x.servers[server_name] - url && "#{url.chomp('/')}/#{type}/berkeley-status/data.zip" + url && "#{url.chomp('/')}/public/berkeley-status/data.zip" end end end diff --git a/spec/requests/okcomputer_spec.rb b/spec/requests/okcomputer_spec.rb index 039d7cb..0f98aa5 100644 --- a/spec/requests/okcomputer_spec.rb +++ b/spec/requests/okcomputer_spec.rb @@ -16,8 +16,7 @@ solr geoserver secure_geoserver - public_spatial_server - ucb_spatial_server + spatial_server ] end end