اختبار: 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/beans | Beans 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: ما هي المقاييس المتاحة افتراضياً؟
الإجابة:
| الفئة | أمثلة |
|---|---|
| JVM | jvm.memory.used, jvm.gc.pause |
| HTTP | http.server.requests |
| Tomcat | tomcat.sessions.active |
| DataSource | hikaricp.connections.active |
| Cache | cache.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؟
الإجابة:
- تكوين Prometheus كمصدر بيانات
- استيراد لوحة تحكم Spring Boot (ID: 12900)
- أو إنشاء لوحات مخصصة:
# طلبات 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: ما هي أفضل ممارسات المراقبة؟
الإجابة:
- مراقبة الإشارات الأربعة الرئيسية (RED): المعدل، الأخطاء، المدة
- تكوين تنبيهات ذات صلة
- استخدام لوحات التحكم
- مركزية السجلات والمقاييس
- مراقبة التبعيات (قاعدة البيانات، الكاش، API الخارجية)
- فحوصات الصحة لموازن التحميل
- تتبع موزع للخدمات المصغرة
- أتمتة كتب التشغيل
النتيجة
| النتيجة | المستوى |
|---|---|
| 27-30 | ممتاز - إتقان Actuator |
| 21-26 | جيد - بعض المراجعات |
| 15-20 | متوسط - اقرأ الفصول مرة أخرى |
| أقل من 15 | بحاجة إلى مراجعة |