一文帶你了解SkyWalking
Apache SkyWalking
SkyWalking是一個開源可觀測平臺,用于收集、分析、聚合和可視化來自服務和云原生基礎設施的數據。SkyWalking 提供了一種簡單的方法來保持分布式系統(tǒng)的清晰視圖,甚至跨云。它是一種現代APM,專為云原生、基于容器的分布式系統(tǒng)而設計。
文檔版本8.9.1,當前最新版本9.10
圖片
介紹
SkyWalking 是一個應用性能監(jiān)控系統(tǒng)(APM)
為微服務、云原生和基于容器(Docker, Kubernetes, Mesos)體系結構而設計,主要實現功能包括分布式追蹤,性能指標分析和服務依賴分析等
相似產品與對比
類似功能的組件還有:Zipkin、Pinpoint 、CAT、Dapper等
- Zipkin是Twitter開源的調用鏈路分析工具,目前基于Spingcloud sleuth得到了廣泛的應用,特點是輕量,部署簡單。
- 一個韓國團隊開源的產品,運用了字節(jié)碼增強技術,只需要在啟動時添加啟動參數即可,對代碼無侵入,目前支持Java和PHP語言,底層采用HBase來存儲數據,探針收集的數據- 粒度非常細,但性能損耗大,因其出現的時間較長,完成度也很高,應用的公司較多
- Skywalking是本土開源的基于字節(jié)碼注入的調用鏈路分析以及應用監(jiān)控分析工具,特點是支持多種插件,UI功能較強,接入端無代碼侵入。
- CAT是由國內美團點評開源的,基于Java語言開發(fā),目前提供Java、C/C++、Node.js、Python、Go等語言的客戶端,監(jiān)控數據會全量統(tǒng)計,國內很多公司在用,例如美團點評、攜程、拼多多等,CAT跟下邊要介紹的Zipkin都需要在應用程序中埋點,對代碼侵入性強。
Cat | Zipkin | Pinpoint | skywalking | |
依賴 | Java 6,7,8 Maven 3.2.3+ mysql5.6 Linux 2.6以及之上(2.6內核才可以支持epoll) | Java 6,7,8 Maven3.2+ rabbitMQ | Java 6,7,8 maven3+ Hbase0.94+ | Java 6,7,8 maven3.0+ nodejs zookeeper elasticsearch |
實現方式 | 代碼埋點(攔截器,注解,過濾器等) | 攔截請求,發(fā)送(http,mq)數據至zipkin服務 | java探針,字節(jié)碼增強 | java探針,字節(jié)碼增強 |
顆粒度 | 代碼級 | 接口級 | 方法級 | 方法級 |
頁面UI | ***** | ** | ***** | **** |
存儲選擇 | Mysql,hdfs | In-memory,mysql,cassandra,elasticsearch | Hbase | Elasticsearch,h2 |
通信方式 | - | http,mq | Thrift | GRPC |
MQ監(jiān)控 | 不支持 | 不支持 | 不支持 | RocketMq,kafka |
全局調用 統(tǒng)計 | 支持 | 不支持 | 支持 | 支持 |
Trace查詢 | 不持支 | 支持 | 不支持 | 支持 |
報警 | 支持 | 不支持 | 支持 | 支持 |
Jvm監(jiān)控 | 不支持 | 不支持 | 支持 | 支持 |
優(yōu)點 | 功能完善 | spring-cloud-sleuth可以很好的集成zipkin , 代碼無侵入,集成非常簡單 , 社區(qū)更加活躍。對外提供有query接口,更加容易二次開發(fā) | 完全無侵入, 僅需修改啟動方式,界面完善,功能細致。 | 完全無侵入,界面完善,支持應用拓撲圖及單個調用鏈查詢。功能比較完善(zipkin + pinpoint) |
缺點 | 代碼侵入性較強,需要埋點文檔比較混亂,文檔與發(fā)布版本的符合性較低,需要依賴點評私服 (或者需要把他私服上的jar手動下載下來,然后上傳到我們的私服上去)。 | 默認使用的是http請求向zipkin上報信息,耗性能。跟sleuth結合可以使用rabbitMQ的方式異步來做,增加了復雜度,需要引入rabbitMQ 。數據分析比較簡單。 | 不支持查詢單個調用鏈, 對外表現的是整個應用的調用生態(tài)。二次開發(fā)難度較高 | 3.2版本之前BUG較多 ,網上反映兼容性較差 . 3.2新版本的反映情況較少依賴較多。 |
文檔 | 網上資料較少,僅官網提供的文檔,比較亂 | 文檔完善 | 文檔完善 | 文檔完善 |
開發(fā)者 | 大眾點評 | Twiter | Naver | 吳晟(華為開發(fā)者) ,目前已經加入Apache孵化器 |
使用公司 | 大眾點評,攜程,陸金所,同程旅游,獵聘網,拼多多 | Twiter | Naver | 華為,alibaba cloud,天源迪科,當當網,京東金融 |
功能
開源監(jiān)控平臺,用于從服務和云原生基礎設施收集、分析、聚合和可視化數據。SkyWalking提供了一種簡單的方法來維護分布式系統(tǒng)的清晰視圖,甚至可以跨云查看。它是一種現代APM,專門為云原生、基于容器的分布式系統(tǒng)設計
監(jiān)測對象包括:service(服務), service instance(實例), endpoint(端點)
功能描述:
- 多種監(jiān)控手段,可以通過語言探針和service mesh獲得監(jiān)控的數據
- 支持多重語言的自動探針,包括JAVA, .NET Core和NodeJS
- 輕量高效,無需大數據平臺和大量的服務器資源
- 模塊化,UI ,存儲,集群管理都有多種機制可選
- 支持告警
- 優(yōu)秀的可視化解決方案
架構
SkyWalking 在邏輯上分為四個部分:Probes、Platform backend、Storage 和 UI。
圖片
探針Probe
采集tracing(調用鏈數據)和metric(指標)信息并上報,上報通過HTTP或者gRPC方式按要求重新格式化數據發(fā)送數據到Skywalking Collector
- 自動探針:Java支持的中間件、框架與類庫列表
- 手動探針:OpenTrackingApi、@Trace注解、trackId集成到日志中。
后端Platform backend
支持數據聚合、分析和流式處理,包括跟蹤、度量和日志。
基于gRpc、Http 鏈路數據收集器,對agent傳過來的tracing和metric數據進行整合分析通過Analysis Core模塊處理并落入相關的數據存儲中,同時會通過Query Core模塊進行二次統(tǒng)計和監(jiān)控告警
數據存儲Storage
通過開放/可插入接口存儲 SkyWalking 數據,支持多種方式存儲數據 H2,ElasticSearch,MySQL, TiDB, InfluxDB或自定義
可視化平臺UI
基于GraphQL Http 高度可定制的基于 Web 的界面的可視化平臺,允許 SkyWalking 最終用戶可視化和管理。
下載安裝
下載
官方下載地址:https://skywalking.apache.org/downloads/
歷史版本下載:https://archive.apache.org/dist/skywalking/
Rocketbot-UI 8.x:https://github.com/apache/skywalking-rocketbot-ui
Booster UI 9.x:https://github.com/apache/skywalking-booster-ui
注:APM已經集成UI,不需要單獨下載與部署
Window安裝
- 安裝APM (8.9.1,h2)
- 下載apache-skywalking-apm-bin
- 解壓執(zhí)行命名 ~/bin/startup.bat
- 訪問http://localhost:8080
圖片
Docker安裝
- 安裝OAP
下載鏡像
docker pull apache/skywalking-oap-server:8.9.1
啟動容器
docker run --name oap -p 12800:12800 -p 11800:11800 -p 1234:1234 --restart always -d apache/skywalking-oap-server:8.9.1
- 安裝UI
下載鏡像
docker pull apache/skywalking-ui
啟動容器
docker run --name oap-ui -p 18080:8080 --restart always -d -e SW_OAP_ADDRESS=http://localhost:12800 apache/skywalking-ui
訪問http://localhost:18080
系統(tǒng)集成
- 探針
負責進行數據的收集,包含了Tracing和Metrics的數據,agent會被安裝到服務所在的服務器上,以方便數據的獲取。探針使用gRPC協(xié)議與OAP平臺通信并上報數據。
- 可觀測性分析平臺 OAP
接收探針發(fā)送的數據,并在內存中使用分析引擎(Analysis Core)進行數據的整合運算,然后將數據存儲到對應的存儲介質上,比如 Elasticsearch、MySQL等存儲服務。同時OAP還使用查詢引擎(Query Core)提供HTTP查詢接口。OAP默認監(jiān)聽兩個端口gRPC協(xié)議端口11800、HTTP端口12800,gRPC用于探針上報數據,HTTP端口用于UI連接OAP平臺獲取數據。
- UI
Skywalking 提供單獨的UI進行數據的查看,UI調用OAP提供的接口,獲取對應的數據根據UI模板的配置進行展示。Skywalking UI與OAP之間使用Http協(xié)議進行通信。Skywalking UI默認監(jiān)聽8080端口提供Web服務。
Java Agent
- 下載:Java Agent v8.11.0
- 目錄結構
activations # 工具包,默認加載。
bootstrap-plugins # 啟動插件,默認加載。
config # 配置文件
logs # 日志
optional-plugins # 可選擴展插件,啟動不加載,如需加載將其移到到plugins目錄下。
optional-reporter-plugins # 可選統(tǒng)計類插件,啟動不加載。
plugins # 服務類插件
skywalking-agent.jar # 客戶端主程序,需要被服務啟動是引用。
- 使用:項目啟動命令添加-javaagent:/path/skywalking-agent/skywalking-agent.jar
- 示例:
java -javaagent:/path/skywalking-agent/skywalking-agent.jar -jar your-app.jar
- 配置:
- 系統(tǒng)屬性:-Dskywalking.[config]=[value]
- 代理參數: -javaagent:skywalking-agent.jar=[config]=[value],...
- 系統(tǒng)環(huán)境變量:agent.service_name=${SW_AGENT_NAME:Your_ApplicationName},如果SW_AGENT_NAME 您的操作系統(tǒng)中存在環(huán)境變量,并且其值為skywalking-agent-demo,則agent.service_name此處的值將被覆蓋為skywalking-agent-demo,否則將被設置為Your_ApplicationName。
- 修改目錄/path/skywalking-agent/config/agent.config文件
// todo
//服務名稱
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
// OAP服務地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}
代理選項 > System.Properties(-D) > 系統(tǒng)環(huán)境變量 > 配置文件
- 官方文檔
Client JavaScript
- 安裝
npm install skywalking-client-js --save
- 注冊
import ClientMonitor from 'skywalking-client-js';
// Report collected data to `http:// + window.location.host + /browser/perfData` in default
ClientMonitor.register({
collector: 'http://127.0.0.1:8080',
service: 'test-ui',
pagePath: '/current/page/name',
serviceVersion: 'v1.0.0',
});
// options
{
// 參考方法文檔
}
- 手動收集指標頁面加載時或任何其他有意義的時刻的指標,PV
register時設置autoTracePerf:false
- 調用setPerformance
import ClientMonitor from 'skywalking-client-js';
ClientMonitor.setPerformance({
collector: 'http://127.0.0.1:8080',
service: 'browser-app',
serviceVersion: '1.0.0',
pagePath: location.href,
useFmp: true
});
- SPA
register時設置enableSPA:true,開啟單頁面應用基于hashchange event觸發(fā)指標采集行為
或者通過以下方法手動處理,在上報數據時手動更新頁面名稱,當調用該方法時,默認情況下將重新報告頁面PV
app.on('routeChange', function (next) {
ClientMonitor.setPerformance({
collector: 'http://127.0.0.1:8080',
service: 'browser-app',
serviceVersion: '1.0.0',
pagePath: location.href,
useFmp: true
});
});
- 跟蹤請求數據支持跟蹤這些(XMLHttpRequest和Fetch API)兩種模式的數據請求。同時,支持基于XMLHttpRequest和fetch的跟蹤庫和工具,如Axios、SuperAgent、OpenApi等
// Angular
import { ErrorHandler } from '@angular/core';
import ClientMonitor from 'skywalking-client-js';
export class AppGlobalErrorhandler implements ErrorHandler {
handleError(error) {
ClientMonitor.reportFrameErrors({
collector: 'http://127.0.0.1',
service: 'angular-demo',
pagePath: '/app',
serviceVersion: 'v1.0.0',
}, error);
}
}
@NgModule({
...
providers: [{provide: ErrorHandler, useClass: AppGlobalErrorhandler}]
})
class AppModule {}
```
```js
// React
class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// Update state so the next render will show the fallback UI.
return { hasError: true };
}
componentDidCatch(error, errorInfo) {
// You can also log the error to an error reporting service
ClientMonitor.reportFrameErrors({
collector: 'http://127.0.0.1',
service: 'react-demo',
pagePath: '/app',
serviceVersion: 'v1.0.0',
}, error);
}
render() {
if (this.state.hasError) {
// You can render any custom fallback UI
return <h1>Something went wrong.</h1>;
}
return this.props.children;
}
}
<ErrorBoundary>
<MyWidget />
</ErrorBoundary>
```
```js
// Vue
Vue.config.errorHandler = (error) => {
ClientMonitor.reportFrameErrors({
collector: 'http://127.0.0.1',
service: 'vue-demo',
pagePath: '/app',
serviceVersion: 'v1.0.0',
}, error);
}
```
- 官方文檔
skywalking-client-js
監(jiān)測對象
- 服務(Service)
對請求提供端點的單個應用或負載,在使用埋點、代理或 SDK 的時候,你可以定義服務的名字。如果不定義的話,SkyWalking 會使用在agent.conf中配置的默認服務名稱。
- 服務實例(Instance)
服務組中的每個單獨的工作負載都稱為一個實例。就像pods在 Kubernetes 中一樣,它不需要是單個操作系統(tǒng)進程,但是,如果您使用儀器代理,則實例實際上是一個真正的操作系統(tǒng)進程。
- 端點(Endpoint)
用于傳入請求的服務中的路徑,例如 HTTP URI 路徑或 gRPC 服務類 + 方法簽名。
UI指標
通過配置文件定義需要關注的指標 通過特定的分析語言計算指標
UI包括以下幾個部分:
- 儀表盤
- 拓撲圖
- 追蹤
- 性能剖析
- 日志
- 告警
- 事件
- 調試
儀表盤
APM
- Global
Services Load(CPM / PPM):服務每分鐘請求數
Slow Services(ms):慢響應服務(按照響應時間排序)
Un-Health Services (Apdex):Apdex分數(1為滿分)
Slow Endpoints (ms):慢Endpoint的平均響應時間
Global Response Latency(percentile in ms):響應時間百分比
Global Heatmap:服務響應時間熱力分布圖,根據時間段內不同響應時間的數量顯示顏色深度顏色越深,請求越多。
- Service
- Service Apdex 數字:當前服務的Apdex分數;
- Successful Rate(%):當前服務的請求成功率;
- Service Load (CPM / PPM)數字:每分鐘調用次數(CPM),如果是TCP,表示每分鐘的數據包數(PPM);
- Service Avg Response Time(ms):當前服務平均響應時間;
- Service Apdex 折線圖:當前服務一段時間內的Apdex分數;
- Service Response Time Percentile(ms):當前服務的百分比響應延時;
- Successful Rate(%)折線圖:當前服務一段時間內的請求成功率;
- Service Load (CPM / PPM)折線圖:當前服務一段時間內的每分鐘調用次數;
- Service Throughput(Bytes):服務吞吐量,只適用于TCP服務;
- Message Queue Consuming Count:消息隊列消費數;
- Message Queue Avg Consuming Latency(ms):消息隊列平均延遲時間;
- Service Instances Load(CPM / PPM):每個實例每分鐘請求數;
- Slow Service Instance(ms):每個服務實例平均延時;
- Service Instance Successful Rate(%):服務實例的請求成功率。
- Instance
- instance_jvm_memory_heap(堆內存使用)
- instance_jvm_memory_heap_max(最大堆內存)
- instance_jvm_memory_noheap(直接內存使用)
- instance_jvm_memory_noheap_max(最大直接內存)
- Service Instance Load(CPM / PPM):當前實例每分鐘調用數;
- Service Instance Throughput(Bytes):當前實例的吞吐流量;
- Service Instance Successful Rate(%):當前實例調用成功比率;
- Service Instance Latency(ms):當前實例響應延時;
- JVM CPU(Java Service)%:當前實例JVM的CPU占用百分比(相對于主機);
- JVM Memory (Java Service)(MB):當前實例的內存占用大??;
- JVM GC Time(ms):JVM 垃圾回收時間,包含young gc和old gc;
- JVM GC Count:JVM垃圾回收次數,包含young gc count和old gc count;
- JVM Thread Count(java service):當前實例的線程數;
- JVM Thread State Count (Java Service):當前實例的各狀態(tài)線程數;
- JVM Class Count (Java Service):當前實例類的計數。
- Endpoint
- Endpoint Load in Current Service(CPM / PPM):當前服務每個端點的每分鐘請求數;
- Slow Endpoints in Current Service(ms):當前服務每個端點的平均響應時間;
- Successful Rate in Current Service(%):當前服務每個端點的請求成功率;
- Endpoint Load:當前端點每個時間段的請求量;
- Endpoint Avg Response Time(ms):當前端點每個時間段的平均請求響應時間;
- Endpoint Response Time Percentile(ms):當前端點每個時間段的響應時間占比;
- Endpoint Successful Rate(%):當前端點每個時間段的請求成功率;
Database
- Database Avg Response Time(ms):當前數據庫平均響應時間;
- Database Access Successful Rate(%):當前數據庫訪問成功率;
- Database Traffic(CPM: Calls Per Minute):當前數據庫每分鐘請求數;
- Database Access Latency Percentile(ms):當前數據庫響應延遲時間的百分比;
- Slow Statements(ms):慢查詢,按照執(zhí)行時間排序;
- All Database Loads(CPM: Calls Per Minute):所有數據庫的請求次數排序;
- Un-Health Databases (Successful Rate):所有數據庫請求成功率排序。
SelfObservability
自監(jiān)控,OAP服務端的各項指標
- 修改配置config/application.yml
# 將-修改為default
prometheus-fetcher:
selector: ${SW_PROMETHEUS_FETCHER:default}
#default:
# active: ${SW_PROMETHEUS_FETCHER_ACTIVE:true}
# 改none為prometheus
telemetry:
selector: ${SW_TELEMETRY:prometheus}
prometheus:
host: ${SW_TELEMETRY_PROMETHEUS_HOST:0.0.0.0}
port: ${SW_TELEMETRY_PROMETHEUS_PORT:1234}
- 如果telemetry有調整,則對應修改修改config/fetcher-prom-rules/self.yaml
fetcherInterval: PT15S
fetcherTimeout: PT10S
metricsPath: /metrics
staticConfig:
# 改為上步中telemetry配置的ip
targets:
- url: http://localhost:1234
sslCaFilePath:
labels:
service: oap-server
- 檢查:curl http://localhost:1234/metrics
Event
Istio、K8s
VM
Web Browser
對前端也有一定的監(jiān)控,通過Skywalking-Client-js組件來操作,包括Web App、Pages兩個指標。
拓撲圖
- 服務選擇器 支持顯示直接關系,包括上游和下游;
- 自定義組 提供服務組的任意子拓撲功能,但是分組的信息是保存在瀏覽器內的;
- 服務菜單 當您單擊任何服務時打開。該圖形可以對所選擇的服務進行度量、跟蹤和告警查詢;
- 服務指標的關系 提供服務RPC交互的度量以及這兩個服務的實例。
追蹤
看每個接口的調用鏈,每個鏈路耗時、狀態(tài)。如果為失敗展示錯誤信息,如果是數據庫,會展示查詢語句。另外可以根據追蹤tid(trace id)和標記(tag)進行篩選。
性能剖析
日志
告警
事件
調試
日志集成
支持logback、log4j、log4j2日志框架集成,基于gRpc通信協(xié)議實現日志采集。
以logback為例:
- 引入依賴
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-logback-1.x</artifactId>
<version>8.9.0</version>
</dependency>
- 修改logback.xml配置
<!-- ... -->
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>
<root level="INFO">
<!-- ... -->
<appender-ref ref="grpc-log"/>
</root>
- 修改agent配置 ~/config/agent.config
plugin.toolkit.log.grpc.reporter.server_host=${SW_GRPC_LOG_SERVER_HOST:0.0.0.0}
plugin.toolkit.log.grpc.reporter.server_port=${SW_GRPC_LOG_SERVER_PORT:11800}
plugin.toolkit.log.grpc.reporter.max_message_size=${SW_GRPC_LOG_MAX_MESSAGE_SIZE:10485760}
plugin.toolkit.log.grpc.reporter.upstream_timeout=${SW_GRPC_LOG_GRPC_UPSTREAM_TIMEOUT:30}
- 官方示例
監(jiān)控方法
通過@Trace注解標記需要追蹤的方法調用情況
- 引入依賴
<dependency>
<groupId>org.apache.skywalking</groupId>
<artifactId>apm-toolkit-trace</artifactId>
<version>8.9.0</version>
</dependency>
- 修改代碼
@Trace
@GetMapping("/printLog")
public String printLog() {
Logger.info("traceId:{}",TraceContext.traceId())
return "ok";
}
告警接入
- 規(guī)則修改配置config/alarm-settings.yml
- 鉤子支持WebHook、GRPCHook、SlackHook、WechatHook、DingtalkHook、FeishuHook實現告警信息推送
場景
指標性統(tǒng)計
一個服務的 TBS 的正確率、成功率、流量等,這是我們常見的針對單個指標或者某一個數據庫的,這就是 Metrics 單指標分析
Tracing 分布式追蹤
一次請求的范圍,也就是我們從瀏覽器或者手機端發(fā)起任何的一次調用,甚至我們可以再推廣一點,是一次業(yè)務交易,比如說一次訂購的過程,從瀏覽商品到最后下定單、支付、物流、最后交到我們的手上。這是一個流程化的東西,我們需要軌跡,需要去追蹤。
Logging 日志記錄
我們程序在執(zhí)行的過程中間發(fā)生了一些日志,會一幀一幀地跳出來給大家去記錄這個東西,這是日志記錄。
關鍵詞
- Topology:拓撲
- Trace:追蹤
- Metrics:度量
- Span:
- Apdex:是根據設定的閾值和響應時間結合考慮的衡量標準。它是滿意響應時間和不滿意響應時間相對于總響應時間的比率。它衡量的是用戶對你的服務的滿意程度,因為傳統(tǒng)的指標(如平均響應時間)可能很快就會容易形成偏差。
- percentile:標簽含義(p50、p75、p90、p95、p99):例如p99為1000ms, 這意味著 99% 的請求應該比1000ms更快
結束語
Apache SkyWalking是一款功能強大的APM系統(tǒng),可以幫助開發(fā)人員和運維人員更好地了解分布式系統(tǒng)的性能狀況。通過使用SkyWalking,可以提高應用程序的穩(wěn)定性和性能,降低運維成本。