.NetCore實踐篇:成功解決分布式監(jiān)控ZipKin聚合依賴問題(三)

前言

讀本篇文章之前,可以先讀前兩篇文章尝蠕。為了照顧沒看過的朋友列肢,我也會稍作復習。
思考大綱: .Net架構篇:思考如何設計一款實用的分布式監(jiān)控系統(tǒng)官册?
實踐篇一:.NetCore實踐篇:分布式監(jiān)控客戶端ZipkinTracer從入門到放棄之路
實踐篇二:.NetCore實踐篇:分布式監(jiān)控系統(tǒng)zipkin踩坑之路(二)
上一章節(jié)生兆,我們遺留了兩個問題,

聚合調(diào)用span傳送到zipkin時膝宁,沒有產(chǎn)生聚合的span鸦难。

菜單dependencies沒有聚合數(shù)據(jù),zipkin-dependencies啟動失敗問題员淫。

很慶幸合蔽,這兩個問題都在本篇文章得到完美解決。沒有什么比一步一步解決問題更開心了介返,我又收集了一堆寶貴的鏈接拴事。非常感謝社區(qū),所以我也將自己的實踐之路分享出來圣蝎,為.net社區(qū)繁榮增一點力氣刃宵。

zipkin復習

zipkin為分布式鏈路調(diào)用監(jiān)控系統(tǒng),聚合各業(yè)務系統(tǒng)調(diào)用延遲數(shù)據(jù)捅彻,達到鏈路調(diào)用監(jiān)控跟蹤组去;
zipkin通過采集跟蹤數(shù)據(jù)可以幫助開發(fā)者深入了解在分布式系統(tǒng)中某一個特定的請求時如何執(zhí)行的;

詳情如下
zipkin參考
zipkin官網(wǎng)

zipkin4net復習

zipkin4net是.NET客戶端庫步淹。

它為您提供:

  • Zipkin 原語(跨度从隆,注釋,二進制注釋缭裆,......)【Zipkin primitives (spans, annotations, binary annotations, ...)】
  • 異步跟蹤發(fā)送
  • 跟蹤傳輸抽象

詳情如下:
zipkin4net

zipkin-dependencies復習

這是一個Spark作業(yè)键闺,它將從您的數(shù)據(jù)存儲區(qū)收集跨度,分析服務之間的鏈接澈驼,并存儲它們以供以后在Web UI中呈現(xiàn)(例如http://localhost:8080/dependency)辛燥。
什么是Spark?
Apache Spark 是專為大規(guī)模數(shù)據(jù)處理而設計的快速通用的計算引擎。
此作業(yè)以UTC時間分析當天的所有跟蹤缝其。這意味著您應該將其安排在UTC午夜之前運行挎塌。
支持所有Zipkin 存儲組件,包括Cassandra内边,MySQL和Elasticsearch榴都。

詳情如下:
zipkin-dependencies

今日重點--成功啟動zipkin-dependencies

上次被zipkin-dependencies的啟動問題卡了很晚,就結束了那篇文章漠其,今天繼續(xù)解決問題嘴高。我從網(wǎng)上搜到一篇類似的博文 部署生產(chǎn)環(huán)境時踩到的一些坑竿音,里面提到直接在tomcat的catalina.sh的JAVA_OPTS注釋處,加一行JAVA_OPTS="-server -Xms1024m -Xmx1624m -XX:PermSize=128M -XX:MaxPermSize=256m"拴驮,即可解決春瞬。

#   JAVA_OPTS       (Optional) Java runtime options used when any command
#                   is executed.
#                   Include here and not in CATALINA_OPTS all options, that
#                   should be used by Tomcat and also by the stop process,
#                   the version command etc.
#                   Most options should go into CATALINA_OPTS.
JAVA_OPTS="-server -Xms1024m -Xmx1624m -XX:PermSize=128M -XX:MaxPermSize=256m"

tomcat啟動成功。

[root@izwz9fwifc2eniq3lbdzmgz bin]# ./startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat/apache-tomcat-8.5.32
Using CATALINA_HOME:   /usr/local/tomcat/apache-tomcat-8.5.32
Using CATALINA_TMPDIR: /usr/local/tomcat/apache-tomcat-8.5.32/temp
Using JRE_HOME:        /usr/lib/jdk1.8.0_181
Using CLASSPATH:       /usr/local/tomcat/apache-tomcat-8.5.32/bin/bootstrap.jar:/usr/local/tomcat/apache-tomcat-8.5.32/bin/tomcat-juli.jar
Tomcat started.

后來又搜到這條鏈接how to increase heap size?
原來直接在執(zhí)行java命令時套啤,追加-Xmx就行了宽气,腦袋太死板,想不到這個點纲岭。

[root@izwz9fwifc2eniq3lbdzmgz cusD]# java -Xmx1024m -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

提示內(nèi)存不足抹竹,分配失敗。

[root@izwz9fwifc2eniq3lbdzmgz cusD]# STORAGE_TYPE=cassandra3  java -Xmx1024m -Xms1024m -jar zipkin-dependencies.jar `date -u -d '1 day ago' +%F`
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000d5550000, 715849728, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 715849728 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /cusD/hs_err_pid6871.log

解決步驟:

執(zhí)行剛才的vi catalina.sh,清理掉設置的JAVA_OPTs信息止潮,關掉mysql窃判,重啟tomcat等步驟。利用freetop查看內(nèi)存消耗喇闸。

[root@izwz9fwifc2eniq3lbdzmgz cusD]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        228M        1.2G        388K        396M        1.4G
Swap:            0B          0B          0B
[root@izwz9fwifc2eniq3lbdzmgz cusD]# STORAGE_TYPE=cassandra3  java -Xmx512m -Xms128m -jar zipkin-dependencies.jar `date -u -d '1 day ago' +%F`
18/09/17 16:42:21 INFO CassandraDependenciesJob: Running Dependencies job for 2018-09-16: 1537056000000000 ≤ Span.timestamp 1537142399999999
18/09/17 16:42:21 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
18/09/17 16:42:22 WARN Java7Support: Unable to load JDK7 types (annotations, java.nio.file.Path): no Java7 support added
Exception in thread "main" java.io.IOException: Failed to open native connection to Cassandra at {127.0.0.1}:9042

未能加載JDK7 types,不過日志級別為Warn,可以忽略袄琳。

啟動成功后,dependency依然沒有數(shù)據(jù)燃乍, 需要繼續(xù)查詢問題唆樊。

今日重點--深思流程解決span聚合問題

上次是由于啟動問題,今天解決了啟動問題刻蟹,再看不到數(shù)據(jù)逗旁,就需要深思整個流程了。
再讓我們回憶下下面這張圖舆瘪,parentid為空片效,是不是意味著跨站點需要強指定parentid或站點名稱?


繼續(xù)翻看zipkin4Net示例代碼,發(fā)現(xiàn)使用了IHttpClientFactoryCreateClient方法英古,又在ConfigureServices里指定了applicationName淀衣,也許這才是能顯示出聚合站點的關鍵!

namespace frontend
{
    public class Startup : CommonStartup
    {
        public override void ConfigureServices(IServiceCollection services)
        {
            services.AddHttpClient("Tracer").AddHttpMessageHandler(provider =>
                TracingHandler.WithoutInnerHandler(provider.GetService<IConfiguration>()["applicationName"]));
        }

        protected override void Run(IApplicationBuilder app, IConfiguration config)
        {
            app.Run(async (context) =>
            {
                var callServiceUrl = config["callServiceUrl"];
                var clientFactory = app.ApplicationServices.GetService<IHttpClientFactory>();
                using (var httpClient = clientFactory.CreateClient("Tracer"))
                {
                    var response = await httpClient.GetAsync(callServiceUrl);
                    if (!response.IsSuccessStatusCode)
                    {
                        await context.Response.WriteAsync(response.ReasonPhrase);
                    }
                    else
                    {
                        var content = await response.Content.ReadAsStringAsync();
                        await context.Response.WriteAsync(content);
                    }
                }
            });
        }
    }
}

繼續(xù)按照示例代碼召调,修改我們的邏輯,封裝一個可供其他站點調(diào)用的HTTPHelper幫助類膨桥,提供能追蹤站點的GetAsync方法,

namespace Demo.ZipkinCommon
{
    public class HTTPHelper : ControllerBase
    {
        /// <summary>
        /// 獲取
        /// </summary>
        /// <param name="url"></param>
        /// <param name="keyValues"></param>
        /// <param name="timeout"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static async Task<string> GetAsync(string url, Dictionary<string, string> keyValues, int timeout = 0, Encoding encoding = null)
        {
            if (encoding == null)
            {
                encoding = Encoding.UTF8;
            }
            var appName = ConfigureSettings.AppSettingConfig["applicationName"];

            using (var httpClient = new HttpClient(new TracingHandler(appName)))
            {
                var response = await httpClient.GetAsync(url);
                if (!response.IsSuccessStatusCode)
                {
                    return response.ReasonPhrase;
                }
                else
                {
                    var content = await response.Content.ReadAsStringAsync();
                    return content;
                }
            }
        }
    }
}

兩個站點的Add方法做出修正唠叛,然后查看監(jiān)控數(shù)據(jù)只嚣。

 [HttpPost]
        public IActionResult Add([FromBody]User user)
        {
            _userService.AddUser(user);

            //模擬調(diào)用其他站點請求。
            var url = $"{ConfigEx.WebSite}/user/get?id={user.Id}";
            var content = HTTPHelper.GetAsync(url, null);
            return Content(content.Result);
        }

監(jiān)控spans有兩級了艺沼,達到了我們要的效果
監(jiān)控層級

點開查看效果
站點聚合
聚合效果圖

經(jīng)測試册舞,重啟linux后,不開啟zipkin-dependencies的情況下澳厢,內(nèi)存模式下依然能實時聚合环础,上篇文章的結論是本人不熟悉所導致。

參考資料

how to increase heap size?
部署生產(chǎn)環(huán)境時踩到的一些坑
Linux下如何同時注釋多行/同時取消多行注釋
利用Zipkin追蹤Mysql數(shù)據(jù)庫調(diào)用鏈
微服務調(diào)用鏈追蹤中心搭建
微服務監(jiān)控zipkin+asp.net core
Zipkin實踐:Python項目中跟蹤系統(tǒng)導入Zipkin

源碼

源碼已上傳范存威的github

總結

基于內(nèi)存模型的存儲剩拢,執(zhí)行效果演示到此結束线得。在這個過程中,提升了我java一些知識徐伐,.NetCore依賴注入贯钩,加深了zipkin整體流程的理解。
下篇文章大體方向是zipkin數(shù)據(jù)持久化和集群办素,以及zipkin如何跟蹤mongodb和Redis角雷。

本篇到此結束,感謝觀看性穿!

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勺三,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子需曾,更是在濱河造成了極大的恐慌吗坚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呆万,死亡現(xiàn)場離奇詭異商源,居然都是意外死亡,警方通過查閱死者的電腦和手機谋减,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門牡彻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人出爹,你說我怎么就攤上這事庄吼。” “怎么了以政?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵霸褒,是天一觀的道長。 經(jīng)常有香客問我盈蛮,道長废菱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任抖誉,我火速辦了婚禮殊轴,結果婚禮上,老公的妹妹穿的比我還像新娘袒炉。我一直安慰自己旁理,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布我磁。 她就那樣靜靜地躺著孽文,像睡著了一般驻襟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芋哭,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天沉衣,我揣著相機與錄音,去河邊找鬼减牺。 笑死豌习,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的拔疚。 我是一名探鬼主播肥隆,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稚失!你這毒婦竟也來了栋艳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墩虹,失蹤者是張志新(化名)和其女友劉穎嘱巾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诫钓,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡旬昭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了菌湃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片问拘。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惧所,靈堂內(nèi)的尸體忽然破棺而出骤坐,到底是詐尸還是另有隱情,我是刑警寧澤下愈,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布纽绍,位于F島的核電站,受9級特大地震影響势似,放射性物質(zhì)發(fā)生泄漏拌夏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一履因、第九天 我趴在偏房一處隱蔽的房頂上張望障簿。 院中可真熱鬧,春花似錦栅迄、人聲如沸站故。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽西篓。三九已至愈腾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間岂津,已是汗流浹背顶滩。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寸爆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓盐欺,卻偏偏與公主長得像赁豆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冗美,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容