Spring Boot metrics monitoring using elasticsearch and kibana

One of the most frequently mentioned challenges related to the creation of microservices based architecture is monitoring. Each microservice should be run on an environment isolated from the other microservices, so it does not share resources such as databases or log files with them.

Spring Boot provides actuator to monitor and manage our application. Actuator is a tool which has HTTP endpoints. when application is pushed to production, you can choose to monitor your application using HTTP endpoints. In this post will see how to ship Spring boot actuator to elasticsearch and monitor our app(s) from Kibana dashboard.

Spring Boot Confirguration

In order for metrics to be available in our app, we just add the Actuator dependency to it:

      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>

For the sake of simplicity, I disabled security for actuator endpoints by adding these lines my application.yml

management:
  security:
    enabled: false

HTTPBeat

Httpbeat is a Beat used to call HTTP endpoints and ship the result to the configured output channel, e.g. Logstash and Elasticsearch...

In this article, we will monitor just 2 actuator endpoints /health and /metrics. the httpbeat.yml config file is something like:

      ######################## Httpbeat Configuration Example ########################

      ############################## Httpbeat ########################################
      httpbeat:

        hosts:
          # Each - Host endpoints to call. Below are the host endpoint specific configurations
          -
            schedule: "@every 30s"
            url: http://localhost:8080/health
            method: get
            headers:
              Accept: application/json
            output_format: json
            json_dot_mode: replace

          -
            schedule: "@every 30s"
            url: http://localhost:8080/metrics
            method: get
            headers:
              Accept: application/json
            output_format: json
            json_dot_mode: replace

      #================================ General =====================================
      fields:
        app_id: test_app

      #----------------------------- Logstash output --------------------------------
      output.elasticsearch:
        hosts: ["localhost:9200"]
        index: "httpbeat-%{+yyyy.MM.dd}"

As you can see, Httpbeat calls every 30s the 2 endpoints. It's important to set json_dot_mode to replace to avoid errors since some of the values in the metrics response contain a dot ('.'). I also added a app_id field to identify my app.

To check if our configuration is fine, let's execute this curl command to list available indices:

 curl -XGET 'localhost:9200/_cat/indices?v&pretty'

We should see httpbeat-... index in the list

Kibana dashboard

Now that we've our index created, we should [add it to kibana] (https://www.elastic.co/guide/en/kibana/current/tutorial-define-index.html) and start playing with it.