Metrics: counter, gauge, histogram ও cardinality
Metrics, Dashboards, and Cardinality
এই পাঠের সূচিপত্র
এই পাঠে যা শিখবেন
- Counter, gauge ও histogram আলাদা করা
- Label cardinality নিয়ন্ত্রণ করা
- Dashboard-এ user outcome এবং saturation রাখা
সমস্যা দিয়ে শুরু
Checkout-এর প্রতিটি order ID metric label করা হয়েছে। কিছু দিন পরে monitoring storage দ্রুত বেড়েছে এবং query ধীর। অন্যদিকে average response time ভালো হলেও কিছু user দশ সেকেন্ড অপেক্ষা করছেন। Metrics compact numeric summary দেয়, কিন্তু ভুল dimension এবং aggregation সেই summary-কে expensive ও misleading করতে পারে। Event detail log-এ এবং bounded measurement metric-এ রাখার ভূমিকা বুঝতে হবে।
সহজ করে বুঝি
Counter cumulative event count; restart-এ reset হতে পারে, rate calculation তা বিবেচনা করে। Gauge বর্তমান মান যেমন queue depth। Histogram observations bucket-এ ভাগ করে latency distribution ও threshold success দেখতে সাহায্য করে। Label-এর প্রতিটি distinct combination নতুন time series তৈরি করে। Route template bounded, raw URL বা user_id সাধারণত unbounded। Units নাম ও documentation-এ স্পষ্ট রাখুন।
পরিচিত একটি উপমা
গাড়ির dashboard speed, fuel ও temperature-এর compact মাপ দেখায়। প্রতিটি যাত্রীর নাম দিয়ে আলাদা speedometer বানায় না। Incident-এর বিস্তারিত diary আলাদা; monitoring-এর কাজ system trend এবং immediate risk সহজে দেখানো।
নকশাটি দেখুন
Diagram লোড হচ্ছে…
Diagram-এর text flow দেখুন
flowchart LR A[Laravel request and worker] --> C[Bounded counters] A --> H[Duration histogram] A --> G[Queue depth gauge] C --> M[Metrics backend] H --> M G --> M M --> D[Dashboard and SLO alerts]
Request ও worker events count এবং duration observations দেয়। Queue collector depth gauge দেয়। Backend query window অনুযায়ী rate, distribution ও saturation দেখায়। Dashboard-এ traffic, errors, latency এবং constrained resources পাশাপাশি রাখুন। Metric labels-এ order ID না দিয়ে logs/traces-এ detailed correlation রাখুন। Missing scrape বা stale gauge zero load নয়।
PHP ও Laravel-এ প্রয়োগ
Laravel console analysis fragment; samples শুধুই illustrative measurements, production histogram exporter নয়। Actual export-এর জন্য maintained PHP/OpenTelemetry বা Prometheus-compatible instrumentation বেছে নিন। এখানে seconds unit এবং threshold fraction দেখানো হয়েছে; কোনো fake framework metrics facade ব্যবহার করা হয়নি।
$durationsSeconds = [0.08, 0.12, 0.2, 1.8, 0.09];
$threshold = 0.5;
$good = count(array_filter(
$durationsSeconds,
fn (float $duration): bool => $duration <= $threshold,
));
$fractionGood = $good / count($durationsSeconds);সুবিধা, সীমাবদ্ধতা ও trade-off
Metrics trend ও alerts-এর জন্য efficient, কিন্তু individual failure-এর সব context রাখে না। More labels flexibility দেয়, cardinality ও query cost বাড়ায়। Histogram bucket ভুল হলে গুরুত্বপূর্ণ latency boundary অদৃশ্য হয়। Client-side percentile summary বিভিন্ন replica-তে সহজে aggregate নাও হতে পারে। Instrumentation choice backend-এর aggregation contract বুঝে করুন।
সাধারণ ভুল
- user_id, order_id বা raw URL metric label করা।
- Average দিয়ে tail latency সম্পূর্ণ ব্যাখ্যা করা।
- Counter-এর raw cumulative value-কে request rate বলা।
আরও একটু গভীরে
Cardinality আনুমানিক label value counts-এর product ধরে বাড়তে পারে; বাস্তব observed combinations দেখতে হবে। Example route labels /orders/{id} ব্যবহার করুন, /orders/123 নয়। Release label অনেক historical series রাখলে retention-এর প্রভাব হিসাব করুন। Collector overload নিজেও data gap তৈরি করে। Dashboard-এর প্রতিটি panel-এর unit, time window ও query source লিখলে incident-এ ভুল তুলনা কমে।
মনে রাখুন
Bounded labels ও সঠিক units-সহ metrics trend দেখায়; distribution, saturation ও data gap একসঙ্গে দেখতে হয়।
নিজে চেষ্টা করুন
Laravel shop-এর দশটি metric লিখুন। প্রতিটির type, unit এবং bounded labels নির্ধারণ করুন। order_id label সরালে incident investigation কীভাবে logs/traces দিয়ে করবেন ব্যাখ্যা করুন।
নিজের বোঝা যাচাই করুন
1. Counter কী?
Cumulative count যা process restart-এ reset হতে পারে। Rate query-তে reset-aware behavior দরকার।
2. Gauge কী?
বর্তমান মান যেমন active jobs বা queue depth। Missing measurement-কে zero ধরে নেওয়া ভুল।
3. Histogram কেন?
Latency distribution ও threshold success বোঝায়। উপযুক্ত bucket এবং backend aggregation দরকার।
4. Cardinality কেন ব্যয়বহুল?
প্রতিটি label combination series তৈরি করে। Unbounded identifiers memory, storage ও query cost বাড়ায়।
5. Metrics কি logs বদলে দেয়?
না। Metrics aggregate signal, logs detailed events। Trace request path দেয়; তিনটির কাজ পরিপূরক।
আরও পড়ুন
এই পাঠের কুইজ
এই পাঠ থেকে ২টি প্রশ্ন। উত্তর দিয়ে ব্যাখ্যা দেখুন; অধ্যায়ের কুইজ আলাদাভাবে দিতে হবে।
এই পাঠের ২টি প্রশ্নের উত্তর দিন। পাস করতে দুটিই সঠিক হতে হবে।
জমা দেওয়ার পর সঠিক উত্তর ও ব্যাখ্যা দেখবেন। ফলাফল এই ব্রাউজারে সংরক্ষিত থাকবে। অনুশীলনের ফল অধ্যায় সম্পন্নের হিসাবে যোগ হয় না।
অগ্রগতি এই ব্রাউজারে সংরক্ষিত থাকে। শুধু পাঠ খুললে সম্পন্ন হয় না।