[Stardust]星尘分布式全链路监控

随着业务的发展,微服务系统会变得越来越大,各个服务之间的调用关系也会日趋复杂。一个WebApi请求,后方可能经历多个微服务以及数据库和MQ操作,在这个调用过程中,可能因为某一个服务节点出现延迟或者失败,而导致整个请求失败,此时极为需要全链路的调用监控。星尘Stardust提供了分布式全链路监控的解决方案。

星尘监控功能

星尘分布式全链路监控,主要功能点如下:

  • 功能强大。能够埋点统计调用次数、错误数、耗时等,适用于Web接口、RPC接口、数据库访问、Redis访问、消息队列访问等场景;

  • 简单易用。只有一个服务端和Web控制台,支持多种数据库(MySql/SQLite/Postgresql/SqlServer),免安装,解压后配置数据库连接即可跑起来;

  • 超低投入。计算能力下沉,无需ES等重型数据库,避免了大量的IT基础设施投入,1台2C4G的服务器和1台2C4G的MySql足够支持80多个应用每天4亿多的埋点数据;

  • 多维度分析。丰富的实时计算经验,按照应用、类别、埋点等多个维度进行实时分析,支持月度、每天、小时、5分钟等多种时间刻度,永久保存分析统计数据,主要接口趋势图等同于业务趋势;

  • 监控告警。支持按照应用配置告警阈值和告警机器人(企业微信、钉钉);

  • 业界标准。基于业界标准OpenTracing来设计,跨应用跟踪基于W3C的TraceContext来设计,支持任意语言开发的应用接入,支持不同语言应用系统的链路集成;

(应用监控趋势图)

(跨应用全链路监控,Android客户端、WebApi、数据库、Redis、消息队列、用户自定义埋点)

部署星尘服务端

源码:https://github.com/NewLifeX/Stardust

国内:https://gitee.com/NewLifeX/Stardust

可以下载源码,编译StarServer/StarWeb并得到两个输出,标准.NET5.0应用。

StarServer是星尘服务端,默认端口6600,可以通过aspnetcore的urls参数调整端口。服务端以webapi形式接收处理StarAgent星尘代理或者其它星尘客户端的数据请求,其中一部分接口属于监控子系统,接收埋点应用上报的链路监控数据。为提升系统可用性,建议服务端采用双节点部署,业务应用集成星尘客户端时,支持配置逗号分隔的多节点地址,来实现故障转移,例如:“http://star.newlifex.com:6600,http://106.14.11.143:6600

StarWeb是星尘Web管理平台,默认端口5000,可以通过aspnetcore的urls参数调整端口。管理平台是一个基于魔方开发的web后台系统,用于管理查看节点和应用埋点数据。Web管理平台仅用于查看数据和修改配置,无需多节点部署。

星尘支持多种数据库(MySql、SQLite、SqlServer、Oracle、Postgresql),默认SQLite。主要连接名如下:

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","ConnectionStrings": {"Stardust": {"connectionString": "Data Source=..\\Data\\Stardust.db","providerName": "SQLite"},"Node": {"connectionString": "Data Source=..\\Data\\Node.db","providerName": "SQLite"},"NodeLog": {"connectionString": "Data Source=..\\Data\\NodeLog.db","providerName": "SQLite"},"Monitor": {"connectionString": "Data Source=..\\Data\\Monitor.db","providerName": "SQLite"},"MonitorLog": {"connectionString": "Data Source=..\\Data\\MonitorLog.db","providerName": "SQLite"}}
}

实际生产环境中,星尘使用2C4G的MySql数据库,2C4G的服务器,支撑了80多个应用系统的埋点数据,每天共4亿多次调用跟踪。

使用监控系统

星尘系统演示:http://star.newlifex.com

星尘服务端试用版:http://star.newlifex.com:6600/

应用跟踪器

应用监控,应用跟踪器,管理着所有连接到星尘的监控埋点应用,默认自动添加新应用。

  • 启用,如果禁用,星尘将不再接受该应用提交的埋点数据;

  • 采样周期,默认每60秒上传一次采样数据;

  • 最大正常采样数,每个采样周期中,每个埋点选择的采样数据明细,用于建立调用链路;

  • 最大异常采样数,每个采样周期中,每个埋点选择的异常采样数据明细,用于分析系统错误;

应用统计

每个应用每天的总调用数、错误数、平均耗时、最大最小耗时,分类调用数(如接口数、Http请求、数据库、消息队列、Redis缓存、用户自定义埋点)

点击应用名,进入应用每日视图,可以看到该应用在这一天中,每一个操作名/埋点(接口)的调用情况,包括次数、错误数、耗时等。点击这里的种类,可以过滤只查看该类埋点操作的数据,不同种类埋点操作,采用不同颜色显示。

再次点击应用名,可以看到该应用每天的整体调用情况

埋点跟踪统计

点击操作名(埋点/接口),可以查看该埋点操作近90天的每日统计数据,主要有调用次数、错误数、耗时等。上方的“7天”,可以查看该埋点仅7天的每小时统计数据。上方的“24小时”,可以查看该埋点近24小时的每5分钟统计数据,5分钟数据比较多,默认只会保留3天,可以在服务端配置文件中调整。

全链路追踪

每个埋点数据行,都带有“跟踪”链接,可以查看该埋点的某一次调用链路。

如上图,同一个调用链上的多次埋点,具有相同traceId,跟踪视图显示该traceId的前后调用关系,甚至跨多个应用系统,穿越http接口和消息队列。鼠标移到埋点操作名上面,可以看到该埋点的数据标签,或者异常信息。例如,数据库埋点的数据标签就是sql语句,消息队列埋点的数据标签就是消息内容。

链路追踪明细数据默认保存3天,可以在星尘服务端配置文件调整。

异常分析

对于有错误次数的埋点,可以从总次数点击进去,找到错误采样,然后进行跟踪查看。如果有多次错误采样,不方便查找,可以从埋点跟踪统计进入五分钟视图后再找。

应用接入监控系统

微服务系统中的调用采样数据及其庞大,星尘监控通过计算能力下沉来解决这个问题。在业务系统埋点模块内部对埋点数据进行初步聚合,再挑选若干采样数据,在每个采样周期(默认60秒)结束后批量上传到星尘服务端的收集器。收集器落库保存数据后,再次进行聚合,并进行级联统计分析。

任何项目想要接入星尘监控,都需要从nuget中引用 NewLife.Stardust 组件库,实例化StarTracer跟踪器。

星尘监控支持WebApi、HttpClient、Redis、XCode、AntJob等场合的自动埋点追踪,也支持用户自定义埋点。

WebApi应用接入监控

netcore项目在Startup的ConfigureServices中配置引入

public void ConfigureServices(IServiceCollection services)
{var set = Stardust.Setting.Current;if (!set.Server.IsNullOrEmpty()){// APM跟踪器var tracer = new StarTracer(set.Server) { Log = XTrace.Log };DefaultTracer.Instance = tracer;ApiHelper.Tracer = tracer;DAL.GlobalTracer = tracer;TracerMiddleware.Tracer = tracer;services.AddSingleton<ITracer>(tracer);}services.AddControllersWithViews();// 引入魔方services.AddCube();
}

从配置文件Config/Star.config中读取Server字段,初始化星尘跟踪器。也可以代码写死或者从配置中心读取地址,支持配置逗号分隔的多节点地址,来实现故障转移,例如:“http://star.newlifex.com:6600,http://106.14.11.143:6600”。

services.AddSingleton<ITracer>(tracer) 直接注入跟踪器实例,便于后面集成使用,推荐使用。

DefaultTracer.Instance 是静态属性,用于没有DI的较老代码的接入,不推荐使用。

ApiHelper.Tracer 开放所有HttpClient扩展的埋点追踪。

DAL.GlobalTracer 开放XCode所有数据库访问的埋点追踪。

TracerMiddleware.Tracer 对所有Web请求进行埋点追踪。

Web应用跟踪视图如下

消息队列应用接入监控

.NET最爱的Redis消息队列,NewLife.Redis 集成了链路追踪,仅需要在实例化FullRedis对象时,指定Tracer属性。

var redis = new FullRedis { Tracer = tracer, Timeout = 15000, Retry = 5, Log = XTrace.Log };

此外,NewLife.RocketMQNewLife.MQTT 都集成了链路追踪支持。

消息队列跟踪视图如下

数据调度应用接入监控

蚂蚁调度 AntJob 集成了链路追踪,仅需要在实例化调度器时指定Tracer属性。

var set = AntSetting.Current;
var server = _getConfig("antServer");
if (!server.IsNullOrEmpty())
{set.Server = server;set.Save();
}
// 实例化调度器
var sc = new Scheduler
{Tracer = DefaultTracer.Instance,// 使用分布式调度引擎替换默认的本地文件调度Provider = new NetworkJobProvider{Server = set.Server,AppID = set.AppID,Secret = set.Secret,Debug = false}
};

数据调度应用跟踪视图如下

用户自定义埋点

在关键业务方法内部,我们需要做一些自定义埋点。通过DI注入或者DefaultTracer.Instance拿到ITracer对象,借助NewSpan方法,即可得到一个埋点实例ISpan,参数就是埋点操作名,span开始到释放就是这一次埋点的耗时。

using var span = _tracer?.NewSpan("CreateOrder", orderModel);
try
{//todo CreateOrder
}
catch (Exception ex)
{span?.SetError(ex, null);throw;
}

如上,使用using语法,让span离开作用域时自动Dispose销毁,计算耗时。NewSpan第二个参数是数据标签Tag,如果这一次埋点span有幸成为采样对象送给星尘服务端,那么Tag将会在链路追踪视图里面得以显示(鼠标移到操作名上)。

如果业务代码抛出异常,需要调用SetError方法指定这一次埋点为异常采样,并设置ex异常信息,该信息会送给星尘服务端,用于查看异常详情。

SetError 不是必须的,如果异常时不调用SetError,还是会记入监控统计,只是认为这次调用成功,并且拿不到异常信息。此时有最简化的自定义埋点代码:

using var span = _tracer?.NewSpan("CreateOrder", orderModel);

NewSpan会在进程中建立埋点的父子关系,无需用户处理。而跨应用集成调用链,则需要一些额外操作。

常见注入和提取扩展

调用另一个系统的WebApi时,按照W3C标准,需要在Http请求头中加上 traceparent ,内容是 span.ToString(),格式:00-traceId-spanId-00

spanId是埋点唯一标识,一般是16字符hex编码;

traceId是链路唯一标识,一般是32字符hex编码,具有相同traceId的埋点采样,构成一个完整调用链;

调用方通过span.Attach把span注入到http请求头,接收方从http请求头中解码得到traceId,魔方的TracerMiddleware.cs中有实现该功能。该方案使得不同应用的埋点操作具有相同的链路标识traceId,从而构成一个完整调用链。

NewLife.Redis消息队列的跨系统集成,本质上是在发布消息时,向json集合中注入一个traceparent的字段,消费时读取,从而共用traceId,构成完成调用链。

从图片库选择

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 C# 中使用 const,readonly,static

平时在开发时经常会用到 const,readonly,static 关键字&#xff0c;可以肯定这些关键词是完全不同的概念&#xff0c;但有时候他们在用法上很相似以至于在场景中不知道选择哪一个&#xff0c;这篇文章我们就来讨论 C# 中的 const&#xff0c;static 和 readonly 关键词&#xf…

2020,你收获了什么?又失去了什么?

这是头哥侃码的第228篇原创今天是圣诞节&#xff0c;既魔幻又真实的2020年&#xff0c;还有6天就要结束了。每年的年末&#xff0c;我都习惯在下班途中&#xff0c;把头靠在地铁车厢两侧的扶手上&#xff0c;闭上眼睛开始思考自己过去一年的收获与得失&#xff0c;并把这些思绪…

2019龙少php泛站群,龙少php泛站群|PHP版站群 全自动泛解析站群程序 赠送教程

首先将准备建站的域名设置泛解析如baidu.com泛解析为 添加A记录为 *.baidu.com然后在iis里添加空头主机不能设置 汉字目录keywords.txt 关键字&#xff0c;一行一个domain.txt 域名&#xff0c;一行一个&#xff0c;*代表随机muban.html 模板文件&#xff0c;可以修改缓存在dat…

轻量级消息队列RedisQueue

消息队列&#xff08;Message Queue&#xff09;是分布式系统必不可少的中间件&#xff0c;大部分消息队列产品&#xff08;如RocketMQ/RabbitMQ/Kafka等&#xff09;要求团队有比较强的技术实力&#xff0c;不适用于中小团队&#xff0c;并且对.NET技术的支持力度不够。而Redi…

生态和能力是国内自研操作系统发展的关键

“缺芯少魂”一直是我国信息产业短板&#xff0c;如果无法实现国产化替代&#xff0c;信息安全和产业安全就犹如沙滩上盖房子&#xff0c;上层再坚固&#xff0c;地基不稳&#xff0c;一遇到风吹草动就有可能全部垮掉。近年来&#xff0c;国内自研操作系统厂商动作频频&#xf…

matlab群延时函数,群延迟函数(group delay function)群延迟滤波器 | 学步园

最近看了许多介绍Group delay function的论文&#xff0c;文章中大篇幅提到Group delay&#xff0c;group delay of digital filters,对这个方面的知识好像还挺有用的&#xff0c;所以想把它记录下来。然后总结下计算Group delay function的步骤。假设有N个样本的脉冲响应为h(n…

怎样使用C# 获取WIFI的连接状态?

怎样使用C# 获取WIFI的连接状态&#xff1f;行文导航思路问题得到解决代码展示断开与连接WIFI状态效果在OrangePI Linux Arm32上的测试效果C# 获取WIFI的连接状态本文是在知道WIFI网络设备名称的情况下&#xff0c;获取该设备的连接状态&#xff0c;同样也是可以判断是否已连接…

如何在 ASP.NET Core 中使用 URL Rewriting 中间件

URL rewriting 是根据预先配置好的一组规则去修改 request url&#xff0c;值得注意的是&#xff1a;URL Rewriting 的重写功能和 url 重定向 是两个概念&#xff0c;本篇我们就来讨论下如何在 ASP.NET Core 中对 url 进行 rewriting。安装 URL Rewriting 中间件 要想使用 URL …

睡眠分期matlab代码,非接触式睡眠分期方法与流程

本发明属于雷达监测技术领域&#xff0c;特别是一种非接触式睡眠分期方法。背景技术&#xff1a;传统的呼吸睡眠监护系统主要依靠贴附于人体的接触式传感器、电极进行测量&#xff0c;从而实时获得人体的生命参数信号&#xff0c;这些方法都需要直接或间接地接触人体&#xff0…

叮咚!你有一份来自明源云的圣诞邀约

请查收&#xff0c;来自明源云的圣诞邀约&#xff5e;

java先进先出 循环队列,JavaScript队列、优先队列与循环队列

队列是一种遵从先进先出(FIFO)原则的有序集合队列在尾部添加新元素&#xff0c;从顶部移除元素队列的理解队列在我们生活中最常见的场景就是排队了队列这个名字也已经很通俗易懂了和栈很像&#xff0c;这不过队列是先入先出的数据结构队列的前面是队头队列的后面是队尾出队从队…

Abp小试牛刀之 图片上传

图片上传是很常见的功能&#xff0c;里面有些固定的操作也可以沉淀下来。本文记录使用Abp vNext做图片上传的姿势。目标上传图片----->预览图片----->确定保存支持集群部署实现思路&#xff1a;1. 上传图片要使用WebAPI特定媒体类型&#xff1a;multipart/form-data;2. 因…

.Net Conf 2020 之回顾

Intro上周 .NET Conf 在苏州成功举办了第二届活动&#xff0c;一年一度的 .NET 盛会又来了&#xff0c;今年大会依然有许多从外地过来参加的开发者们&#xff0c;也有很多讲师也是从外地赶过来为我们分享。虽然今年是疫情的一年&#xff0c;并没有影响 .NET Conf 参会者们的热情…

如何使用 C# 在异步代码中处理异常

异常处理是一种处理运行时错误的技术&#xff0c;而 异步编程 允许我们在处理资源密集型的业务逻辑时不需要在 Main 方法或者在 执行线程 中被阻塞&#xff0c;值得注意的是&#xff0c;异步方法和同步方法的异常处理机制是不一样的&#xff0c;本篇我们就来讨论下如何在异步方…

对 Redis 中的有序集合SortedSet的理解

本篇说一下Redis中的 有序集合类型&#xff0c;曾几何时&#xff0c;我们想把所有数据存到内存中的 数据结构 中&#xff0c;但为了多机器共享内存&#xff0c;不得不将这块内存包装成wcf单独部署&#xff0c;同时还要考虑怎么序列化&#xff0c;烦心事太多太多。。。后来才知道…

代码质量在「内卷时代」的重要性

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「173」篇原创敬上大家好&#xff0c;我是Z哥。提到代码质量&#xff0c;不知道你的脑海中浮现出的第一个词是什么&#xff1f;规范&#xff1f;可读性&#xff1f;…

.NET Core AWS S3云存储

【导读】最近有需要用到AWS S3云存储上传附件&#xff0c;这里对利用.NET或.NET Core在调用SDK APi需要注意的一点小问题做个记录&#xff0c;或许能对后续有用到的童鞋提供一点帮助Amazon Simple Storage Service (Amazon S3) 是一种对象存储服务&#xff0c;提供行业领先的可…

MiniProfiler,一个.NET简单但有效的微型分析器

背景MVC MiniProfiler是Stack Overflow团队设计的一款对ASP.NET MVC的性能分析的小程序。可以对一个页面本身&#xff0c;及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容&#xff0c;并可以显示数据库访问的SQL&#xff08;支持EF、EF …

龙芯.NET正式发布 稳步推进生态建设

2020年12月19日&#xff0c;2020中国. NET开发者大会于苏州开幕。此次大会上&#xff0c;龙芯发布了龙芯.NET 3。龙芯.NET 3基于.NET Core 3.1&#xff0c;支持该版本具备的所有主要功能&#xff0c;包括GC、AOT等。CoreCLR、CoreFX、ASP.NET Core等库的测试通过情况与x64/arm6…

有温度的技术,改善上亿人的生活

06有温度的技术&#xff0c;改善上亿人的生活鱼小皮哥&#xff0c;现在的 APP 真是越来越难用了&#xff0c;功能多、操作复杂、广告更多。唉&#xff0c;可不是么&#xff0c;而且人们的生活已经离不开 APP 了&#xff01;老百鱼小皮我爷爷最近的视力下降的很快&#xff0c;用…