Quiz: Spring Boot Actuator
Teste seus conhecimentos sobre Actuator, métricas e monitoramento.
30 questões - Clique em cada pergunta para revelar a resposta.
Questões 1-15: Fundamentos do Actuator
Pergunta 1: O que é o Spring Boot Actuator?
Resposta: O Actuator fornece endpoints para monitorar e gerenciar uma aplicação Spring Boot em produção:
- Saúde da aplicação
- Métricas
- Informações sobre o ambiente
- Gerenciamento de logs
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Pergunta 2: Como expor todos os endpoints do Actuator?
Resposta:
management:
endpoints:
web:
exposure:
include: "*"
Por padrão, apenas /health e /info são expostos.
Pergunta 3: Quais são os principais endpoints do Actuator?
Resposta:
| Endpoint | Descrição |
|---|---|
/actuator/health | Saúde da aplicação |
/actuator/info | Informações personalizadas |
/actuator/metrics | Métricas |
/actuator/env | Propriedades de ambiente |
/actuator/loggers | Níveis de log |
/actuator/beans | Beans do Spring |
/actuator/mappings | Rotas HTTP |
/actuator/threaddump | Threads ativas |
/actuator/heapdump | Dump de memória |
Pergunta 4: Como configurar o endpoint health?
Resposta:
management:
endpoint:
health:
show-details: always # never, when-authorized, always
show-components: always
health:
db:
enabled: true
diskspace:
enabled: true
threshold: 10MB
Pergunta 5: Como criar um Health Indicator personalizado?
Resposta:
@Component
public class ExternalApiHealthIndicator implements HealthIndicator {
private final ExternalApiClient apiClient;
@Override
public Health health() {
try {
boolean isUp = apiClient.ping();
if (isUp) {
return Health.up()
.withDetail("api", "Available")
.withDetail("responseTime", "50ms")
.build();
}
return Health.down()
.withDetail("api", "Unavailable")
.build();
} catch (Exception e) {
return Health.down(e).build();
}
}
}
Pergunta 6: Como adicionar informações ao /actuator/info?
Resposta:
# application.yml
info:
app:
name: Minha Aplicação
version: 1.0.0
description: API REST
contact:
email: support@example.com
Ou com um InfoContributor:
@Component
public class CustomInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("uptime", getUptime());
builder.withDetail("activeUsers", getActiveUsers());
}
}
Pergunta 7: Como proteger os endpoints do Actuator?
Resposta:
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain actuatorSecurity(HttpSecurity http) throws Exception {
http.securityMatcher("/actuator/**")
.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/health").permitAll()
.requestMatchers("/actuator/**").hasRole("ADMIN")
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
}
Pergunta 8: Como alterar o caminho base do Actuator?
Resposta:
management:
endpoints:
web:
base-path: /manage # /manage/health em vez de /actuator/health
Pergunta 9: Como desabilitar um endpoint específico?
Resposta:
management:
endpoint:
env:
enabled: false
beans:
enabled: false
Pergunta 10: Como expor o Actuator em uma porta diferente?
Resposta:
management:
server:
port: 9090 # Actuator na porta 9090
address: 127.0.0.1 # Acessível apenas localmente
Pergunta 11: Como alterar os níveis de log em tempo real?
Resposta:
# Ver os loggers
curl http://localhost:8080/actuator/loggers
# Alterar um nível
curl -X POST http://localhost:8080/actuator/loggers/com.example \
-H "Content-Type: application/json" \
-d '{"configuredLevel": "DEBUG"}'
Pergunta 12: Como obter um thread dump?
Resposta:
curl http://localhost:8080/actuator/threaddump
Útil para diagnosticar:
- Deadlocks
- Threads bloqueadas
- Problemas de performance
Pergunta 13: Como obter um heap dump?
Resposta:
curl -o heapdump.hprof http://localhost:8080/actuator/heapdump
Analisar com:
- Eclipse MAT
- VisualVM
- JProfiler
Pergunta 14: O que é o endpoint /actuator/env?
Resposta: Exibe todas as propriedades de ambiente:
- Variáveis de sistema
- Variáveis de ambiente
- Propriedades do application.yml
- Perfis ativos
curl http://localhost:8080/actuator/env/spring.datasource.url
Atenção: pode expor segredos!
Pergunta 15: Como ocultar propriedades sensíveis?
Resposta:
management:
endpoint:
env:
keys-to-sanitize:
- password
- secret
- key
- token
- credential
Os valores são substituídos por ******.
Questões 16-30: Métricas e Monitoramento
Pergunta 16: O que é o Micrometer?
Resposta: O Micrometer é uma fachada de métricas (como SLF4J para logs) que permite publicar métricas para diferentes sistemas:
- Prometheus
- Datadog
- InfluxDB
- CloudWatch
O Spring Boot Actuator utiliza por padrão.
Pergunta 17: Como acessar as métricas?
Resposta:
# Lista de métricas
curl http://localhost:8080/actuator/metrics
# Métrica específica
curl http://localhost:8080/actuator/metrics/jvm.memory.used
# Com tags
curl http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:/api/users
Pergunta 18: Quais métricas estão disponíveis por padrão?
Resposta:
| Categoria | Exemplos |
|---|---|
| JVM | jvm.memory.used, jvm.gc.pause |
| HTTP | http.server.requests |
| Tomcat | tomcat.sessions.active |
| DataSource | hikaricp.connections.active |
| Cache | cache.gets, cache.puts |
| Sistema | system.cpu.usage, disk.free |
Pergunta 19: Como criar uma métrica personalizada Counter?
Resposta:
@Service
public class OrderService {
private final Counter ordersCounter;
public OrderService(MeterRegistry registry) {
this.ordersCounter = Counter.builder("orders.created")
.description("Number of orders created")
.tag("type", "online")
.register(registry);
}
public Order createOrder(OrderRequest request) {
Order order = processOrder(request);
ordersCounter.increment();
return order;
}
}
Pergunta 20: Como criar uma métrica Timer?
Resposta:
@Service
public class PaymentService {
private final Timer paymentTimer;
public PaymentService(MeterRegistry registry) {
this.paymentTimer = Timer.builder("payment.processing")
.description("Payment processing time")
.register(registry);
}
public Payment process(PaymentRequest request) {
return paymentTimer.record(() -> {
// Processamento
return doProcess(request);
});
}
}
Pergunta 21: Como criar uma métrica Gauge?
Resposta:
@Component
public class QueueMetrics {
private final BlockingQueue<Task> queue;
public QueueMetrics(MeterRegistry registry, BlockingQueue<Task> queue) {
this.queue = queue;
Gauge.builder("queue.size", queue, BlockingQueue::size)
.description("Current queue size")
.register(registry);
}
}
Pergunta 22: Como usar @Timed para medir métodos?
Resposta:
@Configuration
public class MetricsConfig {
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}
}
@Service
public class UserService {
@Timed(value = "user.find", description = "Time to find user")
public User findById(Long id) {
return userRepository.findById(id).orElseThrow();
}
}
Pergunta 23: Como configurar o Prometheus?
Resposta:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: prometheus
Acesso: /actuator/prometheus
Pergunta 24: Como configurar o Prometheus para coletar as métricas?
Resposta:
# prometheus.yml
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080']
Pergunta 25: Como visualizar métricas no Grafana?
Resposta:
- Configure o Prometheus como fonte de dados
- Importe um dashboard Spring Boot (ID: 12900)
- Ou crie painéis personalizados:
# Requisições HTTP por segundo
rate(http_server_requests_seconds_count[5m])
# Tempo médio de resposta
rate(http_server_requests_seconds_sum[5m]) / rate(http_server_requests_seconds_count[5m])
# Uso de memória
jvm_memory_used_bytes{area="heap"}
Pergunta 26: Como adicionar tags globais às métricas?
Resposta:
@Configuration
public class MetricsConfig {
@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config()
.commonTags("application", "my-app")
.commonTags("environment", "production");
}
}
Pergunta 27: Como medir o tempo de inicialização?
Resposta:
@Component
public class StartupMetrics implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
long startupTime = System.currentTimeMillis()
- event.getTimestamp().toEpochMilli();
log.info("Application started in {} ms", startupTime);
}
}
Também disponível via Actuator: /actuator/startup
Pergunta 28: Como implementar alertas sobre métricas?
Resposta: No Prometheus/Alertmanager:
# alerts.yml
groups:
- name: spring-boot
rules:
- alert: HighErrorRate
expr: rate(http_server_requests_seconds_count{status="500"}[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: "High error rate detected"
Pergunta 29: Como monitorar conexões com o banco de dados?
Resposta: Métricas automáticas do HikariCP:
# Conexões ativas
curl .../actuator/metrics/hikaricp.connections.active
# Conexões pendentes
curl .../actuator/metrics/hikaricp.connections.pending
# Tempo de aquisição
curl .../actuator/metrics/hikaricp.connections.acquire
Pergunta 30: Quais são as boas práticas de monitoramento?
Resposta:
- Monitore os 4 sinais principais (RED): Rate, Errors, Duration
- Configure alertas relevantes
- Use dashboards
- Centralize logs e métricas
- Monitore dependências (DB, cache, APIs externas)
- Health checks para o load balancer
- Tracing distribuído para microsserviços
- Automatize runbooks
Pontuação
| Pontuação | Nível |
|---|---|
| 27-30 | Excelente - Domínio do Actuator |
| 21-26 | Bom - Algumas revisões |
| 15-20 | Médio - Releia os capítulos |
| Menos de 15 | Precisa revisar |