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.

  1. 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
    
  1. 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}
    
  2. 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
    
  3. 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
    
  1. 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
    
  2. 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
    
  3. 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 a bean 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

  1. In your Azure Spring Apps instance, select Application Insights in the navigation pane and then select Application Insights on the page.

    Screenshot of the Azure portal that shows the Azure Spring Apps Application Insights page with Application Insights highlighted.

    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.

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

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

    Screenshot of the Azure portal Application Insights Metrics page with Metric Namespace menu open and azure-applicationinsights option highlighted.

  4. Set Metric to resilience4j_circuitbreaker_buffered_calls, and then set Aggregation to Avg.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker buffered calls and average aggregation.

  5. Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker calls and average aggregation.

  6. Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Add filter and set Name to Delay.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker calls, average aggregation and Delay Filter.

  7. Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Apply splitting and set Split by to kind.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker calls, average aggregation, and splitting.

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

    Screenshot of the Azure portal that shows the Application Insights Metrics page with the chart described in this step.

  1. In your Azure Spring Apps instance, select Application Insights in the navigation pane and then select the default Application Insights on the page.

    Screenshot of the Azure portal that shows the Azure Spring Apps Application Insights page with the default Application Insights instance highlighted.

    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.

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

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

    Screenshot of the Azure portal Application Insights Metrics page with the Metric Namespace menu open and azure.applicationinsights highlighted.

  4. Set Metric to resilience4j_circuitbreaker_buffered_calls, and then set Aggregation to Avg.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker buffered calls and average aggregation.

  5. Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker calls and average aggregation.

  6. Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Add filter and set Name to Delay.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker calls, average aggregation and delay filter.

  7. Set Metric to resilience4j_circuitbreaker_calls, and then set Aggregation to Avg. Select Apply splitting and set Split by to kind.

    Screenshot of the Azure portal Application Insights Metrics page that shows a chart with circuit breaker calls, average aggregation, and splitting.

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

    Screenshot of the Azure portal that shows the Application Insights Metrics page with the chart described in this step.

Next steps