iT邦幫忙

2026 iThome 鐵人賽

DAY 16
0
Software Development

30 天從 Full-Stack Engineer 進化到 System Design:從 0 設計可支撐百萬使用者的系統系列 第 16 篇

# Day 16|Observability:System 出問題時,我們到底怎麼知道哪裡壞了?

  • 分享至 

  • xImage
  •  

Day 15 我們學到 Reliability 的核心:

Failure → Detect → Isolate → Recover

但這裡有一個問題:

我們怎麼知道 Failure 發生了?

User 只告訴你:

「網站今天很慢。」

原因可能是 Backend、Database、Redis、External API、Traffic 或新的
Deployment。

如果沒有資料可以觀察,Engineer 只能猜。

所以今天要學:

Observability


1. Production System 是什麼?

Production System:

真正正式提供給 User 使用的 System。

自己的電腦 → Local Development
測試環境   → Testing / Staging
真實 User  → Production

Production 出問題時,我們需要知道:

發生什麼?
在哪裡發生?
什麼時候開始?
影響多少 User?
可能原因是什麼?

2. Observability 是什麼?

Observability(可觀測性):

透過 System 對外產生的資訊,理解 System 內部正在發生什麼。

例如:

User
 ↓
API Gateway
 ↓
Backend
 ↓
Redis
 ↓
Database

User 說 Request 很慢。

如果看到:

Backend = 30 ms
Redis = 5 ms
Database Query = 4.8 sec

就可以把調查方向放在 Database。

這就是 Observability 的核心。


3. Observe 與 Signal

Observe = 觀察。

像醫生透過:

體溫
血壓
心跳
驗血
症狀

判斷身體內部狀況。

Software 也一樣。

Signal:

System 產生、可以幫助 Engineer 判斷內部狀態的資訊。

例如:

CPU = 95%
Error Rate = 10%
Latency = 5 sec
DB Connections = 100/100

Observability 常見三種核心 Signal:

Metrics
Logs
Traces

4. Monitoring 是什麼?

Monitoring:

持續收集與查看已知的重要指標,確認 System 是否正常。

例如:

CPU > 90%?
Memory > 90%?
Error Rate > 5%?
DB Connections 快用完?

超過門檻時可以發出 Alert。

Monitoring vs Observability

Monitoring 比較像:

我知道要注意哪些問題,所以持續監看。

Observability 比較像:

遇到沒有預先想到的問題時,我是否有足夠資料調查原因。

例如只有 Taiwan User 的 Checkout 變慢,可能沒有一個預先設定好的「Taiwan
Checkout Problem」Alert,但 Metrics、Logs、Traces 可以幫助調查。


5. Metrics 是什麼?

Metric:

用數字表示 System 某個狀態或行為。

例如:

CPU Usage = 82%
Memory Usage = 70%
Request Count = 10,000/min
Error Rate = 2%
Latency = 200 ms

簡單記:

Metric = 可以持續測量、比較、畫成趨勢圖的數值。


6. CPU Usage

**CPU(Central Processing Unit)**可以先想成 Computer
執行計算工作的核心資源之一。

CPU Usage:

CPU 現在有多忙?

20% → 比較空閒
95% → 非常忙

但 CPU 高不一定代表 Bug,也可能只是 Traffic 增加。

所以不能只看一個 Metric 就直接判斷 Root Cause。


7. Memory Usage 與 Memory Leak

這裡的 Memory 主要指 RAM:

Program 執行時暫時存放資料的高速空間。

如果:

Memory = 99%

可能需要調查。

原因可能是:

正常 Cache
大量 Traffic
Large Data Processing
Memory Leak

Memory Leak:

Program 使用 Memory 後,本來應該釋放卻沒有正常釋放,導致 Memory
Usage 持續增加。

例如:

10:00 → 40%
11:00 → 55%
12:00 → 70%
13:00 → 85%
14:00 → 98%

這種 Pattern 可能值得檢查。


8. Root Cause vs Symptom

Root Cause:

造成問題最核心的原因。

Symptom:

問題表面呈現出來的症狀。

例如:

User sees 500 Error
 ↓
Backend Error
 ↓
DB Connection Failed
 ↓
Connection Pool Exhausted
 ↓
Connection Leak

500 Error 是 Symptom。

真正 Root Cause 可能是 Connection Leak。

就像「發燒」是症狀,不一定是疾病真正原因。


9. Latency

Latency:

一個 Operation 從開始到得到結果需要多久。

Request sent    10:00:00.000
Response arrives 10:00:00.200

Latency:

200 ms

ms = millisecond(毫秒)

1000 ms = 1 second

10. Average Latency 的問題

假設:

100 ms
120 ms
130 ms
150 ms
5000 ms

Average:

1100 ms

但真實情況是:

4 個 Request 很快
1 個 Request 超級慢

Average 不一定能完整描述 User Experience。

因此 Production Monitoring 常看:

Percentile

11. Percentile:p50、p95、p99

Percentile(百分位數):

把 Request Latency 從快到慢排序。

p50:

約 50% Request 的 Latency 小於或等於這個值。

p95:

約 95% Request 小於或等於這個值。

p99:

約 99% Request 小於或等於這個值。

例如:

p50 = 100 ms
p95 = 500 ms
p99 = 3 sec

表示:

大部分 Request 很快
但最慢的一小群可能非常慢

12. Tail Latency

Tail = 尾巴。

Tail Latency:

Latency Distribution 中最慢的那一小部分 Request。

常觀察:

p95
p99
p99.9

因為 Average 很漂亮,不代表所有 User Experience 都很好。


13. Throughput 與 RPS

Throughput:

System 在一段時間內能處理多少工作。

例如:

1,000 Requests / second

RPS:

Requests Per Second

也就是每秒 Request 數。

Latency
→ 一個 Request 多久?

Throughput
→ 一段時間處理多少 Request?

14. Error Rate

Error Rate:

所有 Request 中,發生 Error 的比例。

例如:

Total Requests = 10,000
Failed = 500

Error Rate = 5%

如果平常 0.1%,突然變成 10%,就是很重要的 Signal。


15. Traffic

Traffic:

進入 System 的 Request / Data Flow 數量。

例如:

Normal = 1,000 RPS
Black Friday = 10,000 RPS

System 變慢時要先問:

System 壞了?
還是 Traffic 突然增加?

16. Saturation

Saturation:

某個 Resource 已經接近或達到可承受上限。

例如:

CPU = 100%
Connection Pool = 100/100
Disk I/O ≈ Limit

像停車場:

100 個車位
100 個已滿

新的車只能等待。


17. Four Golden Signals

Service Monitoring 常見四個重要方向:

Latency
Traffic
Errors
Saturation

簡單記:

Latency    → Request 多久?
Traffic    → 有多少 Request?
Errors     → 有多少失敗?
Saturation → Resource 快滿了嗎?

18. Logs

Log:

Program 執行過程留下的事件文字紀錄。

例如:

2026-09-28 18:30:01 INFO User login success userId=123
2026-09-28 18:30:03 ERROR Database connection timeout

Metrics 可能告訴你:

Error Rate ↑

Logs 可以進一步告訴你:

發生哪一種 Error?

19. Log Level

常見:

DEBUG
INFO
WARN
ERROR

DEBUG

很詳細、主要幫助開發與 Debug 的資訊。

INFO

正常但值得記錄的重要 Event。

WARN

有異常,但 System 可能仍能繼續。

ERROR

Operation 發生明確 Failure。


20. Debug

Bug:

Software 裡的錯誤或問題。

Debug:

找出、理解並修正 Software 問題的過程。

Logs 是 Debug Production Problem 的重要工具。


21. Structured Log

普通 Log:

User 123 failed login from Taiwan

人很好讀,但 Machine 不一定方便分析。

Structured Log:

把 Log 按固定欄位保存,方便 Search、Filter、Analyze。

例如:

{
  "level": "ERROR",
  "service": "auth-service",
  "userId": 123,
  "event": "LOGIN_FAILED"
}

可以搜尋:

service = auth-service
AND
event = LOGIN_FAILED

22. Timestamp

Timestamp:

某件事情發生的時間紀錄。

例如:

2026-09-28 18:30:03

它可以幫助 Engineer 對照:

18:30 Traffic ↑
18:31 CPU ↑
18:32 Error Rate ↑
18:32 DB Timeout Logs ↑

理解事件發生順序。


23. Trace

第三個核心 Signal:

Trace

在 Microservices:

User
 ↓
API Gateway
 ↓
Order Service
 ↓
Payment Service
 ↓
Inventory Service
 ↓
Database

User 只知道:

Checkout took 5 sec

到底哪一步慢?

Trace:

記錄一個 Request 經過多個 Service / Component 的路徑與時間。


24. Distributed Tracing

當 Request 經過多個 Distributed Services:

Gateway
 ↓
Order
 ↓
Payment
 ↓
Database

追蹤整條路徑就叫:

Distributed Tracing

Distributed = 工作分散在不同 Component / Machine。

Tracing = 追蹤 Request 的旅程。


25. Trace ID 與 Request ID

同時有 10,000 Requests 時,怎麼知道哪些資料屬於同一個 Request?

可以給 Request:

Trace ID = abc123

然後:

Gateway       traceId=abc123
Order Service traceId=abc123
Payment       traceId=abc123

搜尋 abc123 就可以串起整個 Request。

Request ID:

用來唯一識別某一次 Request 的 ID。

簡單 System 中 Request ID 可能已足夠。

Distributed Tracing 通常還會使用:

Trace ID
Span ID

26. Span 與 Span ID

Span:

一個 Trace 裡的一小段工作。

例如:

Trace
├── Gateway          20 ms
├── Order Service   100 ms
├── Payment         800 ms
└── Database         50 ms

每一段就是一個 Span。

Trace = 多個 Spans 組成

Span ID:

唯一識別某一個 Span 的 ID。

Trace ID = abc123

Span ID = s001 → Gateway
Span ID = s002 → Order
Span ID = s003 → Payment

Trace ID 回答:

是不是同一趟 Request?

Span ID 回答:

這趟 Request 裡是哪一段?

27. Parent Span / Child Span

Order Service
 ↓
Payment Service

Order 的 Span 可以是:

Parent Span

Payment:

Child Span

Parent = 父層。

Child = 子層。

這能幫助重建 Service 之間的呼叫關係。


28. Metrics vs Logs vs Traces

最簡單可以記:

Metrics

System 現在有沒有異常?

例如:

Error Rate = 10%
p99 = 5 sec

Logs

到底發生了什麼?

例如:

DatabaseConnectionTimeout

Traces

這個 Request 經過哪裡?
哪一段最慢?

例如:

Gateway       20 ms
Order         50 ms
Payment     4500 ms ← Problem
Database      80 ms

29. Dashboard

Dashboard:

把重要 Metrics 用 Graph / Chart 集中顯示的畫面。

例如:

Request Rate : 5,000 RPS
p95 Latency  : 300 ms
Error Rate   : 0.2%
CPU          : 65%

Engineer 不需要一直手動查每個數字。


30. Time Series 與 Trend

Time Series:

按照時間順序記錄的一連串數值。

18:00 CPU 40%
18:05 CPU 45%
18:10 CPU 70%
18:15 CPU 95%

Trend:

數值隨時間大致往哪個方向變化。

例如 Memory:

40 → 50 → 60 → 70 → 80

持續上升的 Trend 可能值得調查。


31. Alert 與 Threshold

Engineer 不可能 24 小時盯 Dashboard。

所以需要 Alert:

某個重要 Condition 發生時,自動通知相關人員。

例如:

Error Rate > 5%
for 5 minutes

Threshold:

判斷 Metric 是否超出正常範圍的門檻。

這裡的:

5%

就是 Threshold。


32. Alert Fatigue

如果什麼都 Alert:

CPU 70% → Alert
CPU 71% → Alert
One Retry → Alert
One Failed Request → Alert

Engineer 每天收到 500 個 Alert,最後可能開始忽略。

這叫:

Alert Fatigue

也就是 Alert 太多造成「警報疲勞」。

好的 Alert 應該盡量對真正需要人處理的問題發出通知。


33. False Positive / False Negative

False Positive:

發出 Alert,但實際上沒有真正需要處理的問題。

例如 CPU 只短暫 95% 兩秒,這其實是正常 Spike。

False Negative:

真的有問題,但 Monitoring 沒有發出 Alert。

例如:

Checkout Failure = 30%

卻完全沒有警報。


34. SLI

SLI:

Service Level Indicator

Indicator = 指標。

SLI = 用來衡量 Service Quality 的實際數值。

例如:

Availability = 99.95%
p95 Latency = 200 ms
Success Rate = 99.9%

簡單記:

SLI = 實際量到多少?


35. SLO

SLO:

Service Level Objective

Objective = 目標。

SLO = 希望某個 SLI 達到什麼目標。

例如:

SLI:
Actual Availability = 99.95%

SLO:
Availability >= 99.9%

簡單記:

SLO = 我們希望做到多少?


36. SLA

SLA:

Service Level Agreement

Agreement = 協議。

SLA = Service Provider 和 Customer 之間對 Service Level
的正式承諾或協議。

例如:

Monthly Availability >= 99.9%

沒有達到時,Agreement 可能規定 Service Credit 或其他處理方式。


37. SLI vs SLO vs SLA

最簡單記:

SLI
→ 實際量到多少?

SLO
→ 希望做到多少?

SLA
→ 對 Customer 正式承諾多少?

例如:

SLI = 99.95%
SLO = 99.9%
SLA = 99.5%

實際公司的定義與數字會依 Business 而不同。


38. 99.9% Availability

假設一個月約 30 天:

30 days
= 43,200 minutes

99.9% Availability 代表約 0.1% 時間可以不可用。

粗略:

43,200 × 0.001
≈ 43.2 minutes

也就是每月約 43 分鐘。

這只是建立直覺,實際 SLA 要依 Agreement 的計算方式。


39. Error Budget

如果:

SLO = 99.9%

代表允許大約:

0.1%

沒有達到 Availability。

這個可容忍範圍常叫:

Error Budget

不是說我們故意製造 Error。

而是承認:

100% Reliability 通常需要非常高的 Cost,因此 Business 要決定合理的
Reliability Target。


40. Incident 與 Incident Response

Incident:

影響或可能影響正常 Production Service 的異常事件。

例如:

Checkout Down
Payment Failure
Massive Latency Increase

Incident Response:

Team 發現、處理、恢復並追查 Incident 的流程。

Alert
 ↓
Investigate
 ↓
Find affected service
 ↓
Mitigate
 ↓
Recover
 ↓
Find Root Cause

41. Mitigation

Mitigation:

先降低問題造成的影響,不一定已經完全修掉 Root Cause。

例如新的 Deployment 造成 Error Rate 暴增。

先:

Rollback

讓 User 可以正常使用。

真正 Bug 之後再深入修。


42. Rollback 與 Deployment

Deployment:

把新的 Software Version 發布到某個 Environment 執行。

Code
 ↓
Build
 ↓
Test
 ↓
Deploy to Production

Rollback:

從新的 Version 切回前一個較穩定 Version。

Version 2
 ↓ Error Rate ↑
Rollback
 ↓
Version 1

43. Correlation vs Causation

假設:

18:00 Deploy V2
18:02 Error Rate ↑
18:03 p99 ↑

看起來 Deployment 和 Error 有關。

這叫 Correlation:

兩件事在時間或變化上看起來有關聯。

但:

Correlation 不一定等於 Causation。

Causation:

A 真正造成 B。

例如確認:

New Code
 ↓
DB Connections never closed
 ↓
Connection Pool exhausted

才比較能說找到真正原因。


44. Request Path

這裡的 Request Path 不是 URL /users/123。

它是:

一個 Request 從進入 System 到完成,中間經過哪些 Component。

例如:

User
 ↓
Gateway
 ↓
Order
 ↓
Payment
 ↓
Database

Tracing 就是在觀察這條旅程。


45. Cardinality 與 Label

Day 9 已經看過 Cardinality:

一個 Field 有多少不同 Value。

在 Metrics 也很重要。

例如:

status = 200
status = 404
status = 500

不同 Value 不多。

但:

user_id = 1
user_id = 2
...
user_id = 10,000,000

有非常多不同 Value。

這叫:

High Cardinality

可能增加:

Storage
Memory
Query Cost
Complexity

Label:

用來分類 Metric 的額外欄位。

例如:

http_requests_total{
  method="GET",
  status="200"
}

method 和 status 就是 Labels。

不是所有資訊都適合放進 Metric Label。


46. Sensitive Data 與 Logs

Observability 不代表:

把所有東西全部 Log

敏感資料例如:

Password
Access Token
Credit Card Number
Private Personal Data

通常不應直接寫進 Logs。

Logs 本身也需要:

Access Control
Security
Retention Policy

47. Retention

Retention:

Observability Data 要保留多久。

例如概念上:

Metrics → 90 days
Logs    → 30 days
Traces  → 7 days

保留越久:

Storage Cost ↑

所以要做 Trade-off。


48. Sampling

假設:

1 Billion Requests / day

如果每一個 Request 都保存完整 Trace,Cost 可能非常高。

所以可以用:

Sampling

Sampling:

只挑部分 Request 保存完整觀察資料。

例如:

100 Requests
 ↓
Keep 10 Traces

就是約 10% Sampling。

Trade-off:

Cost ↓
但可能漏掉 Rare Problem

Rare Problem 就是非常少見的問題,例如 100,000 個 Request
才發生一次。


49. Observability 不是免費的

收集越多:

Metrics
Logs
Traces

需要越多:

Storage
Network
CPU
Monitoring Infrastructure
Money

所以不是:

Log Everything Forever

而是:

收集足夠資訊
+
控制 Cost
+
保護 Sensitive Data

50. 完整 Observability Architecture

                       User
                         ↓
                    API Gateway
                         ↓
                  Backend Services
                   /      |                        ↓       ↓       ↓
               Redis   Database  External API

                  │       │       │
                  └───────┼───────┘
                          ↓
                Observability Data
                 /       |                       ↓        ↓        ↓
             Metrics    Logs    Traces
                \        |        /
                 \       |       /
                  ↓      ↓      ↓
                     Dashboard
                         ↓
                       Alert
                         ↓
                      Engineer

51. 台積 IT 面試情境:Website 突然變慢

不要一開始就回答:

Restart Server

可以:

1. Check Metrics
2. Check Traffic
3. Check Latency
4. Check Error Rate
5. Check Saturation
6. Check Logs
7. Check Traces
8. Check Recent Deployment / Config Change
9. Identify Bottleneck
10. Mitigate
11. Find Root Cause

52. Example:Checkout 變慢

User:

Checkout takes 5 sec

Metrics:

Traffic = Normal
CPU = Normal
Error Rate = Normal
p99 Latency = High

Trace:

Gateway          20 ms
Order            80 ms
Payment        4500 ms
Database          70 ms

Payment 最慢。

Payment Logs:

External Bank API Timeout

所以調查過程:

Symptom
Checkout Slow
 ↓
Metrics
p99 High
 ↓
Trace
Payment Slow
 ↓
Logs
External API Timeout
 ↓
Investigation
Root Cause

53. Metrics、Logs、Traces 如何合作?

可以先記:

Metrics
 ↓
發現「有問題」

Logs
 ↓
了解「發生什麼」

Traces
 ↓
了解「問題在哪一段 Request Path」

不一定永遠照這個順序,但這是一個很容易理解的 Debugging Flow。


54. 台積 IT 面試情境:Error Rate 突然上升

可以依序:

1. 確認 Error Rate 何時開始上升
2. 看同時間 Traffic 是否增加
3. 看 CPU / Memory / Connection Pool 是否 Saturated
4. 看 Error Logs 的 Error Type
5. 用 Trace 找 Failure 集中的 Service
6. 檢查最近 Deployment / Configuration Change
7. 先 Mitigate User Impact
8. 再確認 Root Cause

55. 台積 IT 面試情境:只有少數 User 很慢

Average:

120 ms

看起來很好。

但:

p99 = 5 sec

代表最慢的一小群 Request 非常慢。

所以不能只看 Average,還要看:

p95
p99
Tail Latency

56. 台積 IT 面試情境:Microservices 怎麼 Debug?

Gateway
 ↓
Order
 ↓
Inventory
 ↓
Payment

User 回報 Error。

使用:

Trace ID

串起:

Gateway Log
Order Log
Inventory Log
Payment Log

再透過 Distributed Trace 找:

哪個 Span Failure?
哪個 Span Latency 特別高?

台積 IT 面試準備 Checkpoint

1. Production System 是什麼?
2. Observability 是什麼?
3. Signal 是什麼?
4. Monitoring 是什麼?
5. Monitoring vs Observability?
6. Metrics 是什麼?
7. CPU / Memory Usage 是什麼?
8. Memory Leak 是什麼?
9. Root Cause vs Symptom?
10. Latency 是什麼?
11. Average Latency 有什麼限制?
12. Percentile 是什麼?
13. p50 / p95 / p99?
14. Tail Latency 是什麼?
15. Throughput / RPS 是什麼?
16. Latency vs Throughput?
17. Error Rate 是什麼?
18. Traffic 是什麼?
19. Saturation 是什麼?
20. Four Golden Signals?
21. Log 是什麼?
22. Log Levels?
23. Debug 是什麼?
24. Structured Log 是什麼?
25. Timestamp 為什麼重要?
26. Trace / Distributed Tracing?
27. Trace ID / Request ID?
28. Span / Span ID?
29. Parent / Child Span?
30. Metrics vs Logs vs Traces?
31. Dashboard 是什麼?
32. Time Series / Trend?
33. Alert / Threshold?
34. Alert Fatigue?
35. False Positive / False Negative?
36. SLI 是什麼?
37. SLO 是什麼?
38. SLA 是什麼?
39. SLI vs SLO vs SLA?
40. 99.9% Availability 大概代表什麼?
41. Error Budget 是什麼?
42. Incident / Incident Response?
43. Mitigation 是什麼?
44. Rollback / Deployment?
45. Correlation vs Causation?
46. Request Path 是什麼?
47. Cardinality / High Cardinality?
48. Metric Label 是什麼?
49. Sensitive Data 可以直接放 Log 嗎?
50. Retention 是什麼?
51. Sampling 是什麼?
52. Sampling 有什麼 Trade-off?
53. Observability 為什麼有 Cost?
54. Website 變慢怎麼調查?
55. Average 很低為什麼 User 還可能抱怨慢?
56. Microservices 怎麼 Debug?

今天學到了什麼?

Observability 的核心問題:

透過 System 對外產生的資訊,我們能不能理解內部正在發生什麼?

三個重要 Signal:

Metrics
Logs
Traces

可以先這樣記:

Metrics
→ System 有沒有異常?

Logs
→ 發生了什麼?

Traces
→ Request 經過哪裡?哪一段有問題?

重要 Service Signals:

Latency
Traffic
Errors
Saturation

Service Level:

SLI
→ 實際量到多少

SLO
→ 希望做到多少

SLA
→ 對 Customer 承諾多少

Production Problem:

Alert
 ↓
Metrics
 ↓
Logs / Traces
 ↓
Investigate
 ↓
Mitigation
 ↓
Root Cause
 ↓
Fix

最重要的一句:

沒有 Observability 的 Distributed
System,就像在沒有儀表板與警示燈的情況下開車;System
可能還在跑,但出問題時你很難知道到底發生了什麼。


下一篇

現在我們可以發現 Failure、查看 Error、追蹤 Request。

下一個重要問題:

誰可以使用 API?
誰可以讀 Data?
Password 怎麼存?
HTTPS 保護什麼?
Attacker 一直嘗試登入怎麼辦?

下一篇:

Day 17|Security:Authentication、Authorization、Encryption
到底差在哪裡?

會從零解釋:

Authentication
Authorization
Identity
Credential
Password Hashing
Salt
Session
Cookie
Token
JWT
HTTPS
TLS
Encryption
Hashing
Least Privilege
RBAC
SQL Injection
XSS
CSRF

並把 Security 放回我們前面建立的 System Architecture。


上一篇
# Day 15|Reliability:Server 掛掉之後,System 為什麼還能繼續運作?
系列文
30 天從 Full-Stack Engineer 進化到 System Design:從 0 設計可支撐百萬使用者的系統 共 16 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言