Slide 1

Slide 1 text

MWC 2 0 2 3 ( 2 0 2 3 / 1 1 / 0 9 ) 劉義瑋 Blueswen 從零開始打造可觀測性平台

Slide 2

Slide 2 text

⾃介 • 劉義瑋 Blueswen • blueswen @ GitHub • 國泰⼈壽 投資資訊部 DevOps Team • 偶爾做做 ML 專案的 DevOps ⼯程師 • 負責導⼊可觀測性與觀測平台 • 領域 • DevOps • Cloud Native • Machine Learning

Slide 3

Slide 3 text

Outline • 1 0 min: 可觀測性基礎概念介紹 • 3 5 min: Observability Signal Data Flow • Metrics、Logs、Traces • Hands-on Lab 0 、Lab 1 • 1 5 min: Observability Signal Correlation • Metrics vs Logs • Metrics to Traces with Exemplar • Traces vs Logs • Hands-on Lab 2 • 2 5 min: More Components • Grafana Mimir, Grafana Agent, OpenTelemetry Collector • Hands-on Lab 3 • OpenTelemetry Collector Span Metrics • Hands-on Lab 4 • 5 min: Recap & Takeaway

Slide 4

Slide 4 text

⽬標 • 瞭解 Logs、Metrics、Traces 的⽣成、收集、儲存、使⽤共四個 階段的處理⽅式 • 使⽤ Docker Compose 建⽴的簡易可觀測性平台,釐清資料傳 遞⽅式與各⾃元件的⽤途 • 學習在 Grafana 中交互應⽤ Logs、Metrics、Traces 三種資訊

Slide 5

Slide 5 text

Pre requirements • GitHub Repo:https://github.com/blueswen/observability-workshop- 1 0 1 • 本機 • 能夠連線⾄網際網路,以便連線⾄ GitHub、Docker Hub 取得相關資源 • 預先安裝 Docker 與 Docker Compose,且可正常使⽤ Volume 掛載與 Port Forwarding 功能 • GCP Cloud Shell • 配有 Docker 與 VSCode 的虛擬機環境,為免費服務無需⽀費任何費⽤,每週可使⽤ 50 ⼩時,其他使⽤限制請參考 Cloud Shell Doc - Limitations and restrictions • 開啟 Grafana 網⾴時會因為 Grafana 本⾝的安全機制阻擋出現 Origin not allowed 錯 誤,可以使⽤ ngrok 建⽴網路通道即可繞過

Slide 6

Slide 6 text

Dev or Ops? Front End or Back End?

Slide 7

Slide 7 text

Python or Java?

Slide 8

Slide 8 text

基礎概念介紹

Slide 9

Slide 9 text

可觀測性介紹 Observability is a characteristic of an application that refers to how well a system's state or status can be understood from its external outputs. Computer systems are measured by observing CPU time, memory, disk space, latency, errors, etc. The more observable a system is, the easier it is to understand how it’s doing by looking at it. 來源:CNCF Observability Whitepaper 可觀測性是⼀個應⽤程式的特性,指的是利⽤其外部輸出來理解系統狀態 或狀態的程度。計算機系統通過觀察 CPU 時間、記憶體、磁碟空間、延 遲、錯誤等來衡量。系統的可觀測性越⾼,越容易通過觀察來理解它的運 ⾏情況。

Slide 10

Slide 10 text

可觀測性介紹 有⾜夠的資訊嗎? 他們都有被好好保存嗎? 有好好利⽤這些資訊嗎? 是否散落個處,形成 Data Silo? 透過各種資訊,清楚了解系統狀態 Log ⼯具 指標儀表板 APM ⼯具

Slide 11

Slide 11 text

可觀測性資訊 圖⽚來源:CNCF Observability Whitepaper Observability Signals 系統揭露出來讓我們更夠理解他的資訊

Slide 12

Slide 12 text

可觀測性資訊 指標 不同時間採樣的系統量化指標 如:CPU 使⽤率、API 回應時間 ⽇誌 紀錄系統中發⽣的事情 如:Debug 訊息、Exception 分散式追蹤 紀錄⾏為在不同服務中的歷程 如:SSO ⾏為橫跨多個服務

Slide 13

Slide 13 text

可觀測性資訊 徵狀:有問題發⽣ 脈絡:怎麼發⽣的 發⽣什麼事 哪裡發⽣的 狀況如何

Slide 14

Slide 14 text

可觀測性資訊 - 應⽤於問題排除 圖⽚來源:Loki: Prometheus-inspired, open source logging for cloud natives 徵狀 脈絡

Slide 15

Slide 15 text

可觀測性資訊 - 應⽤於問題排除 MTTR(Mean Time To Repair) 平均修復時間 圖⽚來源:ManageEngine 良好的 Observability 可以減少診斷與修復問題的時間

Slide 16

Slide 16 text

可觀測性介紹 有⾜夠的資訊嗎? 他們都有被好好保存嗎? 有好好利⽤這些資訊嗎? 是否散落個處,形成 Data Silo? 透過各種資訊,清楚了解系統狀態 Log ⼯具 指標儀表板 APM ⼯具

Slide 17

Slide 17 text

可觀測性平台 - Grafana • Grafana Labs 開源的視覺化與儀表板⼯具,也提供告警功能 Metrics 儀表板範例 OpenTelemetry Application Performance Management

Slide 18

Slide 18 text

可觀測性平台 - Grafana Grafana 檢視 Log

Slide 19

Slide 19 text

可觀測性平台 - Grafana Grafana 檢視 Trace

Slide 20

Slide 20 text

可觀測性平台 - Grafana • ⽀援各種不同的資料來源(Data Source),e.g. Prometheus、Loki、 Tempo、PostgreSQL、Jaeger、Google Sheet 圖⽚來源:Grafana

Slide 21

Slide 21 text

Cloud Native Computing Foundation (CNCF) • 2015 年成⽴,Linus Foundation 旗下的⼦基⾦會 • 推廣與促進 Cloud Native 相關技術與專案,倡導開放性、中⽴性 • CNCF Project • 所有權屬於 CNCF,提供完整的技術、⾏銷、資安、審計⽀援 • 依成熟度度分級:Sandbox、Incubating 、Graduated • CNCF Member • AWC、Google Cloud、Grafana Labs、Microsoft Azure、Oracle、IBM、 Red Hat、VMware 等

Slide 22

Slide 22 text

Data Flow

Slide 23

Slide 23 text

可觀測性平台 Data Flow

Slide 24

Slide 24 text

Data Flow ⽣成 收集 儲存 使⽤ 資訊處理四步驟

Slide 25

Slide 25 text

Metrics

Slide 26

Slide 26 text

有在收集 Metrics 嗎? 有不是⽤ Prometheus 的嗎?

Slide 27

Slide 27 text

Metrics - Prometheus • Prometheus • 監控(Monitoring)與告警(Alerting)⼯具 • 2012 年應 Sound Cloud 內部監控需求開發 • 2016 年成為 CNCF 的第⼆個專案 • 收集不同時間點的量化指標,將之儲存並以 PromQL 語法提供查詢 Prometheus Metrics 爬取 使⽤ PromQL查詢

Slide 28

Slide 28 text

Metrics - ⽣成:Prometheus Metrics • Metrics ⽣成 • 通⽤格式:Prometheus Metrics/OpenMetrics • 系統指標 • 機器相關的資訊,如:CPU、Memory、磁碟空間、JVM 資訊 • 產⽣指標的⼯具(Exporter) • Node Exporter、cAdvisor、JMX Exporter • 業務指標 • 應⽤、業務相關的資訊,如:Request 頻率、API 回應時間、Error Rate • 產⽣指標的⼯具 • Java Spring Boot:Spring Boot Actuator 搭配 Micrometer • 其他語⾔:Prometheus Client Library

Slide 29

Slide 29 text

Metrics - ⽣成:Prometheus Metrics container_memery_usage_bytes{name="garafna"} [value] [unix timestamp] Metrics Name Label Pair

Slide 30

Slide 30 text

Metrics - 收集與儲存:Prometheus http://app-a: 8 0 0 0 /metrics Scrape

Slide 31

Slide 31 text

Metrics - 收集與儲存:Prometheus Prometheus Web UI 可以查看設定爬取的⽬標與爬取狀況

Slide 32

Slide 32 text

Metrics - 使⽤:Prometheus Web UI 使⽤ Prometheus Web UI 查詢 Metrics

Slide 33

Slide 33 text

Metrics - 使⽤:Prometheus with Grafana Prometheus Data Source 設定

Slide 34

Slide 34 text

Metrics - 使⽤:Prometheus with Grafana 展開選單選擇 Explore 左上選擇⽬標 Data Source 進⾏查詢

Slide 35

Slide 35 text

Metrics - 使⽤:Prometheus with Grafana

Slide 36

Slide 36 text

Metrics - Data Flow ⽣成 收集 儲存 使⽤

Slide 37

Slide 37 text

Hands-on - Lab 0 • GitHub Repo 連結 • ⽬標 • 透過 Prometheus、Grafana、cAdvisor 監控 Docker Container 與 Spring Boot App、 FastAPI App 的 Metrics • 任務 • Task 1 : 增加 Prometheus 爬取的⽬標,app-b, app-c • Task 2 : 使⽤ PromQL 語法於 Grafana 或 Prometheus UI 查詢 app-a 的 Container 記憶 體使⽤量 • Task 3 : 使⽤ PromQL 語法於 Grafana 或 Prometheus UI 查詢 app-c 的 JVM 記憶體使 ⽤量

Slide 38

Slide 38 text

Logs

Slide 39

Slide 39 text

Logs - ⽣成 • 內容 • 時間、Level、其他補充資訊 • 格式 • ⾮結構化 • ⼀般搭配 Log Pattern,例如 %d{yyyy-MM-dd HH:mm:ss} [%- 5 p] [%c] [%t] %m%n • 結構化 • JSON • Logfmt • time=" 2 0 2 1 - 0 9 - 1 9 1 5 : 0 0 : 0 0 " level="INFO" logger="main" message="Hello World!" • ⽅式 • Console:通過 STDOUT 或 STDERR 輸出⾄ Console • File:記錄在檔案中,可能搭配 Rotate 進⾏檔案管理 • Stream:透過網路傳輸,直接將 Log 輸出⾄儲存 Log 的服務

Slide 40

Slide 40 text

Logs - ⽣成 • Container 的輸出在 Console 的 stdout 與 stderr 都會被⾃動儲存 • Docker:/var/lib/docker/containers/ • Podman:/var/lib/containers/storage/ • containerd:/var/lib/containerd/ • CRI-O:/var/log/pods/ 或 /var/log/containers/

Slide 41

Slide 41 text

使⽤哪些 Logs ⼯具?

Slide 42

Slide 42 text

Logs - 收集與儲存:Loki & Promtail • Loki • Grafana Labs 開源的 Log 儲存與查詢⼯具 • 借鑑 Prometheus,只針對時間與 Label 建⽴索引 • 借鑑 PromQL,設計 LogQL 供查詢 Log • 簡單易⽤,就像是使⽤ Ctrl + F / CMD + F ⼀樣 • Promtail • 專為 Loki 設計的 Log 收集器,爬取 Log 後推送⾄ Loki 儲存 • 借鑑 Prometheus 爬取設定的⽅式

Slide 43

Slide 43 text

Logs - 收集與儲存:Loki & Promtail Push Scrape Promtail 負責爬取 Log 後推送⾄ Loki

Slide 44

Slide 44 text

Logs - 使⽤:Loki with Grafana Loki Data Source 設定

Slide 45

Slide 45 text

Logs - 使⽤:Loki with Grafana 查詢後可以利⽤ Show Context 查詢上下⽂

Slide 46

Slide 46 text

Logs - 使⽤:Loki with Grafana 查詢後可以利⽤ Show Context 查詢上下⽂

Slide 47

Slide 47 text

Logs - Data Flow ⽣成 收集 儲存 使⽤

Slide 48

Slide 48 text

Traces

Slide 49

Slide 49 text

使⽤哪些 Trace ⼯具? 有已經導⼊ OpenTelemetry 的嗎?

Slide 50

Slide 50 text

Traces(Distributed Tracing) • ⽤於監控跨服務請求,透過統⼀的 Trace ID 串聯,紀錄同⼀個⾏為在不同服 務間的歷程資訊,例如:執⾏時間、錯誤訊息、請求來源 IP、SQL 語法等

Slide 51

Slide 51 text

Traces - OpenTelemetry • OpenTelemetry • A collection of APIs, SDKs, and tools to process telemetry data(traces, logs, metrics). • CNCF Incubating Project, 2 0 1 9 年由 OpenTracing 與 OpenCensus 合併⽽成 • OpenTelemetry Protocol(OTLP) ⽬前已經有多達 50 家廠商⽀援 API SDK Collector 資料格式(OTLP) 傳輸⽅式(HTTP、gRPC) 開發⼯具 Telemetry Data 收集器

Slide 52

Slide 52 text

Traces - ⽣成:OpenTelemetry Instrumentation • Instrumentation • Manual ⼿動設定:搭配 SDK ⾃⾏調整程式 • Python:Instrumentaion • Automatic ⾃動設定:搭配語⾔、框架的機制,⾃動注⼊到程式中,無須 調整程式碼,但仍可搭配 SDK 進⾏額外客製 Python 與 Java 使⽤ Automatic Instrumentation 範例

Slide 53

Slide 53 text

Traces - ⽣成:OpenTelemetry Instrumentation 以 Java 的 Automatic Instrumentation 為例,使⽤後 會⾃動紀錄進出該服務的 HTTP 與資料庫等網路請求

Slide 54

Slide 54 text

Traces - ⽣成:OpenTelemetry Instrumentation HTTP Request,紀錄 URL、IP 、Status Code等資訊

Slide 55

Slide 55 text

Traces - ⽣成:OpenTelemetry Instrumentation DB 操作,紀錄 SQL、Table 名稱等資訊

Slide 56

Slide 56 text

Traces - ⽣成:OpenTelemetry Instrumentation Redis 操作,紀錄 Redis 資訊、指令等資訊

Slide 57

Slide 57 text

Traces - ⽣成:OpenTelemetry Instrumentation • 搭配 Instrumentation 與 SDK,Application 可以取得 Trace 資訊注⼊ Log 中 • Java:搭配 Log 4 j、Logback 應⽤ MDC 機制注⼊ • Python:搭配 Logging Instrumentation 帶有 Trace 與 Span 資訊的 Log

Slide 58

Slide 58 text

Traces - 收集與儲存:Tempo • Tempo • Grafana Labs 開源的 Distributed Tracing 儲存後端 • ⽀援 OpenTelemetry、Jaeger、Zipkin

Slide 59

Slide 59 text

Traces - 使⽤:Tempo with Grafana Tempo Data Source 設定

Slide 60

Slide 60 text

Traces - 使⽤:Tempo with Grafana Grafana 查詢 Tempo 範例

Slide 61

Slide 61 text

Traces - 使⽤:Tempo with Grafana Tempo 也能⽣成服務拓樸圖與 RED Metrics(介紹⽂章)

Slide 62

Slide 62 text

Traces - Data Flow ⽣成 儲存 使⽤

Slide 63

Slide 63 text

可觀測性平台 Data Flow

Slide 64

Slide 64 text

Hands-on - Lab 1 • GitHub Repo 連結 • ⽬標 • 將 Promtail、Loki、Tempo 串連⾄ Lab 0 的架構中 • 任務 • Task 1 : 開啟 http://localhost: 8 0 0 0 後,查詢 App A 的 Log • Task 2 : 開啟 http://localhost: 8 0 8 0 /chain 後,查詢 App C 該筆 Request 的 Trace • Task 3 : 透過 App C 的 Swagger UI http://localhost: 8 0 8 0 /swagger-ui/index.html 執⾏ POST /peanuts ⼀次建⽴⾓⾊,再執⾏ GET /peanuts/ 0 兩次,查詢 App C 這三筆 Request 的 Trace

Slide 65

Slide 65 text

Signal Correlation

Slide 66

Slide 66 text

Signal Correlation 圖⽚來源:CNCF Observability Whitepaper 可觀測資訊彼此間是有關係的,例如時間區段、Trace ID

Slide 67

Slide 67 text

Correlation - Grafana Exemplar 時間區段同步 Trace ID 連結

Slide 68

Slide 68 text

Correlation - Metrics vs Logs 利⽤同步時間功能同時查詢 Metrics 與 Logs

Slide 69

Slide 69 text

Correlation - Metrics to Traces with Exemplar • Exemplar 是 OpenMetrics 新增加的資料型態,能夠將特定⼀筆的 Metrics 值 紀錄於 Metrics 後,並加上其他資訊,如 Trace ID • Prometheus 已經⽀援 OpenMetrics,但需額外設定啟⽤儲存 Exemplar 功 能,Prometheus 才會儲存爬取到的 Exemplar 資料 OpenMetrics 中的 Exemplar

Slide 70

Slide 70 text

Correlation - Metrics to Traces with Exemplar Prometheus Data Source 設定 設定 Trace ID 在 Exemplar 中的 Label 並指定連結的 Trace Data Backend 查詢時必須開啟 Exemplars

Slide 71

Slide 71 text

Correlation - Metrics to Traces with Exemplar

Slide 72

Slide 72 text

Correlation - Traces vs Logs • Traces 與 Logs 彼此透過 Trace ID 進⾏連結 Loki Data Source 設定 使⽤正規表⽰式取出 Log 中的 Trace ID Tempo Data Source 設定 將 Span 中的資訊作為 Loki Label 查詢條件 Trace ID 作為內容篩選條件

Slide 73

Slide 73 text

Correlation - Traces vs Logs 點擊 Span 右側的 Log ICON 可查詢對應 Log

Slide 74

Slide 74 text

Correlation - Traces vs Logs 展開 Log 明細點擊連結可查看該筆 Trace

Slide 75

Slide 75 text

Hands-on - Lab 2 • GitHub Repo 連結 • ⽬標 • 根據 Lab 1 架構,將 Prometheus、Loki、Tempo 資料源透過 Grafana 的設定互相串連

Slide 76

Slide 76 text

More Components

Slide 77

Slide 77 text

More Components • CNCF Landscape 羅列各種 Cloud Native 相關 Project

Slide 78

Slide 78 text

Prometheus 的潛在問題 • ⻑期儲存與可擴展性問題 • 官⽅⽂件中寫到當資料量超過千萬筆或需要⻑期儲存時,建 議搭配其他儲存服務 • 多個 Prometheus 不易查詢 • 在網路控管嚴格的組織中,不同環境網路不互通,不同環境 需要各⾃獨⽴的 Prometheus • 有多座 Kubernetes Cluster 時,都有各⾃獨⽴的 Prometheus

Slide 79

Slide 79 text

有已經導⼊ Prometheus 儲存服務的嗎?

Slide 80

Slide 80 text

Mimir • Grafana Labs 開源的 Prometheus 儲存⽅案 • 良好的可擴展性,查詢快速 • 透過 Prometheus 的 Remote Write 功能彙整⾄ Mimir • API 與 Prometheus ⼀致,使⽤ PromQL 查詢

Slide 81

Slide 81 text

Mimir 在 Prometheus 設定檔中指定將 Metrics 同時寫出到 Mimir

Slide 82

Slide 82 text

Mimir Mimir Data Source 設定,⼀樣使⽤ Prometheus

Slide 83

Slide 83 text

Mimir - Data Flow ⽣成 收集 儲存 使⽤

Slide 84

Slide 84 text

可觀測性平台 Data Flow

Slide 85

Slide 85 text

LGTM Stack 圖⽚來源:Grafana

Slide 86

Slide 86 text

如果 Prometheus 只是負責爬取,那還需要完整的 Prometheus 嗎?

Slide 87

Slide 87 text

Grafana Agent • Grafana Labs 開源的資料收集器 • 可收集 Metrics、Traces、Logs 再轉發⾄儲存資訊的服務

Slide 88

Slide 88 text

Grafana Agent Metrics Grafana Agent 爬取 Metrics 的設定檔

Slide 89

Slide 89 text

Grafana Agent - Data Flow ⽣成 收集 儲存 使⽤

Slide 90

Slide 90 text

OpenTelemetry Collector(OTEL Collector) • Telemetry Data(traces, logs, metrics) 收集器 • 資訊收集與 Data Backend 解耦 • 豐富的輸⼊、處理、輸出 Plugin 可以使⽤ • 分有 Core 版本與 Contrib 版本, Contrib 版本有較多 Plugin Application/Data Data Backend Data Backend OTEL Collector Application/Data

Slide 91

Slide 91 text

OpenTelemetry Collector ⽣成 收集(處理、加⼯) 儲存

Slide 92

Slide 92 text

OpenTelemetry Collector OTLP Jaeger Batch Filter OTLP Prometheus Loki

Slide 93

Slide 93 text

OpenTelemetry Collector 定義元件 使⽤元件

Slide 94

Slide 94 text

OpenTelemetry Collector - Data Flow ⽣成 收集 儲存 使⽤

Slide 95

Slide 95 text

Hands-on - Lab 3 、Lab 4 • Lab 3 • GitHub Repo 連結 • ⽬標 • 將 Mimir 串連⾄ Lab 2 的 架構中 • Lab 4 • GitHub Repo 連結 • ⽬標 • 將 OpenTelemetry Collector 串連⾄ Lab 3 的架構中,並以 Grafana Agent 取代 Prometheus

Slide 96

Slide 96 text

可觀測性平台 Data Flow

Slide 97

Slide 97 text

OTEL Collector Span Metrics

Slide 98

Slide 98 text

OTEL Collector Span Metrics 你也有祖傳⼗⼋代的系統嗎?

Slide 99

Slide 99 text

OTEL Collector Span Metrics

Slide 100

Slide 100 text

OTEL Collector Span Metrics

Slide 101

Slide 101 text

OTEL Collector Span Metrics 祖傳系統(Legacy System)沒有辦法增加 Metrics 透過 OpenTelemetry Collector 的 Span Metrics Connector 從 Trace 產出 OpenTelemetry Automatic Instrumentation 解析 Trace 資訊⽣成 Request 相關 Metrics Scrape Push

Slide 102

Slide 102 text

OTEL Collector Span Metrics

Slide 103

Slide 103 text

OTEL Collector Span Metrics - Data Flow

Slide 104

Slide 104 text

Hands-on - Lab 5 • GitHub Repo 連結 • ⽬標 • 利⽤ OpenTelemetry Collector Span Metrics Connector 將 Span 轉換為 Metrics,並透過 Prometheus 爬取收集

Slide 105

Slide 105 text

Recap & Takeaway

Slide 106

Slide 106 text

Recap • 透過各種資訊,清楚了解系統狀態 • 資訊的⽣成、收集、儲存、使⽤ • 單⼀平台,建⽴關聯,產⽣綜效 • 有各種不同⼯具,可依需求搭配 • Mimir、Grafana Agent、 OpenTelemetry Collector etc.

Slide 107

Slide 107 text

Takeaway • Why You Need Observability/Observability Platform • 減少問題診斷與修復問題的時間 • Lab Level 的可觀測平台 POC 效益 • 快速驗證是否對你的團隊有幫助,思考是否要投注更多資源 • 你還有更多選擇 • 了解資料流,搭配出適合組織的 Stack • 避免 Vendor Locking(養套殺)

Slide 108

Slide 108 text

延伸閱讀 • iThome 鐵⼈賽 • 時光之鏡:透視過去、現在與未來的 Observability:Observability 概 念、⼯具與應⽤介紹 • 你以為你在學 Grafana 其實你建⽴了 Kubernetes 可觀測性宇宙:LGTM Stack • 淺談DevOps與Observability:Observability ⼯具與概介紹 • Grafana 全家桶,如何打造⾼可⽤且具可擴充性的 o 1 1 y 平台 • LINE TECHPULSE 2 0 2 2 - Implementing Observability Practices on Kubernetes • Observability Conference 2 0 2 3

Slide 109

Slide 109 text

延伸閱讀 • Prometheus: The Documentary - Prometheus 紀錄⽚ • Demo Project • FastAPI Observability • Spring Boot Observability • FastAPI Tracing with Jaeger through OpenTelemetry • OpenTelemetry Application Performance Management