كمقدمة ...
يتطلب الاستغلال الصناعي معرفة كيف يعيش التطبيق. يجب أن تؤخذ هذه الأطروحة كبديهية. هذه المعرفة هي المقاييس التي ينتجها التطبيق. يمكن أن تكون المقاييس تقنية بحتة (على سبيل المثال ، مقدار ذاكرة الوصول العشوائي المستهلكة) والعمل (على سبيل المثال ، الطلبات المكتملة).
شريحة المقاييس في حد ذاتها ليست دائمًا مثيرة للاهتمام ومؤشرات في الوقت الحالي. تنشأ أسئلة أساسية حول جمع هذه المقاييس وتخزينها وعرضها.
يصبح الموقف مع الحاجة إلى المقاييس وطريقة معالجتها أكثر حدة عند استخدام نهج الخدمة ويتم دعم تطبيق واحد ، من وجهة نظر المستخدم ، من خلال تشغيل العديد من الخدمات المتفاعلة. أضف نشر السحابة إلى ذلك واحصد الفلفل الحار .
عن ماذا يتكلم
المشروع الذي أشارك فيه يستخدم فقط الخدمات وينشر في AWS (Amazon Web Services). تم تصميم معظم الخدمات باستخدام Java 8+ و Spring Boot و Docker. المحاضرة في Luxoft IT Sreda # 7 وهذه المقالة نمت من احتياجات وأهداف المشروع.
هدفي هو إلقاء نظرة على الجانب العملي لجمع مقاييس التطبيق باستخدام Spring Boot وتصديرها إلى AWS CloudWatch . سيكون هذا ، في الواقع ، دليلًا تفصيليًا مع تفسيرات وتحليل للفروق الدقيقة والأشكال المحتملة.
عندما نتحدث عن حل مشكلة عملية ، من المهم فهم أعراضها من أجل مقارنتها بالبيئة الحالية. هل من الممكن تطبيق ما نتحدث عنه واحد لواحد أو إذا كان التكيف مطلوبًا ، مزيد من البحث.
دعنا نلقي نظرة على ما يتكون منه سياقنا الحالي:
- كمعطى ، يعتمد تطبيقنا أو خدمتنا على Spring Boot. بصفتك منشئ مافن ، جافا 8+
- عامل ميناء. ومع ذلك ، فإن استخدامه ليس حرجًا. من المهم أن يعمل كل شيء في تطبيق يعمل في عامل الإرساء أيضًا
- AWS EC2 هي بنيتنا الأساسية حيث يتم تشغيل التطبيق. إنها في جوهرها آلة افتراضية داخل AWS.
- AWS CloudWatch هو نظام مراقبة عبارة عن لوحة معلومات للبنية التحتية لـ AWS.
حذاء الربيع
دعنا ننتقل إلى SpringBoot وميزاته التي يمكن أن تساعدنا. أول وأهم شيء في الترسانة هو المحرك . تسمح لك هذه الوحدة بالنظر داخل تطبيق قيد التشغيل وتخصيص سلوكه إلى حد ما. على سبيل المثال:
- Health check:
- , , runtime.
- ,
- , , : , , GC.
- ...
مثل العديد من مكونات الزنبرك ، فإن المشغل يشبه المُنشئ ويمكن تخصيصه وتوسيعه وضبطه. يمكنك البدء في الدراسة من هنا .
من المجموعة بأكملها ، نحن مهتمون حاليًا بالمقاييس. المشغل والمقاييس على وجه الخصوص ليست قابلة للتوسعة فحسب ، بل تم تكوينها مسبقًا أيضًا ، لذلك لا يوجد سوى بضع عشرات من المقاييس المتاحة خارج الصندوق. بالطبع ، يمكنك تسجيل المقاييس الخاصة بك. إذا كانت وحدة الويب متصلة بالمشروع ، فيمكن الحصول على المقاييس عن طريق الاتصال
endpoint /metrics
.
يتم تنفيذ جمع المقاييس وتوفيرها من خلال مكتبة الميكرومتر ، وهي نتاج Pivotal(الآن جزء من VMware) ، نفس الشيء الذي يقوم بتطوير Spring. يتم تسويق الميكرومتر كواجهة مستقلة عن البائع لتصدير مقاييس تطبيق Java.
سيتطلب المشغل المبدئ التالي للاتصال:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
سحابة الربيع
بعد ذلك ، نحتاج إلى وحدة نمطية من Spring Cloud ، وهي
spring-cloud-starter-aws
.
كل وحدة من عائلة Spring Cloud لها إصدار خاص بها وسيكون من الصحيح استخدام ليس إصدارًا محددًا من الوحدة ، ولكن BOM
spring-cloud-dependencies
لإصدار معين (تدريب الإصدار) ، حيث يتم جمع الإصدارات المتوافقة من الوحدات النمطية. في وقت كتابة هذا التقرير ، هذا هو Hoxton.RELEASE.
بالإضافة إلى التكوينات التلقائية اللذيذة للعمل مع AWS
spring-cloud-starter-aws
، باعتبارها تبعية متعدية ، فإنها تعطي aws-java-sdk
.
في قسم "إدارة التبعية" ، ضع
<dependencyManagement>
...
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
...
</dependencyManagement>
واعتمادا على:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-aws</artifactId>
</dependency>
سجل ميكرومتر
لدينا الآن ميكرومتر في Spring Actuator و
aws-java-sdk
. من خارج الصندوق ، لا يعرف الميكرومتر كيفية تصدير البيانات إلى AWS CloudWatch ، وهذا يتطلب تنفيذًا مناسبًا لـ MeterRegestry ، وهو تجريد ميكرومتر لجمع المقاييس. الافتراضي هو SimpleMeterRegistry ، الذي يخزن البيانات في الذاكرة. التنفيذ المطلوب مرتبط مع micrometer-registry-cloudwatch
. في وقت كتابة هذا التقرير ، الإصدار الحالي هو 1.3.5.
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-cloudwatch</artifactId>
<version>1.3.5</version>
</dependency>
يبدو ملف pom.xml النهائي ، في حالتنا ، كما يلي: github.com/MrArtemAA/blog-demos/blob/master/export-metrics-to-cloudwatch/pom.xml
app.properties
دعنا ننتقل إلى إعداد خصائص التطبيق ، والتي تلعب في حالتنا دورًا مهمًا:
1
management.metrics.export.cloudwatch.namespace
: تحتاج إلى تحديد مساحة الاسم التي سيتم حفظ المقاييس تحتها في CloudWatch. لان في المقياس نفسه ، لا توجد معلومات من أي مثيل للتطبيق جاءت البيانات ، ستحدد مساحة الاسم فقط مقاييس مثيل معين. خلافًا لذلك ، إذا حددت مساحة اسم واحدة لعدة حالات ، فسيتم خلط بيانات المقاييس وليس من الواضح من أين أتت.
2
management.metrics.export.cloudwatch.batch-size
.: مطلوب تحديد قيمة خاصية حجم الدُفعة صراحةً إلى 20. ما هي هذه المعلمة ولماذا بالضبط 20؟ يتم إرسال المقاييس إلى عملاء Amazon CloudWatch بشكل غير متزامن ، على دفعات من 20 (هذا هو حد AWS) في وقت واحد.
3
cloud.aws.stack.auto=false
.: تحتاج إلى تعطيل الاكتشاف التلقائي لمكدس AWS CloudFormationمنذ هو الافتراضي = صحيح. هذه الخاصية مسؤولة عن ما إذا كان التطبيق سيحاول الحصول تلقائيًا على اسم المكدس لتكوين التطبيق لبيئة السحابة (في نموذج البنية التحتية كرمز). عند النشر على EC2 ، كما هو الحال في جهاز افتراضي عادي ، لا تكون هذه المعلومات متاحة.
من المهم أن نفهم أن أي معلومات ستحاول AWS SDK الحصول عليها بمفردها دون تكوين إضافي ، ستأخذها [المكتبة] من بيانات EC2 الوصفية . للحصول على هذه المعلومات ، توجد نقطة نهاية خدمة خاصة ، حيث يتم إجراء المكالمة.
استخلاص المعلومات
حجم الدفعة
دعنا نعود إلى الخاصية
management.metrics.export.cloudwatch.batch-size
والحاجة إلى جعلها تساوي 20. يبدو أن كل هذا يمكن القيام به على مستوى المكتبات المقابلة التي تعمل مع AWS. في الواقع ، micrometer-registry-cloudwatch
هناك واجهة ذات CloudWatchConfig default
طريقة تتحقق بشكل صحيح من القيمة وتقوم بإلقاء استثناء عندما تتجاوز 20. ومع ذلك ، إذا نظرت org.springframework.cloud.aws.autoconfigure.metrics.CloudWatchExportAutoConfiguration
، فسنرى أن التكوين تم باستخدامorg.springframework.cloud.aws.autoconfigure.metrics.CloudWatchPropertiesConfigAdapter:
@Bean
@ConditionalOnMissingBean
public CloudWatchConfig cloudWatchConfig(CloudWatchProperties cloudWatchProperties) {
return new CloudWatchPropertiesConfigAdapter(cloudWatchProperties);
}
المحول ، بدوره ، يلغي
batchSize()
مثل
@Override
public int batchSize() {
return get(CloudWatchProperties::getBatchSize, CloudWatchConfig.super::batchSize);
}
هذا يعني أنه إذا
CloudWatchProperties
تم تحديد خاصية ، فسيتم أخذها من هناك. لا يحتوي على عمليات التحقق اللازمة ، وإذا لم يتم تعيين الخاصية بشكل صريح ، فستكون القيمة الافتراضية 10000.
طلبات AWS
لا يمكن للتطبيق (الخدمة) تقديم طلبات لخدمات أمازون فقط. يجب أن تحتوي [الطلبات] على بيانات الاعتماد. للقيام بذلك ، تحتوي AWS SDK على سلسلة موفري بيانات الاعتماد ، وهو أمر موصى به. من بين هؤلاء المزودين ، ملف تعريف المثيل ، والذي يمكنه تلقي البيانات بناءً على بيانات تعريف EC2. لكي ينجح هذا ، تحتاج إلى التأكد من أن الدور مرتبط بـ EC2 .
يجب أن يمنح الدور أذونات لتقديم طلبات إلى CloudWatch وأن يكون متاحًا لـ EC2. يمكن تحديد الدور عند إنشاء مثيل EC2 جديد أو إرفاقه بمثيل موجود. يتم تطبيق الدور على الطاير.
المقاييس تعطيل
بالنسبة إلى بيئة البناء أو الاختبار المحلية ، قد يكون تصدير المقاييس أمرًا مبالغًا فيه.
management.metrics.export.cloudwatch.enabled=false
يتيح لك تعيين الخاصية تعطيل تصدير المقاييس إلى CloudWatch ، بينما سيتم إجراء مجموعة المقاييس ، وإذا كانت لديك وحدة ويب متصلة ، endpoint /metrics
فستظل متاحة.
يقوم الميكرومتر بجمع وتقديم مجموعة متنوعة من المقاييس. إذا لم تكن هناك حاجة إلى بعضها ، يمكنك تعطيلها. يمكنك تعطيل كل من الفردي والفئات بأكملها. لذلك ، على سبيل المثال ، ستعمل الخاصية على تعطيل جميع المقاييس التي يبدأ معرفها بـ . يرجى ملاحظة: لن يتم جمع المقاييس المعطلة على الإطلاق.
management.metrics.enable.some.metric=false
some.metric
تشغيل كل AWS
تنتظرك مفاجأة أخرى إذا حاولت تشغيل التطبيق بالحد الأدنى من الإعدادات المطلوبة لكل AWS. للعمل ، البيانات اللازمة للمنطقة حيث يتم تشغيل التطبيق. كما نعلم بالفعل ، كل ما لم يتم ذكره صراحةً ، ستحاول AWS SDK الحصول عليه من البيانات الوصفية ... وهي غير موجودة. لذلك ، فإننا نشير صراحة إلى المنطقة المطلوبة من خلال الخاصية
cloud.aws.region.static=us-east-2
. كما هو الحال مع اسم المكدس (الخاصية cloud.aws.stack.auto
) ، هناك خاصية cloud.aws.region.auto
تساوي true
افتراضيًا. لكن مجرد تعيين القيمة على خطأ لن يساعدنا منذ ذلك الحين قيمة المنطقة مطلوبة.
أيضًا ، كما نتذكر ، تتطلب الطلبات إلى AWS بيانات اعتماد ، لذلك إذا كنت بحاجة إلى إرسال مقاييس إلى CloudWatch (أو تقديم طلبات أخرى إلى AWS) ، فيجب عليك تحديد معلمات بيانات الاعتماد صراحةًعبر ، على سبيل المثال ، خصائص التطبيق أو متغيرات البيئة.
يبدو المرور عبر خصائص التطبيق كما يلي:
cloud.aws.credentials.access-key=YOUR_ACCESS_KEY
cloud.aws.credentials.secret-key=YOUR_SECRET_KEY
النتيجة
كما أعتقد أنك قد لاحظت ، فإن تشغيل المخطط بالكامل ونقل المقاييس من التطبيق إلى CloudWatch ليس بهذه الصعوبة: فقد استغرق الأمر 3 تبعيات و 3 خصائص .
أهم شيء في التفاصيل. تحاول المكتبات (أطر العمل) مثل Spring و AWS SDK تسهيل الحياة والقيام بكل العمل من أجلنا قدر الإمكان ، ولكن في الوقت نفسه ، يمكن أن تؤدي أي خطوة جانباً إلى ظهور نظام Stacktrace ، ومحاولات فهم سبب عدم انتقال المقاييس إلى أي مكان ، ولماذا لا يبدأ التطبيق على الإطلاق وكيفية اصلاحها. آمل أن يسهّل القسم الذي يحتوي على تفاصيل الفروق الدقيقة ووصفًا لبعض تفاصيل كيفية عمل خدمات EC2 و CloudWatch فهمك لما يحدث.
إذا تحدثنا عن استخدام CloudWatch نفسه ، إذن ، في رأيي ، يعد هذا اختيارًا طبيعيًا إلى حد ما عند استخدام بنية AWS الأساسية.
المقاييس هي عيون وآذان تطبيقنا ، لكن هذا لا ينفي حقيقة أنك بحاجة إلى فهم كيفية جمع المقاييس وحسابها وعرضها. ما نوع البيانات التي ستراها في مخططاتك. ستكون هذه المشكلة حادة بشكل خاص في حالة حدوث حالات شاذة وتحليل الحوادث. إذا تحدثنا عن مكتبة الميكرومتر ، يجدر الرجوع إلى الوثائق ، فهناك ، على سبيل المثال ، موصوفة ببعض التفاصيل حول أنواع العدادات (المتر).
الروابط
يتيح لنا تبادل الخبرات إتقان الأساليب والأدوات والتقنيات المختلفة بسرعة والمضي قدمًا. لذلك ، لا يمكنني تجاهل المواد الأكثر فائدة حول هذا الموضوع ، والتي لم تتم الإشارة إليها خلال المقالة:
Spring Boot: Metrics With Micrometer و AWS CloudWatch
Spring Cloud. استخدام خدمات أمازون ويب. التكوين التلقائي لـ Spring Boot
Spring in Action 5 ، Craig Walls ، Manning
Popular حول Amazon Web Services
يمكن العثور على المشروع النهائي على GitHub .