To monitor a Java virtual machine (JVM) application by using Alibaba Cloud Prometheus Service, you can instrument the JVM application to expose data, use Prometheus Service to collect data, configure a Grafana dashboard to display the data, and then create an alert rule. This topic describes how to use Prometheus Service to monitor a JVM application. In this example, Container Service for Kubernetes (ACK) and Container Registry are used.

Prerequisites

Demo

You can also use a demo project to learn how to monitor a JVM application by using Prometheus Service. For more information about the demo project, visit GitHub.

Procedure

The following figure describes how to use Prometheus Service to monitor a JVM application.

flow

Step 1: Instrument a JVM application

To instrument a JVM application to expose data, perform the following steps:

  1. Add Maven dependencies to the pom.xml file.
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_hotspot</artifactId>
        <version>0.6.0</version>
    </dependency>
  2. Add the method to initialize the JVM exporter to the application code.
    @PostConstruct
        public void initJvmExporter() {
            io.prometheus.client.hotspot.DefaultExports.initialize();
        }

    For more information, see the /src/main/java/com/monitise/prometheus_demo/DemoController.java file of the demo project.

  3. Configure the port and endpoint that are used to connect to Prometheus Service in the application.properties file.
    management.port: 8081
    endpoints.prometheus.path: prometheus-metrics

    For more information, see the /src/main/resources/application.properties file of the demo project.

  4. Add the method to enable the HTTP port to the application code.
    @SpringBootApplication
    // sets up the prometheus endpoint /prometheus-metrics
    @EnablePrometheusEndpoint
    // exports the data at /metrics at a prometheus endpoint
    @EnableSpringBootMetricsCollector
    public class PrometheusDemoApplication {
        public static void main(String[] args) {
            SpringApplication.run(PrometheusDemoApplication.class, args);
        }
    }

    For more information, see the /src/main/java/com/monitise/prometheus_demo/PrometheusDemoApplication.java file of the demo project.

Step 2: Upload the JVM application

To build an image for the instrumented JVM application and upload the image to an image repository of Container Registry, perform the following steps:

  1. Run the following command to recompile a module:
    mvn clean install -DskipTests
  2. Run the following command to build an image:
    docker build -t <Name of the local temporary Docker image>:<Version number of the local temporary Docker image> . --no-cache
    Example:
    docker build -t promethues-demo:v0 . --no-cache
  3. Run the following command to tag the image:
    sudo docker tag <Name of the local temporary Docker image>:<Version number of the local temporary Docker image> <Domain name of the image repository>/<Namespace>/<Image name>:<Image version number>
    Example:
    sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
  4. Run the following command to upload the image to the image repository:
    sudo docker push <Domain name of the image repository>/<Namespace>/<Image name>:<Image version number>
    Example:
    sudo docker push registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
    You can view the information about the uploaded application image on the Tags page of the Container Registry console. Image

Step 3: Deploy the JVM application

To deploy the JVM application to an ACK cluster, perform the following steps:

  1. Log on to the Alibaba Cloud Container Service for Kubernetes console .
  2. In the left-side navigation pane, click Clusters.
  3. On the Clusters page, find the cluster to which you want to deploy the application and click Applications in the Actions column.
  4. Create a container group.
    1. In the left-side navigation pane, choose Workloads > Deployments.
    2. On the Deployments page, click Create from YAML in the upper-right corner.
    3. On the Create page, enter the following code in the Template code editor and click Create:
      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: prometheus-demo
      spec:
        replicas: 2
        template:
          metadata:
            annotations:
              prometheus.io/scrape: 'true'
              prometheus.io/path: '/prometheus-metrics'
              prometheus.io/port: '8081'
            labels:
              app: tomcat
          spec:
            containers:
            - name: tomcat
              imagePullPolicy: Always
              image: <Domain name of the image repository>/<Namespace>/<Image name>:<Image version number>
              ports:
              - containerPort: 8080
                name: tomcat-normal
              - containerPort: 8081
                name: tomcat-monitor
      Sample code:
      apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
      kind: Deployment
      metadata:
        name: prometheus-demo
        labels:
          app: tomcat
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: tomcat
        template:
          metadata:
            annotations:
              prometheus.io/scrape: 'true'
              prometheus.io/path: '/prometheus-metrics'
              prometheus.io/port: '8081'
            labels:
              app: tomcat
          spec:
            containers:
            - name: tomcat
              imagePullPolicy: Always
              image: registry.cn-hangzhou.aliyuncs.com/peiyu-test/prometheus-demo:v0
              ports:
              - containerPort: 8080
                name: tomcat-normal
              - containerPort: 8081
                name: tomcat-monitor
    The newly created container group is displayed on the Deployments page. Container group
  5. Create a Service.
    1. In the left-side navigation pane, choose Network > Services.
    2. On the Services page, click Create Resources in YAML.
    3. On the Create page, enter the following code in the Template code editor and click Create:
      apiVersion: v1
      kind: Service
      metadata:
        labels:
          app: tomcat
        name: tomcat
        namespace: default
      spec:
        ports:
        - name: tomcat-normal
          port: 8080
          protocol: TCP
          targetPort: 8080
        - name: tomcat-monitor
          port: 8081
          protocol: TCP
          targetPort: 8081
        type: NodePort
        selector:
          app: tomcat
    The newly created Service is displayed on the Services page. Services

Step 4: Configure a service discovery task

Configure a service discovery task on the ServiceMonitor tab in Prometheus Service to collect data from the JVM application. For more information, see Use ServiceMonitors to discover and monitor Services.