Micronaut-core: Redis Integration cannot parse address port when deployed in k8s

Created on 8 Sep 2019  路  3Comments  路  Source: micronaut-projects/micronaut-core

Task List

  • [x] Steps to reproduce provided
  • [x] Stacktrace (if present) provided
  • [ ] Example that reproduces the problem uploaded to Github
  • [x] Full description of the issue provided (see bellow)

Description

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.

Steps to Reproduce

  1. Have Redis Sentinel deployment named redis
  2. Configure via redis.uri: redis-sentinel://pass@redis:26379?sentinelMasterId=mymaster
  3. Set env deduction to false. (does not matter if it is true, I just want to disable any k8s specifics if any)

  4. 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.

Expected Behaviour

Application does not crash on bean creation and connects to redis.

Actual Behaviour

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

Environment Information

  • Operating System: minikube, k8s
  • Micronaut Version: 1.2.0
  • JDK Version: 11
notabug

Most helpful comment

@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

All 3 comments

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();
}
Was this page helpful?
0 / 5 - 0 ratings

Related issues

Jhraumg picture Jhraumg  路  4Comments

dchenk picture dchenk  路  3Comments

iBernd81 picture iBernd81  路  3Comments

denbilyk picture denbilyk  路  3Comments

johanhaleby picture johanhaleby  路  4Comments