SkyWalking是一個開源可觀測平臺,用于收集、分析、聚合和可視化來自服務和云原生基礎設施的數據。SkyWalking 提供了一種簡單的方法來保持分布式系統的清晰視圖,甚至跨云。它是一種現代APM,專為云原生、基于容器的分布式系統而設計。
文檔版本8.9.1,當前最新版本9.10
圖片
SkyWalking 是一個應用性能監控系統(APM)
為微服務、云原生和基于容器(Docker, Kubernetes, Mesos)體系結構而設計,主要實現功能包括分布式追蹤,性能指標分析和服務依賴分析等
類似功能的組件還有:Zipkin、Pinpoint 、CAT、Dapper等
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 |
實現方式 | 代碼埋點(攔截器,注解,過濾器等) | 攔截請求,發送(http,mq)數據至zipkin服務 | java探針,字節碼增強 | java探針,字節碼增強 |
顆粒度 | 代碼級 | 接口級 | 方法級 | 方法級 |
頁面UI | ***** | ** | ***** | **** |
存儲選擇 | Mysql,hdfs | In-memory,mysql,cassandra,elasticsearch | Hbase | Elasticsearch,h2 |
通信方式 | - | http,mq | Thrift | GRPC |
MQ監控 | 不支持 | 不支持 | 不支持 | RocketMq,kafka |
全局調用 統計 | 支持 | 不支持 | 支持 | 支持 |
Trace查詢 | 不持支 | 支持 | 不支持 | 支持 |
報警 | 支持 | 不支持 | 支持 | 支持 |
Jvm監控 | 不支持 | 不支持 | 支持 | 支持 |
優點 | 功能完善 | spring-cloud-sleuth可以很好的集成zipkin , 代碼無侵入,集成非常簡單 , 社區更加活躍。對外提供有query接口,更加容易二次開發 | 完全無侵入, 僅需修改啟動方式,界面完善,功能細致。 | 完全無侵入,界面完善,支持應用拓撲圖及單個調用鏈查詢。功能比較完善(zipkin + pinpoint) |
缺點 | 代碼侵入性較強,需要埋點文檔比較混亂,文檔與發布版本的符合性較低,需要依賴點評私服 (或者需要把他私服上的jar手動下載下來,然后上傳到我們的私服上去)。 | 默認使用的是http請求向zipkin上報信息,耗性能。跟sleuth結合可以使用rabbitMQ的方式異步來做,增加了復雜度,需要引入rabbitMQ 。數據分析比較簡單。 | 不支持查詢單個調用鏈, 對外表現的是整個應用的調用生態。二次開發難度較高 | 3.2版本之前BUG較多 ,網上反映兼容性較差 . 3.2新版本的反映情況較少依賴較多。 |
文檔 | 網上資料較少,僅官網提供的文檔,比較亂 | 文檔完善 | 文檔完善 | 文檔完善 |
開發者 | 大眾點評 | Twiter | Naver | 吳晟(華為開發者) ,目前已經加入Apache孵化器 |
使用公司 | 大眾點評,攜程,陸金所,同程旅游,獵聘網,拼多多 | Twiter | Naver | 華為,alibaba cloud,天源迪科,當當網,京東金融 |
開源監控平臺,用于從服務和云原生基礎設施收集、分析、聚合和可視化數據。SkyWalking提供了一種簡單的方法來維護分布式系統的清晰視圖,甚至可以跨云查看。它是一種現代APM,專門為云原生、基于容器的分布式系統設計
監測對象包括:service(服務), service instance(實例), endpoint(端點)
功能描述:
SkyWalking 在邏輯上分為四個部分:Probes、Platform backend、Storage 和 UI。
圖片
采集tracing(調用鏈數據)和metric(指標)信息并上報,上報通過HTTP或者gRPC方式按要求重新格式化數據發送數據到Skywalking Collector
支持數據聚合、分析和流式處理,包括跟蹤、度量和日志。
基于gRpc、Http 鏈路數據收集器,對agent傳過來的tracing和metric數據進行整合分析通過Analysis Core模塊處理并落入相關的數據存儲中,同時會通過Query Core模塊進行二次統計和監控告警
通過開放/可插入接口存儲 SkyWalking 數據,支持多種方式存儲數據 H2,ElasticSearch,MySQL, TiDB, InfluxDB或自定義
基于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,不需要單獨下載與部署
圖片
下載鏡像
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
下載鏡像
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
負責進行數據的收集,包含了Tracing和Metrics的數據,agent會被安裝到服務所在的服務器上,以方便數據的獲取。探針使用gRPC協議與OAP平臺通信并上報數據。
接收探針發送的數據,并在內存中使用分析引擎(Analysis Core)進行數據的整合運算,然后將數據存儲到對應的存儲介質上,比如 Elasticsearch、MySQL等存儲服務。同時OAP還使用查詢引擎(Query Core)提供HTTP查詢接口。OAP默認監聽兩個端口gRPC協議端口11800、HTTP端口12800,gRPC用于探針上報數據,HTTP端口用于UI連接OAP平臺獲取數據。
Skywalking 提供單獨的UI進行數據的查看,UI調用OAP提供的接口,獲取對應的數據根據UI模板的配置進行展示。Skywalking UI與OAP之間使用Http協議進行通信。Skywalking UI默認監聽8080端口提供Web服務。
Java Agent
activations # 工具包,默認加載。
bootstrap-plugins # 啟動插件,默認加載。
config # 配置文件
logs # 日志
optional-plugins # 可選擴展插件,啟動不加載,如需加載將其移到到plugins目錄下。
optional-reporter-plugins # 可選統計類插件,啟動不加載。
plugins # 服務類插件
skywalking-agent.jar # 客戶端主程序,需要被服務啟動是引用。
java -javaagent:/path/skywalking-agent/skywalking-agent.jar -jar your-app.jar
// 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) > 系統環境變量 > 配置文件
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 { // 參考方法文檔 }
register時設置autoTracePerf:false
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 });
register時設置enableSPA:true,開啟單頁面應用基于hashchange event觸發指標采集行為
或者通過以下方法手動處理,在上報數據時手動更新頁面名稱,當調用該方法時,默認情況下將重新報告頁面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 }); });
// 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
對請求提供端點的單個應用或負載,在使用埋點、代理或 SDK 的時候,你可以定義服務的名字。如果不定義的話,SkyWalking 會使用在agent.conf中配置的默認服務名稱。
服務組中的每個單獨的工作負載都稱為一個實例。就像pods在 Kubernetes 中一樣,它不需要是單個操作系統進程,但是,如果您使用儀器代理,則實例實際上是一個真正的操作系統進程。
用于傳入請求的服務中的路徑,例如 HTTP URI 路徑或 gRPC 服務類 + 方法簽名。
通過配置文件定義需要關注的指標 通過特定的分析語言計算指標
UI包括以下幾個部分:
儀表盤
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:服務響應時間熱力分布圖,根據時間段內不同響應時間的數量顯示顏色深度顏色越深,請求越多。
自監控,OAP服務端的各項指標
# 將-修改為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}
fetcherInterval: PT15S fetcherTimeout: PT10S metricsPath: /metrics staticConfig: # 改為上步中telemetry配置的ip targets: - url: http://localhost:1234 sslCaFilePath: labels: service: oap-server
對前端也有一定的監控,通過Skywalking-Client-js組件來操作,包括Web App、Pages兩個指標。
拓撲圖
追蹤
看每個接口的調用鏈,每個鏈路耗時、狀態。如果為失敗展示錯誤信息,如果是數據庫,會展示查詢語句。另外可以根據追蹤tid(trace id)和標記(tag)進行篩選。
性能剖析
日志
告警
事件
調試
支持logback、log4j、log4j2日志框架集成,基于gRpc通信協議實現日志采集。
以logback為例:
<dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-logback-1.x</artifactId> <version>8.9.0</version> </dependency>
<!-- ... --> <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>
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}
https://skywalking.apache.org/docs/skywalking-java/v8.11.0/en/setup/service-agent/java-agent/application-toolkit-logback-1.x/
通過@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"; }
一個服務的 TBS 的正確率、成功率、流量等,這是我們常見的針對單個指標或者某一個數據庫的,這就是 Metrics 單指標分析
一次請求的范圍,也就是我們從瀏覽器或者手機端發起任何的一次調用,甚至我們可以再推廣一點,是一次業務交易,比如說一次訂購的過程,從瀏覽商品到最后下定單、支付、物流、最后交到我們的手上。這是一個流程化的東西,我們需要軌跡,需要去追蹤。
我們程序在執行的過程中間發生了一些日志,會一幀一幀地跳出來給大家去記錄這個東西,這是日志記錄。
Apache SkyWalking是一款功能強大的APM系統,可以幫助開發人員和運維人員更好地了解分布式系統的性能狀況。通過使用SkyWalking,可以提高應用程序的穩定性和性能,降低運維成本。
本文鏈接:http://www.tebozhan.com/showinfo-26-17160-0.html一文帶你了解SkyWalking
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com