Upgrade to Pro — share decks privately, control downloads, hide ads and more …

從零開始打造可觀測性平台

Blueswen
November 09, 2023

 從零開始打造可觀測性平台

MWC 2023 Workshop - 從零開始打造可觀測性平台
Lab: https://github.com/blueswen/observability-workshop-101

Blueswen

November 09, 2023
Tweet

More Decks by Blueswen

Other Decks in Programming

Transcript

  1. MWC 2 0 2 3 ( 2 0 2 3

    / 1 1 / 0 9 ) 劉義瑋 Blueswen 從零開始打造可觀測性平台
  2. ⾃介  • 劉義瑋 Blueswen • blueswen @ GitHub •

    國泰⼈壽 投資資訊部 DevOps Team • 偶爾做做 ML 專案的 DevOps ⼯程師 • 負責導⼊可觀測性與觀測平台 • 領域 • DevOps • Cloud Native • Machine Learning
  3. 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
  4. ⽬標  • 瞭解 Logs、Metrics、Traces 的⽣成、收集、儲存、使⽤共四個 階段的處理⽅式 • 使⽤ Docker

    Compose 建⽴的簡易可觀測性平台,釐清資料傳 遞⽅式與各⾃元件的⽤途 • 學習在 Grafana 中交互應⽤ Logs、Metrics、Traces 三種資訊
  5. 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 建⽴網路通道即可繞過
  6. 可觀測性介紹  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 時間、記憶體、磁碟空間、延 遲、錯誤等來衡量。系統的可觀測性越⾼,越容易通過觀察來理解它的運 ⾏情況。
  7. 可觀測性資訊  指標 不同時間採樣的系統量化指標 如:CPU 使⽤率、API 回應時間 ⽇誌 紀錄系統中發⽣的事情 如:Debug

    訊息、Exception 分散式追蹤 紀錄⾏為在不同服務中的歷程 如:SSO ⾏為橫跨多個服務
  8. 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 等
  9. Metrics - Prometheus  • Prometheus • 監控(Monitoring)與告警(Alerting)⼯具 • 2012

    年應 Sound Cloud 內部監控需求開發 • 2016 年成為 CNCF 的第⼆個專案 • 收集不同時間點的量化指標,將之儲存並以 PromQL 語法提供查詢 Prometheus Metrics 爬取 使⽤ PromQL查詢
  10. 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
  11. 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 記憶體使 ⽤量
  12. 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 的服務
  13. 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/
  14. Logs - 收集與儲存:Loki & Promtail  • Loki • Grafana

    Labs 開源的 Log 儲存與查詢⼯具 • 借鑑 Prometheus,只針對時間與 Label 建⽴索引 • 借鑑 PromQL,設計 LogQL 供查詢 Log • 簡單易⽤,就像是使⽤ Ctrl + F / CMD + F ⼀樣 • Promtail • 專為 Loki 設計的 Log 收集器,爬取 Log 後推送⾄ Loki 儲存 • 借鑑 Prometheus 爬取設定的⽅式
  15. 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 收集器
  16. Traces - ⽣成:OpenTelemetry Instrumentation  • Instrumentation • Manual ⼿動設定:搭配

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

    為例,使⽤後 會⾃動紀錄進出該服務的 HTTP 與資料庫等網路請求
  18. Traces - ⽣成:OpenTelemetry Instrumentation  • 搭配 Instrumentation 與 SDK,Application

    可以取得 Trace 資訊注⼊ Log 中 • Java:搭配 Log 4 j、Logback 應⽤ MDC 機制注⼊ • Python:搭配 Logging Instrumentation 帶有 Trace 與 Span 資訊的 Log
  19. Traces - 收集與儲存:Tempo  • Tempo • Grafana Labs 開源的

    Distributed Tracing 儲存後端 • ⽀援 OpenTelemetry、Jaeger、Zipkin
  20. 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
  21. Correlation - Metrics to Traces with Exemplar  • Exemplar

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

    Source 設定 設定 Trace ID 在 Exemplar 中的 Label 並指定連結的 Trace Data Backend 查詢時必須開啟 Exemplars
  23. Correlation - Traces vs Logs  • Traces 與 Logs

    彼此透過 Trace ID 進⾏連結 Loki Data Source 設定 使⽤正規表⽰式取出 Log 中的 Trace ID Tempo Data Source 設定 將 Span 中的資訊作為 Loki Label 查詢條件 Trace ID 作為內容篩選條件
  24. Hands-on - Lab 2  • GitHub Repo 連結 •

    ⽬標 • 根據 Lab 1 架構,將 Prometheus、Loki、Tempo 資料源透過 Grafana 的設定互相串連
  25. Prometheus 的潛在問題  • ⻑期儲存與可擴展性問題 • 官⽅⽂件中寫到當資料量超過千萬筆或需要⻑期儲存時,建 議搭配其他儲存服務 • 多個

    Prometheus 不易查詢 • 在網路控管嚴格的組織中,不同環境網路不互通,不同環境 需要各⾃獨⽴的 Prometheus • 有多座 Kubernetes Cluster 時,都有各⾃獨⽴的 Prometheus
  26. Mimir  • Grafana Labs 開源的 Prometheus 儲存⽅案 • 良好的可擴展性,查詢快速

    • 透過 Prometheus 的 Remote Write 功能彙整⾄ Mimir • API 與 Prometheus ⼀致,使⽤ PromQL 查詢
  27. 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
  28. Hands-on - Lab 3 、Lab 4  • Lab 3

    • GitHub Repo 連結 • ⽬標 • 將 Mimir 串連⾄ Lab 2 的 架構中 • Lab 4 • GitHub Repo 連結 • ⽬標 • 將 OpenTelemetry Collector 串連⾄ Lab 3 的架構中,並以 Grafana Agent 取代 Prometheus
  29. OTEL Collector Span Metrics  祖傳系統(Legacy System)沒有辦法增加 Metrics 透過 OpenTelemetry

    Collector 的 Span Metrics Connector 從 Trace 產出 OpenTelemetry Automatic Instrumentation 解析 Trace 資訊⽣成 Request 相關 Metrics Scrape Push
  30. Hands-on - Lab 5  • GitHub Repo 連結 •

    ⽬標 • 利⽤ OpenTelemetry Collector Span Metrics Connector 將 Span 轉換為 Metrics,並透過 Prometheus 爬取收集
  31. Takeaway  • Why You Need Observability/Observability Platform • 減少問題診斷與修復問題的時間

    • Lab Level 的可觀測平台 POC 效益 • 快速驗證是否對你的團隊有幫助,思考是否要投注更多資源 • 你還有更多選擇 • 了解資料流,搭配出適合組織的 Stack • 避免 Vendor Locking(養套殺)
  32. 延伸閱讀  • 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
  33. 延伸閱讀  • Prometheus: The Documentary - Prometheus 紀錄⽚ •

    Demo Project • FastAPI Observability • Spring Boot Observability • FastAPI Tracing with Jaeger through OpenTelemetry • OpenTelemetry Application Performance Management