AWS SDK CloudWatch Examples: Custom Metrics, Alarms आणि Logs Insights (Python, PHP, Node.js)
CloudWatch म्हणजे AWS चा health dashboard. Python, PHP आणि Node.js मधून आपले business metrics पाठवू, परत वाचू, team ला email करणारा alarm लावू, logs लिहू आणि Logs Insights ने शोधू. Example: Barcelona मधला Mateo आणि बंगळुरूचा Ishaan late orders बघणाऱ्या food-delivery app वर.
या chapter मध्ये तुम्ही काय शिकाल
- Custom metrics publish
- Statistics वाचा
- Alarm बनवा
- Logs लिहा व filter
- Logs Insights queries
1. मोठं चित्र: car dashboard
हे का लागतं?
Car सतत speed व fuel दाखवते, oil कमी झालं की लाल light लागतो. Metrics = gauges, alarms = warning lights, logs = काही बिघडल्यावर वाचायची trip diary.
हे काय आहे?
Metric = Namespace + MetricName + Dimensions. PutMetricData points लिहितो; GetMetricData वाचतो. PutMetricAlarm statistic वर लक्ष ठेवतो. Logs log groups व streams मध्ये.
कसं करायचं (step by step)
2. Custom metrics publish
हे का लागतं?
Mateo ला दर मिनिटाला city नुसार किती orders उशिरा येतात ते पाहायचं आहे.
हे काय आहे?
स्वतःचा namespace, Unit, आणि split साठी Dimensions. Dimension values कमी प्रकारच्या ठेवा (city, order id नाही).
कसं करायचं (step by step)
- Python.
import boto3
cw = boto3.client("cloudwatch", region_name="eu-south-2")
cw.put_metric_data(Namespace="FoodApp", MetricData=[
{"MetricName": "LateOrders", "Dimensions": [{"Name": "City", "Value": "Barcelona"}], "Value": 4, "Unit": "Count"},
{"MetricName": "DeliveryMinutes", "Dimensions": [{"Name": "City", "Value": "Barcelona"}], "Values": [28, 31, 45], "Unit": "None"}])
print("sent")
अपेक्षित output:
sent
- Node.js.
import { CloudWatchClient, PutMetricDataCommand } from "@aws-sdk/client-cloudwatch";
const cw = new CloudWatchClient({ region: "ap-south-1" });
await cw.send(new PutMetricDataCommand({ Namespace: "FoodApp", MetricData: [
{ MetricName: "LateOrders", Dimensions: [{ Name: "City", Value: "Bengaluru" }], Value: 9, Unit: "Count" }] }));
console.log("sent");
अपेक्षित output:
sent
- PHP.
<?php
require "vendor/autoload.php";
$cw = new Aws\CloudWatch\CloudWatchClient(["region" => "eu-west-2"]);
$cw->putMetricData(["Namespace" => "FoodApp", "MetricData" => [[
"MetricName" => "LateOrders", "Dimensions" => [["Name" => "City", "Value" => "London"]],
"Value" => 2, "Unit" => "Count"]]]);
echo "sent", PHP_EOL;
अपेक्षित output:
sent
- Verify: metric list.
aws cloudwatch list-metrics --namespace FoodApp --region ap-south-1 --query "Metrics[].Dimensions[0].Value" --output text
अपेक्षित output:
Bengaluru
3. Statistics वाचा
हे का लागतं?
Ishaan छोटा report बनवतो: गेल्या तासात दर 5 मिनिटांचे late orders.
हे काय आहे?
GetMetricData Stat व Period सह MetricDataQueries घेतो आणि Timestamps व Values arrays देतो.
कसं करायचं (step by step)
- Python.
from datetime import datetime, timedelta, timezone
now = datetime.now(timezone.utc)
r = cw.get_metric_data(StartTime=now - timedelta(hours=1), EndTime=now, MetricDataQueries=[{
"Id": "late", "MetricStat": {"Stat": "Sum", "Period": 300, "Metric": {
"Namespace": "FoodApp", "MetricName": "LateOrders",
"Dimensions": [{"Name": "City", "Value": "Barcelona"}]}}}])
print(sum(r["MetricDataResults"][0]["Values"]))
अपेक्षित output:
4.0
- Node.js.
import { GetMetricDataCommand } from "@aws-sdk/client-cloudwatch";
const end = new Date(), start = new Date(end - 3600e3);
const r = await cw.send(new GetMetricDataCommand({ StartTime: start, EndTime: end, MetricDataQueries: [{
Id: "late", MetricStat: { Stat: "Sum", Period: 300, Metric: { Namespace: "FoodApp", MetricName: "LateOrders",
Dimensions: [{ Name: "City", Value: "Bengaluru" }] } } }] }));
console.log(r.MetricDataResults[0].Values);
अपेक्षित output:
[ 9 ]
- PHP: metrics वर गणित.
<?php
$r = $cw->getMetricData(["StartTime" => strtotime("-1 hour"), "EndTime" => time(), "MetricDataQueries" => [
["Id" => "l", "ReturnData" => false, "MetricStat" => ["Stat" => "Sum", "Period" => 3600,
"Metric" => ["Namespace" => "FoodApp", "MetricName" => "LateOrders", "Dimensions" => [["Name" => "City", "Value" => "London"]]]]],
["Id" => "pct", "Expression" => "l * 100 / 50", "Label" => "late % of 50 orders"]]]);
echo $r["MetricDataResults"][0]["Values"][0], "%", PHP_EOL;
अपेक्षित output:
4%
- CLI ने verify.
aws cloudwatch get-metric-statistics --namespace FoodApp --metric-name LateOrders --dimensions Name=City,Value=Bengaluru --statistics Sum --period 3600 --start-time $(date -u -d "-1 hour" +%FT%TZ) --end-time $(date -u +%FT%TZ) --query "Datapoints[0].Sum"
अपेक्षित output:
9.0
4. Alarm बनवा
हे का लागतं?
बंगळुरूत 5 मिनिटांत 20 पेक्षा जास्त orders उशिरा झाल्या तर on-call team ला email जायला हवा.
हे काय आहे?
PutMetricAlarm threshold, period, evaluation periods आणि AlarmActions (SNS topic) ठरवतो. States: OK, ALARM, INSUFFICIENT_DATA.
कसं करायचं (step by step)
- Python.
cw.put_metric_alarm(AlarmName="late-orders-blr", Namespace="FoodApp", MetricName="LateOrders",
Dimensions=[{"Name": "City", "Value": "Bengaluru"}], Statistic="Sum", Period=300,
EvaluationPeriods=1, Threshold=20, ComparisonOperator="GreaterThanThreshold",
TreatMissingData="notBreaching",
AlarmActions=["arn:aws:sns:ap-south-1:123456789012:oncall"])
print("alarm ok")
अपेक्षित output:
alarm ok
- Node.js: email test साठी state force.
import { SetAlarmStateCommand } from "@aws-sdk/client-cloudwatch";
await cw.send(new SetAlarmStateCommand({ AlarmName: "late-orders-blr", StateValue: "ALARM", StateReason: "test" }));
console.log("forced");
अपेक्षित output:
forced (on-call gets an email)
- PHP: alarm state वाचा.
<?php
$cw = new Aws\CloudWatch\CloudWatchClient(["region" => "ap-south-1"]);
$a = $cw->describeAlarms(["AlarmNames" => ["late-orders-blr"]])["MetricAlarms"][0];
echo $a["StateValue"], " ", $a["Threshold"], PHP_EOL;
अपेक्षित output:
ALARM 20
- Verify: alarm history.
aws cloudwatch describe-alarm-history --alarm-name late-orders-blr --history-item-type StateUpdate --max-items 1 --query "AlarmHistoryItems[0].HistorySummary" --output text
अपेक्षित output:
Alarm updated from OK to ALARM
5. Logs आणि Logs Insights
हे का लागतं?
Paris मधला rider म्हणतो order PA-311 आली नाही; Mateo logs शोधतो.
हे काय आहे?
Group व stream बनवा, millisecond timestamps सह PutLogEvents, साध्या search साठी FilterLogEvents, Logs Insights साठी StartQuery/GetQueryResults.
कसं करायचं (step by step)
- Python: JSON log lines लिहा.
import json, time
logs = boto3.client("logs", region_name="eu-west-3")
logs.create_log_group(logGroupName="/foodapp/orders")
logs.create_log_stream(logGroupName="/foodapp/orders", logStreamName="api-1")
logs.put_log_events(logGroupName="/foodapp/orders", logStreamName="api-1", logEvents=[
{"timestamp": int(time.time() * 1000), "message": json.dumps({"order": "PA-311", "status": "picked", "total": "€23.40"})}])
print("logged")
अपेक्षित output:
logged
- Node.js: events filter.
import { CloudWatchLogsClient, FilterLogEventsCommand } from "@aws-sdk/client-cloudwatch-logs";
const logs = new CloudWatchLogsClient({ region: "eu-west-3" });
const r = await logs.send(new FilterLogEventsCommand({ logGroupName: "/foodapp/orders", filterPattern: '{ $.order = "PA-311" }' }));
for (const e of r.events) console.log(e.message);
अपेक्षित output:
{"order": "PA-311", "status": "picked", "total": "€23.40"}
- PHP: Logs Insights query.
<?php
$logs = new Aws\CloudWatchLogs\CloudWatchLogsClient(["region" => "eu-west-3"]);
$q = $logs->startQuery(["logGroupName" => "/foodapp/orders", "startTime" => time() - 3600, "endTime" => time(),
"queryString" => "stats count(*) by status"])["queryId"];
do { sleep(1); $r = $logs->getQueryResults(["queryId" => $q]); } while ($r["status"] === "Running");
foreach ($r["results"] as $row) echo $row[0]["value"], "=", $row[1]["value"], PHP_EOL;
अपेक्षित output:
picked=1
- Verify: group tail.
aws logs tail /foodapp/orders --since 10m --region eu-west-3 | grep -c PA-311
अपेक्षित output:
1
6. हाच call Java, Go, .NET आणि CLI मध्ये
हे का लागतं?
Teams अनेकदा भाषा मिसळतात. Python, PHP आणि Node.js मध्ये call समजला की बाकीचे SDKs म्हणजे तोच API, फक्त syntax वेगळा.
हे काय आहे?
सगळे PutMetricData API call करतात. Terminal मधून पटकन test करायला CLI ओळ वापरा.
कसं करायचं (step by step)
| Stack | Code |
|---|---|
| AWS CLI | aws cloudwatch put-metric-data --namespace FoodApp --metric-name LateOrders --dimensions City=Bengaluru --value 9 --unit Count |
| Java v2 | cw.putMetricData(b -> b.namespace("FoodApp").metricData(MetricDatum.builder().metricName("LateOrders").value(9.0).build())); |
| Go v2 | client.PutMetricData(ctx, &cloudwatch.PutMetricDataInput{Namespace: aws.String("FoodApp"), MetricData: []types.MetricDatum{{MetricName: aws.String("LateOrders"), Value: aws.Float64(9)}}}) |
| .NET | await cw.PutMetricDataAsync(new PutMetricDataRequest { Namespace = "FoodApp", MetricData = { new MetricDatum { MetricName = "LateOrders", Value = 9 } } }); |
7. काहीही खर्च चालू राहू नये म्हणून cleanup
हे का लागतं?
चालू ठेवलेले lab resources पैसे खातात आणि security risk बनतात.
हे काय आहे?
उलट्या क्रमाने delete करा: आधी children, मग parents.
कसं करायचं (step by step)
- Alarm व log group delete (metrics स्वतः expire).
aws cloudwatch delete-alarms --alarm-names late-orders-blr --region ap-south-1
aws logs delete-log-group --log-group-name /foodapp/orders --region eu-west-3
अपेक्षित output:
(no output means success)
Ravindra Bagale's Tip
प्रत्येक log group ला retention लावा (PutRetentionPolicy); default मध्ये logs, आणि bill, कायम राहतात.
8. मुलाखत प्रश्न आणि उत्तरं
प्र. Metric कसा ओळखतात?
Namespace + name + dimensions.
प्र. GetMetricData vs GetMetricStatistics?
नवीन, batch, math.
प्र. Alarm states?
OK, ALARM, INSUFFICIENT_DATA.
प्र. Alarm action test कसा?
SetAlarmState.
प्र. FilterLogEvents vs Insights?
Pattern vs query language.
घरी करून बघा
- Node.js मधून DeliveryMinutes publish करून p90 > 40 वर alarm.
- 5 सर्वात हळू orders दाखवणारी Python Logs Insights query लिहा.
थोडक्यात सांगायचं तर
- Dimensions सह PutMetricData.
- GetMetricData + math.
- PutMetricAlarm → SNS.
- ms मध्ये PutLogEvents.
- Logs Insights StartQuery.
सराव Tasks
Goa Beach Stays हा पणजी मधला हॉस्पिटॅलिटी व्यवसाय आहे. Rosario Fernandes त्यांचं IT व cloud काम पाहतात. त्यांचे पैसे INR मध्ये मोजले जातात आणि AWS resources ap-south-1 Region मध्ये चालतात. खालच्या tasks मध्ये तुम्ही या lesson मध्ये शिकलेलं वापरून त्यांची खरी कामं करता. सगळी नावं, account IDs, IP addresses व numbers सरावासाठी काल्पनिक आहेत.
0 / 12
सोपं Namespace मधले metrics दाखवा
का: Service साठी AWS कोणते metrics गोळा करतो ते पाहा.
काय करायचं: AWS/EC2 namespace मधले metrics दाखवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं SNS topic बनवा
का: Topic म्हणजे channel: एकदा publish, सगळ्या subscribers ना मिळतं.
काय करायचं: goabeachstays-alerts topic बनवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं Firing alarms दाखवा
का: Incident मध्ये आधी ALARM state मधले alarms पाहा.
काय करायचं: फक्त ALARM state असलेले alarms describe करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं Instance reboot करा
का: Reboot मध्ये disks व IPs तेच राहतात, stop/start ने public IP बदलू शकतो.
काय करायचं: i-03a3c4d31b3111a2b instance reboot करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
सोपं एका topic वर publish
का: Alerting app ला फक्त publish लागतं.
काय करायचं: फक्त arn:aws:sns:ap-south-1:113713948363:goabeachstays-alerts वर sns:Publish allow करा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Custom metric publish करा
का: Custom metrics ने business numbers वर graph व alarm करता येतो.
काय करायचं: Namespace GoaBeachStays/Shop मध्ये OrdersPlaced metric value 12 सह publish करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Email subscribe करा
का: Email subscribers नी messages मिळण्याआधी confirm link दाबावी लागते.
काय करायचं: ops@goabeachstays.in ला email ने arn:aws:sns:ap-south-1:113713948363:goabeachstays-alerts वर subscribe करा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Target health तपासा
का: Targets unhealthy असल्यास site 502/503 errors दाखवते.
काय करायचं: arn:aws:elasticloadbalancing:ap-south-1:113713948363:targetgroup/goabeachstays-tg/6d0ecf831eec9f09 मधल्या targets चं health दाखवा.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
मध्यम Function ला logs लिहू द्या
का: या actions शिवाय Lambda logs CloudWatch मध्ये दिसत नाहीत.
काय करायचं: फक्त arn:aws:logs:*:*:* वर logs:CreateLogGroup, logs:CreateLogStream, logs:PutLogEvents allow करा.
- { "Version": "2012-10-17", "Statement": [ ... ] } ने सुरू करा.
- प्रत्येक statement मध्ये Effect, Action व Resource लिहा.
- Task ला लागेल तेवढंच द्या (least privilege).
- Double quotes व commas नीट वापरा. Check answer दाबा.
मध्यम Kubernetes LoadBalancer Service
का: LoadBalancer Service ला AWS load balancer मिळतो.
काय करायचं: app: web select करणारी LoadBalancer Service, port 80 → targetPort 8080.
- Task मधल्या top-level keys पासून सुरू करा.
- Child keys 2 spaces ने indent करा (tabs नकोत).
- प्रत्येक property मध्ये task मधली value भरा.
- Check answer दाबा. Keys चा क्रम महत्त्वाचा नाही.
अवघड CPU alarm बनवा
का: Alarm metric पाहतो व users ला कळण्याआधी तुम्हाला कळवतो.
काय करायचं: goabeachstays-cpu-high alarm बनवा: AWS/EC2 CPUUtilization, 300 seconds चा Average, 1 evaluation period, GreaterThanThreshold 80, InstanceId=i-03a3c4d31b3111a2b साठी, arn:aws:sns:ap-south-1:113713948363:goabeachstays-alerts ला notify.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
अवघड Alarm ने instance auto-recover करा
का: System check fail झाल्यास recover action instance healthy hardware वर हलवतो.
काय करायचं: goabeachstays-recover alarm बनवा: AWS/EC2 StatusCheckFailed_System, 60 s चा Maximum, 2 periods, GreaterThanOrEqualToThreshold 1, InstanceId=i-03a3c4d31b3111a2b, action arn:aws:automate:ap-south-1:ec2:recover.
- Task वाचा आणि ते कोणत्या AWS service बद्दल आहे ते ठरवा.
- aws लिहा, मग service चं नाव, मग operation (action शब्द).
- प्रत्येक आवश्यक flag (--name) व त्यापुढे task मधली value लिहा.
- Flags कोणत्याही क्रमाने चालतात. Check answer दाबा.
उजळणी, तुलना आणि मुलाखत cards
हा lesson काही मिनिटांत revise करा. Cards phone वर save करा किंवा PNG download करा. प्रत्येक card वरचा QR हा lesson उघडतो.




अजून cards: Ravi Sir's Cards.