There is an error when trying to connect to Redis Sentinel deployment called redis in k8s.
If any other name is used the behaviour is as expected (app does not crash on bean creation and connects).
The issue might be due to the same reason as describe in https://github.com/micronaut-projects/micronaut-rabbitmq/issues/14
Might be related to uri parsing (unlikely) because redis is also used when defining the redis schema . However the Spring analog of the same application using the lettuce driver works when using redis as a hostname alias.
redisredis.uri: redis-sentinel://pass@redis:26379?sentinelMasterId=mymasterSet env deduction to false. (does not matter if it is true, I just want to disable any k8s specifics if any)
Configure via redis.uri: redis-sentinel://pass@ala-redis:26379?sentinelMasterId=mymaster - connects successfully
Side note:
I cannot test if configuring the DefaultRedisConfiguration via the other properties (redis.host, redis.password, redis.sentinel-master-id, etc), works, because when using redis.password there is some other exception saying that password field cannot be parsed but this should go in other bug report I suppose.
Edit: I tested using redis.host,redis.port, redis.sentinel-master-id by disabling the password of the redis cluster yet the same exception is thrown.
Application does not crash on bean creation and connects to redis.
16:51:49.308 [main] INFO i.m.context.DefaultBeanContext - Reading Startup environment from bootstrap.yml
16:51:51.731 [main] ERROR i.m.h.server.netty.NettyHttpServer - Error starting Micronaut server: Failed to inject value for parameter [port] of method [setPort] of class: io.micronaut.configuration.lettuce.DefaultRedisConfiguration
Message: Error resolving property value [redis.port]. Unable to convert value [tcp://10.107.40.69:6379] to target type [int] due to: For input string: "tcp://10.107.40.69:6379"
Path Taken: new Application([Redis arg0]) --> new Redis([StatefulRedisConnection arg0]) --> StatefulRedisConnection.redisConnection([RedisClient redisClient]) --> RedisClient.redisClient([AbstractRedisConfiguration config]) --> DefaultRedisConfiguration.setPort([int port])
io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [port] of method [setPort] of class: io.micronaut.configuration.lettuce.DefaultRedisConfiguration
Message: Error resolving property value [redis.port]. Unable to convert value [tcp://10.107.40.69:6379] to target type [int] due to: For input string: "tcp://10.107.40.69:6379"
Path Taken: new Application([Redis arg0]) --> new Redis([StatefulRedisConnection arg0]) --> StatefulRedisConnection.redisConnection([RedisClient redisClient]) --> RedisClient.redisClient([AbstractRedisConfiguration config]) --> DefaultRedisConfiguration.setPort([int port])
at io.micronaut.context.AbstractBeanDefinition.getValueForMethodArgument(AbstractBeanDefinition.java:773)
at io.micronaut.configuration.lettuce.$DefaultRedisConfigurationDefinition.injectBean(Unknown Source)
at io.micronaut.configuration.lettuce.$DefaultRedisConfigurationDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at io.micronaut.configuration.lettuce.$DefaultRedisClientFactory$RedisClientDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at io.micronaut.configuration.lettuce.$DefaultRedisClientFactory$RedisConnectionDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at hello.world2.$RedisDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at hello.world2.$ApplicationDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.getScopedBeanForDefinition(DefaultBeanContext.java:1949)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1851)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:577)
at io.micronaut.context.DefaultBeanContext$BeanExecutionHandle.invoke(DefaultBeanContext.java:2706)
at io.micronaut.aop.chain.AdapterIntroduction.intercept(AdapterIntroduction.java:80)
at io.micronaut.aop.MethodInterceptor.intercept(MethodInterceptor.java:40)
at io.micronaut.aop.chain.InterceptorChain.proceed(InterceptorChain.java:146)
at hello.world2.Application$ApplicationEventListener$onStartup1$Intercepted.onApplicationEvent(Unknown Source)
at io.micronaut.context.DefaultBeanContext.lambda$publishEvent$17(DefaultBeanContext.java:1047)
at io.micronaut.context.DefaultBeanContext$$Lambda$361.0000000024EDB730.accept(Unknown Source)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1041)
at io.micronaut.http.server.netty.NettyHttpServer.bindServerToHost(NettyHttpServer.java:416)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:310)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:95)
at io.micronaut.runtime.Micronaut.lambda$start$2(Micronaut.java:75)
at io.micronaut.runtime.Micronaut$$Lambda$536.00000000250F31F0.accept(Unknown Source)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:73)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:288)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:274)
at hello.world2.Application.main(Application.java:20)
16:51:51.817 [main] ERROR io.micronaut.runtime.Micronaut - Error starting Micronaut server: Unable to start Micronaut server on port: 8081
io.micronaut.http.server.exceptions.ServerStartupException: Unable to start Micronaut server on port: 8081
at io.micronaut.http.server.netty.NettyHttpServer.bindServerToHost(NettyHttpServer.java:438)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:310)
at io.micronaut.http.server.netty.NettyHttpServer.start(NettyHttpServer.java:95)
at io.micronaut.runtime.Micronaut.lambda$start$2(Micronaut.java:75)
at io.micronaut.runtime.Micronaut$$Lambda$536.00000000250F31F0.accept(Unknown Source)
at java.base/java.util.Optional.ifPresent(Optional.java:183)
at io.micronaut.runtime.Micronaut.start(Micronaut.java:73)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:288)
at io.micronaut.runtime.Micronaut.run(Micronaut.java:274)
at hello.world2.Application.main(Application.java:20)
Caused by: io.micronaut.context.exceptions.DependencyInjectionException: Failed to inject value for parameter [port] of method [setPort] of class: io.micronaut.configuration.lettuce.DefaultRedisConfiguration
Message: Error resolving property value [redis.port]. Unable to convert value [tcp://10.107.40.69:6379] to target type [int] due to: For input string: "tcp://10.107.40.69:6379"
Path Taken: new Application([Redis arg0]) --> new Redis([StatefulRedisConnection arg0]) --> StatefulRedisConnection.redisConnection([RedisClient redisClient]) --> RedisClient.redisClient([AbstractRedisConfiguration config]) --> DefaultRedisConfiguration.setPort([int port])
at io.micronaut.context.AbstractBeanDefinition.getValueForMethodArgument(AbstractBeanDefinition.java:773)
at io.micronaut.configuration.lettuce.$DefaultRedisConfigurationDefinition.injectBean(Unknown Source)
at io.micronaut.configuration.lettuce.$DefaultRedisConfigurationDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at io.micronaut.configuration.lettuce.$DefaultRedisClientFactory$RedisClientDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at io.micronaut.configuration.lettuce.$DefaultRedisClientFactory$RedisConnectionDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at hello.world2.$RedisDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.createAndRegisterSingleton(DefaultBeanContext.java:2163)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1849)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:997)
at io.micronaut.context.AbstractBeanDefinition.getBeanForConstructorArgument(AbstractBeanDefinition.java:982)
at hello.world2.$ApplicationDefinition.build(Unknown Source)
at io.micronaut.context.DefaultBeanContext.doCreateBean(DefaultBeanContext.java:1494)
at io.micronaut.context.DefaultBeanContext.getScopedBeanForDefinition(DefaultBeanContext.java:1949)
at io.micronaut.context.DefaultBeanContext.getBeanForDefinition(DefaultBeanContext.java:1851)
at io.micronaut.context.DefaultBeanContext.getBeanInternal(DefaultBeanContext.java:1829)
at io.micronaut.context.DefaultBeanContext.getBean(DefaultBeanContext.java:577)
at io.micronaut.context.DefaultBeanContext$BeanExecutionHandle.invoke(DefaultBeanContext.java:2706)
at io.micronaut.aop.chain.AdapterIntroduction.intercept(AdapterIntroduction.java:80)
at io.micronaut.aop.MethodInterceptor.intercept(MethodInterceptor.java:40)
at io.micronaut.aop.chain.InterceptorChain.proceed(InterceptorChain.java:146)
at hello.world2.Application$ApplicationEventListener$onStartup1$Intercepted.onApplicationEvent(Unknown Source)
at io.micronaut.context.DefaultBeanContext.lambda$publishEvent$17(DefaultBeanContext.java:1047)
at io.micronaut.context.DefaultBeanContext$$Lambda$361.0000000024EDB730.accept(Unknown Source)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1540)
at io.micronaut.context.DefaultBeanContext.publishEvent(DefaultBeanContext.java:1041)
at io.micronaut.http.server.netty.NettyHttpServer.bindServerToHost(NettyHttpServer.java:416)
... 9 common frames omitted
The problem is caused by the environment variables coming from k8s and read by micronaut out of the box:
If the redis deployment is named redis then
REDIS_PORT=tcp://172.30.31.32:6379 is available as env variable which causes micronaut trying to parse it as int in 'redis.port' which causes the exception.
Same should be the case with https://github.com/micronaut-projects/micronaut-rabbitmq/issues/14
@radpet you can use environmentVariableExcludes when starting your app in the main method of the Application class. See https://github.com/micronaut-projects/micronaut-core/blob/master/inject/src/main/java/io/micronaut/context/ApplicationContextBuilder.java#L103
Just to clearify, you can exclude environment variables by editing the ApplicationContext before starting the Micronaut application, example:
public static void main(String[] args) {
Micronaut.build(args)
.mainClass(Application.class)
.environmentVariableExcludes("REDIS_PORT") // See https://github.com/micronaut-projects/micronaut-core/issues/2097
.start();
}
Most helpful comment
@radpet you can use
environmentVariableExcludeswhen starting your app in themainmethod of theApplicationclass. See https://github.com/micronaut-projects/micronaut-core/blob/master/inject/src/main/java/io/micronaut/context/ApplicationContextBuilder.java#L103