skywalking系列(2)-在IntelliJ IDEA中通過skywalking源碼構建項目


目的
為了學習skywalking源碼的設計,以及更好的了解內部原理,對系統進行擴展,優化。

參考
github上skywalking官方教程:https://github.com/apache/skywalking/blob/master/docs/en/guides/How-to-build.md
SkyWalking 6.x 源碼分析 —— 調試環境搭建【芋道源碼】:http://www.iocoder.cn/SkyWalking/6/build-debugging-environment/

環境准備
操作系統: macOS 10.14.1
skywalking源碼版本: github上6.6.0之后的master分支(2020-1-29)
IDE: intelliJ IDEA
jdk: 1.8
maven: maven 3

構建項目

1.clone代碼

git clone https://github.com/apache/skywalking.git

遇到的問題
(1) 問題:clone代碼失敗:
解決辦法:配置host,可加快網速

219.76.4.4 github-cloud.s3.amazonaws.com
192.30.253.112 github.com
151.101.185.194 github.global.ssl.fastly.net

2.選擇maven方式導入skywalking源碼到IDEA

3.執行git命令

git submodule init

4.執行git命令

git submodule update
這兩步的目的是獲取skywalking子模塊的源碼,子模塊包括apm-network、query-graphql-plugin、skywalking-ui、e2e-ttl-es,具體的依賴信息可查看/.gitmodules文件

[submodule "apm-protocol/apm-network/src/main/proto"]
	path = apm-protocol/apm-network/src/main/proto
	url = https://github.com/apache/skywalking-data-collect-protocol.git
[submodule "oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol"]
	path = oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol
	url = https://github.com/apache/skywalking-query-protocol.git
[submodule "skywalking-ui"]
	path = skywalking-ui
	url = https://github.com/apache/skywalking-rocketbot-ui.git
[submodule "test/e2e/e2e-ttl/e2e-ttl-es/src/main/proto"]
	path = test/e2e/e2e-ttl/e2e-ttl-es/src/main/proto
	url = https://github.com/apache/skywalking-data-collect-protocol.git
  • 【敲黑板】該步驟非常重要,不完整執行成功,后續的編譯會失敗。
  • git submodule update執行很慢,還可能中途中斷,但是執行的過程中不要手動中斷命令的執行,等10分鍾看結果,不然文件可能只下載了一部分,導致莫名其妙的問題。

遇到的問題
(1)git submodule update失敗

terrydeMacBook-Pro:skywalking-terry terry$ git submodule init
terrydeMacBook-Pro:skywalking-terry terry$ git submodule update
Submodule path 'oap-server/server-query-plugin/query-graphql-plugin/src/main/resources/query-protocol': checked out '6fc96650acc7f539fcdf6d51648525ce93e5fa1a'
fatal: Needed a single revision
Unable to find current revision in submodule path 'skywalking-ui'

解決辦法
參考:https://www.cnblogs.com/ligun123/p/4139883.html
刪除skywalking-ui目錄,再執行git submodule update,將會出現如下:

terrydembp:skywalking-github terry$ git submodule update
remote: Enumerating objects: 14, done.
remote: Counting objects: 100% (14/14), done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 4370 (delta 2), reused 3 (delta 0), pack-reused 4356
Receiving objects: 100% (4370/4370), 13.76 MiB | 36.00 KiB/s, done.
Resolving deltas: 100% (2575/2575), done.
From https://github.com/apache/skywalking-rocketbot-ui
 * [new branch]      develop    -> origin/develop
 * [new branch]      master     -> origin/master
 * [new tag]         v0.9.0     -> v0.9.0
 * [new tag]         v1.0.0     -> v1.0.0
 * [new tag]         v1.0.1     -> v1.0.1
 * [new tag]         v1.0.2     -> v1.0.2
 * [new tag]         v1.0.3     -> v1.0.3
 * [new tag]         v6.1.0     -> v6.1.0
 * [new tag]         v6.2.0     -> v6.2.0
 * [new tag]         v6.3.0     -> v6.3.0
 * [new tag]         v6.4.0     -> v6.4.0
 * [new tag]         v6.5.0     -> v6.5.0
 * [new tag]         v6.6.0     -> v6.6.0
Submodule path 'skywalking-ui': checked out '9ad81a05a2f2969420c1f75769c2b4def42819e4'
Submodule path 'test/e2e/e2e-ttl/e2e-ttl-es/src/main/proto': checked out '7b244ff7ec350910295eee85633e02d92a6f6b1c'
 

5.執行mvn命令

./mvnw clean package -DskipTests

這一步執行時間長短和網速有關系,編譯過兩次,一次14min、一次1h

執行情況示例:

terrydembp:skywalking-github terry$ ./mvnw clean package -DskipTests
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 50710  100 50710    0     0  20994      0  0:00:02  0:00:02 --:--:-- 20997
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] apm                                                                [pom]
[INFO] apm-commons                                                        [pom]
省略許多行......
省略許多行......
省略許多行......

遇到的問題
(1) ./mvnw clean package -DskipTests無法編譯
原因:開了vpn,原以為【翻qiang】會快很多,沒想到開了VPN,反而下載不了需要的插件。
解決辦法:關閉vpm

(2)執行失敗,提示缺少部分類,例如缺少類KeyStringValuePair.java

[ERROR] /Users/terry/Gits/agent/skywalking/skywalking-github/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/command/TraceIgnoreCommand.java:[39,48] 找不到符號
[ERROR]   符號:   變量 KeyStringValuePair
[ERROR]   位置: 類 org.apache.skywalking.apm.network.trace.component.command.TraceIgnoreCommand
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
[ERROR] 
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :apm-network

可能是因為git submodule沒有更新到submodule,解決辦法是:找到上面提到的項目根目錄下的/.gitmodules文件,查看submodule對應的path路徑,看是否完整更新下來的源碼。
image.png
可以刪除這幾個目錄,然后執行git submodule init、git submodule update,重新更新submodule的文件。

執行成功的結果:

[INFO] configuration-consul ............................... SUCCESS [  2.216 s]
[INFO] server-bootstrap ................................... SUCCESS [  4.166 s]
[INFO] server-starter ..................................... SUCCESS [01:27 min]
[INFO] server-starter-es7 ................................. SUCCESS [  8.393 s]
[INFO] apm-webapp ......................................... SUCCESS [07:15 min]
[INFO] apache-skywalking-apm .............................. SUCCESS [ 45.532 s]
[INFO] apache-skywalking-apm-es7 .......................... SUCCESS [ 22.466 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:01 h
[INFO] Finished at: 2020-01-29T13:03:28+08:00

6.最終在disk目錄下生成了文件:

dist/apache-skywalking-apm-bin.tar.gz
dist/apache-skywalking-apm-bin-es7.tar.gz

這些包和官方的release版本的包是一樣的,后續可以自己修改源碼進行編譯、構建、部署。
image.png

7.生成源碼:

grpc-java and java folders in apm-protocol/apm-network/target/generated-sources/protobuf
grpc-java and java folders in oap-server/server-core/target/generated-sources/protobuf
grpc-java and java folders in oap-server/server-receiver-plugin/receiver-proto/target/generated-sources/protobuf
grpc-java and java folders in oap-server/exporter/target/generated-sources/protobuf
grpc-java and java folders in oap-server/server-configuration/grpc-configuration-sync/target/generated-sources/protobuf
antlr4 folder in oap-server/oal-grammar/target/generated-sources

根據官網找到上面的文件目錄,
右鍵--->Mark Directory As --->Generated Rources Root
文件夾會由黃色變成藍色

啟動:

啟動OapServer

執行org.apache.skywalking.oap.server.starter.OAPServerStartUp#main方法,啟動server。

注意

  • 6.6.0默認是用es7作為storage module,所以需要部署es7;
    如果想用其他storage module,則可以修改/oap-server/server-bootstrap/src/main/resources/application.yml目錄下的storage節點的配置。然后rebuild一下該文件,重新編譯,在重新啟動即可。

我采用的的是ES6,修改skywalking的配置如下,啟動ES后,再啟動OapServer

storage:
  elasticsearch:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
    #trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
    #trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
    user: ${SW_ES_USER:""}
    password: ${SW_ES_PASSWORD:""}
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
    # Those data TTL settings will override the same settings in core module.
    recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
    otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
    monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
    resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
    segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
    profileTaskQueryMaxSize: ${SW_STORAGE_ES_QUERY_PROFILE_TASK_SIZE:200}
    advanced: ${SW_STORAGE_ES_ADVANCED:""}
#  elasticsearch7:
#    nameSpace: ${SW_NAMESPACE:""}
#    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
#    protocol: ${SW_STORAGE_ES_HTTP_PROTOCOL:"http"}
#    #trustStorePath: ${SW_SW_STORAGE_ES_SSL_JKS_PATH:"../es_keystore.jks"}
#    #trustStorePass: ${SW_SW_STORAGE_ES_SSL_JKS_PASS:""}
#    user: ${SW_ES_USER:""}
#    password: ${SW_ES_PASSWORD:""}
#    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
#    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
#    # Those data TTL settings will override the same settings in core module.
#    recordDataTTL: ${SW_STORAGE_ES_RECORD_DATA_TTL:7} # Unit is day
#    otherMetricsDataTTL: ${SW_STORAGE_ES_OTHER_METRIC_DATA_TTL:45} # Unit is day
#    monthMetricsDataTTL: ${SW_STORAGE_ES_MONTH_METRIC_DATA_TTL:18} # Unit is month
#    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
#    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:1000} # Execute the bulk every 1000 requests
#    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
#    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests
#    resultWindowMaxSize: ${SW_STORAGE_ES_QUERY_MAX_WINDOW_SIZE:10000}
#    metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:5000}
#    segmentQueryMaxSize: ${SW_STORAGE_ES_QUERY_SEGMENT_SIZE:200}
#    advanced: ${SW_STORAGE_ES_ADVANCED:""}

查看ES索引
訪問http://localhost:9200/_cat/indices
查看ES索引可以檢驗skywalking初始化數據是否成功
image.png

啟動webApp

執行org.apache.skywalking.apm.webapp.ApplicationStartUp方法
驗證
訪問http://127.0.0.1:8080/
image.png

啟動普通java應用,驗證鏈路追蹤

配置應用的VM參數如下,再運行應用:

-Dskywalking.agent.service_name=skywalking-test-local -Dskywalking.collector.backend_service=127.0.0.1:11800 -javaagent:/Users/terry/Gits/agent/skywalking-bin/6.6.0/apache-skywalking-apm-bin/agent/skywalking-agent.jar

image.png

驗證
訪問一個springmvc的請求localhost:8082/a_testSysLog
參考skywalking
image.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM