A. References
- https://www.callicoder.com/spring-boot-actuator/
- https://micrometer.io/docs
- https://prometheus.io/
- https://grafana.com/docs/grafana/latest/
B. Demo show chỉ số từ ứng dụng Spring-boot sang Prometheus và vẽ biểu đồ lên Grafana
I. Ứng dụng Spring boot exposing các chỉ số metrics từ ứng dụng
1. Khởi tạo ứng dụng
- Truy câp vào trang khởi tạo Spring Boot http://start.spring.io/
- Spring boot Actuator
- Prometheus
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<scope>runtime</scope>
</dependency>
- Chạy ứng dụng vào truy cập vào link sau http://localhost:8080/actuator
Trong file app.properties thêm các cấu hình sau
# Use "*" to expose all endpoints, or a comma-separated list to expose selected ones
management.endpoints.web.exposure.include=health,info,prometheus
management.endpoints.web.exposure.exclude=
Cấu hình port chạy metrics:
management.server.port=8081
3. Một số loại actuator enpoint thông dụng
3.1 /health
- Check trạng thái ứng dụng, có thể kết hợp một số loại chỉ số check khác như trạng thái kết nối đến Database, Redis, MongoDb, hoặc tùy chỉnh một chỉ số cần check.
Để hiển thị chi tiết hơn thông tin, thêm tham số sau vào file cấu hình app.properties# HEALTH ENDPOINT
management.endpoint.health.show-details=always
Khi gọi vào link http://localhost:8080/actuator/health
- Tùy chỉnh chỉ số health check.
HealthIndicator
hoặc
extend từ abstract class
AbstractHealthIndicator
package com.example.actuatordemo.health;
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.stereotype.Component;
@Component
public class CustomHealthIndicator extends AbstractHealthIndicator {
@Override
protected void doHealthCheck(Health.Builder builder) throws Exception {
// Use the builder to build the health status details that should be reported.
// If you throw an exception, the status will be DOWN with the exception message.
builder.up()
.withDetail("app", "Alive and Kicking")
.withDetail("error", "Nothing! I'm good.");
}
}
Kết quả sau khi truy cập link http://localhost:8080/actuator/health
{
"status":"UP",
"details":{
"custom":{
"status":"UP",
"details":{
"app":"Alive and Kicking",
"error":"Nothing! I'm good."
}
},
"diskSpace":{
"status":"UP",
"details":{
"total":250790436864,
"free":97949245440,
"threshold":10485760
}
}
}
}
3.2 /Metrics
list tất cả các metrics mà có thể theo dõi
VD: http://localhost:8080/actuator/metrics/system.cpu.count
3.3 /prometheus
Các chỉ số prometheus để bên prometheus có thể scrap dữ liệu, có thể tra cứu xem các tham số ứng dụng đẩy lên prometheus đã có ở đây chưa.4. Bảo mật Actuator Endpoint với Spring Security
Actuator Enpoint là nhạy cảm cần được bảo mật để chặn các truy cập trái phép. Có thể sử dụng Spring Security để bảo mật nếu ứng dụng chưa có cơ chế bảo mật.
- Add thêm dependency vào ứng dụng
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
- Thêm class sau để override lại default spring security và định nghĩa các rule truy cập
package com.example.actuatordemo.config;
import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
import org.springframework.boot.actuate.context.ShutdownEndpoint;
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
/*
This spring security configuration does the following
1. Restrict access to the Shutdown endpoint to the ACTUATOR_ADMIN role.
2. Allow access to all other actuator endpoints.
3. Allow access to static resources.
4. Allow access to the home page (/).
5. All other requests need to be authenticated.
5. Enable http basic authentication to make the configuration complete.
You are free to use any other form of authentication.
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.requestMatchers(EndpointRequest.to(ShutdownEndpoint.class))
.hasRole("ACTUATOR_ADMIN")
.requestMatchers(EndpointRequest.toAnyEndpoint())
.permitAll()
.requestMatchers(PathRequest.toStaticResources().atCommonLocations())
.permitAll()
.antMatchers("/")
.permitAll()
.antMatchers("/**")
.authenticated()
.and()
.httpBasic();
}
}
- Thêm tham số sau vào cấu hình
# Spring Security Default user name and password
spring.security.user.name=actuator
spring.security.user.password=actuator
spring.security.user.roles=ACTUATOR_ADMIN
5. Tùy chỉnh các chỉ số metrics
II. Kết nối ứng dụng với prometheus
1. Cài đặt Prometheus
2. Cấu hình thêm ứng dụng cần monitor vào file prometheus.yml
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['127.0.0.1:9090']
- job_name: 'spring-actuator'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['HOST_IP:8080']
3. View chỉ số trên Prometheus
III. Kết nối Grafana
1. Cài đặt grafana
2. Add prometheus data source trên Grafana
3. Add Dashboard trên Grafana
Không có nhận xét nào:
Đăng nhận xét