
一 前言

二 IT系統的可觀測性
-
系統更加的複雜:以前的汽車只需要一個發動機、傳送帶、車輛、剎車就可以跑起來,現在隨便一個汽車上至少有上百個部件和系統,故障的定位難度變的更大。
-
開發涉及更多的人:隨著全球化時代的到來,公司、部分的分工也越來越細,也就意味著系統的開發和維護需要更多的部門和人來共同完成,協調的代價也越來越大。
-
執行環境多種多樣:不同的執行環境下,每個系統的工作情況是變化的,我們需要在任何階段都能有效記錄好系統的狀態,便於我們分析問題、最佳化產品。



三 IT可觀測性的演進

-
IT運維場景:IT運維場景從橫向、縱向來看,觀察的目標從最基礎的機房、網路等開始向用戶的端上發展;觀察的場景也從純粹的錯誤、慢請求等發展為使用者的實際產品體驗。 -
通用場景:觀測本質上是一個通用的行為,除了運維場景外,對於公司的安全、使用者行為、運營增長、交易等都適用,我們可以針對這些場景構建例如攻擊檢測、攻擊溯源、ABTest、廣告效果分析等應用形式。 -
特殊場景:除了場景的公司內通用場景外,針對不同的行業屬性,也可以衍生出特定行業的觀測場景與應用,例如阿里雲的城市大腦,就是透過觀測道路擁堵、訊號燈、交通事故等資訊,透過控制不同紅綠燈時間、出行規劃等手段降低城市整體擁堵率。
四 Pragmatic可觀測性如何落地

-
資料的覆蓋面足夠的全:能夠包括各類不同場景的不同型別的資料,除了狹義的日誌、監控、Trace外,還需要包括我們的CMDB、變更資料、客戶資訊、訂單/交易資訊、網路流、API呼叫等 -
資料關聯與統一分析:資料價值的發掘不是簡單的透過一種資料來實現,更多的時候我們需要利用多種資料關聯來達到目的,例如結合使用者的資訊表以及訪問日誌,我們可以分析不同年齡段、性別的使用者的行為特點,針對性的進行推薦;透過登入日誌、CMDB等,結合規則引擎,來實現安全類的攻擊檢測。

-
感測器:獲取資料的前提是要有足夠感測器來產生資料,這些感測器在IT領域的形態有:SDK、埋點、外部探針等。 -
資料:感測器產生資料後,我們需要有足夠的能力去獲取、收集各種型別的資料,並把這些資料歸類分析。 -
算力:可觀測場景的核心是需要覆蓋足夠多的資料,資料一定是海量的,因此係統需要有足夠的算力來計算和分析這些資料。 -
演算法:可觀測場景的終極應用是資料的價值發掘,因此需要使用到各類演算法,包括一些基礎的數值類演算法、各種AIOps相關的演算法以及這些演算法的組合。
五 再論可觀測性資料分類

-
Logs:我們對於Logs是更加寬泛的定義:記錄事/物變化的載體,對於常見的訪問日誌、交易日誌、核心日誌等文字型以及包括GPS、音影片等泛型資料也包含在其中。日誌在呼叫鏈場景結構化後其實可以轉變為Trace,在進行聚合、降取樣操作後會變成Metrics。
-
Metrics:是聚合後的數值,相對比較離散,一般有name、labels、time、values組成,Metrics資料量一般很小,相對成本更低,查詢的速度比較快。
-
Traces:是最標準的呼叫日誌,除了定義了呼叫的父子關係外(一般透過TraceID、SpanID、ParentSpanID),一般還會定義操作的服務、方法、屬性、狀態、耗時等詳細資訊,透過Trace能夠代替一部分Logs的功能,透過Trace的聚合也能得到每個服務、方法的Metrics指標。
六 “割裂”的可觀測性方案

-
Metrics:Zabbix、Nagios、Prometheus、InfluxDB、OpenFalcon、OpenCensus -
Traces:Jaeger、Zipkin、SkyWalking、OpenTracing、OpenCensus -
Logs:ELK、Splunk、SumoLogic、Loki、Loggly
-
多套方案交織:可能要使用至少Metrics、Logging、Tracing3種方案,維護代價巨大 -
資料不互通:雖然是同一個業務元件,同一個系統,產生的資料由於在不同的方案中,資料難以互通,無法充分發揮資料價值

七 可觀測性資料引擎架構
-
資料全面覆蓋:包括各類的可觀測資料以及支援從各個端、系統中採集資料 -
統一的系統:拒絕割裂,能夠在一個系統中支援Traces、Metrics、Logs的統一儲存與分析 -
資料可關聯:每種資料內部可以互相關聯,也支援跨資料型別的關聯,能夠用一套分析語言把各類資料進行融合分析 -
足夠的算力:分散式、可擴充套件,面對PB級的資料,也能有足夠的算力去分析 -
靈活智慧的演算法:除了基礎的演算法外,還應包括AIOps相關的異常檢測、預測類的演算法,並且支援對這些演算法進行編排
-
感測器:資料來源以OpenTelemetry為核心,並且支援各類資料形態、裝置/端、資料格式的採集,覆蓋面足夠的“廣”。
-
資料+算力:採集上來的資料,首先會進入到我們的管道系統(類似於Kafka),根據不同的資料型別構建不同的索引,目前每天我們的平臺會有幾十PB的新資料寫入並存儲下。除了常見的查詢和分析能力外,我們還內建了ETL的功能,負責對資料進行清洗和格式化,同時支援對接外部的流計算和離線計算系統。
-
演算法:除了基礎的數值演算法外,目前我們支援了十多種的異常檢測/預測演算法,並且還支援流式異常檢測;同時也支援使用Scheduled SQL進行資料的編排,幫助我們產生更多新的資料。
-
價值發掘:價值發掘過程主要透過視覺化、告警、互動式分析等人機互動來實現,同時也提供了OpenAPI來對接外部系統或者供使用者來實現一些自定義的功能。

八 資料來源與協議相容

-
Traces:除了內部的飛天Trace、鷹眼Trace外,開源的包括Jaeger、OpenTracing、Zipkin、SkyWalking、OpenTelemetry、OpenCensus等。
-
Logs:Logs的協議較少,但是設計比較多的日誌採集Agent,我們平臺除了自研的Logtail外,還相容包括Logstash、Beats(FileBeat、AuditBeat)、Fluentd、Fluent bits,同時還提供syslog協議,路由器交換機等可以直接用syslog協議上報資料到服務端。
-
Metrics:時序引擎我們在新版本設計之初就相容了Prometheus,並且支援Telegraf、OpenFalcon、OpenTelemetry Metrics、Zabbix等資料接入。
九 統一儲存引擎

-
Logs/Traces:
-
查詢的方式主要是透過關鍵詞/TraceID進行查詢,另外會根據某些Tag進行過濾,例如hostname、region、app等
-
每次查詢的命中數相對較少,尤其是TraceID的查詢方式,而且命中的資料極有可能是離散的
-
通常這類資料最適合儲存在搜尋引擎中,其中最核心的技術是倒排索引
-
Metrics:
-
通常都是range查詢,每次查詢某一個單一的指標/時間線,或者一組時間線進行聚合,例如統一某個應用所有機器的平均CPU
-
時序類的查詢一般QPS都較高(主要有很多告警規則),為了適應高QPS查詢,需要把資料的聚合性做好
-
對於這類資料都會有專門的時序引擎來支撐,目前主流的時序引擎基本上都是用類似於LSM Tree的思想來實現,以適應高吞吐的寫入和查詢(Update、Delete操作很少)

-
接入層支援各類協議寫入,寫入的資料首先會進入到一個FIFO的管道中,類似於Kafka的MQ模型,並且支援資料消費,用來對接各類下游 -
在管道之上有兩套索引結構,分別是倒排索引以及SortedTable,分別為Traces/Logs和Metrics提供快速的查詢能力 -
兩套索引除了結構不同外,其他各類機制都是共用的,例如儲存引擎、FailOver邏輯、快取策略、冷熱資料分層策略等 -
上述這些資料都在同一個程序內實現,大大降低運維、部署代價 -
整個儲存引擎基於純分散式框架實現,支援橫向擴充套件,單個Store最多支援日PB級的資料寫入
十 統一分析引擎

-
Metrics:通常用於告警和圖形化展示,一般直接獲取或者輔以簡單的計算,例如PromQL、TSQL等 -
Traces/Logs:最簡單直接的方式是關鍵詞的查詢,包括TraceID查詢也只是關鍵詞查詢的特例 -
資料分析(一般針對Traces、Logs):通常Traces、Logs還會用於資料分析和挖掘,所以要使用圖靈完備的語言,一般程式設計師接受最廣的是SQL

-
背景:線上發現有支付失敗的錯誤,需要分析這些出現支付失敗的錯誤的機器CPU指標有沒有問題
-
實現
-
首先查詢機器的CPU指標 -
關聯機器的Region資訊(需要排查是否某個Region出現問題) -
和日誌中出現支付失敗的機器進行Join,只關心這些機器 -
最後應用時序異常檢測演算法來快速的分析這些機器的CPU指標 -
最後的結果使用線圖進行視覺化,結果展示更加直觀

十一 資料編排

-
資料加工:也就是大資料ETL(extract, transform, and load)中T的功能,能夠幫我們把非結構化、半結構化的資料處理成結構化的資料,更加容易分析。 -
Scheduled SQL:顧名思義,就是定期執行的SQL,核心思想是把龐大的資料精簡化,更加利於查詢,例如透過AccessLog每分鐘定期計算網站的訪問請求、按APP、Region粒度聚合CPU、記憶體指標、定期計算Trace拓撲等。 -
AIOps巡檢:針對時序資料特別開發的基於時序異常演算法的巡檢能力,用機器和算力幫我們去檢查到底是哪個指標的哪個維度出現問題。
十二 可觀測性引擎應用實踐
1 全鏈路可觀測
-
資料來源包括移動端、Web端、後端的各類資料,同時還包括一些監控系統的資料、第三方的資料等 -
採集透過SLS的Logtail和TLog實現 -
基於離線上混合的資料處理方式,對資料進行打標、過濾、關聯、分發等預處理 -
各類資料全部儲存在SLS可觀測資料引擎中,主要利用SLS提供的索引、查詢和聚合分析能力 -
上層基於SLS的介面構建全鏈路的資料展示和監控系統

2 成本可觀測
-
收集雲上每個產品(虛擬機器、網路、儲存、資料庫、SaaS類等)的費用,包括詳細的計費資訊 -
收集每個產品的監控資訊,包括用量、利用率等 -
建立起Catalog/CMDB,包括每個資源/例項所屬的業務部門、團隊、用途等

3 Trace可觀測
-
依賴關係:這是絕大部分的Trace系統都會附帶的功能,基於Trace中的父子關係進行聚合計算,得到Trace Dependency -
服務/介面黃金指標:Trace中記錄了服務/介面的呼叫延遲、狀態碼等資訊,基於這些資料可以計算出QPS、延遲、錯誤率等黃金指標。 -
上下游分析:基於計算的Dependency資訊,按照某個Service進行聚合,統一Service依賴的上下游的指標 -
中介軟體分析:Trace中對於中介軟體(資料庫/MQ等)的呼叫一般都會記錄成一個個Span,基於這些Span的統計可以得到中介軟體的QPS、延遲、錯誤率。 -
告警相關:通常基於服務/介面的黃金指標設定監控和告警,也可以只關心整體服務入口的告警(一般對父Span為空的Span認為是服務入口呼叫)。

4 基於編排的根因分析

-
關聯關係:透過Trace可以計算出APP/服務之間的依賴關係;透過CMDB資訊可以得到APP和PaaS、IaaS之間的依賴關係。透過關聯關係就可以“順藤摸瓜”,找到出現問題的原因。 -
時序異常檢測演算法:自動檢測某一條、某組曲線是否有異常,包括ARMA、KSigma、Time2Graph等,詳細的演算法可以參考:異常檢測演算法、流式異常檢測。 -
日誌聚類分析:將相似度高的日誌聚合,提取共同的日誌模式(Pattern),快速掌握日誌全貌,同時利用Pattern的對比功能,對比正常/異常時間段的Pattern,快速找到日誌中的異常。


十三 寫在最後
-
讓系統更加穩定,使用者體驗更好 -
觀察IT支出,消除不合理的使用,節省更多的成本 -
觀察交易行為,找到刷單/作弊,即使止損 -
利用AIOps等自動化手段發現問題,節省更多的人力,運維提效
《看見新力量》第二期免費下載!帶你走進數十位科技創業者背後的故事
這是一本正在進行中的科技創業者的記錄,書中涉及的創業者還都奔跑在路上。然而,他們的所思所做,已足以令一些產業發生微小而有效的變化,令數字經濟時代下人們的生活變得更加智慧。阿里雲創新中心作為科技創業者堅定的陪伴者,希望能夠透過記錄的方式,讓大家聽到創業者真實的聲音,看見科技創新的力量。點選閱讀原文檢視詳情!
關鍵詞
系統
可觀測
可觀測性
能力
資訊