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

Update SmallRye Config to 3.4.4 #36917

Merged
merged 1 commit into from
Nov 13, 2023
Merged

Conversation

@quarkus-bot

This comment has been minimized.

@radcortez radcortez changed the title Update SmallRye Config to 3.4.2 Update SmallRye Config to 3.4.3 Nov 8, 2023
@edeandrea
Copy link
Contributor

edeandrea commented Nov 8, 2023

@radcortez I just tried to take this new version (3.4.3) and apply it to quarkusio/quarkus-super-heroes#404 in order to see if it fixes the problem I was seeing there.

When I deploy with these changes I actually find that other properties don't seem to work...When I go back to the current version (3.4.1 I think), the app starts up just fine (although the stork/hypen properties don't work).

With this ConfigMap:

kind: ConfigMap
apiVersion: v1
metadata:
  name: rest-fights-config
  labels:
    app: rest-fights
    application: fights-service
    system: quarkus-super-heroes
data:
# should map to quarkus.stork.hero-service.service-discovery.port-name
  QUARKUS_STORK_HERO_SERVICE_SERVICE_DISCOVERY_PORT_NAME: http
# should map to quarkus.otel.exporter.otlp.traces.endpoint
  QUARKUS_OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: 'http://otel-collector:4317'
# should map to quarkus.stork.narration-service.service-discovery.port-name
  QUARKUS_STORK_NARRATION_SERVICE_SERVICE_DISCOVERY_PORT_NAME: http
# should map to kafka.bootstrap.servers
  KAFKA_BOOTSTRAP_SERVERS: 'PLAINTEXT://fights-kafka:9092'
# should map to mp.messaging.connector.smallrye-kafka.apicurio.registry.url
  MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL: 'http://apicurio:8080/apis/registry/v2'
# should map to quarkus.liquibase-mongodb.migrate-at-start
  QUARKUS_LIQUIBASE_MONGODB_MIGRATE_AT_START: 'false'
# should map to quarkus.stork.narration-service.service-discovery.refresh-period
  QUARKUS_STORK_NARRATION_SERVICE_SERVICE_DISCOVERY_REFRESH_PERIOD: 1H
# should map to quarkus.stork.hero-service.service-discovery.refresh-period
  QUARKUS_STORK_HERO_SERVICE_SERVICE_DISCOVERY_REFRESH_PERIOD: 1H
# should map to quarkus.stork.hero-service.service-discovery.application
  QUARKUS_STORK_HERO_SERVICE_SERVICE_DISCOVERY_APPLICATION: rest-heroes
# should map to quarkus.stork.villain-service.service-discovery.type
  QUARKUS_STORK_VILLAIN_SERVICE_SERVICE_DISCOVERY_TYPE: kubernetes
# should map to quarkus.stork.narration-service.service-discovery.application
  QUARKUS_STORK_NARRATION_SERVICE_SERVICE_DISCOVERY_APPLICATION: rest-narration
# should map to quarkus.grpc.clients.locations.port
  QUARKUS_GRPC_CLIENTS_LOCATIONS_PORT: '80'
# should map to quarkus.mongodb.hosts
  QUARKUS_MONGODB_HOSTS: 'fights-db:27017'
# should map to quarkus.grpc.clients.locations.host
  QUARKUS_GRPC_CLIENTS_LOCATIONS_HOST: grpc-locations
# should map to quarkus.stork.villain-service.service-discovery.refresh-period
  QUARKUS_STORK_VILLAIN_SERVICE_SERVICE_DISCOVERY_REFRESH_PERIOD: 1H
# should map to quarkus.stork.villain-service.service-discovery.port-name
  QUARKUS_STORK_VILLAIN_SERVICE_SERVICE_DISCOVERY_PORT_NAME: http
# should map to quarkus.stork.narration-service.service-discovery.type
  QUARKUS_STORK_NARRATION_SERVICE_SERVICE_DISCOVERY_TYPE: kubernetes
# should map to quarkus.stork.villain-service.service-discovery.application
  QUARKUS_STORK_VILLAIN_SERVICE_SERVICE_DISCOVERY_APPLICATION: rest-villains
# should map to quarkus.stork.hero-service.service-discovery.type
  QUARKUS_STORK_HERO_SERVICE_SERVICE_DISCOVERY_TYPE: kubernetes

upon startup, I'm seeing this:

17:08:05 ERROR traceId=, parentId=, spanId=, sampled= [io.sm.re.me.provider] (main) SRMSG00230: Unable to create the publisher or subscriber during initialization: org.apache.kafka.common.KafkaException: java.lang.IllegalArgumentException: Missing registry base url, set apicurio.registry.url
	at io.smallrye.reactive.messaging.kafka.fault.SerializerWrapper.configure(SerializerWrapper.java:45)
	at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.<init>(ReactiveKafkaProducer.java:108)
	at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.<init>(ReactiveKafkaProducer.java:65)
	at io.smallrye.reactive.messaging.kafka.impl.KafkaSink.<init>(KafkaSink.java:89)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector.getSubscriber(KafkaConnector.java:270)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_Subclass.getSubscriber$$superforward(Unknown Source)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_Subclass$$function$$10.apply(Unknown Source)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:73)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:62)
	at io.quarkus.smallrye.reactivemessaging.runtime.DuplicatedContextConnectorFactoryInterceptor.intercept(DuplicatedContextConnectorFactoryInterceptor.java:37)
	at io.quarkus.smallrye.reactivemessaging.runtime.DuplicatedContextConnectorFactoryInterceptor_Bean.intercept(Unknown Source)
	at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:30)
	at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:27)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_Subclass.getSubscriber(Unknown Source)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_ClientProxy.getSubscriber(Unknown Source)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory.createSubscriber(ConfiguredChannelFactory.java:190)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory.register(ConfiguredChannelFactory.java:145)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory.initialize(ConfiguredChannelFactory.java:106)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory_ClientProxy.initialize(Unknown Source)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
	at io.smallrye.reactive.messaging.providers.extension.MediatorManager.start(MediatorManager.java:237)
	at io.smallrye.reactive.messaging.providers.extension.MediatorManager_ClientProxy.start(Unknown Source)
	at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle.onApplicationStart(SmallRyeReactiveMessagingLifecycle.java:53)
	at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_68e7b57eb97cb75d597c5b816682366e888d0d9b.notify(Unknown Source)
	at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:346)
	at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:328)
	at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:82)
	at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:155)
	at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:106)
	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
	at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
	at io.quarkus.runtime.Application.start(Application.java:101)
	at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:71)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
	at io.quarkus.runner.GeneratedMain.main(Unknown Source)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at io.quarkus.bootstrap.runner.QuarkusEntryPoint.doRun(QuarkusEntryPoint.java:61)
	at io.quarkus.bootstrap.runner.QuarkusEntryPoint.main(QuarkusEntryPoint.java:32)
Caused by: java.lang.IllegalArgumentException: Missing registry base url, set apicurio.registry.url
	at io.apicurio.registry.resolver.AbstractSchemaResolver.configure(AbstractSchemaResolver.java:73)
	at io.apicurio.registry.resolver.DefaultSchemaResolver.configure(DefaultSchemaResolver.java:61)
	at io.apicurio.registry.serde.SchemaResolverConfigurer.configure(SchemaResolverConfigurer.java:87)
	at io.apicurio.registry.serde.AbstractKafkaSerDe.configure(AbstractKafkaSerDe.java:70)
	at io.apicurio.registry.serde.avro.AvroKafkaSerializer.configure(AvroKafkaSerializer.java:91)
	at io.smallrye.reactive.messaging.kafka.fault.SerializerWrapper.configure(SerializerWrapper.java:42)
	... 46 more

17:08:05 ERROR traceId=, parentId=, spanId=, sampled= [io.qu.ru.Application] (main) Failed to start application (with profile [openshift, prod]): java.lang.RuntimeException: Failed to start quarkus
	at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
	at io.quarkus.runtime.Application.start(Application.java:101)
	at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:71)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
	at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
	at io.quarkus.runner.GeneratedMain.main(Unknown Source)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at io.quarkus.bootstrap.runner.QuarkusEntryPoint.doRun(QuarkusEntryPoint.java:61)
	at io.quarkus.bootstrap.runner.QuarkusEntryPoint.main(QuarkusEntryPoint.java:32)
Caused by: jakarta.enterprise.inject.spi.DeploymentException: org.apache.kafka.common.KafkaException: java.lang.IllegalArgumentException: Missing registry base url, set apicurio.registry.url
	at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle.onApplicationStart(SmallRyeReactiveMessagingLifecycle.java:58)
	at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle_Observer_onApplicationStart_68e7b57eb97cb75d597c5b816682366e888d0d9b.notify(Unknown Source)
	at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:346)
	at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:328)
	at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:82)
	at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:155)
	at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:106)
	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
	at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
	... 13 more
Caused by: org.apache.kafka.common.KafkaException: java.lang.IllegalArgumentException: Missing registry base url, set apicurio.registry.url
	at io.smallrye.reactive.messaging.kafka.fault.SerializerWrapper.configure(SerializerWrapper.java:45)
	at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.<init>(ReactiveKafkaProducer.java:108)
	at io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaProducer.<init>(ReactiveKafkaProducer.java:65)
	at io.smallrye.reactive.messaging.kafka.impl.KafkaSink.<init>(KafkaSink.java:89)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector.getSubscriber(KafkaConnector.java:270)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_Subclass.getSubscriber$$superforward(Unknown Source)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_Subclass$$function$$10.apply(Unknown Source)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:73)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:62)
	at io.quarkus.smallrye.reactivemessaging.runtime.DuplicatedContextConnectorFactoryInterceptor.intercept(DuplicatedContextConnectorFactoryInterceptor.java:37)
	at io.quarkus.smallrye.reactivemessaging.runtime.DuplicatedContextConnectorFactoryInterceptor_Bean.intercept(Unknown Source)
	at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
	at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:30)
	at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:27)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_Subclass.getSubscriber(Unknown Source)
	at io.smallrye.reactive.messaging.kafka.KafkaConnector_ClientProxy.getSubscriber(Unknown Source)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory.createSubscriber(ConfiguredChannelFactory.java:190)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory.register(ConfiguredChannelFactory.java:145)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory.initialize(ConfiguredChannelFactory.java:106)
	at io.smallrye.reactive.messaging.providers.impl.ConfiguredChannelFactory_ClientProxy.initialize(Unknown Source)
	at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
	at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
	at io.smallrye.reactive.messaging.providers.extension.MediatorManager.start(MediatorManager.java:237)
	at io.smallrye.reactive.messaging.providers.extension.MediatorManager_ClientProxy.start(Unknown Source)
	at io.quarkus.smallrye.reactivemessaging.runtime.SmallRyeReactiveMessagingLifecycle.onApplicationStart(SmallRyeReactiveMessagingLifecycle.java:53)
	... 21 more
Caused by: java.lang.IllegalArgumentException: Missing registry base url, set apicurio.registry.url
	at io.apicurio.registry.resolver.AbstractSchemaResolver.configure(AbstractSchemaResolver.java:73)
	at io.apicurio.registry.resolver.DefaultSchemaResolver.configure(DefaultSchemaResolver.java:61)
	at io.apicurio.registry.serde.SchemaResolverConfigurer.configure(SchemaResolverConfigurer.java:87)
	at io.apicurio.registry.serde.AbstractKafkaSerDe.configure(AbstractKafkaSerDe.java:70)
	at io.apicurio.registry.serde.avro.AvroKafkaSerializer.configure(AvroKafkaSerializer.java:91)
	at io.smallrye.reactive.messaging.kafka.fault.SerializerWrapper.configure(SerializerWrapper.java:42)
	... 46 more

@radcortez
Copy link
Member Author

radcortez commented Nov 8, 2023

Thanks, I'll have a look.

@edeandrea
Copy link
Contributor

edeandrea commented Nov 8, 2023

I cloned smallrye-config locally (main branch) and went into EnvConfigSourceTest, went into the envEquals method and added this:

assertTrue(EnvProperty.equals("MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL", new String("mp.messaging.connector.smallrye-kafka.apicurio.registry.url")));

and that test fails, yet

assertTrue(envSourceEquals("MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL", new String("mp.messaging.connector.smallrye-kafka.apicurio.registry.url")));

passes.

Of course, I don't know that project and am not sure if both of those should pass :)

@quarkus-bot

This comment has been minimized.

@radcortez
Copy link
Member Author

assertTrue(EnvProperty.equals("MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL", new String("mp.messaging.connector.smallrye-kafka.apicurio.registry.url")));

and that test fails, yet

Yes, this is expected.

assertTrue(envSourceEquals("MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL", new String("mp.messaging.connector.smallrye-kafka.apicurio.registry.url")));

passes.

Yes, this is expected.

The explanation:

As you and some people noticed, I completely rewrote the matching of environment variables (which, unfortunately, is causing some issues). The main reason is due to #35322 (comment). The previous environment variable matching code was noticeable in our flame graphs (both CPU and memory) due to all the String conversions required and missing values (the source is very high on the list, so pretty much any configuration lookup requires a query to the EnvSource).

Instead of blinding converting names:
https://github.com/smallrye/smallrye-config/blob/3.3.4/implementation/src/main/java/io/smallrye/config/EnvConfigSource.java#L56-L74

We moved to a plain equals and hashcode reverse match, which significantly boosted the performance (as seen in some of the measurements). Unfortunately, I was unaware that Docker could set dotted environment variable names, which complicated things a bit. Usually, UNIX terminals like bash only accept names in the POSIX convention, meaning that you cannot set something like mp.messaging.connector.smallrye-kafka.apicurio.registry.url in a bash terminal, without converting it to MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL, so they are in-fact equal with our set of rules for environment variables conversion.

But, if you can set a dotted name, now it means that both mp.messaging.connector.smallrye-kafka.apicurio.registry.url and MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL can coexist in the same source with different values, breaking the equals contract. For that reason, in your code, a plain equals fail, but on the source, it gives you the expected results because internally, we also generate a dotted key name to keep two entries and correctly match what you expect.

Moving forward, that support should reenable the dotted names as environment variables again, which I recommend that you to move back (I'm sorry for the inconvenience :(). The current failure of MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL is because the Config system is not aware that SMALLRYE_KAFKA should be converted to smallrye-kafka (it will convert it to smallrye.kafka). In this cases, you need an additional property in any other source to disambiguate the case. For instance:

application.properties

mp.messaging.connector.smallrye-kafka.apicurio.registry.url=

Please, check https://quarkus.io/guides/config-reference#environment-variables

@edeandrea
Copy link
Contributor

Thank you for the detailed explanation!

Given this information, how would you expect setting an environment variable of MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL to work? I'm all for only supporting posix formats/etc, but being able to override properties via environment variables is essential. What is set as mp.messaging.connector.smallrye-kafka.apicurio.registry.url in application.properties really is meaningless when an application is deployed from one environment to another.

@radcortez
Copy link
Member Author

radcortez commented Nov 9, 2023

Given this information, how would you expect setting an environment variable of MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL to work? I'm all for only supporting posix formats/etc, but being able to override properties via environment variables is essential.

This is precisely how environment variables should be used. They tend to be used to set the configuration instead of overriding configuration. While it is certainly possible to set most of the configuration, there are certain names / patterns that due to the lossy format of POSIX conventions cannot be expressed as they should.

To use a more straightforward example, think about a named datasource, which is expressed as the dotted name quarkus.datasource."datasource-name".jdbc. The environment variable name conversion is QUARKUS_DATASOURCE__DATASOURCE_NAME__JDBC. Notice that datasource-name is a dynamic piece of the key, user-defined, so when we find it alone in the configuration, how can we tell if DATASOURCE_NAME refers to datasource-name? Because it can also express datasource.name (notice the dash and the dot difference).

This is frustrating for the used, because it is expect to work. It is also frustrating to us, because probably, this is the most opened issue / thread about configuration, and we were not able to find a good way to support this, and no amount of documentation / explanation seem to work.

I'm also already biased on this, so maybe you can help with a new perspective. How can we make this work?

  • Assuming that a dynamic key is always separated by a dash? Maybe that is the most common case, although some will also use dots, and now we would just switch the user that would complain.
  • Introduce yet, another naming convention? Right now, we use the following conversion table:
    • _ to .
    • __ to ." or ".
    • _0-9_ to [0-9]
    • add a syntax that represents a dash?

Any other ideas?

What is set as mp.messaging.connector.smallrye-kafka.apicurio.registry.url in application.properties really is meaningless when an application is deployed from one environment to another.

Adding an empty mp.messaging.connector.smallrye-kafka.apicurio.registry.url to application.properties solves the issue. That was the best way I came up with without overcomplicating things. What happens in this case is that the Config system will have both mp.messaging.connector.smallrye-kafka.apicurio.registry.url and MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL, so we know that the user wants to override mp.messaging.connector.smallrye-kafka.apicurio.registry.url with MP_MESSAGING_CONNECTOR_SMALLRYE_KAFKA_APICURIO_REGISTRY_URL and correctly disambiguate the dot vs dash case.

@edeandrea
Copy link
Contributor

edeandrea commented Nov 9, 2023

I see where you are coming from. I would, however, disagree with the statement that only dynamic keys are separated by dashes. That is not the case. There are plenty of configuration keys that aren't dynamic yet that use dashes.

I'm not sure of the specific implementation, but Spring does have the concept of relaxed binding and seems it follows a lot of the same rules, although they follow a slightly different convention when binding environment variables. They just drop the hypens completely and don't replace with underscores.

Adding an empty mp.messaging.connector.smallrye-kafka.apicurio.registry.url to application.properties solves the issue.

Having to do this for every property like this in an application would make for having a section in application.properties that defined 20-30 properties with empty values. I'm not sure thats a viable solution unfortunately.

Moving forward, that support should reenable the dotted names as environment variables again, which I recommend that you to move back (I'm sorry for the inconvenience :(

I can't do that with Quarkus 3.5.0. Binding lowercase with . as env variables no longer works at all. I haven't tested 3.5.1 yet - should I expect it to work there?

@edeandrea
Copy link
Contributor

edeandrea commented Nov 9, 2023

The other thing I could do to get around this is to not use environment variables at all. I could create my ConfigMap like this:

apiVersion: v1
kind: ConfigMap
metadata:
  name: rest-fights-config
  labels:
    app: rest-fights
    application: fights-service
    system: quarkus-super-heroes
data:
  application.properties: |
    quarkus.liquibase-mongodb.migrate-at-start=false
    quarkus.mongodb.hosts=fights-db:27017
    quarkus.stork.hero-service.service-discovery.type=kubernetes
    quarkus.stork.hero-service.service-discovery.application=rest-heroes
    quarkus.stork.hero-service.service-discovery.refresh-period=1H
    quarkus.stork.hero-service.service-discovery.port-name=http
    quarkus.stork.villain-service.service-discovery.type=kubernetes
    quarkus.stork.villain-service.service-discovery.application=rest-villains
    quarkus.stork.villain-service.service-discovery.refresh-period=1H
    quarkus.stork.villain-service.service-discovery.port-name=http
    quarkus.stork.narration-service.service-discovery.type=kubernetes
    quarkus.stork.narration-service.service-discovery.application=rest-narration
    quarkus.stork.narration-service.service-discovery.refresh-period=1H
    quarkus.stork.narration-service.service-discovery.port-name=http
    quarkus.grpc.clients.locations.host=grpc-locations
    quarkus.grpc.clients.locations.port=80
    quarkus.otel.exporter.otlp.traces.endpoint=http://otel-collector:4317
    kafka.bootstrap.servers=PLAINTEXT://fights-kafka:9092
    mp.messaging.connector.smallrye-kafka.apicurio.registry.url=http://apicurio:8080/apis/registry/v2

and then in application.properties set quarkus.kubernetes.app-config-map=rest-fights-config

This will mount the ConfigMap as a volume and set the SMALLRYE_CONFIG_LOCATIONS env variable to point to its location.

But while that approach does work (I just tested it), I feel like there is an issue here with configuration resolution that still needs to be resolved. That approach also won't work for those using docker compose, where you have to pass configuration as environment variables.

A property like QUARKUS_LIQUIBASE_MONGODB_MIGRATE_AT_START needs to be able to resolve to quarkus.liquibase-mongodb.migrate-at-start. In that case, liquibase-mongodb is not a dynamic key. It is a top-level key.

@gsmet
Copy link
Member

gsmet commented Nov 9, 2023

I haven't checked the details if if things that were working previously are broken, we need to be extra cautious and document it properly in the migration guide (if we are sure we actually want to break them).

@edeandrea
Copy link
Contributor

edeandrea commented Nov 9, 2023

@gsmet As it stands right now, smallrye-config 3.4.3 breaks existing applications that use environment variables that have hyphens in them (which is a lot of things).

Furthermore, Quarkus 3.5.0 made it so that applications that were using lowercase with .s in them as environment variables no longer work (that is documented in the 3.5.0 migration guide).

So for applications that are affected, the only current available solution is to downgrade back to 3.4.x. I haven't checked 3.5.1 though, so maybe there is a fix in there?

@cescoffier
Copy link
Member

The change is breaking reactive messaging "weird" environment variable handling. We need to see if we merge it and consider it as a breaking change, or if we try to change how it's handled.

@edeandrea
Copy link
Contributor

Its not just reactive messaging that this breaks. Its more wirespread than that.

@radcortez
Copy link
Member Author

I see where you are coming from. I would, however, disagree with the statement that only dynamic keys are separated by dashes. That is not the case. There are plenty of configuration keys that aren't dynamic yet that use dashes.

I didn't mean to say that only dynamic keys are separated by dashes, but the issue is that dynamic keys are the ones that we cannot infer properly (for instance a datasource name). I've been improving the support and dashed names that are static parts of a @ConfigMapping are correctly resolved without the additional key required to disambiguate.

I'm not sure of the specific implementation, but Spring does have the concept of relaxed binding and seems it follows a lot of the same rules, although they follow a slightly different convention when binding environment variables. They just drop the hypens completely and don't replace with underscores.

I can check if they are doing something different, but I can't see how a dynamic dashed name can be supported with an environment variable alone, without some sort of representation. I mean, maybe we just introduce a triple _ to represent a dash and all the problems will go away, but we wanted to avoid overcomplicating the rules. The chance is that then someone is going to ask for a new representation of another character that cannot be represented in POSIX.

Going back to the datasource name example, I don't think this can be relaxed in any form. The name has to match the injection point to retrieve the correct datasource as @DataSource("datasource-name"). The Config system only deals with lookup, retrievals, and conversion, it is not aware of semantic meanings or names. In this case, each extension would be required to internally determine what is acceptable or not. You could use the annotation metadata to determine this, but again is not fail-safe because you may have a situation where you access the config programmatically without any other metadata to help you.

Having to do this for every property like this in an application would make for having a section in application.properties that defined 20-30 properties with empty values. I'm not sure thats a viable solution unfortunately.

This is not for every property. It is for properties that contain dynamic segments which are separated by dashes. A good alternative is not to use dashes if you want to also use the same configuration name as an environment variable :)

I can't do that with Quarkus 3.5.0. Binding lowercase with . as env variables no longer works at all. I haven't tested 3.5.1 yet - should I expect it to work there?

It will work again with this update. That was my bad because I was not aware that Docker or K8s were able to bind environment variable names without any restriction (as used dotted formats and characters not defined in the POSIX standard). Every time I've had to set such variables, I've naturally converted them to a bash-style accepted syntax :)

Can you please try it with the dotted format and the dependency update (required both common and core)? I've tried it locally, and the app starts, but I'm not fully aware of all the functionality, so I have no idea if all the pieces are working. Sorry for the inconvenience, and thanks!

@radcortez
Copy link
Member Author

A property like QUARKUS_LIQUIBASE_MONGODB_MIGRATE_AT_START needs to be able to resolve to quarkus.liquibase-mongodb.migrate-at-start. In that case, liquibase-mongodb is not a dynamic key. It is a top-level key.

Correct. While I did claim in my previous comment that this now works out of the box, it does require the Quarkus extension to use @ConfigMapping for the binding. A lot of the extensions are still using the old structure which does not support that and requires migration.

@edeandrea
Copy link
Contributor

edeandrea commented Nov 9, 2023

This is not for every property. It is for properties that contain dynamic segments which are separated by dashes. A good alternative is not to use dashes if you want to also use the same configuration name as an environment variable :)

I meant for every property that contains dynamic segments, which for the application in question is about 15, so definitely a pain. And some I have no control over whether the dynamic segment uses a hyphen (i.e. the smallrye-kafka example).

Can you please try it with the dotted format and the dependency update (required both common and core)?

As a baseline, I reverted back to Quarkus 3.4.3 and everything works as expected. Then I ran a few scenarios that all ended up the same, where the specific apicurio error mentioned above went away, but other lowercase configuration that has hyphens in it are not respected, resulting in the application not working as expected:

  • Quarkus 3.4.3 while forcing smallrye-config, smallrye-config-core, smallrye-config-common, smallrye-config-validator, and smallrye-config-source-yaml to version 3.4.3
  • Quarkus 3.5.0 while forcing smallrye-config, smallrye-config-core, smallrye-config-common, smallrye-config-validator, and smallrye-config-source-yaml to version 3.4.3
  • Quarkus 3.5.1 while forcing smallrye-config, smallrye-config-core, smallrye-config-common, smallrye-config-validator, and smallrye-config-source-yaml to version 3.4.3
  • Quarkus 3.5.0 (none of the lowercase properties are respected)
  • Quarkus 3.5.1 (none of the lowercase properties are respected)

I can describe how I ran my test(s) if you're interested.

@radcortez
Copy link
Member Author

@gsmet As it stands right now, smallrye-config 3.4.3 breaks existing applications that use environment variables that have hyphens in them (which is a lot of things).

The change is breaking reactive messaging "weird" environment variable handling. We need to see if we merge it and consider it as a breaking change, or if we try to change how it's handled.

This is the same break, which I would have to argue that is not a break at all :)

RM was able to properly discover configuration with some really weird combinations, that shouldn't be supported in the first place. For instance, if you have the attribute hostname and the connector mp.messaging.incoming.foo, then acceptable lookup configurations should be:

  • mp.messaging.incoming.foo.hostname
  • MP_MESSAGING_INCOMING_FOO_HOSTNAME (env name conversion)

(which are the listed formats for our documentation)

But RM is actually looking up for mp.messaging.incoming.foo.HOSTNAME or if the name is dashed it would look for mp.messaging.incoming.foo.HOST_NAME.

The problem with this, is that on a Docker container env source you could set both MP_MESSAGING_INCOMING_FOO_HOSTNAME and mp.messaging.incoming.foo.HOSTNAME to different values and the value you get back is not MP_MESSAGING_INCOMING_FOO_HOSTNAME as documented, but this weird mixed mode mp.messaging.incoming.foo.HOSTNAME, so I have restricted those cases, and that causes the breakage.

Furthermore, Quarkus 3.5.0 made it so that applications that were using lowercase with .s in them as environment variables no longer work (that is documented in the 3.5.0 migration guide).

While this was initially intended, I've realized that it is going to be a major inconvenience for a lot of users, and this PR readds such support.

So for applications that are affected, the only current available solution is to downgrade back to 3.4.x. I haven't checked 3.5.1 though, so maybe there is a fix in there?

For applications that use dotted format configuration names as environment variables names, if they want to upgrade to 3.5.0, must change them to POSIX compatible names and follow any dissabiguation rules documented here: https://quarkus.io/guides/config-reference#environment-variables. If they want to keep using their dotted format names, there is no Quarkus version for it yet. They would need to update SR Config manually to 3.4.3.

@radcortez
Copy link
Member Author

radcortez commented Nov 9, 2023

I can describe how I ran my test(s) if you're interested.

Sure. How do you determine if the app is behaving as expected? Just a clean startup is ok? Or do you need to execute a specific action?

@radcortez radcortez marked this pull request as draft November 9, 2023 16:24
@edeandrea
Copy link
Contributor

Sure. How do you determine if the app is behaving is expected? Just a clean startup is ok? Of do you need to execute a specific action?

I'm using the Superheroes application on an OpenShift cluster that I have set up.

First, I deployed the entire system as a whole by doing oc apply -f https://raw.githubusercontent.com/quarkusio/quarkus-super-heroes/main/deploy/k8s/java17-openshift.yml. These apps are based on Quarkus 3.5.1.

If you look at https://raw.githubusercontent.com/quarkusio/quarkus-super-heroes/main/deploy/k8s/java17-openshift.yml and find the ConfigMap named rest-fights-config you'll notice that it has been converted to all uppercase.

Once the app is deployed, I open the UI (Super heroes UI) and see that I am getting fallback hero & villains.

image

Then, I clone the main branch of the superheroes locally. I go into rest-fights/src/main/kubernetes/openshift.yml and update the ConfigMap to be

apiVersion: v1
kind: ConfigMap
metadata:
  name: rest-fights-config
  labels:
    app: rest-fights
    application: fights-service
    system: quarkus-super-heroes
data:
  quarkus.liquibase-mongodb.migrate-at-start: false
  quarkus.mongodb.hosts: fights-db:27017
  quarkus.stork.hero-service.service-discovery.type: kubernetes
  quarkus.stork.hero-service.service-discovery.application: rest-heroes
  quarkus.stork.hero-service.service-discovery.refresh-period: 1H
  quarkus.stork.hero-service.service-discovery.port-name: http
  quarkus.stork.villain-service.service-discovery.type: kubernetes
  quarkus.stork.villain-service.service-discovery.application: rest-villains
  quarkus.stork.villain-service.service-discovery.refresh-period: 1H
  quarkus.stork.villain-service.service-discovery.port-name: http
  quarkus.stork.narration-service.service-discovery.type: kubernetes
  quarkus.stork.narration-service.service-discovery.application: rest-narration
  quarkus.stork.narration-service.service-discovery.refresh-period: 1H
  quarkus.stork.narration-service.service-discovery.port-name: http
  quarkus.grpc.clients.locations.host: grpc-locations
  quarkus.grpc.clients.locations.port: 80
  quarkus.otel.exporter.otlp.traces.endpoint: http://otel-collector:4317
  kafka.bootstrap.servers: PLAINTEXT://fights-kafka:9092
  mp.messaging.connector.smallrye-kafka.apicurio.registry.url: http://apicurio:8080/apis/registry/v2

I do an oc login to my cluster, switch to the project, and do ./mvnw clean package -Dquarkus.profile=openshift -Dquarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 -Dquarkus.container-image.group=$(oc project -q) -Dquarkus.kubernetes.deploy=true -DskipTests -Dquarkus.kubernetes-client.trust-certs=true. This will run an S2I build from my local source and re-deploy the app.

But then the rest-fights app fails to start up, because it can't use the lowercase/. env variables to find things like the database, kafka broker, etc.

So then in rest-fights/pom.xml I added this to the <dependencyManagement>/<dependencies> section:

<dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-core</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-common</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-validator</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-source-yaml</artifactId>
        <version>3.4.3</version>
      </dependency>

Then I re-do ./mvnw clean package -Dquarkus.profile=openshift -Dquarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 -Dquarkus.container-image.group=$(oc project -q) -Dquarkus.kubernetes.deploy=true -DskipTests -Dquarkus.kubernetes-client.trust-certs=true

The app actually starts up this time, but I still see fallback hero/villain

image

I know some of the config is good though, because if I perform a fight it persists when I refresh the page I see the result in the table below.

Then I go back to rest-fights/pom.xml and change quarkus.platform.version to 3.4.3. I also have to make a change on line 115 of FightService because that method was introduced in Quarkus 3.5.0. I need to change .with((h, v) -> new Fighters(h, v)) to .combinedWith((h, v) -> new Fighters(h, v)).

Then I re-do ./mvnw clean package -Dquarkus.profile=openshift -Dquarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 -Dquarkus.container-image.group=$(oc project -q) -Dquarkus.kubernetes.deploy=true -DskipTests -Dquarkus.kubernetes-client.trust-certs=true and get the same result.

Then I go back to rest-fights/pom.xml and remove the updates to the smallrye-config stuff and re-deploy, and everything works as expected.

image

@radcortez
Copy link
Member Author

Thanks, but I think that is not going to work for me. I don't have an Openshift instance, so I must run this locally on my Minikube.

@edeandrea
Copy link
Contributor

edeandrea commented Nov 9, 2023

instead of using https://raw.githubusercontent.com/quarkusio/quarkus-super-heroes/main/deploy/k8s/java17-openshift.yml you can use https://raw.githubusercontent.com/quarkusio/quarkus-super-heroes/main/deploy/k8s/java17-minikube.yml, and when deploying you can use -Dquarkus.profile=minikube instead of -Dquarkus.profile=openshift

And instead of modifying rest-fights/src/main/kubernetes/openshift.yml you would modify rest-fights/src/main/kubernetes/minikube.yml

I can also provide you an OpenShift cluster if you'd like where I have all of this stuff already deployed.

I could also try to replicate using docker compose if you'd like, although I'm less convinced that will show the problem, because some of the default properties specified in application.properties will kick in, because the fact the services are running on localhost (the defaults). Deploying to a "real" environment forces those properties to be overridden.

@radcortez
Copy link
Member Author

No worries, I'll figure it out. I just needed to know what are the conditions to consider the app to be running as expected. Thanks.

@radcortez
Copy link
Member Author

  • Quarkus 3.5.0 while forcing smallrye-config, smallrye-config-core, smallrye-config-common, smallrye-config-validator, and smallrye-config-source-yaml to version 3.4.3
  • Quarkus 3.5.1 while forcing smallrye-config, smallrye-config-core, smallrye-config-common, smallrye-config-validator, and smallrye-config-source-yaml to version 3.4.3

BTW, in these cases, which properties are not working?

@edeandrea
Copy link
Contributor

BTW, in these cases, which properties are not working?

  quarkus.stork.hero-service.service-discovery.type: kubernetes
  quarkus.stork.hero-service.service-discovery.application: rest-heroes
  quarkus.stork.hero-service.service-discovery.refresh-period: 1H
  quarkus.stork.hero-service.service-discovery.port-name: http
  quarkus.stork.villain-service.service-discovery.type: kubernetes
  quarkus.stork.villain-service.service-discovery.application: rest-villains
  quarkus.stork.villain-service.service-discovery.refresh-period: 1H
  quarkus.stork.villain-service.service-discovery.port-name: http
  quarkus.stork.narration-service.service-discovery.type: kubernetes
  quarkus.stork.narration-service.service-discovery.application: rest-narration
  quarkus.stork.narration-service.service-discovery.refresh-period: 1H
  quarkus.stork.narration-service.service-discovery.port-name: http

@edeandrea
Copy link
Contributor

edeandrea commented Nov 9, 2023

I can reproduce it using docker compose if that is more helpful. Here's how to do it.

1-time setup

  1. Clone https://github.com/quarkusio/quarkus-super-heroes (main branch)
  2. Replace rest-fights/src/main/resources/application.properties with this:
quarkus.application.name=rest-fights

## HTTP configuration
quarkus.http.port=8082
quarkus.jackson.serialization-inclusion=non-empty

## Mongo
quarkus.mongodb.metrics.enabled=true
quarkus.mongodb.database=fights

## Liquibase Mongo
quarkus.liquibase-mongodb.migrate-at-start=true

## CORS
quarkus.http.cors=true
quarkus.http.cors.origins=*

## Rest clients
quarkus.rest-client.hero-client.url=stork://hero-service
quarkus.rest-client.narration-client.url=stork://narration-service
fight.villain.client-base-url=stork://villain-service

## gRPC clients
quarkus.grpc.dev-mode.force-server-start=false
quarkus.grpc.clients.locations.use-quarkus-grpc-client=true
quarkus.grpc.clients.locations.host=localhost
quarkus.grpc.clients.locations.port=8089
quarkus.grpc.clients.locations.load-balancing-policy=round_robin

## Microcks
quarkus.microcks.devservices.enabled=false

## Fight configuration
fight.hero.fallback.name=Fallback hero
fight.hero.fallback.picture=https://dummyimage.com/280x380/1e8fff/ffffff&text=Fallback+Hero
fight.hero.fallback.powers=Fallback hero powers
fight.hero.fallback.level=1
fight.villain.fallback.name=Fallback villain
fight.villain.fallback.picture=https://dummyimage.com/280x380/b22222/ffffff&text=Fallback+Villain
fight.villain.fallback.powers=Fallback villain powers
fight.villain.fallback.level=45
fight.fallback-narration=High above a bustling city, a symbol of hope and justice soared through the sky, while chaos reigned below, with malevolent laughter echoing through the streets.\nWith unwavering determination, the figure swiftly descended, effortlessly evading explosive attacks, closing the gap, and delivering a decisive blow that silenced the wicked laughter.\n\nIn the end, the battle concluded with a clear victory for the forces of good, as their commitment to peace triumphed over the chaos and villainy that had threatened the city.\nThe people knew that their protector had once again ensured their safety.\n
fight.location.fallback.name=Fallback location
fight.location.fallback.description=This is a fallback location. Not generally someplace you'd like to visit.
fight.location.fallback.picture=https://dummyimage.com/280x380/b22222/ffffff&text=Fallback+Location

## Kafka configuration
mp.messaging.outgoing.fights.connector=smallrye-kafka
mp.messaging.outgoing.fights.topic=fights
mp.messaging.outgoing.fights.apicurio.registry.auto-register=true

# Container image
quarkus.container-image.builder=docker
quarkus.container-image.group=quarkus-super-heroes
quarkus.container-image.name=${quarkus.application.name}
  1. Replace rest-fights/deploy/docker-compose/java17.yml with this:
#######################################################################
# THIS FILE IS AUTOMATICALLY GENERATED DURING CI/CD.
# ANY LOCAL CHANGES YOU MAKE SHOULD NOT BE COMMITTED TO SOURCE CONTROL.
#######################################################################

version: "3"
services:

  fights-db:
    image: mongo:5.0
    container_name: fights-db
    ports:
      - "27017"
    environment:
      MONGO_INITDB_DATABASE: fights
      MONGO_INITDB_ROOT_USERNAME: super
      MONGO_INITDB_ROOT_PASSWORD: super
    volumes:
      - ../../../rest-fights/deploy/db-init/initialize-database.js:/docker-entrypoint-initdb.d/1-init-db.js

  fights-kafka:
    image: quay.io/strimzi/kafka:0.34.0-kafka-3.4.0
    container_name: fights-kafka
    command:
      - "sh"
      - "-c"
      - "export CLUSTER_ID=$$(bin/kafka-storage.sh random-uuid) && bin/kafka-storage.sh format -t $${CLUSTER_ID} -c config/kraft/server.properties && bin/kafka-server-start.sh config/kraft/server.properties --override advertised.listeners=$${KAFKA_ADVERTISED_LISTENERS}"
    ports:
      - "9092:9092"
    environment:
      LOG_DIR: /tmp/logs
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://fights-kafka:9092

  rest-fights:
    image: quarkus-super-heroes/rest-fights:1.0
    container_name: rest-fights
    depends_on:
      - fights-db
      - fights-kafka
    ports:
      - "8082:8082"
    environment:
      quarkus.mongodb.hosts: fights-db:27017
      kafka.bootstrap.servers: PLAINTEXT://fights-kafka:9092
      quarkus.liquibase-mongodb.migrate-at-start: "false"
      quarkus.mongodb.credentials.username: superfight
      quarkus.mongodb.credentials.password: superfight
      quarkus.stork.hero-service.service-discovery.type: static
      quarkus.stork.hero-service.service-discovery.address-list: http://rest-heroes-another-test.apps.cluster-hx5gs.hx5gs.sandbox1297.opentlc.com
      quarkus.stork.villain-service.service-discovery.type: static
      quarkus.stork.villain-service.service-discovery.address-list: http://rest-villains-another-test.apps.cluster-hx5gs.hx5gs.sandbox1297.opentlc.com
      quarkus.stork.narration-service.service-discovery.type: static
      quarkus.stork.narration-service.service-discovery.address-list: http://rest-narration-another-test.apps.cluster-hx5gs.hx5gs.sandbox1297.opentlc.com
      quarkus.grpc.clients.locations.host: grpc-locations-another-test.apps.cluster-hx5gs.hx5gs.sandbox1297.opentlc.com
      quarkus.grpc.clients.locations.port: 80
      mp.messaging.connector.smallrye-kafka.apicurio.registry.url: http://apicurio-another-test.apps.cluster-hx5gs.hx5gs.sandbox1297.opentlc.com/apis/registry/v2
    restart: on-failure
    networks:
      default:
        aliases:
          - rest-fights
    deploy:
      resources:
        limits:
          memory: 1G
          cpus: '1'
        reservations:
          memory: 256M
          cpus: '0.5'
  1. In rest-fights/src/main/java/io/quarkus/sample/superheroes/fight/service/FightService.java on line 115, change .with((h, v) -> new Fighters(h, v)) to .combinedWith((h, v) -> new Fighters(h, v))

Test scenarios

Baseline test with Quarkus 3.4.3

  1. cd into rest-fights
  2. In rest-fights/pom.xml, change <quarkus.platform.version>3.5.1</quarkus.platform.version> to <quarkus.platform.version>3.4.3</quarkus.platform.version>
  3. Run a build by doing ./mvnw clean package -DskipTests -Dquarkus.container-image.build=true
  4. Start up the service by doing docker compose -f deploy/docker-compose/java17.yml up and wait for everything to start up
  5. In a separate terminal, try to do curl http://localhost:8082/api/fights/randomfighters. You should see real data (not fallback hero/villain). The configuration is pointing to live services that I have running on an OpenShift cluster. This is the baseline test that everything is fine with Quarkus 3.4.3.

Upgrade to Quarkus 3.5.1

  1. Run docker compose -f deploy/docker-compose/java17.yml down --remove-orphans to shut everything down
  2. Go back into rest-fights/pom.xml and change <quarkus.platform.version>3.4.3</quarkus.platform.version> to <quarkus.platform.version>3.5.1</quarkus.platform.version>
  3. Re-run ./mvnw clean package -DskipTests -Dquarkus.container-image.build=true
  4. Re-run docker compose -f deploy/docker-compose/java17.yml up
  5. Try to do the curl http://localhost:8082/api/fights/randomfighters again. It should fail. If you examine the docker compose log, you should see that the rest-fights app failed to start because it can't connect to mongodb.
    • The environment variables in the compose file aren't being read/set properly.

Add Smallrye Config 3.4.3

  1. Run docker compose -f deploy/docker-compose/java17.yml down --remove-orphans to shut everything down
  2. Go back into rest-fights/pom.xml. In the <dependencyManagement>/<dependencies> section, add this:
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-core</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-common</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-validator</artifactId>
        <version>3.4.3</version>
      </dependency>
      <dependency>
        <groupId>io.smallrye.config</groupId>
        <artifactId>smallrye-config-source-yaml</artifactId>
        <version>3.4.3</version>
      </dependency>
  1. Re-run ./mvnw clean package -DskipTests -Dquarkus.container-image.build=true
  2. Re-run docker compose -f deploy/docker-compose/java17.yml up
  3. Do the curl http://localhost:8082/api/fights/randomfighters again. You should see the fallback hero/villain:
{"hero":{"name":"Fallback hero","level":1,"picture":"https://dummyimage.com/280x380/1e8fff/ffffff&text=Fallback+Hero","powers":"Fallback hero powers"},"villain":{"name":"Fallback villain","level":45,"picture":"https://dummyimage.com/280x380/b22222/ffffff&text=Fallback+Villain","powers":"Fallback villain powers"}}%
  1. If you look in the docker compose logs, you'll probably see some errors like
rest-fights   | 2023-11-09 18:00:45,609 ERROR [org.jbo.res.rea.cli.imp.StorkClientRequestFilter] (vert.x-eventloop-thread-0) Error selecting service instance for serviceName: hero-service: io.smallrye.stork.api.NoSuchServiceDefinitionException: No service defined for name hero-service
rest-fights   |         at io.smallrye.stork.Stork.getService(Stork.java:71)

rest-fights   | 2023-11-09 18:00:45,612 ERROR [org.jbo.res.rea.cli.imp.StorkClientRequestFilter] (vert.x-eventloop-thread-0) Error selecting service instance for serviceName: villain-service: io.smallrye.stork.api.NoSuchServiceDefinitionException: No service defined for name villain-service
rest-fights   |         at io.smallrye.stork.Stork.getService(Stork.java:71)

The stork configuration is not being set properly. My guess is that the mp.messaging.connector.smallrye-kafka.apicurio.registry.url property isn't getting set correctly either, but this test didn't do anything to prove or disprove that.

If you go back to the compose file and change the quarkus.stork.* variables to their UPPERCASE_EQUIVALENTS, none of these tests work either. They don't work even back in the Quarkus 3.4.3 baseline test either.

@radcortez
Copy link
Member Author

Thanks!

Can you please try out this patch? smallrye/smallrye-config#1050

@edeandrea
Copy link
Contributor

That patch seems to work! I tried it with Quarkus 3.5.1, both in my "on-openshift" & docker compose tests.

@radcortez
Copy link
Member Author

Great. Thanks!

@radcortez radcortez changed the title Update SmallRye Config to 3.4.3 Update SmallRye Config to 3.4.4 Nov 11, 2023
@radcortez radcortez marked this pull request as ready for review November 11, 2023 10:18
@quarkus-bot
Copy link

quarkus-bot bot commented Nov 11, 2023

Failing Jobs - Building 785433f

Status Name Step Failures Logs Raw logs Build scan
✔️ Gradle Tests - JDK 11
Gradle Tests - JDK 11 Windows Build Failures Logs Raw logs

Full information is available in the Build summary check run.

Failures

⚙️ Gradle Tests - JDK 11 Windows #

- Failing: integration-tests/gradle 

📦 integration-tests/gradle

io.quarkus.gradle.CustomManifestArgumentsTest.shouldContainsSpecificManifestProperty line 37 - More details - Source on GitHub

java.lang.AssertionError: 

Expecting actual not to be null

@gsmet
Copy link
Member

gsmet commented Nov 13, 2023

@radcortez @edeandrea do I understand things correctly, this patch makes everyone happy?

@famod
Copy link
Member

famod commented Nov 13, 2023

FWIW, my case (#36856) is fixed with SR-Config 3.4.4. Thanks @radcortez!

@edeandrea
Copy link
Contributor

Yes this, along with reverting quarkusio/quarkus-super-heroes@2f5ed77 fixes quarkusio/quarkus-super-heroes#404

@famod
Copy link
Member

famod commented Nov 13, 2023

Look good to merge so that it can be included in 3.5.2, no?

@gsmet gsmet merged commit 848c636 into quarkusio:main Nov 13, 2023
64 of 65 checks passed
@quarkus-bot quarkus-bot bot added this to the 3.6 - main milestone Nov 13, 2023
@gsmet gsmet modified the milestones: 3.6 - main, 3.5.2 Nov 13, 2023
@radcortez
Copy link
Member Author

@radcortez @edeandrea do I understand things correctly, this patch makes everyone happy?

Not totally happy myself, but as long as everyone else is happy, I will be happy :)

@edeandrea
Copy link
Contributor

Not totally happy myself, but as long as everyone else is happy, I will be happy :)

Well for me, happy = it works :)

benkard pushed a commit to benkard/mulkcms2 that referenced this pull request Dec 2, 2023
This MR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [flow-bin](https://github.com/flowtype/flow-bin) ([changelog](https://github.com/facebook/flow/blob/master/Changelog.md)) | devDependencies | minor | [`^0.220.0` -> `^0.222.0`](https://renovatebot.com/diffs/npm/flow-bin/0.220.0/0.222.0) |
| [org.postgresql:postgresql](https://jdbc.postgresql.org) ([source](https://github.com/pgjdbc/pgjdbc)) | build | minor | `42.6.0` -> `42.7.0` |
| [org.liquibase.ext:liquibase-hibernate5](https://github.com/liquibase/liquibase-hibernate/wiki) ([source](https://github.com/liquibase/liquibase-hibernate)) | build | minor | `4.24.0` -> `4.25.0` |
| [org.liquibase:liquibase-maven-plugin](http://www.liquibase.org/liquibase-maven-plugin) ([source](https://github.com/liquibase/liquibase)) | build | minor | `4.24.0` -> `4.25.0` |
| [org.jsoup:jsoup](https://jsoup.org/) ([source](https://github.com/jhy/jsoup)) | compile | minor | `1.16.2` -> `1.17.1` |
| [io.hypersistence:hypersistence-utils-hibernate-62](https://github.com/vladmihalcea/hypersistence-utils) | compile | patch | `3.6.0` -> `3.6.1` |
| [org.hibernate.orm:hibernate-envers](https://hibernate.org/orm) ([source](https://github.com/hibernate/hibernate-orm)) | build | minor | `6.3.1.Final` -> `6.4.0.Final` |
| [org.hibernate.orm:hibernate-core](https://hibernate.org/orm) ([source](https://github.com/hibernate/hibernate-orm)) | build | minor | `6.3.1.Final` -> `6.4.0.Final` |
| [com.blazebit:blaze-persistence-bom](https://persistence.blazebit.com) ([source](https://github.com/Blazebit/blaze-persistence)) | import | patch | `1.6.9` -> `1.6.10` |
| [com.diffplug.spotless:spotless-maven-plugin](https://github.com/diffplug/spotless) | build | minor | `2.40.0` -> `2.41.0` |
| [io.quarkus:quarkus-maven-plugin](https://github.com/quarkusio/quarkus) | build | minor | `3.5.1` -> `3.6.0` |
| [io.quarkus:quarkus-universe-bom](https://github.com/quarkusio/quarkus-platform) | import | patch | `3.5.1` -> `3.5.3` |

---

### Release Notes

<details>
<summary>flowtype/flow-bin</summary>

### [`v0.222.0`](flow/flow-bin@543cad7...84a68f1)

[Compare Source](flow/flow-bin@543cad7...84a68f1)

### [`v0.221.0`](flow/flow-bin@e8b3a2e...543cad7)

[Compare Source](flow/flow-bin@e8b3a2e...543cad7)

### [`v0.220.1`](flow/flow-bin@030bfc6...e8b3a2e)

[Compare Source](flow/flow-bin@030bfc6...e8b3a2e)

</details>

<details>
<summary>pgjdbc/pgjdbc</summary>

### [`v42.7.0`](https://github.com/pgjdbc/pgjdbc/blob/HEAD/CHANGELOG.md#&#8203;4270-2023-11-20-093300--0500)

##### Changed

-   fix: Deprecate for removal PGPoint.setLocation(java.awt.Point) to cut dependency to `java.desktop` module. [MR #&#8203;2967](pgjdbc/pgjdbc#2967)
-   feat: return all catalogs for getCatalogs metadata query closes [ISSUE #&#8203;2949](pgjdbc/pgjdbc#2949) [MR #&#8203;2953](pgjdbc/pgjdbc#2953)
-   feat: support SET statements combining with other queries with semicolon in PreparedStatement [MR ##&#8203;2973](pgjdbc/pgjdbc#2973)

##### Fixed

-   chore: add styleCheck Gradle task to report style violations [MR #&#8203;2980](pgjdbc/pgjdbc#2980)
-   fix: Include currentXid in "Error rolling back prepared transaction" exception message [MR #&#8203;2978](pgjdbc/pgjdbc#2978)
-   fix: add varbit as a basic type inside the TypeInfoCache [MR #&#8203;2960](pgjdbc/pgjdbc#2960)
-   fix: Fix failing tests for version 16.  [MR #&#8203;2962](pgjdbc/pgjdbc#2962)
-   fix: allow setting arrays with ANSI type name [MR #&#8203;2952](pgjdbc/pgjdbc#2952)
-   feat: Use KeepAlive to confirm LSNs [MR #&#8203;2941](pgjdbc/pgjdbc#2941)
-   fix: put double ' around log parameter [MR #&#8203;2936](pgjdbc/pgjdbc#2936) fixes [ISSUE #&#8203;2935](pgjdbc/pgjdbc#2935)
-   fix: Fix Issue [#&#8203;2928](pgjdbc/pgjdbc#2928) number of ports not equal to number of servers in datasource [MR #&#8203;2929](pgjdbc/pgjdbc#2929)
-   fix: Use canonical DateStyle name ([#&#8203;2925](pgjdbc/pgjdbc#2925)) fixes [pgbouncer issue](pgbouncer/pgbouncer#776)
-   fix: Method getFastLong should be able to parse all longs [MR #&#8203;2881](pgjdbc/pgjdbc#2881)
-   docs: Fix typos in info.html [MR #&#8203;2860](pgjdbc/pgjdbc#2860)
-   fix: Return correct default from PgDatabaseMetaData.getDefaultTransactionIsolation [MR #&#8203;2992](pgjdbc/pgjdbc#2992) fixes [Issue #&#8203;2991](pgjdbc/pgjdbc#2991)
-   test: fix assertion in RefCursorFetchTestultFetchSize rows
-   test: use try-with-resources in LogicalReplicationStatusTest

</details>

<details>
<summary>liquibase/liquibase-hibernate</summary>

### [`v4.25.0`](https://github.com/liquibase/liquibase-hibernate/releases/tag/v4.25.0): Support for Liquibase Hibernate 6 Extension v4.25.0

[Compare Source](liquibase/liquibase-hibernate@v4.24.0...v4.25.0)

#### Changes

#### What's Changed

-   DAT-15993 -
liquibase-hibernate using Liquibase Parent POM by [@&#8203;jandroav](https://github.com/jandroav) in liquibase/liquibase-hibernate#587
-   Update README.md by [@&#8203;vivekBoii](https://github.com/vivekBoii) in liquibase/liquibase-hibernate#585
-   Update pom.xml by [@&#8203;jandroav](https://github.com/jandroav) in liquibase/liquibase-hibernate#596
-   chore(deps): bump liquibase/build-logic from 0.4.7 to 0.5.5 by [@&#8203;dependabot](https://github.com/dependabot) in liquibase/liquibase-hibernate#609
-   Fixed a typo in ReadMe by [@&#8203;smty2018](https://github.com/smty2018) in liquibase/liquibase-hibernate#600

#### New Contributors

-   [@&#8203;vivekBoii](https://github.com/vivekBoii) made their first contribution in liquibase/liquibase-hibernate#585
-   [@&#8203;smty2018](https://github.com/smty2018) made their first contribution in liquibase/liquibase-hibernate#600
-   [@&#8203;sayaliM0412](https://github.com/sayaliM0412) made their first contribution in liquibase/liquibase-hibernate#618

**Full Changelog**: liquibase/liquibase-hibernate@v4.24.0...v4.25.0

</details>

<details>
<summary>liquibase/liquibase</summary>

### [`v4.25.0`](https://github.com/liquibase/liquibase/blob/HEAD/changelog.txt#Liquibase-4250-is-a-major-release)

[Compare Source](liquibase/liquibase@v4.24.0...v4.25.0)

</details>

<details>
<summary>vladmihalcea/hypersistence-utils</summary>

### [`v3.6.1`](https://github.com/vladmihalcea/hypersistence-utils/blob/HEAD/changelog.txt#Version-361---November-11-2023)

\================================================================================

Export the testing mechanism [#&#8203;676](vladmihalcea/hypersistence-utils#676)

</details>

<details>
<summary>hibernate/hibernate-orm</summary>

### [`v6.4.0.Final`](https://github.com/hibernate/hibernate-orm/blob/HEAD/changelog.txt#Changes-in-640Final-November-23-2023)

[Compare Source](hibernate/hibernate-orm@6.3.2...6.4.0)

https://hibernate.atlassian.net/projects/HHH/versions/32212

\*\* Bug
\* \[HHH-17454] - SemanticException caused by type check when comparing generic path to parameter expression
\* \[HHH-17428] - Parameter place holder should start from 1 in StandardTemporaryTableExporter
\* \[HHH-17415] - NullPointerException: EntityValuedPathInterpretation - getNavigablePath()
\* \[HHH-17412] - Type comparison error due to surprising javac method selection
\* \[HHH-17411] - Fetch join on treated join leads to owner not selected error
\* \[HHH-17386] - Type inference source is not reset for top level predicates
\* \[HHH-17384] - OneToMany association with [@&#8203;NotFound](https://github.com/NotFound) results in SQL with different JOIN-type for SELECT (LEFT JOIN) and COUNT (JOIN)
\* \[HHH-17383] - Association is null in lazy initialized element collection
\* \[HHH-17382] - Dynamic instantiation leads to superclass fields not found when using injection
\* \[HHH-17381] - fix wrong groupId in Compatibility.adoc
\* \[HHH-17380] - Persisting an entity with a non generated id and [@&#8203;MapsId](https://github.com/MapsId) throws PropertyValueException
\* \[HHH-17370] - ServiceException: Unable to create requested service \[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] due to: Cannot invoke "org.hibernate.resource.jdbc.spi.JdbcObserver.jdbcConnectionAcquisitionEnd(java.sql.Connection)" because "this.observer" is null
\* \[HHH-17344] - DB2zDialect NullPointerException
\* \[HHH-17328] - Retrieve entity using entity graph not adding type in the where clause for [@&#8203;Inheritance](https://github.com/Inheritance)(strategy = InheritanceType.SINGLE_TABLE)
\* \[HHH-17313] - Session#setDefaultReadOnly is ignored by named queries
\* \[HHH-17308] - AssertionError when mixing [@&#8203;SQLSelect](https://github.com/SQLSelect) and composite ID
\* \[HHH-17299] - AssertionError in DiscriminatorPathInterpretation when treating a path with the same subtype
\* \[HHH-17294] - Non-Embeddable JSON objects are not marked as dirty when modified
\* \[HHH-17292] - MappedSuperclass with more than 1 subclass level leads to "UnknownPathException: Could not resolve attribute"
\* \[HHH-17102] - [@&#8203;SqlResultSetMapping](https://github.com/SqlResultSetMapping) doesn’t work with [@&#8203;Inheritance](https://github.com/Inheritance)(strategy = InheritanceType.JOINED)

\*\* Deprecation
\* \[HHH-17441] - Deprecate [@&#8203;Comment](https://github.com/Comment)

\*\* Improvement
\* \[HHH-17425] - Introduce new configuration parameters for offline Dialect initialization
\* \[HHH-17424] - Have Dialect manage more of ExtractedDatabaseMetadata
\* \[HHH-17417] - Workaround Oracle driver issue to reduce connection creation
\* \[HHH-17409] - Support offset without limit in AbstractSimpleLimitHandler and Oracle12LimitHandler
\* \[HHH-17389] - Add getQueryHintString() for PostgreSQLDialect
\* \[HHH-17372] - Endless recursion between default implementations of SelectionQuery.getResultStream() and SelectionQuery.stream()
\* \[HHH-17355] - Smoothen rough edges with array functions
\* \[HHH-17340] - Fix typos in javadoc
\* \[HHH-17023] - Add support for Altibase dialect
\* \[HHH-15074] - Allow partial composite id generation for EmbeddedId

\*\* New Feature
\* \[HHH-17357] - Support pgvector types and functions
\* \[HHH-17210] - Expose custom JFR events

\*\* Sub-task
\* \[HHH-17347] - Support for JDK which do not support JFR events

\*\* Task
\* \[HHH-17390] - Change scope of AbstyractEntityInitializer#resolveInstance
\* \[HHH-17367] - Add links to tutorials in documentation
\* \[HHH-17362] - Define dependencies of hibernate-jpamodelgen as api
\* \[HHH-17350] - Work on hibernate-models, XSD and JAXB

### [`v6.3.2.Final`](hibernate/hibernate-orm@6.3.1...6.3.2)

[Compare Source](hibernate/hibernate-orm@6.3.1...6.3.2)

</details>

<details>
<summary>Blazebit/blaze-persistence</summary>

### [`v1.6.10`](https://github.com/Blazebit/blaze-persistence/blob/HEAD/CHANGELOG.md#&#8203;1610)

[Compare Source](Blazebit/blaze-persistence@1.6.9...1.6.10)

12/11/2023 - [Release tag](https://github.com/Blazebit/blaze-persistence/releases/tag/1.6.10) [Resolved issues](https://github.com/Blazebit/blaze-persistence/issues?q=is%3Aissue+milestone%3A1.6.10+is%3Aclosed+sort%3Aupdated-desc)

##### New features

-   Support JDK 21
-   Add CockroachDB function registrations
-   Support Hibernate 6.3 and 6.4
-   Special case limit 1 in correlation builders to support old MySQL and MariaDB versions

##### Bug fixes

-   Fix parsing error for entity view limit mapping
-   Fix dropping of embeddable group by expression when nested property has same name as parent property
-   Fix SQL generation for lateral subqueries when correlated path has `@Where` predicate
-   Fix `ConcurrentModificationException` during metamodel determination for special Hibernate Envers mappings
-   Clear `EntityViewManager` static fields in entity view implementations to avoid possible memory leak
-   Ignore `@Any` mapped attributes in enum type scanning
-   Fix NPE caused by wrong order by expression during criteria builder copying
-   Workaround Hibernate 6 returning null java type for enum parameters
-   Add Entity View type test values for more Java types

##### Backwards-incompatible changes

None yet

</details>

<details>
<summary>diffplug/spotless</summary>

### [`v2.41.0`](https://github.com/diffplug/spotless/blob/HEAD/CHANGES.md#&#8203;2410---2023-08-29)

##### Added

-   Add a `jsonPatch` step to `json` formatter configurations. This allows patching of JSON documents using [JSON Patches](https://jsonpatch.com). ([#&#8203;1753](diffplug/spotless#1753))
-   Support GJF own import order. ([#&#8203;1780](diffplug/spotless#1780))

##### Fixed

-   Use latest versions of popular style guides for `eslint` tests to fix failing `useEslintXoStandardRules` test. ([#&#8203;1761](diffplug/spotless#1761), [#&#8203;1756](diffplug/spotless#1756))
-   Add support for `prettier` version `3.0.0` and newer. ([#&#8203;1760](diffplug/spotless#1760), [#&#8203;1751](diffplug/spotless#1751))
-   Fix npm install calls when npm cache is not up-to-date. ([#&#8203;1760](diffplug/spotless#1760), [#&#8203;1750](diffplug/spotless#1750))

##### Changes

-   Bump default `eslint` version to latest `8.31.0` -> `8.45.0` ([#&#8203;1761](diffplug/spotless#1761))
-   Bump default `prettier` version to latest (v2) `2.8.1` -> `2.8.8`. ([#&#8203;1760](diffplug/spotless#1760))
-   Bump default `greclipse` version to latest `4.27` -> `4.28`. ([#&#8203;1775](diffplug/spotless#1775))

</details>

<details>
<summary>quarkusio/quarkus</summary>

### [`v3.6.0`](quarkusio/quarkus@3.5.3...3.6.0)

[Compare Source](quarkusio/quarkus@3.5.3...3.6.0)

### [`v3.5.3`](https://github.com/quarkusio/quarkus/releases/tag/3.5.3)

[Compare Source](quarkusio/quarkus@3.5.2...3.5.3)

##### Complete changelog

-   [#&#8203;37215](quarkusio/quarkus#37215) - Use LinkedHashMap for parts map to ensure user input order
-   [#&#8203;37214](quarkusio/quarkus#37214) - MultipartFormDataOutput should use an ordered map instead of a HashMap
-   [#&#8203;37210](quarkusio/quarkus#37210) - \[3.5] Fix and adjust Quarkiverse extension template
-   [#&#8203;37209](quarkusio/quarkus#37209) - Build cache - Additional tweaks
-   [#&#8203;37206](quarkusio/quarkus#37206) - recognize quarkus.tls.trust-all property by keycloak-admin-client extension
-   [#&#8203;37174](quarkusio/quarkus#37174) - Ignore files coming from quarkus-ide-launcher jar
-   [#&#8203;37130](quarkusio/quarkus#37130) - Do not report unused deprecated runtime props with default value as used
-   [#&#8203;37102](quarkusio/quarkus#37102) - Fix filter per extension in dev ui
-   [#&#8203;37073](quarkusio/quarkus#37073) - Use 3.2 as the example stream for update-quarkus.adoc
-   [#&#8203;37072](quarkusio/quarkus#37072) - Deprecated runtime configuration properties with default value are reported even though never used
-   [#&#8203;37046](quarkusio/quarkus#37046) - Adjust Quarkiverse Antora doc templates a bit
-   [#&#8203;36961](quarkusio/quarkus#36961) - Fix GraphQL WebSocket handling occurring before authorization

### [`v3.5.2`](https://github.com/quarkusio/quarkus/releases/tag/3.5.2)

[Compare Source](quarkusio/quarkus@3.5.1...3.5.2)

##### Complete changelog

-   [#&#8203;37120](quarkusio/quarkus#37120) - Bump Smallrye RM from 4.10.1 to 4.10.2
-   [#&#8203;37104](quarkusio/quarkus#37104) - Make analytics tests more a bit more resilient
-   [#&#8203;37090](quarkusio/quarkus#37090) - Add the actual coordinates of the MySQL driver
-   [#&#8203;37070](quarkusio/quarkus#37070) - Security doc fix: Broken link and bad code snippet
-   [#&#8203;37069](quarkusio/quarkus#37069) - Tiny tweaks based on QE feedback for Datasource guide
-   [#&#8203;37068](quarkusio/quarkus#37068) - Updates infinispan client intelligence section
-   [#&#8203;37058](quarkusio/quarkus#37058) - Bump com.fasterxml.jackson:jackson-bom from 2.15.2 to 2.15.3
-   [#&#8203;37055](quarkusio/quarkus#37055) - Bump io.smallrye.config:smallrye-config-source-yaml from 3.4.1 to 3.4.4 in /devtools/gradle
-   [#&#8203;37038](quarkusio/quarkus#37038) - Disable CustomManifestArgumentsTest on Windows
-   [#&#8203;37032](quarkusio/quarkus#37032) - OpenAPI make sure basic auth auto detection work
-   [#&#8203;37028](quarkusio/quarkus#37028) - Fix typos in reactive-sql-clients.adoc
-   [#&#8203;37025](quarkusio/quarkus#37025) - Document how to log authentication failures for RESTEasy Reactive users migrating from the RESTEasy Classic
-   [#&#8203;37019](quarkusio/quarkus#37019) - Address CVE-2023-21971 present in MySQL connector
-   [#&#8203;37018](quarkusio/quarkus#37018) - Address CVE-2023-21971 present in MySQL connector
-   [#&#8203;37015](quarkusio/quarkus#37015) - Bump org.eclipse.parsson:parsson from 1.1.4 to 1.1.5
-   [#&#8203;37010](quarkusio/quarkus#37010) - Fix vale errors and some warnings in the OIDC Configuration Properties reference guide
-   [#&#8203;37006](quarkusio/quarkus#37006) - Never register server specific providers in REST Client (fixed)
-   [#&#8203;37003](quarkusio/quarkus#37003) - Small adjustments for documentation related content
-   [#&#8203;37001](quarkusio/quarkus#37001) - Revert "Unblock SmallRye Health exposed routes"
-   [#&#8203;36991](quarkusio/quarkus#36991) - Upgrade es-module-shims to 1.8.1
-   [#&#8203;36985](quarkusio/quarkus#36985) - Generate a file with relations between guides
-   [#&#8203;36983](quarkusio/quarkus#36983) - Fix discarded ObjectMapper configuration
-   [#&#8203;36981](quarkusio/quarkus#36981) - Updates to Infinispan 14.0.20.Final
-   [#&#8203;36968](quarkusio/quarkus#36968) - Send host.name in all spans
-   [#&#8203;36953](quarkusio/quarkus#36953) - Workaround quarkusio/quarkus#36952 alias jboss/jboss-parent-pom#236 jboss-parent:40 still manages jdk-misc, but does not define version.jdk-misc anymore
-   [#&#8203;36942](quarkusio/quarkus#36942) - Option TraceServiceLoaderFeature removed in GraalVM 23.1
-   [#&#8203;36941](quarkusio/quarkus#36941) - Fix OTel Resource Attributes
-   [#&#8203;36924](quarkusio/quarkus#36924) - Add keywords and topics for hibernate-search-orm-elasticsearch.adoc
-   [#&#8203;36917](quarkusio/quarkus#36917) - Update SmallRye Config to 3.4.4
-   [#&#8203;36914](quarkusio/quarkus#36914) - Reset databases/users for each Hibernate ORM tenancy test module
-   [#&#8203;36912](quarkusio/quarkus#36912) - Avoid `@TempDir` in RestClientCDIDelegateBuilderTest
-   [#&#8203;36884](quarkusio/quarkus#36884) - SmallRye Config property mapping mismatches from the property name in the generated config documentation
-   [#&#8203;36868](quarkusio/quarkus#36868) - Native binary generated using quarkus, graalvm and picocli trying to read from .env folder in working directory
-   [#&#8203;36856](quarkusio/quarkus#36856) - Lowercase env vars with hyphens are no picked up anymore in Quarkus 3.5.0 (e.g. in docker compose or Hashicorp Nomad)
-   [#&#8203;36850](quarkusio/quarkus#36850) - ObjectMapper configuration is discarded in resteasy-reactive-jackson's JsonFactory
-   [#&#8203;36847](quarkusio/quarkus#36847) - SmallRye Config error message suggests strange enum values when a bad value is passed
-   [#&#8203;36753](quarkusio/quarkus#36753) - Fix order of defaults recording
-   [#&#8203;36742](quarkusio/quarkus#36742) - DevUI resource error on main
-   [#&#8203;36711](quarkusio/quarkus#36711) - Disable Http2RSTFloodProtectionTest on Windows
-   [#&#8203;36578](quarkusio/quarkus#36578) - Maven CLI: add startWith matching into recipes detection
-   [#&#8203;36573](quarkusio/quarkus#36573) - Maven CLI: add wildcard matching into recipes detection
-   [#&#8203;36570](quarkusio/quarkus#36570) - Maven CLI: use recipes for platform extensions
-   [#&#8203;36568](quarkusio/quarkus#36568) - Maven CLI: use recipes for platform extensions
-   [#&#8203;36129](quarkusio/quarkus#36129) - auto-service-loader-registration fails with GraalVM CE 21+35.1
-   [#&#8203;32049](quarkusio/quarkus#32049) - resteasy-reactive Interceptors don't get executed after Authorization failure
-   [#&#8203;31024](quarkusio/quarkus#31024) - Resteasy Reactive client tries to use ContainerResponseFilter

</details>

<details>
<summary>quarkusio/quarkus-platform</summary>

### [`v3.5.3`](quarkusio/quarkus-platform@3.5.2...3.5.3)

[Compare Source](quarkusio/quarkus-platform@3.5.2...3.5.3)

### [`v3.5.2`](quarkusio/quarkus-platform@3.5.1...3.5.2)

[Compare Source](quarkusio/quarkus-platform@3.5.1...3.5.2)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Enabled.

♻ **Rebasing**: Whenever MR is behind base branch, or you tick the rebase/retry checkbox.

👻 **Immortal**: This MR will be recreated if closed unmerged. Get [config help](https://github.com/renovatebot/renovate/discussions) if that's undesired.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC4yNC4wIiwidXBkYXRlZEluVmVyIjoiMzQuMjQuMCJ9-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment