-
Notifications
You must be signed in to change notification settings - Fork 41.6k
Description
Problem:
I have a Java 11 + Spring Boot 2.7.14 application that acts like a proxy between an user and a service. It's currently receiving up to 200 million requests per month.
I have actuator only for Health checks, all application performance monitoring is with open telemetry.
I am currently facing a problem where org.springframework.boot.actuate.autoconfigure.metrics.AutoConfiguredCompositeMeterRegistry
is ocuppying up to 90% of my JVM heap, meaning that I'm using more memory to a metric that I don't use, than to handle requests.
My code
This is the piece of code where the proxy requests happens:
@Service
@AllArgsConstructor
public class ProxyRequestService {
private WebClient webClient;
public Mono<Object> request(Object body, String uri, TokenDTO token, Map<String, String> httpHeaders) {
return webClient.post()
.uri(token.getUrl() + uri)
.headers(headers -> headers.setAll(httpHeaders))
.bodyValue(body != null ? body : "").exchangeToMono(response -> response.bodyToMono(byte[].class));
}
}
And this is my dependencies tree:
-----------------------------------------------------------
Root project 'orchestrator-api' - orchestrator-api
------------------------------------------------------------
annotationProcessor - Annotation processors and their dependencies for source set 'main'.
\--- org.projectlombok:lombok -> 1.18.28
bootArchives - Configuration for Spring Boot archive artifacts. (n)
No dependencies
compileClasspath - Compile classpath for source set 'main'.
+--- org.projectlombok:lombok -> 1.18.28
+--- org.springframework.boot:spring-boot-starter-actuator -> 2.7.14
| +--- org.springframework.boot:spring-boot-starter:2.7.14
| | +--- org.springframework.boot:spring-boot:2.7.14
| | | +--- org.springframework:spring-core:5.3.29
| | | | \--- org.springframework:spring-jcl:5.3.29
| | | \--- org.springframework:spring-context:5.3.29
| | | +--- org.springframework:spring-aop:5.3.29
| | | | +--- org.springframework:spring-beans:5.3.29
| | | | | \--- org.springframework:spring-core:5.3.29 (*)
| | | | \--- org.springframework:spring-core:5.3.29 (*)
| | | +--- org.springframework:spring-beans:5.3.29 (*)
| | | +--- org.springframework:spring-core:5.3.29 (*)
| | | \--- org.springframework:spring-expression:5.3.29
| | | \--- org.springframework:spring-core:5.3.29 (*)
| | +--- org.springframework.boot:spring-boot-autoconfigure:2.7.14
| | | \--- org.springframework.boot:spring-boot:2.7.14 (*)
| | +--- org.springframework.boot:spring-boot-starter-logging:2.7.14
| | | +--- ch.qos.logback:logback-classic:1.2.12
| | | | +--- ch.qos.logback:logback-core:1.2.12
| | | | \--- org.slf4j:slf4j-api:1.7.32 -> 1.7.36
| | | +--- org.apache.logging.log4j:log4j-to-slf4j:2.17.2
| | | | +--- org.slf4j:slf4j-api:1.7.35 -> 1.7.36
| | | | \--- org.apache.logging.log4j:log4j-api:2.17.2
| | | \--- org.slf4j:jul-to-slf4j:1.7.36
| | | \--- org.slf4j:slf4j-api:1.7.36
| | +--- jakarta.annotation:jakarta.annotation-api:1.3.5
| | +--- org.springframework:spring-core:5.3.29 (*)
| | \--- org.yaml:snakeyaml:1.30
| +--- org.springframework.boot:spring-boot-actuator-autoconfigure:2.7.14
| | +--- org.springframework.boot:spring-boot-actuator:2.7.14
| | | \--- org.springframework.boot:spring-boot:2.7.14 (*)
| | +--- org.springframework.boot:spring-boot:2.7.14 (*)
| | \--- org.springframework.boot:spring-boot-autoconfigure:2.7.14 (*)
| \--- io.micrometer:micrometer-core:1.9.13
| \--- org.hdrhistogram:HdrHistogram:2.1.12
+--- org.springframework.boot:spring-boot-starter-cache -> 2.7.14
| +--- org.springframework.boot:spring-boot-starter:2.7.14 (*)
| \--- org.springframework:spring-context-support:5.3.29
| +--- org.springframework:spring-beans:5.3.29 (*)
| +--- org.springframework:spring-context:5.3.29 (*)
| \--- org.springframework:spring-core:5.3.29 (*)
+--- org.springframework.boot:spring-boot-starter-web -> 2.7.14
| +--- org.springframework.boot:spring-boot-starter:2.7.14 (*)
| +--- org.springframework.boot:spring-boot-starter-json:2.7.14
| | +--- org.springframework.boot:spring-boot-starter:2.7.14 (*)
| | +--- org.springframework:spring-web:5.3.29
| | | +--- org.springframework:spring-beans:5.3.29 (*)
| | | \--- org.springframework:spring-core:5.3.29 (*)
| | +--- com.fasterxml.jackson.core:jackson-databind:2.13.5
| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.13.5
| | | | \--- com.fasterxml.jackson:jackson-bom:2.13.5
| | | | +--- com.fasterxml.jackson.core:jackson-annotations:2.13.5 (c)
| | | | +--- com.fasterxml.jackson.core:jackson-core:2.13.5 (c)
| | | | +--- com.fasterxml.jackson.core:jackson-databind:2.13.5 (c)
| | | | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.13.5 -> 2.9.0 (c)
| | | | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.5 (c)
| | | | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.5 (c)
| | | | +--- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.13.5 (c)
| | | | +--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.5 (c)
| | | | \--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.5 (c)
| | | +--- com.fasterxml.jackson.core:jackson-core:2.13.5
| | | | \--- com.fasterxml.jackson:jackson-bom:2.13.5 (*)
| | | \--- com.fasterxml.jackson:jackson-bom:2.13.5 (*)
| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.13.5
| | | +--- com.fasterxml.jackson.core:jackson-core:2.13.5 (*)
| | | +--- com.fasterxml.jackson.core:jackson-databind:2.13.5 (*)
| | | \--- com.fasterxml.jackson:jackson-bom:2.13.5 (*)
| | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.5
| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.13.5 (*)
| | | +--- com.fasterxml.jackson.core:jackson-core:2.13.5 (*)
| | | +--- com.fasterxml.jackson.core:jackson-databind:2.13.5 (*)
| | | \--- com.fasterxml.jackson:jackson-bom:2.13.5 (*)
| | \--- com.fasterxml.jackson.module:jackson-module-parameter-names:2.13.5
| | +--- com.fasterxml.jackson.core:jackson-core:2.13.5 (*)
| | +--- com.fasterxml.jackson.core:jackson-databind:2.13.5 (*)
| | \--- com.fasterxml.jackson:jackson-bom:2.13.5 (*)
| +--- org.springframework.boot:spring-boot-starter-tomcat:2.7.14
| | +--- jakarta.annotation:jakarta.annotation-api:1.3.5
| | +--- org.apache.tomcat.embed:tomcat-embed-core:9.0.78
| | +--- org.apache.tomcat.embed:tomcat-embed-el:9.0.78
| | \--- org.apache.tomcat.embed:tomcat-embed-websocket:9.0.78
| | \--- org.apache.tomcat.embed:tomcat-embed-core:9.0.78
| +--- org.springframework:spring-web:5.3.29 (*)
| \--- org.springframework:spring-webmvc:5.3.29
| +--- org.springframework:spring-aop:5.3.29 (*)
| +--- org.springframework:spring-beans:5.3.29 (*)
| +--- org.springframework:spring-context:5.3.29 (*)
| +--- org.springframework:spring-core:5.3.29 (*)
| +--- org.springframework:spring-expression:5.3.29 (*)
| \--- org.springframework:spring-web:5.3.29 (*)
+--- org.springframework.boot:spring-boot-starter-webflux -> 2.7.14
| +--- org.springframework.boot:spring-boot-starter:2.7.14 (*)
| +--- org.springframework.boot:spring-boot-starter-json:2.7.14 (*)
| +--- org.springframework.boot:spring-boot-starter-reactor-netty:2.7.14
| | \--- io.projectreactor.netty:reactor-netty-http:1.0.34
| | +--- io.netty:netty-codec-http:4.1.94.Final
| | | +--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-buffer:4.1.94.Final
| | | | \--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-transport:4.1.94.Final
| | | | +--- io.netty:netty-common:4.1.94.Final
| | | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | | \--- io.netty:netty-resolver:4.1.94.Final
| | | | \--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-codec:4.1.94.Final
| | | | +--- io.netty:netty-common:4.1.94.Final
| | | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | | \--- io.netty:netty-transport:4.1.94.Final (*)
| | | \--- io.netty:netty-handler:4.1.94.Final
| | | +--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-resolver:4.1.94.Final (*)
| | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | +--- io.netty:netty-transport-native-unix-common:4.1.94.Final
| | | | +--- io.netty:netty-common:4.1.94.Final
| | | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | | \--- io.netty:netty-transport:4.1.94.Final (*)
| | | \--- io.netty:netty-codec:4.1.94.Final (*)
| | +--- io.netty:netty-codec-http2:4.1.94.Final
| | | +--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | +--- io.netty:netty-codec:4.1.94.Final (*)
| | | +--- io.netty:netty-handler:4.1.94.Final (*)
| | | \--- io.netty:netty-codec-http:4.1.94.Final (*)
| | +--- io.netty:netty-resolver-dns:4.1.94.Final
| | | +--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | +--- io.netty:netty-resolver:4.1.94.Final (*)
| | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | +--- io.netty:netty-codec:4.1.94.Final (*)
| | | +--- io.netty:netty-codec-dns:4.1.94.Final
| | | | +--- io.netty:netty-common:4.1.94.Final
| | | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | | \--- io.netty:netty-codec:4.1.94.Final (*)
| | | \--- io.netty:netty-handler:4.1.94.Final (*)
| | +--- io.netty:netty-resolver-dns-native-macos:4.1.94.Final
| | | \--- io.netty:netty-resolver-dns-classes-macos:4.1.94.Final
| | | +--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-resolver-dns:4.1.94.Final (*)
| | | \--- io.netty:netty-transport-native-unix-common:4.1.94.Final (*)
| | +--- io.netty:netty-transport-native-epoll:4.1.94.Final
| | | +--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | +--- io.netty:netty-transport-native-unix-common:4.1.94.Final (*)
| | | \--- io.netty:netty-transport-classes-epoll:4.1.94.Final
| | | +--- io.netty:netty-common:4.1.94.Final
| | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | \--- io.netty:netty-transport-native-unix-common:4.1.94.Final (*)
| | +--- io.projectreactor.netty:reactor-netty-core:1.0.34
| | | +--- io.netty:netty-handler:4.1.94.Final (*)
| | | +--- io.netty:netty-handler-proxy:4.1.94.Final
| | | | +--- io.netty:netty-common:4.1.94.Final
| | | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | | +--- io.netty:netty-codec:4.1.94.Final (*)
| | | | +--- io.netty:netty-codec-socks:4.1.94.Final
| | | | | +--- io.netty:netty-common:4.1.94.Final
| | | | | +--- io.netty:netty-buffer:4.1.94.Final (*)
| | | | | +--- io.netty:netty-transport:4.1.94.Final (*)
| | | | | \--- io.netty:netty-codec:4.1.94.Final (*)
| | | | \--- io.netty:netty-codec-http:4.1.94.Final (*)
| | | +--- io.netty:netty-resolver-dns:4.1.94.Final (*)
| | | +--- io.netty:netty-resolver-dns-native-macos:4.1.94.Final (*)
| | | +--- io.netty:netty-transport-native-epoll:4.1.94.Final (*)
| | | \--- io.projectreactor:reactor-core:3.4.31
| | | \--- org.reactivestreams:reactive-streams:1.0.4
| | \--- io.projectreactor:reactor-core:3.4.31 (*)
| +--- org.springframework:spring-web:5.3.29 (*)
| \--- org.springframework:spring-webflux:5.3.29
| +--- org.springframework:spring-beans:5.3.29 (*)
| +--- org.springframework:spring-core:5.3.29 (*)
| +--- org.springframework:spring-web:5.3.29 (*)
| \--- io.projectreactor:reactor-core:3.4.31 (*)
+--- org.springdoc:springdoc-openapi-ui:1.6.14
| +--- org.springdoc:springdoc-openapi-webmvc-core:1.6.14
| | +--- org.springdoc:springdoc-openapi-common:1.6.14
| | | +--- org.springframework.boot:spring-boot-autoconfigure:2.7.6 -> 2.7.14 (*)
| | | +--- org.springframework:spring-web:5.3.24 -> 5.3.29 (*)
| | | \--- io.swagger.core.v3:swagger-core:2.2.7
| | | +--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.2 -> 2.3.3
| | | | \--- jakarta.activation:jakarta.activation-api:1.2.2
| | | +--- org.apache.commons:commons-lang3:3.12.0
| | | +--- org.slf4j:slf4j-api:1.7.35 -> 1.7.36
| | | +--- com.fasterxml.jackson.core:jackson-annotations:2.14.0 -> 2.13.5 (*)
| | | +--- com.fasterxml.jackson.core:jackson-databind:2.14.0 -> 2.13.5 (*)
| | | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.14.0 -> 2.13.5
| | | | +--- com.fasterxml.jackson.core:jackson-databind:2.13.5 (*)
| | | | +--- org.yaml:snakeyaml:1.31 -> 1.30
| | | | +--- com.fasterxml.jackson.core:jackson-core:2.13.5 (*)
| | | | \--- com.fasterxml.jackson:jackson-bom:2.13.5 (*)
| | | +--- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.14.0 -> 2.13.5 (*)
| | | +--- io.swagger.core.v3:swagger-annotations:2.2.7
| | | +--- org.yaml:snakeyaml:1.33 -> 1.30
| | | +--- io.swagger.core.v3:swagger-models:2.2.7
| | | | \--- com.fasterxml.jackson.core:jackson-annotations:2.14.0 -> 2.13.5 (*)
| | | \--- jakarta.validation:jakarta.validation-api:2.0.2
| | \--- org.springframework:spring-webmvc:5.3.24 -> 5.3.29 (*)
| +--- org.webjars:swagger-ui:4.15.5
| +--- org.webjars:webjars-locator-core:0.52 -> 0.50
| | +--- org.slf4j:slf4j-api:1.7.36
| | \--- com.fasterxml.jackson.core:jackson-core:2.13.1 -> 2.13.5 (*)
| \--- io.github.classgraph:classgraph:4.8.149
+--- a.private.dependencie:gateway-auth-lib:master
| +--- io.jsonwebtoken:jjwt-api:0.11.5
| +--- io.jsonwebtoken:jjwt-impl:0.11.5
| \--- io.jsonwebtoken:jjwt-jackson:0.11.5
+--- org.jetbrains:annotations:24.1.0
+--- com.google.code.gson:gson:2.8.9
+--- net.minidev:json-smart:2.4.7
| \--- net.minidev:accessors-smart:2.4.7
| \--- org.ow2.asm:asm:9.1
\--- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.9.0
+--- com.fasterxml.jackson.core:jackson-core:2.9.0 -> 2.13.5 (*)
+--- com.fasterxml.jackson.core:jackson-annotations:2.9.0 -> 2.13.5 (*)
+--- com.fasterxml.jackson.core:jackson-databind:2.9.0 -> 2.13.5 (*)
+--- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.9.0 -> 2.13.5
| +--- com.fasterxml.jackson.core:jackson-annotations:2.13.5 (*)
| +--- com.fasterxml.jackson.core:jackson-core:2.13.5 (*)
| +--- com.fasterxml.jackson.core:jackson-databind:2.13.5 (*)
| +--- jakarta.xml.bind:jakarta.xml.bind-api:2.3.3 (*)
| +--- jakarta.activation:jakarta.activation-api:1.2.1 -> 1.2.2
| \--- com.fasterxml.jackson:jackson-bom:2.13.5 (*)
+--- org.codehaus.woodstox:stax2-api:3.1.4
\--- com.fasterxml.woodstox:woodstox-core:5.0.3
\--- org.codehaus.woodstox:stax2-api:3.1.4
No, the application is not entire Reactive. We are only using Webclient. The application Runs with starter-web
.
What I have tried:
The piece of code that I showed you is already my final version. It was previously like this:
public Mono<Object> request(Object body, String uri, TokenDTO token, Map<String, String> httpHeaders) {
return webClient.post()
.uri(URI.create(token.getUrl() + uri)) // I changed it. Removed URI.create.
.headers(headers -> headers.setAll(httpHeaders))
.bodyValue(body != null ? body : "").exchangeToMono(response -> response.bodyToMono(byte[].class));
}
I also added a configuration on my application.yaml:
management:
metrics:
enable:
http:
client:
metrics: false
Conclusion
Is there a correct way to remove this type of metric?