Este contenido no está disponible en el idioma seleccionado.

Chapter 7. Develop Micrometer application for JBoss EAP


7.1. Integrating Micrometer metrics in JBoss EAP

Using Micrometer, you can monitor and collect application metrics in JBoss EAP. Micrometer support provides the exposure of application metrics. The export process is PUSH-based, ensuring that metrics are sent to an OpenTelemetry Collector.

Prerequisites

Note

The example in this section, including how to use the configure-micrometer.cli file, is based on the Micrometer Quickstart.

Procedure

  1. Open a terminal.
  2. Start JBoss EAP as a standalone server by using the following script:

    $ <EAP_HOME>/bin/standalone.sh -c standalone-microprofile.xml
    Copy to Clipboard Toggle word wrap
    Note

    For Windows server, use the <EAP_HOME>\bin\standalone.bat script.

  3. Open a new terminal.
  4. Navigate to the application root directory.
  5. Run the following command to configure the server:

    $ <EAP_HOME>/bin/jboss-cli.sh --connect --file=configure-micrometer.cli
    Copy to Clipboard Toggle word wrap
    Note

    For Windows server, use the <EAP_HOME>\bin\jboss-cli.bat script.

    Replace <EAP_HOME> with the path to your server.

    Expected output:

    The batch executed successfully
    process-state: reload-required
    Copy to Clipboard Toggle word wrap

  6. Reload the server with the following management command:

    $ <EAP_HOME>/bin/jboss-cli.sh --connect --commands=reload
    Copy to Clipboard Toggle word wrap
  7. Create a configuration file named docker-compose.yaml with the following content:

    version: "3"
    
    services:
      otel-collector:
        image: otel/opentelemetry-collector
        command: [--config=/etc/otel-collector-config.yaml]
        volumes:
          - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml:Z
        ports:
          - 1888:1888 # pprof extension
          - 8888:8888 # Prometheus metrics exposed by the collector
          - 8889:8889 # Prometheus exporter metrics
          - 13133:13133 # health_check extension
          - 4317:4317 # OTLP gRPC receiver
          - 4318:4318 # OTLP http receiver
          - 55679:55679 # zpages extension
          - 1234:1234 # /metrics endpoint
    Copy to Clipboard Toggle word wrap
  8. Create a configuration file named otel-collector-config.yaml with the following content:

    extensions:
      health_check:
      pprof:
        endpoint: 0.0.0.0:1777
      zpages:
        endpoint: 0.0.0.0:55679
    
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    
    processors:
      batch:
    
    exporters:
      prometheus:
        endpoint: "0.0.0.0:1234"
    
    service:
      pipelines:
        metrics:
          receivers: [otlp]
          processors: [batch]
          exporters: [prometheus]
    
      extensions: [health_check, pprof, zpages]
    Copy to Clipboard Toggle word wrap
  9. Start the collector server instance by running the following command:

    $ docker-compose up
    Copy to Clipboard Toggle word wrap
    Note

    You can also use Podman instead of Docker. If you choose Podman, then use the $ podman-compose up command instead of $ docker-compose up. If Docker or Podman is not supported in your environment, then see Otel Collector documentation for guidance on installing and running the OpenTelemetry Collector.

  10. In the RootResource class, see how the MeterRegistry is injected into your class to ensure proper setup before registering the meters.

    @Path("/")
    @ApplicationScoped
    public class RootResource {
        // ...
        @Inject
        private MeterRegistry registry;
    
        private Counter performCheckCounter;
        private Counter originalCounter;
        private Counter duplicatedCounter;
    
        @PostConstruct
        private void createMeters() {
            Gauge.builder("prime.highestSoFar", () -> highestPrimeNumberSoFar)
                    .description("Highest prime number so far.")
                    .register(registry);
            performCheckCounter = Counter
                    .builder("prime.performedChecks")
                    .description("How many prime checks have been performed.")
                    .register(registry);
            originalCounter = Counter
                    .builder("prime.duplicatedCounter")
                    .tags(List.of(Tag.of("type", "original")))
                    .register(registry);
            duplicatedCounter = Counter
                    .builder("prime.duplicatedCounter")
                    .tags(List.of(Tag.of("type", "copy")))
                    .register(registry);
        }
        // ...
    }
    Copy to Clipboard Toggle word wrap
  11. Inspect the checkIfPrime() method body to see how to use the registered meters within your application logic. For example:

    @GET
    @Path("/prime/{number}")
    public String checkIfPrime(@PathParam("number") long number) throws Exception {
        performCheckCounter.increment();
    
        Timer timer = registry.timer("prime.timer");
    
        return timer.recordCallable(() -> {
    
            if (number < 1) {
                return "Only natural numbers can be prime numbers.";
            }
    
            if (number == 1) {
                return "1 is not prime.";
            }
    
            if (number == 2) {
                return "2 is prime.";
            }
    
            if (number % 2 == 0) {
                return number + " is not prime, it is divisible by 2.";
            }
    
            for (int i = 3; i < Math.floor(Math.sqrt(number)) + 1; i = i + 2) {
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    //
                }
                if (number % i == 0) {
                    return number + " is not prime, is divisible by " + i + ".";
                }
            }
    
            if (number > highestPrimeNumberSoFar) {
                highestPrimeNumberSoFar = number;
            }
    
            return number + " is prime.";
        });
    }
    Copy to Clipboard Toggle word wrap
  12. Navigate to the application root directory.

    Syntax

    $ cd <path_to_application_root>/<application_root>
    Copy to Clipboard Toggle word wrap

    Example, in reference to the Micrometer Quickstart:

    $ cd ~/quickstarts/micrometer
    Copy to Clipboard Toggle word wrap

  13. Compile and deploy the application with the following command:

    $ mvn clean package wildfly:deploy
    Copy to Clipboard Toggle word wrap

This deploys micrometer/target/micrometer.war to the running server.

Verification

  1. Access the application by using a web browser or you can run the following command.

    $ curl http://localhost:8080/micrometer/prime/13
    Copy to Clipboard Toggle word wrap

    Expected output:

    13 is prime.
    Copy to Clipboard Toggle word wrap

Volver arriba
Red Hat logoGithubredditYoutubeTwitter

Aprender

Pruebe, compre y venda

Comunidades

Acerca de la documentación de Red Hat

Ayudamos a los usuarios de Red Hat a innovar y alcanzar sus objetivos con nuestros productos y servicios con contenido en el que pueden confiar. Explore nuestras recientes actualizaciones.

Hacer que el código abierto sea más inclusivo

Red Hat se compromete a reemplazar el lenguaje problemático en nuestro código, documentación y propiedades web. Para más detalles, consulte el Blog de Red Hat.

Acerca de Red Hat

Ofrecemos soluciones reforzadas que facilitan a las empresas trabajar en plataformas y entornos, desde el centro de datos central hasta el perímetro de la red.

Theme

© 2025 Red Hat