Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bugfix/fix pydantic test failures #429

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

blakewatters
Copy link
Contributor

Fix weird test failures related to the period attribute by renaming to interval. Mark Kube Metrics test as part of the integration suite and pin Kubernetes version to keep kubetest happy and the unit tests fast

@linkous8
Copy link
Contributor

Fix weird test failures related to the period attribute by renaming to interval.

Can you elaborate on this please? I'd be very interested to see the logs

@blakewatters
Copy link
Contributor Author

Sure thing. I am running on an M1 machine for the first time and was totally baffled but after screwing with it for awhile the name period seems to be causing the issue for whatever reason:

$ pytest tests/connectors/prometheus_test.py

Users/blake/Library/Caches/pypoetry/virtualenvs/servox-cef6otZG-py3.9/lib/python3.9/site-packages/pytest_sugar.py:169: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
  xdist_version = LooseVersion(xdist.__version__)
/Users/blake/Library/Caches/pypoetry/virtualenvs/servox-cef6otZG-py3.9/lib/python3.9/site-packages/pytest_sugar.py:170: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
  if xdist_version >= LooseVersion('1.14'):
Test session starts (platform: darwin, Python 3.9.11, pytest 6.2.4, pytest-sugar 0.9.4)
Using --randomly-seed=3931736050
kubetest config file: tests/kubeconfig
kubetest context: kubetest
servo connectors: measure-0.0.0, kube_metrics-0.0.1, servo-2.0.0, kubernetes-1.5.0, scripts-0.0.0, vegeta-0.5.0, prometheus-1.5.0, opsani_dev-2.0.0, adjust-0.0.0
rootdir: /Users/blake/Projects/servox-blakewatters, configfile: setup.cfg
plugins: cov-2.12.1, sugar-0.9.4, picked-0.4.6, freezegun-0.4.2, asyncio-0.15.1, randomly-3.8.0, vscodedebug-0.1.0, xdist-2.3.0, html-3.1.1, clarity-1.0.1, mock-3.6.1, metadata-1.11.0, kubetest-0.9.3, profiling-1.7.0, forked-1.3.0
collecting ...
 tests/connectors/prometheus_test.py sssssssss✓✓                                                                                                                      14% █▌

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestPrometheusChecks.test_check_base_url ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusChecks object at 0x10861e1f0>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('45m'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def checks(self, metric) -> PrometheusChecks:
>       config = PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:286:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      15% █▋

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestPrometheusChecks.test_check_queries ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusChecks object at 0x10863f0a0>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('45m'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def checks(self, metric) -> PrometheusChecks:
>       config = PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:286:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      17% █▋

――――――――――――――――――――――――――――――― ERROR at setup of TestPrometheusChecks.test_check_targets[targets0-False-no targets are being scraped by Prometheus] ―――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusChecks object at 0x108627820>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('45m'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def checks(self, metric) -> PrometheusChecks:
>       config = PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:286:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      18% █▊

―――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestPrometheusChecks.test_check_base_url_failing ――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusChecks object at 0x1088ee9d0>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('45m'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def checks(self, metric) -> PrometheusChecks:
>       config = PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:286:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      19% █▉

――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestPrometheusChecks.test_check_targets[targets1-True-found 1 targets] ―――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusChecks object at 0x1088d8850>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('45m'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def checks(self, metric) -> PrometheusChecks:
>       config = PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:286:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      21% ██▏

――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestCLI.TestTargets.test_one_active_connector ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestCLI.TestTargets object at 0x1087270d0>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('45m'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def config(self, metric: PrometheusMetric) -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:911:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      22% ██▎
 tests/connectors/prometheus_test.py ✓✓                                                                                                                               24% ██▌

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestPrometheusConfiguration.test_metrics_required ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusConfiguration object at 0x1088b41f0>

    def test_metrics_required(self):
        try:
>           PrometheusConfiguration(metrics=None)

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:114:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError

 tests/connectors/prometheus_test.py ⨯                                                                                                                                26% ██▋

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestPrometheusConfiguration.test_generate_default_config ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusConfiguration object at 0x1088e6e20>

    def test_generate_default_config(self):
>       config = PrometheusConfiguration.generate()

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:124:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError

 tests/connectors/prometheus_test.py ⨯                                                                                                                                27% ██▊

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestPrometheusConfiguration.test_url_required ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusConfiguration object at 0x1087cf070>

    def test_url_required(self):
        try:
>           PrometheusConfiguration(base_url=None)

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:77:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError

 tests/connectors/prometheus_test.py ⨯                                                                                                                                28% ██▊

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestPrometheusConfiguration.test_supports_localhost_url ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusConfiguration object at 0x1088ca880>

    def test_supports_localhost_url(self):
>       config = PrometheusConfiguration(base_url="http://localhost:9090", metrics=[])

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:86:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError

 tests/connectors/prometheus_test.py ⨯                                                                                                                                29% ██▉

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestPrometheusConfiguration.test_rejects_invalid_url ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusConfiguration object at 0x10876d910>

    def test_rejects_invalid_url(self):
        try:
>           PrometheusConfiguration(base_url="gopher://this-is-invalid")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:97:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError

 tests/connectors/prometheus_test.py ⨯                                                                                                                                31% ███▏

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestPrometheusConfiguration.test_supports_cluster_url ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusConfiguration object at 0x1088fbfa0>

    def test_supports_cluster_url(self):
>       config = PrometheusConfiguration(
            base_url="http://prometheus.default.svc.cluster.local:9090", metrics=[]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:90:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError

 tests/connectors/prometheus_test.py ⨯                                                                                                                                32% ███▎

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― TestPrometheusConfiguration.test_generate_override_metrics ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestPrometheusConfiguration object at 0x108715700>

    def test_generate_override_metrics(self):
>       PrometheusConfiguration.generate(
            metrics=[
                PrometheusMetric(
                    "throughput",
                    servo.Unit.requests_per_second,
                    query="sum(rate(envoy_cluster_upstream_rq_total[1m]))",
                    absent=servo.connectors.prometheus.AbsentMetricPolicy.zero,
                    step="1m",
                ),
                PrometheusMetric(
                    "error_rate",
                    servo.Unit.percentage,
                    query='sum(rate(envoy_cluster_upstream_rq_xx{opsani_role!="tuning", envoy_response_code_class=~"4|5"}[1m]))',
                    absent=servo.connectors.prometheus.AbsentMetricPolicy.zero,
                    step="1m",
                ),
            ],
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:150:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError

 tests/connectors/prometheus_test.py ⨯✓✓                                                                                                                              36% ███▋

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestConnector.test_measure ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestConnector object at 0x1088b4d90>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('5s'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def config(self, metric: PrometheusMetric) -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:976:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      37% ███▊

――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestConnector.test_metrics ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestConnector object at 0x1088f7df0>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('5s'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def config(self, metric: PrometheusMetric) -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:976:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      38% ███▉

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestConnector.test_check ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestConnector object at 0x108724ac0>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('5s'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def config(self, metric: PrometheusMetric) -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:976:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      40% ████

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestConnector.test_one_active_connector ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestConnector object at 0x108724490>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('5s'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def config(self, metric: PrometheusMetric) -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:976:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      41% ████▏

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestConnector.test_describe ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestConnector object at 0x1088fad90>
metric = PrometheusMetric(name='test', unit=<Unit.requests_per_minute: 'rpm'>, query='throughput', step=Duration('5s'), absent=<AbsentMetricPolicy.ignore: 'ignore'>)

    @pytest.fixture
    def config(self, metric: PrometheusMetric) -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://localhost:9090", metrics=[metric]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:976:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      42% ████▎
 tests/connectors/prometheus_test.py ✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓✓                                                                                                    79% ███████▉

―――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_present_metric_returns_empty_results[ignore] ――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x1088d2cd0>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      81% ████████▏

――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_present_metric_returns_empty_results[zero] ―――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x1088b4b50>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      82% ████████▎

――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_empty_range_query_triggers_absent_check[warn] ――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x1087293d0>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      83% ████████▍

――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_present_metric_returns_empty_results[warn] ―――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x108729a90>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      85% ████████▌

――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_present_metric_returns_empty_results[fail] ―――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x1086b5fd0>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      86% ████████▋

――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_empty_range_query_triggers_absent_check[fail] ――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x1089cad30>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      87% ████████▊

―――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_empty_range_query_triggers_absent_check[ignore] ―――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x1088fbeb0>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      88% ████████▉

――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestAbsentMetrics.test_that_empty_range_query_triggers_absent_check[zero] ――――――――――――――――――――――――――――――――――――――――――――

self = <prometheus_test.TestAbsentMetrics object at 0x108c86d30>

    @pytest.fixture
    def connector(self) -> servo.connectors.prometheus.PrometheusConnector:
        optimizer = servo.Optimizer(
            id="servox.opsani.com/tests",
            token="00000000-0000-0000-0000-000000000000",
        )
>       config = PrometheusConfiguration.generate(base_url="https://localhost:9090")

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1564:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/connectors/prometheus.py:774: in generate
    return cls(
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      90% █████████
 tests/connectors/prometheus_test.py ✓✓✓✓✓                                                                                                                            96% █████████▋

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestResponse.test_parsing_vector_result ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

    @pytest.fixture
    def config() -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://prometheus.io/some/path/", metrics=[]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1388:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      97% █████████▊

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestResponse.test_parsing_matrix_result ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

    @pytest.fixture
    def config() -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://prometheus.io/some/path/", metrics=[]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1388:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                      99% █████████▉

―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ERROR at setup of TestResponse.test_parsing_error ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

    @pytest.fixture
    def config() -> PrometheusConfiguration:
>       return PrometheusConfiguration(
            base_url="http://prometheus.io/some/path/", metrics=[]
        )

/Users/blake/Projects/servox-blakewatters/tests/connectors/prometheus_test.py:1388:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
/Users/blake/Projects/servox-blakewatters/servo/configuration.py:279: in __init__
    super().__init__(**kwargs)
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1012: in pydantic.main.validate_model
    ???
pydantic/fields.py:422: in pydantic.fields.ModelField.get_default
    ???
pydantic/env_settings.py:38: in pydantic.env_settings.BaseSettings.__init__
    ???
pydantic/main.py:329: in pydantic.main.BaseModel.__init__
    ???
pydantic/main.py:1022: in pydantic.main.validate_model
    ???
pydantic/fields.py:837: in pydantic.fields.ModelField.validate
    ???
pydantic/fields.py:1118: in pydantic.fields.ModelField._apply_validators
    ???
pydantic/class_validators.py:278: in pydantic.class_validators._generic_validator_cls.lambda2
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

cls = <class 'servo.configuration.FastFailConfiguration'>, v = None, values = {'disabled': 0}
kwargs = {'config': <class 'servo.configuration.Config'>, 'field': ModelField(name='span', type=Optional[Duration], required=False, default=None)}

    @pydantic.validator("span", pre=True, always=True)
    def span_defaults_to_period(cls, v, *, values, **kwargs):
        if v is None:
>           return values["period"]
E           KeyError: 'period'

/Users/blake/Projects/servox-blakewatters/servo/configuration.py:661: KeyError
                                                                                                                                                                     100% ██████████
============================================================================= short test summary info ==============================================================================
FAILED tests/connectors/prometheus_test.py::TestPrometheusChecks::test_check_base_url - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusChecks::test_check_queries - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusChecks::test_check_targets[targets0-False-no targets are being scraped by Prometheus] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusChecks::test_check_base_url_failing - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusChecks::test_check_targets[targets1-True-found 1 targets] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestCLI::TestTargets::test_one_active_connector - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusConfiguration::test_metrics_required - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusConfiguration::test_generate_default_config - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusConfiguration::test_url_required - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusConfiguration::test_supports_localhost_url - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusConfiguration::test_rejects_invalid_url - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusConfiguration::test_supports_cluster_url - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestPrometheusConfiguration::test_generate_override_metrics - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestConnector::test_measure - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestConnector::test_metrics - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestConnector::test_check - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestConnector::test_one_active_connector - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestConnector::test_describe - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_present_metric_returns_empty_results[ignore] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_present_metric_returns_empty_results[zero] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_empty_range_query_triggers_absent_check[warn] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_present_metric_returns_empty_results[warn] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_present_metric_returns_empty_results[fail] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_empty_range_query_triggers_absent_check[fail] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_empty_range_query_triggers_absent_check[ignore] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestAbsentMetrics::test_that_empty_range_query_triggers_absent_check[zero] - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestResponse::test_parsing_vector_result - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestResponse::test_parsing_matrix_result - KeyError: 'period'
FAILED tests/connectors/prometheus_test.py::TestResponse::test_parsing_error - KeyError: 'period'

Results (1.69s):
      40 passed
       7 failed
         - tests/connectors/prometheus_test.py:112 TestPrometheusConfiguration.test_metrics_required
         - tests/connectors/prometheus_test.py:123 TestPrometheusConfiguration.test_generate_default_config
         - tests/connectors/prometheus_test.py:75 TestPrometheusConfiguration.test_url_required
         - tests/connectors/prometheus_test.py:85 TestPrometheusConfiguration.test_supports_localhost_url
         - tests/connectors/prometheus_test.py:95 TestPrometheusConfiguration.test_rejects_invalid_url
         - tests/connectors/prometheus_test.py:89 TestPrometheusConfiguration.test_supports_cluster_url
         - tests/connectors/prometheus_test.py:149 TestPrometheusConfiguration.test_generate_override_metrics
      22 error
       9 skipped

@linkous8
Copy link
Contributor

linkous8 commented May 16, 2022

Thank you for submitting this, please allow some time for deeper RCA as the implications of this bug could be quite far reaching (model validation dict not including values when the model defines default values)

@blakewatters
Copy link
Contributor Author

There are other changes here that are not at all controversial.

Marking the kubemetrics tests as integration is straightforward and an obvious oversight.

@blakewatters
Copy link
Contributor Author

As is pinning the Kubernetes library version to avoid inadvertent upgrades

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants