一文帶你了解SkyWalking
Apache SkyWalking
SkyWalking是一個(gè)開(kāi)源可觀測(cè)平臺(tái),用于收集、分析、聚合和可視化來(lái)自服務(wù)和云原生基礎(chǔ)設(shè)施的數(shù)據(jù)。SkyWalking 提供了一種簡(jiǎn)單的方法來(lái)保持分布式系統(tǒng)的清晰視圖,甚至跨云。它是一種現(xiàn)代APM,專(zhuān)為云原生、基于容器的分布式系統(tǒng)而設(shè)計(jì)。
文檔版本8.9.1,當(dāng)前最新版本9.10
圖片
介紹
SkyWalking 是一個(gè)應(yīng)用性能監(jiān)控系統(tǒng)(APM)
為微服務(wù)、云原生和基于容器(Docker, Kubernetes, Mesos)體系結(jié)構(gòu)而設(shè)計(jì),主要實(shí)現(xiàn)功能包括分布式追蹤,性能指標(biāo)分析和服務(wù)依賴(lài)分析等
相似產(chǎn)品與對(duì)比
類(lèi)似功能的組件還有:Zipkin、Pinpoint 、CAT、Dapper等
- Zipkin是Twitter開(kāi)源的調(diào)用鏈路分析工具,目前基于Spingcloud sleuth得到了廣泛的應(yīng)用,特點(diǎn)是輕量,部署簡(jiǎn)單。
- 一個(gè)韓國(guó)團(tuán)隊(duì)開(kāi)源的產(chǎn)品,運(yùn)用了字節(jié)碼增強(qiáng)技術(shù),只需要在啟動(dòng)時(shí)添加啟動(dòng)參數(shù)即可,對(duì)代碼無(wú)侵入,目前支持Java和PHP語(yǔ)言,底層采用HBase來(lái)存儲(chǔ)數(shù)據(jù),探針收集的數(shù)據(jù)- 粒度非常細(xì),但性能損耗大,因其出現(xiàn)的時(shí)間較長(zhǎng),完成度也很高,應(yīng)用的公司較多
- Skywalking是本土開(kāi)源的基于字節(jié)碼注入的調(diào)用鏈路分析以及應(yīng)用監(jiān)控分析工具,特點(diǎn)是支持多種插件,UI功能較強(qiáng),接入端無(wú)代碼侵入。
- CAT是由國(guó)內(nèi)美團(tuán)點(diǎn)評(píng)開(kāi)源的,基于Java語(yǔ)言開(kāi)發(fā),目前提供Java、C/C++、Node.js、Python、Go等語(yǔ)言的客戶(hù)端,監(jiān)控?cái)?shù)據(jù)會(huì)全量統(tǒng)計(jì),國(guó)內(nèi)很多公司在用,例如美團(tuán)點(diǎn)評(píng)、攜程、拼多多等,CAT跟下邊要介紹的Zipkin都需要在應(yīng)用程序中埋點(diǎn),對(duì)代碼侵入性強(qiáng)。
Cat | Zipkin | Pinpoint | skywalking | |
依賴(lài) | Java 6,7,8 Maven 3.2.3+ mysql5.6 Linux 2.6以及之上(2.6內(nèi)核才可以支持epoll) | Java 6,7,8 Maven3.2+ rabbitMQ | Java 6,7,8 maven3+ Hbase0.94+ | Java 6,7,8 maven3.0+ nodejs zookeeper elasticsearch |
實(shí)現(xiàn)方式 | 代碼埋點(diǎn)(攔截器,注解,過(guò)濾器等) | 攔截請(qǐng)求,發(fā)送(http,mq)數(shù)據(jù)至zipkin服務(wù) | java探針,字節(jié)碼增強(qiáng) | java探針,字節(jié)碼增強(qiáng) |
顆粒度 | 代碼級(jí) | 接口級(jí) | 方法級(jí) | 方法級(jí) |
頁(yè)面UI | ***** | ** | ***** | **** |
存儲(chǔ)選擇 | Mysql,hdfs | In-memory,mysql,cassandra,elasticsearch | Hbase | Elasticsearch,h2 |
通信方式 | - | http,mq | Thrift | GRPC |
MQ監(jiān)控 | 不支持 | 不支持 | 不支持 | RocketMq,kafka |
全局調(diào)用 統(tǒng)計(jì) | 支持 | 不支持 | 支持 | 支持 |
Trace查詢(xún) | 不持支 | 支持 | 不支持 | 支持 |
報(bào)警 | 支持 | 不支持 | 支持 | 支持 |
Jvm監(jiān)控 | 不支持 | 不支持 | 支持 | 支持 |
優(yōu)點(diǎn) | 功能完善 | spring-cloud-sleuth可以很好的集成zipkin , 代碼無(wú)侵入,集成非常簡(jiǎn)單 , 社區(qū)更加活躍。對(duì)外提供有query接口,更加容易二次開(kāi)發(fā) | 完全無(wú)侵入, 僅需修改啟動(dòng)方式,界面完善,功能細(xì)致。 | 完全無(wú)侵入,界面完善,支持應(yīng)用拓?fù)鋱D及單個(gè)調(diào)用鏈查詢(xún)。功能比較完善(zipkin + pinpoint) |
缺點(diǎn) | 代碼侵入性較強(qiáng),需要埋點(diǎn)文檔比較混亂,文檔與發(fā)布版本的符合性較低,需要依賴(lài)點(diǎn)評(píng)私服 (或者需要把他私服上的jar手動(dòng)下載下來(lái),然后上傳到我們的私服上去)。 | 默認(rèn)使用的是http請(qǐng)求向zipkin上報(bào)信息,耗性能。跟sleuth結(jié)合可以使用rabbitMQ的方式異步來(lái)做,增加了復(fù)雜度,需要引入rabbitMQ 。數(shù)據(jù)分析比較簡(jiǎn)單。 | 不支持查詢(xún)單個(gè)調(diào)用鏈, 對(duì)外表現(xiàn)的是整個(gè)應(yīng)用的調(diào)用生態(tài)。二次開(kāi)發(fā)難度較高 | 3.2版本之前BUG較多 ,網(wǎng)上反映兼容性較差 . 3.2新版本的反映情況較少依賴(lài)較多。 |
文檔 | 網(wǎng)上資料較少,僅官網(wǎng)提供的文檔,比較亂 | 文檔完善 | 文檔完善 | 文檔完善 |
開(kāi)發(fā)者 | 大眾點(diǎn)評(píng) | Twiter | Naver | 吳晟(華為開(kāi)發(fā)者) ,目前已經(jīng)加入Apache孵化器 |
使用公司 | 大眾點(diǎn)評(píng),攜程,陸金所,同程旅游,獵聘網(wǎng),拼多多 | Twiter | Naver | 華為,alibaba cloud,天源迪科,當(dāng)當(dāng)網(wǎng),京東金融 |
功能
開(kāi)源監(jiān)控平臺(tái),用于從服務(wù)和云原生基礎(chǔ)設(shè)施收集、分析、聚合和可視化數(shù)據(jù)。SkyWalking提供了一種簡(jiǎn)單的方法來(lái)維護(hù)分布式系統(tǒng)的清晰視圖,甚至可以跨云查看。它是一種現(xiàn)代APM,專(zhuān)門(mén)為云原生、基于容器的分布式系統(tǒng)設(shè)計(jì)
監(jiān)測(cè)對(duì)象包括:service(服務(wù)), service instance(實(shí)例), endpoint(端點(diǎn))
功能描述:
- 多種監(jiān)控手段,可以通過(guò)語(yǔ)言探針和service mesh獲得監(jiān)控的數(shù)據(jù)
- 支持多重語(yǔ)言的自動(dòng)探針,包括JAVA, .NET Core和NodeJS
- 輕量高效,無(wú)需大數(shù)據(jù)平臺(tái)和大量的服務(wù)器資源
- 模塊化,UI ,存儲(chǔ),集群管理都有多種機(jī)制可選
- 支持告警
- 優(yōu)秀的可視化解決方案
架構(gòu)
SkyWalking 在邏輯上分為四個(gè)部分:Probes、Platform backend、Storage 和 UI。
圖片
探針Probe
采集tracing(調(diào)用鏈數(shù)據(jù))和metric(指標(biāo))信息并上報(bào),上報(bào)通過(guò)HTTP或者gRPC方式按要求重新格式化數(shù)據(jù)發(fā)送數(shù)據(jù)到Skywalking Collector
- 自動(dòng)探針:Java支持的中間件、框架與類(lèi)庫(kù)列表
- 手動(dòng)探針:OpenTrackingApi、@Trace注解、trackId集成到日志中。
后端Platform backend
支持?jǐn)?shù)據(jù)聚合、分析和流式處理,包括跟蹤、度量和日志。基于gRpc、Http 鏈路數(shù)據(jù)收集器,對(duì)agent傳過(guò)來(lái)的tracing和metric數(shù)據(jù)進(jìn)行整合分析通過(guò)Analysis Core模塊處理并落入相關(guān)的數(shù)據(jù)存儲(chǔ)中,同時(shí)會(huì)通過(guò)Query Core模塊進(jìn)行二次統(tǒng)計(jì)和監(jiān)控告警
數(shù)據(jù)存儲(chǔ)Storage
通過(guò)開(kāi)放/可插入接口存儲(chǔ) SkyWalking 數(shù)據(jù),支持多種方式存儲(chǔ)數(shù)據(jù) H2,ElasticSearch,MySQL, TiDB, InfluxDB或自定義
可視化平臺(tái)UI
基于GraphQL Http 高度可定制的基于 Web 的界面的可視化平臺(tái),允許 SkyWalking 最終用戶(hù)可視化和管理。
下載安裝
下載
官方下載地址: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已經(jīng)集成UI,不需要單獨(dú)下載與部署
Window安裝
- 安裝APM (8.9.1,h2)
- 下載apache-skywalking-apm-bin
- 解壓執(zhí)行命名 ~/bin/startup.bat
- 訪(fǎng)問(wèn)http://localhost:8080
圖片
Docker安裝
- 安裝OAP
下載鏡像
docker pull apache/skywalking-oap-server:8.9.1啟動(dòng)容器
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啟動(dòng)容器
docker run --name oap-ui -p 18080:8080 --restart always -d -e SW_OAP_ADDRESS=http://localhost:12800 apache/skywalking-ui訪(fǎng)問(wèn)http://localhost:18080
系統(tǒng)集成
- 探針
負(fù)責(zé)進(jìn)行數(shù)據(jù)的收集,包含了Tracing和Metrics的數(shù)據(jù),agent會(huì)被安裝到服務(wù)所在的服務(wù)器上,以方便數(shù)據(jù)的獲取。探針使用gRPC協(xié)議與OAP平臺(tái)通信并上報(bào)數(shù)據(jù)。
- 可觀測(cè)性分析平臺(tái) OAP
接收探針發(fā)送的數(shù)據(jù),并在內(nèi)存中使用分析引擎(Analysis Core)進(jìn)行數(shù)據(jù)的整合運(yùn)算,然后將數(shù)據(jù)存儲(chǔ)到對(duì)應(yīng)的存儲(chǔ)介質(zhì)上,比如 Elasticsearch、MySQL等存儲(chǔ)服務(wù)。同時(shí)OAP還使用查詢(xún)引擎(Query Core)提供HTTP查詢(xún)接口。OAP默認(rèn)監(jiān)聽(tīng)兩個(gè)端口gRPC協(xié)議端口11800、HTTP端口12800,gRPC用于探針上報(bào)數(shù)據(jù),HTTP端口用于UI連接OAP平臺(tái)獲取數(shù)據(jù)。
- UI
Skywalking 提供單獨(dú)的UI進(jìn)行數(shù)據(jù)的查看,UI調(diào)用OAP提供的接口,獲取對(duì)應(yīng)的數(shù)據(jù)根據(jù)UI模板的配置進(jìn)行展示。Skywalking UI與OAP之間使用Http協(xié)議進(jìn)行通信。Skywalking UI默認(rèn)監(jiān)聽(tīng)8080端口提供Web服務(wù)。
Java Agent
- 下載:Java Agent v8.11.0
- 目錄結(jié)構(gòu)
activations # 工具包,默認(rèn)加載。
bootstrap-plugins # 啟動(dòng)插件,默認(rèn)加載。
config # 配置文件
logs # 日志
optional-plugins # 可選擴(kuò)展插件,啟動(dòng)不加載,如需加載將其移到到plugins目錄下。
optional-reporter-plugins # 可選統(tǒng)計(jì)類(lèi)插件,啟動(dòng)不加載。
plugins # 服務(wù)類(lèi)插件
skywalking-agent.jar # 客戶(hù)端主程序,需要被服務(wù)啟動(dòng)是引用。
- 使用:項(xiàng)目啟動(dòng)命令添加-javaagent:/path/skywalking-agent/skywalking-agent.jar
- 示例:
java -javaagent:/path/skywalking-agent/skywalking-agent.jar -jar your-app.jar- 配置:
- 系統(tǒng)屬性:-Dskywalking.[config]=[value]
- 代理參數(shù): -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,否則將被設(shè)置為Your_ApplicationName。
- 修改目錄/path/skywalking-agent/config/agent.config文件
// todo
//服務(wù)名稱(chēng)
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}
// OAP服務(wù)地址
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:127.0.0.1:11800}代理選項(xiàng) > System.Properties(-D) > 系統(tǒng)環(huán)境變量 > 配置文件
- 官方文檔
Client JavaScript
- 安裝
npm install skywalking-client-js --save- 注冊(cè)
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
{
// 參考方法文檔
}- 手動(dòng)收集指標(biāo)頁(yè)面加載時(shí)或任何其他有意義的時(shí)刻的指標(biāo),PV
register時(shí)設(shè)置autoTracePerf:false
- 調(diào)用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時(shí)設(shè)置enableSPA:true,開(kāi)啟單頁(yè)面應(yīng)用基于hashchange event觸發(fā)指標(biāo)采集行為
或者通過(guò)以下方法手動(dòng)處理,在上報(bào)數(shù)據(jù)時(shí)手動(dòng)更新頁(yè)面名稱(chēng),當(dāng)調(diào)用該方法時(shí),默認(rèn)情況下將重新報(bào)告頁(yè)面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
});
});- 跟蹤請(qǐng)求數(shù)據(jù)支持跟蹤這些(XMLHttpRequest和Fetch API)兩種模式的數(shù)據(jù)請(qǐng)求。同時(shí),支持基于XMLHttpRequest和fetch的跟蹤庫(kù)和工具,如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)測(cè)對(duì)象
- 服務(wù)(Service)
對(duì)請(qǐng)求提供端點(diǎn)的單個(gè)應(yīng)用或負(fù)載,在使用埋點(diǎn)、代理或 SDK 的時(shí)候,你可以定義服務(wù)的名字。如果不定義的話(huà),SkyWalking 會(huì)使用在agent.conf中配置的默認(rèn)服務(wù)名稱(chēng)。- 服務(wù)實(shí)例(Instance)
服務(wù)組中的每個(gè)單獨(dú)的工作負(fù)載都稱(chēng)為一個(gè)實(shí)例。就像pods在 Kubernetes 中一樣,它不需要是單個(gè)操作系統(tǒng)進(jìn)程,但是,如果您使用儀器代理,則實(shí)例實(shí)際上是一個(gè)真正的操作系統(tǒng)進(jìn)程。- 端點(diǎn)(Endpoint)
用于傳入請(qǐng)求的服務(wù)中的路徑,例如 HTTP URI 路徑或 gRPC 服務(wù)類(lèi) + 方法簽名。UI指標(biāo)
通過(guò)配置文件定義需要關(guān)注的指標(biāo) 通過(guò)特定的分析語(yǔ)言計(jì)算指標(biāo)
UI包括以下幾個(gè)部分:
- 儀表盤(pán)
- 拓?fù)鋱D
- 追蹤
- 性能剖析
- 日志
- 告警
- 事件
- 調(diào)試
儀表盤(pán)
APM
- Global
Services Load(CPM / PPM):服務(wù)每分鐘請(qǐng)求數(shù)
Slow Services(ms):慢響應(yīng)服務(wù)(按照響應(yīng)時(shí)間排序)
Un-Health Services (Apdex):Apdex分?jǐn)?shù)(1為滿(mǎn)分)
Slow Endpoints (ms):慢Endpoint的平均響應(yīng)時(shí)間
Global Response Latency(percentile in ms):響應(yīng)時(shí)間百分比
Global Heatmap:服務(wù)響應(yīng)時(shí)間熱力分布圖,根據(jù)時(shí)間段內(nèi)不同響應(yīng)時(shí)間的數(shù)量顯示顏色深度顏色越深,請(qǐng)求越多。
- Service
- Service Apdex 數(shù)字:當(dāng)前服務(wù)的Apdex分?jǐn)?shù);
- Successful Rate(%):當(dāng)前服務(wù)的請(qǐng)求成功率;
- Service Load (CPM / PPM)數(shù)字:每分鐘調(diào)用次數(shù)(CPM),如果是TCP,表示每分鐘的數(shù)據(jù)包數(shù)(PPM);
- Service Avg Response Time(ms):當(dāng)前服務(wù)平均響應(yīng)時(shí)間;
- Service Apdex 折線(xiàn)圖:當(dāng)前服務(wù)一段時(shí)間內(nèi)的Apdex分?jǐn)?shù);
- Service Response Time Percentile(ms):當(dāng)前服務(wù)的百分比響應(yīng)延時(shí);
- Successful Rate(%)折線(xiàn)圖:當(dāng)前服務(wù)一段時(shí)間內(nèi)的請(qǐng)求成功率;
- Service Load (CPM / PPM)折線(xiàn)圖:當(dāng)前服務(wù)一段時(shí)間內(nèi)的每分鐘調(diào)用次數(shù);
- Service Throughput(Bytes):服務(wù)吞吐量,只適用于TCP服務(wù);
- Message Queue Consuming Count:消息隊(duì)列消費(fèi)數(shù);
- Message Queue Avg Consuming Latency(ms):消息隊(duì)列平均延遲時(shí)間;
- Service Instances Load(CPM / PPM):每個(gè)實(shí)例每分鐘請(qǐng)求數(shù);
- Slow Service Instance(ms):每個(gè)服務(wù)實(shí)例平均延時(shí);
- Service Instance Successful Rate(%):服務(wù)實(shí)例的請(qǐng)求成功率。
- Instance
- instance_jvm_memory_heap(堆內(nèi)存使用)
- instance_jvm_memory_heap_max(最大堆內(nèi)存)
- instance_jvm_memory_noheap(直接內(nèi)存使用)
- instance_jvm_memory_noheap_max(最大直接內(nèi)存)
- Service Instance Load(CPM / PPM):當(dāng)前實(shí)例每分鐘調(diào)用數(shù);
- Service Instance Throughput(Bytes):當(dāng)前實(shí)例的吞吐流量;
- Service Instance Successful Rate(%):當(dāng)前實(shí)例調(diào)用成功比率;
- Service Instance Latency(ms):當(dāng)前實(shí)例響應(yīng)延時(shí);
- JVM CPU(Java Service)%:當(dāng)前實(shí)例JVM的CPU占用百分比(相對(duì)于主機(jī));
- JVM Memory (Java Service)(MB):當(dāng)前實(shí)例的內(nèi)存占用大小;
- JVM GC Time(ms):JVM 垃圾回收時(shí)間,包含young gc和old gc;
- JVM GC Count:JVM垃圾回收次數(shù),包含young gc count和old gc count;
- JVM Thread Count(java service):當(dāng)前實(shí)例的線(xiàn)程數(shù);
- JVM Thread State Count (Java Service):當(dāng)前實(shí)例的各狀態(tài)線(xiàn)程數(shù);
- JVM Class Count (Java Service):當(dāng)前實(shí)例類(lèi)的計(jì)數(shù)。
- Endpoint
- Endpoint Load in Current Service(CPM / PPM):當(dāng)前服務(wù)每個(gè)端點(diǎn)的每分鐘請(qǐng)求數(shù);
- Slow Endpoints in Current Service(ms):當(dāng)前服務(wù)每個(gè)端點(diǎn)的平均響應(yīng)時(shí)間;
- Successful Rate in Current Service(%):當(dāng)前服務(wù)每個(gè)端點(diǎn)的請(qǐng)求成功率;
- Endpoint Load:當(dāng)前端點(diǎn)每個(gè)時(shí)間段的請(qǐng)求量;
- Endpoint Avg Response Time(ms):當(dāng)前端點(diǎn)每個(gè)時(shí)間段的平均請(qǐng)求響應(yīng)時(shí)間;
- Endpoint Response Time Percentile(ms):當(dāng)前端點(diǎn)每個(gè)時(shí)間段的響應(yīng)時(shí)間占比;
- Endpoint Successful Rate(%):當(dāng)前端點(diǎn)每個(gè)時(shí)間段的請(qǐng)求成功率;
Database
- Database Avg Response Time(ms):當(dāng)前數(shù)據(jù)庫(kù)平均響應(yīng)時(shí)間;
- Database Access Successful Rate(%):當(dāng)前數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)成功率;
- Database Traffic(CPM: Calls Per Minute):當(dāng)前數(shù)據(jù)庫(kù)每分鐘請(qǐng)求數(shù);
- Database Access Latency Percentile(ms):當(dāng)前數(shù)據(jù)庫(kù)響應(yīng)延遲時(shí)間的百分比;
- Slow Statements(ms):慢查詢(xún),按照?qǐng)?zhí)行時(shí)間排序;
- All Database Loads(CPM: Calls Per Minute):所有數(shù)據(jù)庫(kù)的請(qǐng)求次數(shù)排序;
- Un-Health Databases (Successful Rate):所有數(shù)據(jù)庫(kù)請(qǐng)求成功率排序。
SelfObservability
自監(jiān)控,OAP服務(wù)端的各項(xiàng)指標(biāo)
- 修改配置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有調(diào)整,則對(duì)應(yīng)修改修改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
對(duì)前端也有一定的監(jiān)控,通過(guò)Skywalking-Client-js組件來(lái)操作,包括Web App、Pages兩個(gè)指標(biāo)。
拓?fù)鋱D
- 服務(wù)選擇器 支持顯示直接關(guān)系,包括上游和下游;
- 自定義組 提供服務(wù)組的任意子拓?fù)涔δ埽欠纸M的信息是保存在瀏覽器內(nèi)的;
- 服務(wù)菜單 當(dāng)您單擊任何服務(wù)時(shí)打開(kāi)。該圖形可以對(duì)所選擇的服務(wù)進(jìn)行度量、跟蹤和告警查詢(xún);
- 服務(wù)指標(biāo)的關(guān)系 提供服務(wù)RPC交互的度量以及這兩個(gè)服務(wù)的實(shí)例。
追蹤
看每個(gè)接口的調(diào)用鏈,每個(gè)鏈路耗時(shí)、狀態(tài)。如果為失敗展示錯(cuò)誤信息,如果是數(shù)據(jù)庫(kù),會(huì)展示查詢(xún)語(yǔ)句。另外可以根據(jù)追蹤tid(trace id)和標(biāo)記(tag)進(jìn)行篩選。
性能剖析
日志
告警
事件
調(diào)試
日志集成
支持logback、log4j、log4j2日志框架集成,基于gRpc通信協(xié)議實(shí)現(xiàn)日志采集。
以logback為例:
- 引入依賴(lài)
<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)控方法
通過(guò)@Trace注解標(biāo)記需要追蹤的方法調(diào)用情況
- 引入依賴(lài)
<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實(shí)現(xiàn)告警信息推送
場(chǎng)景
指標(biāo)性統(tǒng)計(jì)
一個(gè)服務(wù)的 TBS 的正確率、成功率、流量等,這是我們常見(jiàn)的針對(duì)單個(gè)指標(biāo)或者某一個(gè)數(shù)據(jù)庫(kù)的,這就是 Metrics 單指標(biāo)分析
Tracing 分布式追蹤
一次請(qǐng)求的范圍,也就是我們從瀏覽器或者手機(jī)端發(fā)起任何的一次調(diào)用,甚至我們可以再推廣一點(diǎn),是一次業(yè)務(wù)交易,比如說(shuō)一次訂購(gòu)的過(guò)程,從瀏覽商品到最后下定單、支付、物流、最后交到我們的手上。這是一個(gè)流程化的東西,我們需要軌跡,需要去追蹤。
Logging 日志記錄
我們程序在執(zhí)行的過(guò)程中間發(fā)生了一些日志,會(huì)一幀一幀地跳出來(lái)給大家去記錄這個(gè)東西,這是日志記錄。
關(guān)鍵詞
- Topology:拓?fù)?/li>
- Trace:追蹤
- Metrics:度量
- Span:
- Apdex:是根據(jù)設(shè)定的閾值和響應(yīng)時(shí)間結(jié)合考慮的衡量標(biāo)準(zhǔn)。它是滿(mǎn)意響應(yīng)時(shí)間和不滿(mǎn)意響應(yīng)時(shí)間相對(duì)于總響應(yīng)時(shí)間的比率。它衡量的是用戶(hù)對(duì)你的服務(wù)的滿(mǎn)意程度,因?yàn)閭鹘y(tǒng)的指標(biāo)(如平均響應(yīng)時(shí)間)可能很快就會(huì)容易形成偏差。
- percentile:標(biāo)簽含義(p50、p75、p90、p95、p99):例如p99為1000ms, 這意味著 99% 的請(qǐng)求應(yīng)該比1000ms更快
結(jié)束語(yǔ)
Apache SkyWalking是一款功能強(qiáng)大的APM系統(tǒng),可以幫助開(kāi)發(fā)人員和運(yùn)維人員更好地了解分布式系統(tǒng)的性能狀況。通過(guò)使用SkyWalking,可以提高應(yīng)用程序的穩(wěn)定性和性能,降低運(yùn)維成本。





































