الفصل 1: مقدمة إلى Spring Boot Actuator
مقدمة
Spring Boot Actuator يضيف ميزات المراقبة والإدارة لتطبيقك. يقوم بتوفير نقاط نهاية HTTP التي تسمح بمراقبة حالة الصحة، المقاييس، وتشخيص المشاكل.
🎯 أهداف الفصل
في نهاية هذا الفصل، ستعرف:
- ✅ ما هو Actuator ولماذا تستخدمه
- ✅ إضافة Actuator إلى مشروعك
- ✅ تكوين نقاط النهاية
- ✅ تأمين الوصول إلى نقاط النهاية
1. ما هو Actuator؟
الميزات الرئيسية
Spring Boot Actuator يوفر:
├── Health Checks: هل التطبيق يعمل؟
├── مقاييس: الأداء، استخدام الذاكرة، الطلبات/الثانية
├── معلومات: معلومات عن التطبيق (الإصدار، البناء)
├── البيئة: التكوين والمتغيرات البيئية
├── Loggers: تعديل مستويات السجل في الوقت الفعلي
├── Thread Dump: تحليل الخيوط
├── Heap Dump: تحليل الذاكرة
└── HTTP Trace: تاريخ الطلبات
حالات الاستخدام
1. Kubernetes: فحوصات الحياة/الجاهزية
2. موازن التحميل: التحقق مما إذا كانت الحالة الصحية سليمة
3. Prometheus: جمع المقاييس
4. تصحيح الأخطاء: التشخيص في الإنتاج
5. DevOps: أتمتة النشر
2. التثبيت
تبعية Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator'
3. التكوين الأساسي
تفعيل نقاط النهاية
بشكل افتراضي، يتم عرض /actuator/health فقط عبر HTTP.
# application.properties
# عرض جميع نقاط النهاية عبر HTTP
management.endpoints.web.exposure.include=*
# أو عرض بعض نقاط النهاية فقط
management.endpoints.web.exposure.include=health,info,metrics,prometheus
# استبعاد نقاط النهاية الحساسة
management.endpoints.web.exposure.exclude=env,beans
التحقق من التثبيت
# بدء التطبيق
mvn spring-boot:run
# سرد جميع نقاط النهاية المتاحة
curl http://localhost:8080/actuator
الاستجابة:
{
"_links": {
"self": {"href": "http://localhost:8080/actuator"},
"health": {"href": "http://localhost:8080/actuator/health"},
"info": {"href": "http://localhost:8080/actuator/info"},
"metrics": {"href": "http://localhost:8080/actuator/metrics"},
"loggers": {"href": "http://localhost:8080/actuator/loggers"}
}
}
4. المنفذ والمسار المخصص
فصل منفذ الإدارة
# منفذ منفصل لـ Actuator (موصى به في الإنتاج)
management.server.port=8081
# التطبيق يبقى على 8080
# Actuator متاح على 8081
المزايا:
- عزل حركة المرور للمراقبة
- تكوين جدار ناري مختلف
- عدم العرض على الإنترنت
تخصيص المسار
# تغيير المسار الأساسي
management.endpoints.web.base-path=/admin/monitoring
# ستكون نقاط النهاية تحت:
# /admin/monitoring/health
# /admin/monitoring/info
# إلخ.
5. أمان نقاط النهاية
مع Spring Security
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
// نقاط النهاية العامة
.requestMatchers("/actuator/health").permitAll()
.requestMatchers("/actuator/info").permitAll()
// نقاط النهاية لـ Prometheus (IP داخلي فقط)
.requestMatchers("/actuator/prometheus").permitAll()
// جميع نقاط النهاية الأخرى لـ Actuator: ADMIN فقط
.requestMatchers("/actuator/**").hasRole("ADMIN")
// بقية التطبيق
.anyRequest().authenticated()
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
}
تعطيل نقاط النهاية
# تعطيل نقطة نهاية بالكامل
management.endpoint.shutdown.enabled=false
management.endpoint.env.enabled=false
# تعطيل الجميع، ثم التفعيل بشكل انتقائي
management.endpoints.enabled-by-default=false
management.endpoint.health.enabled=true
management.endpoint.info.enabled=true
management.endpoint.metrics.enabled=true
6. نقاط النهاية الأساسية
/actuator/health
curl http://localhost:8080/actuator/health
{
"status": "UP"
}
مع التفاصيل:
management.endpoint.health.show-details=always
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "H2",
"validationQuery": "isValid()"
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": 499963174912,
"free": 234567891234,
"threshold": 10485760
}
}
}
}
/actuator/info
# إضافة معلومات مخصصة
info.app.name=My Application
info.app.version=1.0.0
info.app.description=تطبيق تجريبي
info.contact.email=support@example.com
# معلومات Git (إذا كان spring-boot-maven-plugin مكونًا)
management.info.git.mode=full
curl http://localhost:8080/actuator/info
{
"app": {
"name": "My Application",
"version": "1.0.0",
"description": "تطبيق تجريبي"
},
"contact": {
"email": "support@example.com"
}
}
/actuator/metrics
# سرد جميع المقاييس
curl http://localhost:8080/actuator/metrics
# مقياس محدد
curl http://localhost:8080/actuator/metrics/jvm.memory.used
{
"name": "jvm.memory.used",
"measurements": [
{"statistic": "VALUE", "value": 123456789}
],
"availableTags": [
{"tag": "area", "values": ["heap", "nonheap"]},
{"tag": "id", "values": ["G1 Eden Space", "G1 Old Gen"]}
]
}
7. التكوين الكامل الموصى به
# ===== ACTUATOR =====
# عرض نقاط النهاية الضرورية
management.endpoints.web.exposure.include=health,info,metrics,prometheus,loggers
# منفذ منفصل (اختياري ولكن موصى به في الإنتاج)
# management.server.port=8081
# الصحة مع التفاصيل
management.endpoint.health.show-details=when_authorized
management.endpoint.health.show-components=when_authorized
# معلومات مخصصة
info.app.name=@project.name@
info.app.version=@project.version@
info.app.encoding=@project.build.sourceEncoding@
info.java.version=@java.version@
# تفعيل معلومات البناء
management.info.build.enabled=true
management.info.git.enabled=true
management.info.env.enabled=true
# المقاييس
management.metrics.tags.application=${spring.application.name}
8. ملخص
التثبيت
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
التكوين الأدنى
management.endpoints.web.exposure.include=health,info,metrics
management.endpoint.health.show-details=always
نقاط النهاية الرئيسية
| نقطة النهاية | الاستخدام |
|---|---|
/actuator/health | حالة الصحة |
/actuator/info | معلومات التطبيق |
/actuator/metrics | مقاييس الأداء |
/actuator/loggers | مستويات السجل |
/actuator/env | المتغيرات البيئية |
🎯 الخطوة التالية
لنستكشف بالتفصيل جميع نقاط النهاية المتاحة.