前言
讀本篇文章之前,可以先讀前兩篇文章尝蠕。為了照顧沒看過的朋友列肢,我也會稍作復習。
思考大綱: .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等步驟。利用free或top查看內(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)使用了IHttpClientFactory的CreateClient方法英古,又在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有兩級了艺沼,達到了我們要的效果經(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角雷。
本篇到此結束,感謝觀看性穿!