Verified Commit 46d766c6 authored by Hercules Merscher's avatar Hercules Merscher 🌴
Browse files

feat: Configuring JSON schema reference resolver timeout -- default to 2s

parent 7895ee00
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -16,11 +16,12 @@ module Labkit
  module UserExperienceSli
    # Configuration class for UserExperienceSli
    class Configuration
      attr_accessor :logger, :registry_path
      attr_accessor :logger, :registry_path, :ref_resolver_timeout

      def initialize
        @logger = Labkit::Logging::JsonLogger.new($stdout)
        @registry_path = File.join("config", "user_experience_slis")
        @ref_resolver_timeout = 2
      end
    end

+17 −0
Original line number Diff line number Diff line
@@ -33,6 +33,23 @@ This allows you to:

**Note:** The registry is automatically reset when the configuration changes, so the new path takes effect immediately.

### RefResolver Timeout Configuration

When validating user experience SLI definitions against JSON schemas, the system may need to fetch remote schema references over HTTP/HTTPS. By default, the timeout for these requests is 2 seconds. You can configure a custom timeout:

```ruby
Labkit::UserExperienceSli.configure do |config|
  config.ref_resolver_timeout = 5  # Set timeout to 5 seconds
end
```

This configuration is useful when:
- Working in environments with slower network connections
- Fetching schemas from remote servers with higher latency
- Needing stricter timeout constraints for faster failure detection

**Note:** The timeout applies to both connection opening and reading operations when fetching remote JSON schema references.

### User Experience Definitions

User Experience SLI definitions will be lazy loaded from the default directory (`config/user_experience_slis`).
+2 −1
Original line number Diff line number Diff line
@@ -92,7 +92,8 @@ module Labkit
      def schema
        @schema ||= begin
          schema = JSON.parse(File.read(SCHEMA_PATH))
          JSONSchemer.schema(schema, ref_resolver: Labkit::JsonSchema::RefResolver.new)
          timeout = Labkit::UserExperienceSli.configuration.ref_resolver_timeout
          JSONSchemer.schema(schema, ref_resolver: Labkit::JsonSchema::RefResolver.new(timeout_s: timeout))
        end
      end

+15 −0
Original line number Diff line number Diff line
@@ -128,6 +128,21 @@ RSpec.describe Labkit::UserExperienceSli::Registry do
        expect(registry['invalid_schema']).to be_nil
      end
    end

    context 'with custom ref_resolver_timeout' do
      it 'uses the configured timeout when creating RefResolver' do
        create_yaml_file("#{user_experience_id}.yml", base_content)

        Labkit::UserExperienceSli.configure do |config|
          config.ref_resolver_timeout = 10
        end

        expect(Labkit::JsonSchema::RefResolver).to receive(:new).with(timeout_s: 10).and_call_original

        registry = described_class.new(dir: user_experiences_dir)
        registry[user_experience_id]
      end
    end
  end

  private
+13 −0
Original line number Diff line number Diff line
@@ -103,6 +103,19 @@ RAILS_ENVIRONMENTS = %w[test development].freeze
          expect(configuration.registry_path).to eq(custom_path)
        end
      end

      describe '#ref_resolver_timeout' do
        it 'defaults to 2 seconds' do
          expect(configuration.ref_resolver_timeout).to eq(2)
        end
      end

      describe '#ref_resolver_timeout=' do
        it 'allows setting a custom timeout' do
          configuration.ref_resolver_timeout = 5
          expect(configuration.ref_resolver_timeout).to eq(5)
        end
      end
    end

    describe '.registry' do