انتقل إلى المحتوى الرئيسي

اختبار: Spring Boot Actuator

اختبر معرفتك بـ Actuator، المقاييس والمراقبة.

30 سؤالاً - انقر على كل سؤال لكشف الإجابة.


الأسئلة 1-15: أساسيات Actuator​

السؤال 1: ما هو Spring Boot Actuator؟

الإجابة: يوفر Actuator نقاط نهاية لمراقبة وإدارة تطبيق Spring Boot في الإنتاج:

  • صحة التطبيق
  • المقاييس
  • معلومات عن البيئة
  • إدارة السجلات
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

السؤال 2: كيف تعرض جميع نقاط النهاية في Actuator؟

الإجابة:

management:
endpoints:
web:
exposure:
include: "*"

بشكل افتراضي، يتم عرض /health و /info فقط.


السؤال 3: ما هي نقاط النهاية الرئيسية في Actuator؟

الإجابة:

Endpointالوصف
/actuator/healthصحة التطبيق
/actuator/infoمعلومات مخصصة
/actuator/metricsمقاييس
/actuator/envخصائص البيئة
/actuator/loggersمستويات السجل
/actuator/beansBeans Spring
/actuator/mappingsمسارات HTTP
/actuator/threaddumpالخيوط النشطة
/actuator/heapdumpتفريغ الذاكرة

السؤال 4: كيف تقوم بتكوين نقطة النهاية health؟

الإجابة:

management:
endpoint:
health:
show-details: always # never, when-authorized, always
show-components: always
health:
db:
enabled: true
diskspace:
enabled: true
threshold: 10MB

السؤال 5: كيف تنشئ مؤشر صحة مخصص؟

الإجابة:

@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();
}
}
}

السؤال 6: كيف تضيف معلومات إلى /actuator/info؟

الإجابة:

# application.yml
info:
app:
name: تطبيقي
version: 1.0.0
description: API REST
contact:
email: support@example.com

أو باستخدام InfoContributor:

@Component
public class CustomInfoContributor implements InfoContributor {

@Override
public void contribute(Info.Builder builder) {
builder.withDetail("uptime", getUptime());
builder.withDetail("activeUsers", getActiveUsers());
}
}

السؤال 7: كيف تؤمن نقاط النهاية في Actuator؟

الإجابة:

@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();
}
}

السؤال 8: كيف تغير مسار الأساس لـ Actuator؟

الإجابة:

management:
endpoints:
web:
base-path: /manage # /manage/health بدلاً من /actuator/health

السؤال 9: كيف تعطل نقطة نهاية معينة؟

الإجابة:

management:
endpoint:
env:
enabled: false
beans:
enabled: false

السؤال 10: كيف تعرض Actuator على منفذ مختلف؟

الإجابة:

management:
server:
port: 9090 # Actuator على المنفذ 9090
address: 127.0.0.1 # متاح فقط محلياً

السؤال 11: كيف تعدل مستويات السجل في الوقت الفعلي؟

الإجابة:

# عرض السجلات
curl http://localhost:8080/actuator/loggers

# تغيير مستوى
curl -X POST http://localhost:8080/actuator/loggers/com.example \
-H "Content-Type: application/json" \
-d '{"configuredLevel": "DEBUG"}'

السؤال 12: كيف تحصل على تفريغ للخيوط؟

الإجابة:

curl http://localhost:8080/actuator/threaddump

مفيد لتشخيص:

  • حالات الجمود
  • الخيوط المحظورة
  • مشاكل الأداء

السؤال 13: كيف تحصل على تفريغ للذاكرة؟

الإجابة:

curl -o heapdump.hprof http://localhost:8080/actuator/heapdump

تحليل باستخدام:

  • Eclipse MAT
  • VisualVM
  • JProfiler

السؤال 14: ما هي نقطة النهاية /actuator/env؟

الإجابة: تعرض جميع خصائص البيئة:

  • متغيرات النظام
  • متغيرات البيئة
  • خصائص application.yml
  • الملفات النشطة
curl http://localhost:8080/actuator/env/spring.datasource.url

تنبيه: قد تعرض أسراراً!


السؤال 15: كيف تخفي الخصائص الحساسة؟

الإجابة:

management:
endpoint:
env:
keys-to-sanitize:
- password
- secret
- key
- token
- credential

يتم استبدال القيم بـ ******.


الأسئلة 16-30: المقاييس والمراقبة​

السؤال 16: ما هو Micrometer؟

الإجابة: Micrometer هو واجهة للمقاييس (مثل SLF4J للسجلات) التي تسمح بنشر المقاييس إلى أنظمة مختلفة:

  • Prometheus
  • Datadog
  • InfluxDB
  • CloudWatch

يستخدمه Spring Boot Actuator افتراضياً.


السؤال 17: كيف تصل إلى المقاييس؟

الإجابة:

# قائمة المقاييس
curl http://localhost:8080/actuator/metrics

# مقياس محدد
curl http://localhost:8080/actuator/metrics/jvm.memory.used

# مع العلامات
curl http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:/api/users

السؤال 18: ما هي المقاييس المتاحة افتراضياً؟

الإجابة:

الفئةأمثلة
JVMjvm.memory.used, jvm.gc.pause
HTTPhttp.server.requests
Tomcattomcat.sessions.active
DataSourcehikaricp.connections.active
Cachecache.gets, cache.puts
النظامsystem.cpu.usage, disk.free

السؤال 19: كيف تنشئ مقياس Counter مخصص؟

الإجابة:

@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;
}
}

السؤال 20: كيف تنشئ مقياس Timer؟

الإجابة:

@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(() -> {
// معالجة
return doProcess(request);
});
}
}

السؤال 21: كيف تنشئ مقياس Gauge؟

الإجابة:

@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);
}
}

السؤال 22: كيف تستخدم @Timed لقياس الطرق؟

الإجابة:

@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();
}
}

السؤال 23: كيف تقوم بتكوين Prometheus؟

الإجابة:

<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: prometheus

الوصول: /actuator/prometheus


السؤال 24: كيف تقوم بتكوين Prometheus لجلب المقاييس؟

الإجابة:

# prometheus.yml
scrape_configs:
- job_name: 'spring-boot'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['app:8080']

السؤال 25: كيف تعرض المقاييس في Grafana؟

الإجابة:

  1. تكوين Prometheus كمصدر بيانات
  2. استيراد لوحة تحكم Spring Boot (ID: 12900)
  3. أو إنشاء لوحات مخصصة:
# طلبات HTTP في الثانية
rate(http_server_requests_seconds_count[5m])

# متوسط وقت الاستجابة
rate(http_server_requests_seconds_sum[5m]) / rate(http_server_requests_seconds_count[5m])

# استخدام الذاكرة
jvm_memory_used_bytes{area="heap"}

السؤال 26: كيف تضيف علامات عامة إلى المقاييس؟

الإجابة:

@Configuration
public class MetricsConfig {

@Bean
public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config()
.commonTags("application", "my-app")
.commonTags("environment", "production");
}
}

السؤال 27: كيف تقيس وقت بدء التشغيل؟

الإجابة:

@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);
}
}

متاح أيضاً عبر Actuator: /actuator/startup


السؤال 28: كيف تنفذ تنبيهات على المقاييس؟

الإجابة: في 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"

السؤال 29: كيف تراقب الاتصالات بقاعدة البيانات؟

الإجابة: مقاييس HikariCP التلقائية:

# الاتصالات النشطة
curl .../actuator/metrics/hikaricp.connections.active

# الاتصالات المعلقة
curl .../actuator/metrics/hikaricp.connections.pending

# وقت الاكتساب
curl .../actuator/metrics/hikaricp.connections.acquire

السؤال 30: ما هي أفضل ممارسات المراقبة؟

الإجابة:

  1. مراقبة الإشارات الأربعة الرئيسية (RED): المعدل، الأخطاء، المدة
  2. تكوين تنبيهات ذات صلة
  3. استخدام لوحات التحكم
  4. مركزية السجلات والمقاييس
  5. مراقبة التبعيات (قاعدة البيانات، الكاش، API الخارجية)
  6. فحوصات الصحة لموازن التحميل
  7. تتبع موزع للخدمات المصغرة
  8. أتمتة كتب التشغيل

النتيجة​

النتيجةالمستوى
27-30ممتاز - إتقان Actuator
21-26جيد - بعض المراجعات
15-20متوسط - اقرأ الفصول مرة أخرى
أقل من 15بحاجة إلى مراجعة

العودة إلى الوحدة 11