מדריך מהיר למיקרומטר

1. הקדמה

מִיקרוֹמֶטֶר מספק חזית פשוטה על לקוחות המכשור למספר מערכות ניטור פופולריות. נכון לעכשיו, הוא תומך במערכות הניטור הבאות: אטלס, Datadog, Graphite, Ganglia, Influx, JMX ו- Prometheus.

במאמר זה נציג את השימוש הבסיסי במיקרומטר ושילובו עם אביב.

לשם הפשטות, ניקח את אטלס המיקרומטר כדוגמה כדי להדגים את רוב מקרי השימוש שלנו.

2. תלות של Maven

ראשית, בואו נוסיף את התלות הבאה ל- pom.xml:

 io.micrometer micrometer-registry-atlas 0.12.0.RELEASE 

הגרסה האחרונה תוכל למצוא כאן.

3. מד רישום

במיקרומטר, א מד רישום הוא רכיב הליבה המשמש לרישום מטרים. אנו יכולים לחזור על הרישום ולקדם את המדדים של כל מטר, כדי ליצור סדרת זמן בגב האחורי עם שילובי מדדים וערכי המימד שלהם.

הצורה הפשוטה ביותר של הרישום היא SimpleMeterRegistry. אך ברוב המקרים עלינו להשתמש ב- מד רישום תוכנן במפורש למערכת הניטור שלנו; עבור אטלס, זה AtlasMeterRegistry.

CompositeMeterRegistry מאפשר להוסיף מספר רישומים. הוא מספק פתרון לפרסום מדדי יישומים למערכות ניטור נתמכות שונות בו זמנית.

אנחנו יכולים להוסיף כל אחד מהם מד רישום נדרש להעלאת הנתונים למספר פלטפורמות:

CompositeMeterRegistry compositeRegistry = CompositeMeterRegistry חדש (); SimpleMeterRegistry oneSimpleMeter = SimpleMeterRegistry חדש (); AtlasMeterRegistry atlasMeterRegistry = AtlasMeterRegistry חדש (atlasConfig, Clock.SYSTEM); compositeRegistry.add (oneSimpleMeter); compositeRegistry.add (atlasMeterRegistry);

יש תמיכה רישומית גלובלית סטטית במיקרומטר: מדדים.global רישום. כמו כן, קבוצה של בונים סטטיים המבוססים על רישום עולמי זה מסופקת כדי ליצור מטרים פנימיים מדדים:

@ מבט בטל פומבי שניתן GlobalRegistry_whenIncrementAnywhere_thenCounted () {class CountedObject {private CountedObject () {Metrics.counter ("objects.instance"). תוספת (1.0); }} Metrics.addRegistry (SimpleMeterRegistry חדש ()); Metrics.counter ("objects.instance"). תוספת (); CountedObject חדש (); CounterOptional = Metrics.globalRegistry .find ("objects.instance") אופציונלי. Counter (); assertTrue (counterOptional.isPresent ()); assertTrue (counterOptional.get (). count () == 2.0); }

4. תגים ו מטר

4.1. תגים

מזהה של א מטר מורכב משם ותגים. מוצע כי עלינו לפעול על פי מוסכמות למתן שמות המפרידה בין מילים לנקודה, כדי להבטיח ניידות של שמות מדדים במערכות ניטור מרובות.

מונה נגד = registry.counter ("page.visitors", "age", "20s");

תגים יכול לשמש לחיתוך המדד לצורך חשיבה על הערכים. בקוד לעיל, page.visitors הוא שם המונה, עם גיל = 20s כתגית שלה. במקרה זה, הדלפק נועד לספור את המבקרים בדף בגיל 20 עד 30.

במערכת גדולה נוכל להוסיף תגים נפוצים לרישום, ולומר שהמדדים הם מאזור מסוים:

registry.config (). commonTags ("אזור", "ua-מזרח");

4.2. דֶלְפֵּק

א דֶלְפֵּק מדווח רק על ספירה על מאפיין מוגדר של יישום. אנו יכולים לבנות דלפק מותאם אישית עם הבנאי השוטף או בשיטת העוזר של כל אחד מהם מטרי רישום:

מונה נגד = מונה. Builder ("מופע"). תיאור ("מציין ספירת מופעים של האובייקט"). תגיות ("dev", "performance") .register (registry); counter.increment (2.0); assertTrue (counter.count () == 2); counter.increment (-1); assertTrue (counter.count () == 2);

כפי שניתן לראות מהקטע שלמעלה, ניסינו להקטין את המונה באחד אך אנחנו יכולים רק להגדיל את הדלפק בצורה מונוטונית בכמות חיובית קבועה.

4.3. טיימרים

כדי למדוד איחורים או תדירות אירועים במערכת שלנו, נוכל להשתמש בהם טיימרים. א שָׁעוֹן עֶצֶר ידווח לפחות על סך הזמן ועל ספירת האירועים בסדרות הזמן הספציפיות.

לדוגמה, אנו יכולים להקליט אירוע יישום שעשוי להימשך מספר שניות:

SimpleMeterRegistry הרישום = SimpleMeterRegistry חדש (); טיימר טיימר = registry.timer ("app.event"); timer.record (() -> {try {TimeUnit.MILLISECONDS.sleep (1500);} catch (InterruptedException ignored) {}}); timer.record (3000, MILLISECONDS); assertTrue (2 == timer.count ()); assertTrue (4510> timer.totalTime (MILLISECONDS) && 4500 <= timer.totalTime (MILLISECONDS));

כדי להקליט אירועים ארוכים, אנו משתמשים בהם LongTaskTimer:

SimpleMeterRegistry registry = SimpleMeterRegistry חדש (); LongTaskTimer longTaskTimer = LongTaskTimer. Builder ("3rdPartyService") .register (הרישום); ארוך currentTaskId = longTaskTimer.start (); נסה את {TimeUnit.SECONDS.sleep (2); } לתפוס (התעלם מ- InterruptedException) {} long timeElapsed = longTaskTimer.stop (currentTaskId); assertTrue (timeElapsed / (int) 1e9 == 2);

4.4. מַד

מד מראה את הערך הנוכחי של מטר.

שונה ממטר אחר, מדדים צריך לדווח על נתונים רק כאשר הם נצפים. מדדים יכול להיות שימושי בעת ניטור נתונים סטטיסטיים של מטמון, אוספים וכו ':

SimpleMeterRegistry registry = SimpleMeterRegistry חדש (); רשימת רשימה = ArrayList חדש (4); מד מד = מד. Builder ("cache.size", רשימה, רשימה :: גודל) .register (הרישום); assertTrue (gauge.value () == 0.0); list.add ("1"); assertTrue (gauge.value () == 1.0);

4.5. הפצה סיכום

חלוקת אירועים וסיכום פשוט ניתנת על ידי הפצה סיכום:

SimpleMeterRegistry registry = SimpleMeterRegistry חדש (); DistributionSummary distributionSummary = DistributionSummary .builder ("request.size") .baseUnit ("בתים") .register (הרישום); distributionSummary.record (3); distributionSummary.record (4); distributionSummary.record (5); assertTrue (3 == distributionSummary.count ()); assertTrue (12 == distributionSummary.totalAmount ());

יתר על כך, הפצה סיכום ו טיימרים יכול להיות מועשר בכמויות:

SimpleMeterRegistry registry = SimpleMeterRegistry חדש (); טיימר טיימר = Timer.builder ("test.timer") .quantiles (WindowSketchQuantiles .quantiles (0.3, 0.5, 0.95) .create ()) .register (registry);

בקטע שלמעלה, שלושה מדדים עם תגים כמותית = 0.3, כמותית = 0.5 ו כמותית = 0.95 יהיה זמין ברישום, המציין את הערכים שמתחתם 95%, 50% ו -30% מהתצפיות נופלים, בהתאמה.

כדי לראות את הכמויות האלה בפעולה, בואו נוסיף את הרשומות הבאות:

timer.record (2, TimeUnit.SECONDS); timer.record (2, TimeUnit.SECONDS); timer.record (3, TimeUnit.SECONDS); timer.record (4, TimeUnit.SECONDS); timer.record (8, TimeUnit.SECONDS); timer.record (13, TimeUnit.SECONDS);

אז נוכל לאמת על ידי חילוץ ערכים בשלושת הכמויות האלה מדדים:

רשימת quantileGauges = registry.getMeters (). Stream () .filter (m -> m.getType (). Name (). Equals ("Gauge")) .map (meter -> (Gauge) meter) .collect (Collectors) .למנות()); assertTrue (3 == quantileGauges.size ()); מפה quantileMap = extractTagValueMap (הרישום, Type.Gauge, 1e9); assertThat (quantileMap, allOf (hasEntry ("quantile = 0.3", 2), hasEntry ("quantile = 0.5", 3), hasEntry ("quantile = 0.95", 8)));

חוץ מזה, מיקרומטר תומך גם בהיסטוגרמות:

DistributionSummary היסט = DistributionSummary .builder ("סיכום"). היסטוגרמה (Histogram.linear (0, 10, 5)). רישום (רישום);

בדומה לכמויות, לאחר הוספת מספר רשומות, אנו יכולים לראות שההיסטוגרמה מטפלת בחישוב די טוב:

היסטוגרמות מפה = extractTagValueMap (הרישום, Type.Counter, 1.0); assertThat (היסטוגרמות, allOf (hasEntry ("bucket = 0.0", 0), hasEntry ("bucket = 10.0", 2), hasEntry ("bucket = 20.0", 2), hasEntry ("bucket = 30.0", 1), hasEntry ("bucket = 40.0", 1), hasEntry ("bucket = Infinity", 0)));

באופן כללי, היסטוגרמות יכולות להמחיש השוואה ישירה בדליים נפרדים. ניתן גם לשנות את קנה המידה של היסטוגרמות, וזה די שימושי לניתוח זמן התגובה של שירות ה- backend:

SimpleMeterRegistry הרישום = SimpleMeterRegistry חדש (); טיימר טיימר = טיימר. Builder ("טיימר"). היסטוגרמה (Histogram.linearTime (TimeUnit.MILLISECONDS, 0, 200, 3)) .register (הרישום); // ... assertThat (היסטוגרמות, allOf (hasEntry ("bucket = 0.0", 0), hasEntry ("bucket = 2.0E8", 1), hasEntry ("bucket = 4.0E8", 1), hasEntry ("bucket = אינסוף ", 3)));

5. קלסרים

מיקרומטר כולל מספר קלסרים מובנים לניטור ה- JVM, מטמונים, שירות ExecutorService ושירותי כריתת עצים.

כשמדובר ב- JVM ובניטור המערכת, אנו יכולים לפקח על מדדי מטעני הכיתה (ClassLoaderMetrics), מאגר זיכרון JVM (JvmMemoryMetrics) ומדדי GC (JvmGcMetrics), חוט ומעבד (JvmThreadMetrics, ProcessorMetrics).

ניטור מטמון (נכון לעכשיו, תומכים רק בגויאבה, EhCache, Hazelcast וקפאין) על ידי מכשור עם GuavaCacheMetrics, EhCache2Metrics, HazelcastCacheMetrics, ו קפאין מטמון מדדים. וכדי לפקח על שירות ההתחברות, אנו יכולים לאגד LogbackMetrics לכל רישום תקף:

LogbackMetrics חדש (). bind (הרישום);

השימוש בקלסרים לעיל דומה למדי ל- LogbackMetrics וכולם פשוטים למדי, כך שלא נצלול לפרטים נוספים כאן.

6. שילוב אביב

Spring Boot Actuator מספק ניהול תלות ותצורה אוטומטית עבור מיקרומטר. כעת הוא נתמך באביב אתחול 2.0 / 1.x ובאביב מסגרת 5.0 / 4.x.

נצטרך את התלות הבאה (הגרסה האחרונה תוכל למצוא כאן):

 io.micrometer micrometer-spring-legacy 0.12.0. שחרור 

ללא כל שינוי נוסף בקוד הקיים, אפשרנו תמיכה באביב באמצעות מיקרומטר. מדדי זיכרון JVM ביישום Spring שלנו יירשמו באופן אוטומטי ברישום העולמי ויפורסמו לנקודת הסיום של אטלס ברירת המחדל: // localhost: 7101 / api / v1 / publish.

ישנם מספר מאפיינים הניתנים להגדרה הזמינים לבקרת מדדי ייצוא התנהגות, החל מ spring.metrics.atlas. *. חשבון AtlasConfig כדי לראות רשימה מלאה של מאפייני תצורה לפרסום אטלס.

אם עלינו לאגד ערכים נוספים, רק הוסף אותם כ- @אפונה להקשר היישום.

תגיד שאנחנו צריכים את JvmThreadMetrics:

@Bean JvmThreadMetrics threadMetrics () {החזר JvmThreadMetrics חדש (); }

באשר לניטור אינטרנט, הוא מוגדר אוטומטית לכל נקודת קצה ביישום שלנו, אך עם זאת לניהול באמצעות מאפיין תצורה: spring.metrics.web.autoTimeServerRequests.

יישום ברירת המחדל מספק ארבעה ממדים של מדדים לנקודות קצה: שיטת בקשת HTTP, קוד תגובת HTTP, URI של נקודות קצה ומידע חריג.

כשמשיבים לבקשות, מדדים הנוגעים לשיטת הבקשה (לקבל, הודעהוכו ') יפורסם באטלס.

בעזרת Atlas Graph API, אנו יכולים ליצור גרף להשוואה בין זמן התגובה לשיטות שונות:

כברירת מחדל, קודי תגובה של פי 20, פי 30, 40x, 50x ידווח גם:

אנו יכולים גם להשוות URIs שונים:

או בדוק מדדי חריגים:

שים לב שאנחנו יכולים גם להשתמש @ מתוזמן במחלקת הבקר או בשיטות נקודת קצה ספציפיות להתאמה אישית של תגים, משימה ארוכה, כמות ואחוזים של המדדים:

@RestController @Timed ("אנשים") מחלקה ציבורית PeopleController {@GetMapping ("/ people") @Timed (value = "people.all", longTask = true) רשימת רשימות ציבורית רשימת אנשים () {// ...}}

בהתבסס על הקוד לעיל, אנו יכולים לראות את התגים הבאים על ידי בדיקת נקודת הקצה של אטלס // localhost: 7101 / api / v1 / tags / name:

["אנשים", "אנשים.כל", "jvmBufferCount", ...]

מיקרומטר עובד גם במסגרת רשת הפונקציות שהוצגה באביב אתחול 2.0. ניתן להפעיל מדדים על ידי סינון ה- RouterFunction:

מדדי RouterFunctionMetrics = RouterFunctionMetrics חדשים (רישום); RouterFunctions.route (...) .filter (metrics.timer ("server.requests"));

ניתן לאסוף מדדים ממקור הנתונים ומשימות מתוזמנות. לפרטים נוספים, עיין בתיעוד הרשמי.

7. מסקנה

במאמר זה הצגנו את חזית המדדים מיקרומטר. על ידי הפשטה ותמיכה של מערכות ניטור מרובות תחת סמנטיקה נפוצה, הכלי הופך את המעבר בין פלטפורמות ניטור שונות למדי קל.

כמו תמיד, ניתן למצוא את קוד ההטמעה המלא של מאמר זה ב- Github.


$config[zx-auto] not found$config[zx-overlay] not found