EN: Read in English
Dunia O4: Diari & Satu Pesanan
Misi capstone 9: Pantau Kedai Kancil
Anda akan belajar: jalankan bilik kawalan sendiri untuk Kedai Kancil: Prometheus, Grafana, node-exporter, satu amaran dan satu dashboard.
Teks BM belum disemak oleh penutur asli.
Disemak dengan Prometheus 3 pada 1 Nov 2026
Masalahnya
Misi 9: pantau Kedai Kancil! Anda akan bina bilik kawalan kecil dalam folder monitoring/. Mula-mula, letak setiap fail di tempatnya.
Seret kad ke dalam kotak. Atau ketik kad, kemudian ketik kotak.
Tengok
node-exporter tiada baris ports. Macam mana Prometheus sampai kepadanya?
Pilih satu jawapan.
services:
prometheus:
image: quay.io/prometheus/prometheus:v3.13.5
volumes:
- ./prometheus:/etc/prometheus:ro
ports: ["9090:9090"]
node-exporter:
image: quay.io/prometheus/node-exporter:v1.12.1
grafana:
image: grafana/grafana:13.2.5
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning:ro
- ./grafana/dashboards:/var/lib/grafana/dashboards:ro
ports: ["3000:3000"]Tengok
Uji query panel “Targets up” dulu. Jadikan ia satu nombor.
Taip query PromQL, kemudian tekan Jalankan. Jadual papar jawapan pada masa nilai. Graf papar jawapan sepanjang masa.
{
"uid": "kedai",
"title": "Kedai Kancil",
"panels": [
{ "type": "stat", "title": "Targets up",
"gridPos": { "x": 0, "y": 0, "w": 6, "h": 6 },
"targets": [{ "refId": "A", "expr": "sum(up)" }] },
{ "type": "timeseries", "title": "CPU busy (%)",
"gridPos": { "x": 6, "y": 0, "w": 18, "h": 6 },
"targets": [{ "refId": "A", "expr": "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[$__rate_interval])))" }] }
]
}Tengok
Grafana berjalan dalam container sendiri. Kenapa sumber data tulis http://prometheus:9090, bukan localhost?
Pilih satu jawapan.
# grafana/provisioning/datasources/prometheus.yaml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
uid: prometheus
url: http://prometheus:9090
access: proxy
isDefault: true# grafana/provisioning/dashboards/kedai.yaml
apiVersion: 1
providers:
- name: kedai
folder: Kedai Kancil
type: file
options:
path: /var/lib/grafana/dashboardsCuba
prometheus.yml ini scrape localhost:9100. Dalam container Prometheus, tiada apa mendengar di situ. Halakan job node ke node-exporter.
Ubah YAML ini. Kotak di bawah tunjuk cara komputer membacanya.
Cara komputer membacanya
- globalmap · 2 kunci
- scrape_interval15steks
- evaluation_interval15steks
- rule_filessenarai · 1 item
- item 1rules.ymlteks
- scrape_configssenarai · 2 item
- item 1map · 2 kunci
- job_nameprometheusteks
- static_configssenarai · 1 item
- item 1map · 1 kunci
- targetssenarai · 1 item
- item 1localhost:9090teks
- targetssenarai · 1 item
- item 1map · 1 kunci
- item 2map · 2 kunci
- job_namenodeteks
- static_configssenarai · 1 item
- item 1map · 1 kunci
- targetssenarai · 1 item
- item 1localhost:9100teks
- targetssenarai · 1 item
- item 1map · 1 kunci
- item 1map · 2 kunci
Petunjuk
Untuk Prometheus sendiri, localhost betul. Untuk node-exporter, guna nama servisnya.Cuba
Sekarang amaran. Panggil bila mana-mana target mati selama seminit, dan sebut job serta instance.
Bina rule alert daripada blok. Garis masa papar bila ia menunggu dan bila ia berbunyi.
groups: - name: kedai rules: - alert: KedaiTargetDown expr: up == 0 annotations: summary: Target down
Graf sebagai jadual
| Masa | up{instance="db-1", job="db"} | up{instance="shop-1", job="shop"} | up{instance="shop-2", job="shop"} |
|---|---|---|---|
| 0s | 1 | 1 | 1 |
| 1m | 1 | 1 | 1 |
| 2m | 1 | 1 | 1 |
| 3m | 1 | 1 | 1 |
| 4m | 1 | 1 | 1 |
| 5m | 1 | 1 | 1 |
| 6m | 0 | 1 | 1 |
| 7m | 0 | 1 | 1 |
| 8m | 0 | 1 | 1 |
| 9m | 1 | 1 | 1 |
| 10m | 1 | 1 | 1 |
| 11m | 1 | 0 | 1 |
| 12m | 1 | 0 | 1 |
| 13m | 1 | 0 | 1 |
| 14m | 1 | 0 | 1 |
| 15m | 1 | 0 | 1 |
| 16m | 1 | 0 | 1 |
| 17m | 1 | 0 | 1 |
| 18m | 1 | 0 | 1 |
| 19m | 1 | 0 | 1 |
| 20m | 1 | 0 | 1 |
| 21m | 1 | 0 | 1 |
| 22m | 1 | 0 | 1 |
| 23m | 1 | 0 | 1 |
| 24m | 1 | 0 | 1 |
| 25m | 1 | 0 | 1 |
| 26m | 1 | 0 | 1 |
| 27m | 1 | 0 | 1 |
| 28m | 1 | 0 | 1 |
| 29m | 1 | 0 | 1 |
| 30m | 1 | 0 | 1 |
| 31m | 1 | 0 | 1 |
Apa alert buat sepanjang masa
Kelabu: senyap. Kuning: pending (benar, tetapi menunggu). Merah: firing.
{instance="db-1", job="db"}🔔 firing 6m hingga 8m
{instance="shop-1", job="shop"}🔔 firing 11m hingga 31m
Pada 12m:
- FIRING
KedaiTargetDowninstance="shop-1", job="shop"Target down
Garis masa sebagai jadual
| Masa | {instance="db-1", job="db"} | {instance="shop-1", job="shop"} |
|---|---|---|
| 0s | senyap | senyap |
| 1m | senyap | senyap |
| 2m | senyap | senyap |
| 3m | senyap | senyap |
| 4m | senyap | senyap |
| 5m | senyap | senyap |
| 6m | 🔔 firing | senyap |
| 7m | 🔔 firing | senyap |
| 8m | 🔔 firing | senyap |
| 9m | senyap | senyap |
| 10m | senyap | senyap |
| 11m | senyap | 🔔 firing |
| 12m | senyap | 🔔 firing |
| 13m | senyap | 🔔 firing |
| 14m | senyap | 🔔 firing |
| 15m | senyap | 🔔 firing |
| 16m | senyap | 🔔 firing |
| 17m | senyap | 🔔 firing |
| 18m | senyap | 🔔 firing |
| 19m | senyap | 🔔 firing |
| 20m | senyap | 🔔 firing |
| 21m | senyap | 🔔 firing |
| 22m | senyap | 🔔 firing |
| 23m | senyap | 🔔 firing |
| 24m | senyap | 🔔 firing |
| 25m | senyap | 🔔 firing |
| 26m | senyap | 🔔 firing |
| 27m | senyap | 🔔 firing |
| 28m | senyap | 🔔 firing |
| 29m | senyap | 🔔 firing |
| 30m | senyap | 🔔 firing |
| 31m | senyap | 🔔 firing |
Petunjuk
Tunggu 1 minit, supaya restart sekejap tak panggil sesiapa.Cuba
Sekarang bina betul-betul, langkah demi langkah. Tanda anda disimpan.
Misi sebenar
mkdir -p monitoring && cd monitoring && mkdir -p prometheus grafana/dashboards grafana/provisioning/datasources grafana/provisioning/dashboardsdocker compose config --quietdocker run --rm --entrypoint promtool -v "$PWD/prometheus:/etc/prometheus:ro" quay.io/prometheus/prometheus:v3.13.5 check config /etc/prometheus/prometheus.ymldocker compose up -dhttp://localhost:9090/targetshttp://localhost:3000docker compose stop node-exporterhttp://localhost:9090/alertsdocker compose start node-exportergit add monitoring && git commit -m "Watch the shop" && git pushdocker compose down
0 daripada 12 langkah siap · Tanda anda disimpan.
Semak
GitHub boleh nampak fail anda. Taip nama pengguna anda dan tekan Semak sekarang.
Semak di GitHub
- Repo kedai-kancil anda awamBelum disemak
- Ia ada monitoring/compose.yamlBelum disemak
- Ia ada config PrometheusBelum disemak
- Ia ada alert ruleBelum disemak
- Ia ada dashboardBelum disemak
Semak
Selebihnya hanya anda boleh nampak. Tanda yang benar.
Semakan diri
0 daripada 5 langkah siap · Tanda anda disimpan.
Anda berjaya!
Kini anda boleh jalankan bilik kawalan kecil: metrik, dashboard dan amaran.
Nak tahu lebih (pilihan)
Di mana cerita ini tak tepat. Bilik kawalan sebenar memantau dari luar. Bilik kita berjalan di mesin yang dipantaunya. Jika mesin itu mati, loceng pun mati. Dalam container, node-exporter nampak cakera dan rangkaian container sendiri. README-nya tunjuk mount hos untuk mesin sebenar. Seterusnya: tambah Alertmanager, supaya loceng sampai ke telefon.
English
Mission 9: watch Kedai Kancil! You will build a small control room in a monitoring/ folder. First, put each file in its place.
node-exporter has no ports line. How does Prometheus reach it?
services:
prometheus:
image: quay.io/prometheus/prometheus:v3.13.5
volumes:
- ./prometheus:/etc/prometheus:ro
ports: ["9090:9090"]
node-exporter:
image: quay.io/prometheus/node-exporter:v1.12.1
grafana:
image: grafana/grafana:13.2.5
volumes:
- ./grafana/provisioning:/etc/grafana/provisioning:ro
- ./grafana/dashboards:/var/lib/grafana/dashboards:ro
ports: ["3000:3000"]
Test the “Targets up” panel’s query first. Make it one number.
{
"uid": "kedai",
"title": "Kedai Kancil",
"panels": [
{ "type": "stat", "title": "Targets up",
"gridPos": { "x": 0, "y": 0, "w": 6, "h": 6 },
"targets": [{ "refId": "A", "expr": "sum(up)" }] },
{ "type": "timeseries", "title": "CPU busy (%)",
"gridPos": { "x": 6, "y": 0, "w": 18, "h": 6 },
"targets": [{ "refId": "A", "expr": "100 * (1 - avg(rate(node_cpu_seconds_total{mode=\"idle\"}[$__rate_interval])))" }] }
]
}
Grafana runs in its own container. Why does the data source say http://prometheus:9090, not localhost?
# grafana/provisioning/datasources/prometheus.yaml
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
uid: prometheus
url: http://prometheus:9090
access: proxy
isDefault: true# grafana/provisioning/dashboards/kedai.yaml
apiVersion: 1
providers:
- name: kedai
folder: Kedai Kancil
type: file
options:
path: /var/lib/grafana/dashboards
This prometheus.yml scrapes localhost:9100. Inside the Prometheus container, nothing listens there. Point the node job at node-exporter.
Now the alert. Page when any target is down for a minute, and name the job and instance.
Now build it for real, step by step. Your ticks are saved.
GitHub can see your files. Type your username and press Check now.
The rest only you can see. Tick what is true.
You can now run a small control room: metrics, a dashboard and an alert.
Anda dah siapkan ini. Latihan lagi pun bagus!
Dokumentasi rasmi: Prometheus: getting started · Prometheus configuration · Node exporter guide · Grafana provisioning
Anda dah belajar 25 minit. Rehat sekejap bantu otak anda.
Pecutan selesai! Fokus yang hebat. Regangkan badan seminit?