Collect Spring Cloud Resilience4J Circuit Breaker Metrics with Micrometer (Preview)
Note
The Basic, Standard, and Enterprise plans will be deprecated starting from mid-March, 2025, with a 3 year retirement period. We recommend transitioning to Azure Container Apps. For more information, see the Azure Spring Apps retirement announcement.
The Standard consumption and dedicated plan will be deprecated starting September 30, 2024, with a complete shutdown after six months. We recommend transitioning to Azure Container Apps. For more information, see Migrate Azure Spring Apps Standard consumption and dedicated plan to Azure Container Apps.
This article applies to: ✔️ Basic/Standard ✔️ Enterprise
This article shows you how to collect Spring Cloud Resilience4j Circuit Breaker Metrics with Application Insights Java in-process agent. With this feature, you can monitor the metrics of Resilience4j circuit breaker from Application Insights with Micrometer.
The demo spring-cloud-circuit-breaker-demo shows how the monitoring works.
Prerequisites
- Install Git, Maven, and Java, if not already installed on the development computer.
Build and deploy apps
Use the following steps to build and deploy the sample applications.
Use the following command to clone and build the demo repository:
git clone https://github.com/spring-cloud-samples/spring-cloud-circuitbreaker-demo.git cd spring-cloud-circuitbreaker-demo && mvn clean package -DskipTests
Use the following command to create an Azure Spring Apps service instance:
az spring create \ --resource-group ${resource-group-name} \ --name ${Azure-Spring-Apps-instance-name}
Use the following commands to create the applications with endpoints:
az spring app create \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name resilience4j \ --assign-endpoint az spring app create \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name reactive-resilience4j \ --assign-endpoint
Use the following commands to deploy the applications:
az spring app deploy \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name resilience4j \ --env resilience4j.circuitbreaker.instances.backendA.registerHealthIndicator=true \ --artifact-path ./spring-cloud-circuitbreaker-demo-resilience4j/target/spring-cloud-circuitbreaker-demo-resilience4j-0.0.1-SNAPSHOT.jar az spring app deploy \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name reactive-resilience4j \ --env resilience4j.circuitbreaker.instances.backendA.registerHealthIndicator=true \ --artifact-path ./spring-cloud-circuitbreaker-demo-reactive-resilience4j/target/spring-cloud-circuitbreaker-demo-reactive-resilience4j-0.0.1-SNAPSHOT.jar
Use the following command to create an Azure Spring Apps service instance:
Note
If your subscription has never been used to create an Enterprise plan instance of Azure Spring Apps, you must run the following command:
az term accept \ --publisher vmware-inc --product azure-spring-cloud-vmware-tanzu-2 --plan asa-ent-hr-mtr
az spring create \ --resource-group ${resource-group-name} \ --name ${Azure-Spring-Apps-instance-name} \ --sku Enterprise
Use the following commands to create applications with endpoints:
az spring app create \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name resilience4j \ --assign-endpoint az spring app create \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name reactive-resilience4j \ --assign-endpoint
Use the following commands to deploy the applications:
az spring app deploy \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name resilience4j \ --env resilience4j.circuitbreaker.instances.backendA.registerHealthIndicator=true \ --artifact-path ./spring-cloud-circuitbreaker-demo-resilience4j/target/spring-cloud-circuitbreaker-demo-resilience4j-0.0.1-SNAPSHOT.jar az spring app deploy \ --resource-group ${resource-group-name} \ --service ${Azure-Spring-Apps-instance-name} \ --name reactive-resilience4j \ --env resilience4j.circuitbreaker.instances.backendA.registerHealthIndicator=true \ --artifact-path ./spring-cloud-circuitbreaker-demo-reactive-resilience4j/target/spring-cloud-circuitbreaker-demo-reactive-resilience4j-0.0.1-SNAPSHOT.jar
Note
Include the required dependency for Resilience4j:
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-micrometer</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId> </dependency>
Your code must use the
CircuitBreakerFactory
API, which is implemented as abean
automatically created when you include a Spring Cloud Circuit Breaker starter. For more information, see Spring Cloud Circuit Breaker.The following two dependencies have conflicts with Resilient4j packages. Be sure you don't include them.
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zipkin</artifactId> </dependency>
Navigate to the URL provided by gateway applications, and access the endpoint from spring-cloud-circuit-breaker-demo as follows:
/get
/delay/{seconds}
/fluxdelay/{seconds}
Locate Resilence4j Metrics on the Azure portal
In your Azure Spring Apps instance, select Application Insights in the navigation pane and then select Application Insights on the page.
Note
If you don't enable Application Insights, you can enable the Java In-Process agent. For more information, see the Manage Application Insights using the Azure portal section of Use Application Insights Java In-Process Agent in Azure Spring Apps.
Enable dimension collection for resilience4j metrics. For more information, see the Custom metrics dimensions and preaggregation section of Log-based and preaggregated metrics in Application Insights.
Select Metrics in the navigation pane. The Metrics page provides dropdown menus and options to define the charts in this procedure. For all charts, set Metric Namespace to azure.applicationinsights.
Set Metric to resilience4j_circuitbreaker_buffered_calls, and then set Aggregation to Avg.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Add filter and set Name to Delay.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Apply splitting and set Split by to kind.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Add metric and set Metric to resilience4j_circuitbreaker_buffered_calls, and then set Aggregation to Avg. Select Add metric again and set Metric to resilience4j_circuitbreaker_slow_calls, and then set Aggregation set to Avg.
In your Azure Spring Apps instance, select Application Insights in the navigation pane and then select the default Application Insights on the page.
Note
If there's no default Application Insights available, you can enable the Java In-Process agent. For more information, see the Manage Application Insights using the Azure portal section of Use Application Insights Java In-Process Agent in Azure Spring Apps.
Enable dimension collection for resilience4j metrics. For more information, see the Custom metrics dimensions and preaggregation section of Log-based and preaggregated metrics in Application Insights.
Select Metrics in the navigation pane. The Metrics page provides dropdown menus and options to define the charts in this procedure. For all charts, set Metric Namespace to azure.applicationinsights.
Set Metric to resilience4j_circuitbreaker_buffered_calls, and then set Aggregation to Avg.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Add filter and set Name to Delay.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Apply splitting and set Split by to kind.
Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Add metric and set Metric to resilience4j_circuitbreaker_buffered_calls, and then set Aggregation to Avg. Select Add metric again and set Metric to resilience4j_circuitbreaker_slow_calls, and then set Aggregation set to Avg.