Pular para o conteúdo principal

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:

EndpointDescrição
/actuator/healthSaúde da aplicação
/actuator/infoInformações personalizadas
/actuator/metricsMétricas
/actuator/envPropriedades de ambiente
/actuator/loggersNíveis de log
/actuator/beansBeans do Spring
/actuator/mappingsRotas HTTP
/actuator/threaddumpThreads ativas
/actuator/heapdumpDump 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:

CategoriaExemplos
JVMjvm.memory.used, jvm.gc.pause
HTTPhttp.server.requests
Tomcattomcat.sessions.active
DataSourcehikaricp.connections.active
Cachecache.gets, cache.puts
Sistemasystem.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:

  1. Configure o Prometheus como fonte de dados
  2. Importe um dashboard Spring Boot (ID: 12900)
  3. 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:

  1. Monitore os 4 sinais principais (RED): Rate, Errors, Duration
  2. Configure alertas relevantes
  3. Use dashboards
  4. Centralize logs e métricas
  5. Monitore dependências (DB, cache, APIs externas)
  6. Health checks para o load balancer
  7. Tracing distribuído para microsserviços
  8. Automatize runbooks

Pontuação​

PontuaçãoNível
27-30Excelente - Domínio do Actuator
21-26Bom - Algumas revisões
15-20Médio - Releia os capítulos
Menos de 15Precisa revisar

Voltar ao Módulo 11