TARS服务信息上报|全方位服务监控

Wesley13
• 阅读 188

TARS服务信息上报|全方位服务监控

服务上线运营后,出现异常是难免的事,通常情况下会通过服务日志排查问题。然而这种排查问题的方式有时候是低效的,特别是日志比较多,还不知道如何下手的时候,非常麻烦。那让服务主动报告出现的错误不就行了吗?本文将对TARS中的几种信息上报方式进行介绍。

TARS服务信息上报|全方位服务监控

  • 简介

  • 状态统计上报

  • 异常上报

  • 属性统计上报

  • 总结

TARS服务信息上报|全方位服务监控

服务出现异常时,特别是生产环境中,我们需要快速定位并解决问题。而日志排查方式又是低效的,特别是在我们对问题还没有头绪的时候。这时如果能够让服务主动报告出现的问题,会很大程度提高排查问题的效率。

TARS框架中集成了服务信息上报的功能,包含了服务的状态统计上报、异常上报、属性统计上报等三个信息上报统计方式,实现对服务健康程度的多方面监控。这三种信息上报方式分别通过 Stat、Notify、Property 这三个节点实现。如下图:

TARS服务信息上报|全方位服务监控

服务通过向这三个节点报告自身不同维度的信息,实现对服务状态的监控。那么接下来我们来了解这三种信息上报方式吧。

TARS服务信息上报|全方位服务监控

所谓的状态统计上报,就是在 TARS 框架中,服务向 Stat上报自身的调用耗时、超时率、异常率等状态信息并进行统计。

服务调用上报接口后,实际上是先暂存在内存中,当到达某个时间点后才正式上报到 Stat 服务(默认是1分钟上报一次)。我们称两个上报时间点之间的时间为一个统计区间,在一个统计区间相同 key 进行累加、对比等操作。

状态统计上报一般不需用户额外开发,服务在 TARS 框架中正确配置并部署后,即可自动上报。

打开 TarsWeb 的服务管理页面,在具体服务的 服务监控 页面中可以看到对应服务相关的状态信息,包括流量、平均耗时、超时率等,如下图:

TARS服务信息上报|全方位服务监控

TARS服务信息上报|全方位服务监控

服务状态统计上报能够直观地了解服务的状态和健康度。不过实际使用场景中,仅统计一些服务的调用信息是不够的。为了更好监控,TARS 框架支持在服务中将异常直接上报到 Notify,并可以在 TarsWeb 管理页面上查看到,或结合别的告警软件或平台直接通知用户。TARS 不同语言版本中都提供了异常上报方式。本部分将分别基于 TarsCpp 和 TarsGo 举例介绍,其他语言版本类似。

TarsCpp

TarsCpp 中提供了一种异常上报方式,即使用 RemoteNotify::report 来上报异常,用法如下:

TARS服务信息上报|全方位服务监控

参数info为需要上报的异常信息,类型为 string 字符串, 可以直接上报字符串到 Notify,页面可以看到上报的字符串。例如我们创建一个服务名为 Demo.DemoServer.DemoObj 的 TarsCpp 服务,创建命令如下:

TARS服务信息上报|全方位服务监控

项目目录结构如下:

TARS服务信息上报|全方位服务监控

接着在 DemoServer.cpp 的服务初始化函数 DemoServer::initialize 中上报一条信息,这样服务在启动时,就会上报一条 DemoServer Start 的信息,如下:

TARS服务信息上报|全方位服务监控

将服务编译部署后,可以在 TarsWeb 上服务的实时状态中看到服务上报的信息,如下图:

TARS服务信息上报|全方位服务监控

TarsGo

TarsGo 中提供了如下函数来上报异常信息,用法和前面 TarsCpp 的相似。

TARS服务信息上报|全方位服务监控

level指的是异常等级,分为NOTIFY_NORMAL, NOTIFY_WARN, NOTIFY_ERROR,info则为上报的信息。

我们通过以下命令创建一个 TarsGo 服务Demo.NotifyDemo.DemoObj

TARS服务信息上报|全方位服务监控

项目目录结构如下:

TARS服务信息上报|全方位服务监控

同 TarsCpp 相似,我们在demo_imp.cpp的Init中添加异常上报

TARS服务信息上报|全方位服务监控

构建部署该服务后,同样可以在服务实时状态中看到

TARS服务信息上报|全方位服务监控

可见,异常上报是一个主动上报的过程,开发者可以通过异常上报,主动上报服务错误,比如在try...catch捕捉到错误时,进行上报。

TARS服务信息上报|全方位服务监控

除了状态统计上报和异常上报,TARS 中也提供了属性统计的功能,开发者能够上报业务相关属性并进行统计。为了方便业务使用,TARS 目前自带了以下几种统计类型:

  • 求和(sum)

  • 平均(avg)

  • 分布(distr)

  • 最大值(max)

  • 最小值(min)

  • 计数(count)

TarsCpp 中,可以通过 createPropertyReport() 来创建并配置一个属性上报对象,并通过调用该对象的方法 report 来上报属性值。例如,我们想监控一个数组大小的最大值,我们创建一个属性名为 array_size 的属性上报对象,并配置上报方法为 max ,即最大值,可以通过如下步骤实现。

TARS服务信息上报|全方位服务监控

接下来我们以一个 C++ 实现的简单队列服务为例,该服务包含两个队列操作接口

  • pop:用于弹出队列最前端的数字

  • push:用于添加一个数字到队列中

并对服务中队列的大小进行属性统计上报。

首先,我们新建一个服务名为Demo.PropertyDemo.TestObj的服务,并新建文件 Queue.h,项目结构如下:

TARS服务信息上报|全方位服务监控

在 Queue.h 中实现一个简单的线程安全队列类,实现如下:

TARS服务信息上报|全方位服务监控

可以看到 Queue 继承自 TC_Singleton,TC_Singleton是 TarsCpp 中提供的一个单件类组件,通过继承该类,使 Queue 成为单件类。

修改 Test.tars,我们新增两个接口 pop, push 用于操作服务的队列。如下:

TARS服务信息上报|全方位服务监控

然后在 TestImp.h 中添加接口的声明,如下:

TARS服务信息上报|全方位服务监控

并在 TestImp.cpp 中实现这两个接口,如下:

TARS服务信息上报|全方位服务监控

最后,在 PropertyDemo.cpp 中,添加对队列大小的上报,如下:

TARS服务信息上报|全方位服务监控

在 reportFunc 中,我们创建了一个属性 queuelength 的上报对象reportPtr,添加上述的六种统计策略,并定时上报;然后在 main 函数中创建一个线程来运行 reportFunc。

构建并部署服务后,我们就可以在 TarsWeb 页面服务的特性监控中看到属性的统计值了,如下图:

TARS服务信息上报|全方位服务监控

如果看不到统计信息,可以间隔5分钟,监控信息每5分钟同步一次。

从上图中,可以看到六种统计策略的值,分别是Queue中队列大小的求和、最小值、最大值、分布、计数、平均值。通过调用服务的接口pop和push,即向Queue队列中添加或弹出对象,改变队列大小,这些值也会相应的变化。

TARS服务信息上报|全方位服务监控

本文对 TARS 三种信息上报方式及如何使用进行了介绍。通过这三种服务信息上报方式,开发者能够对服务进行多维度的监控,了解服务和业务实时健康状态、异常信息及业务相关属性,帮助开发者更好地管理服务。

TARS 可以在考虑到易用性和高性能的同时快速构建系统并自动生成代码,帮助开发人员和企业以微服务的方式快速构建自己稳定可靠的分布式应用,从而令开发人员只关注业务逻辑,提高运营效率。多语言、敏捷研发、高可用和高效运营的特性使 TARS 成为企业级产品。


TARS基金会是Linux基金会下的非营利性、微服务基金会,致力于建设一个强大而灵活的微服务生态系统。无论你在哪个行业,无论你使用什么技术栈,这里能助你快速实现你的创意。

TARS服务信息上报|全方位服务监控

TARS服务信息上报|全方位服务监控


TARS服务信息上报|全方位服务监控

TARS服务信息上报|全方位服务监控

TARS服务信息上报|全方位服务监控

点“在看”让TARS小姐姐变好看TARS服务信息上报|全方位服务监控

TARS服务信息上报|全方位服务监控

本文分享自微信公众号 - TARS星球(TarsCloud)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
秃头王路飞 秃头王路飞
5个月前
webpack5手撸vue2脚手架
webpack5手撸vue相信工作个12年的小伙伴们在面试的时候多多少少怕被问到关于webpack方面的知识,本菜鸟最近闲来无事,就尝试了手撸了下vue2的脚手架,第一次发帖实在是没有经验,望海涵。languageJavaScript"name":"vuecliversion2","version":"1.0.0","desc
技术小男生 技术小男生
5个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
5个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
刚刚好 刚刚好
5个月前
css问题
1、在IOS中图片不显示(给图片加了圆角或者img没有父级)<div<imgsrc""/</divdiv{width:20px;height:20px;borderradius:20px;overflow:h
小森森 小森森
5个月前
校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
后续会继续更新,敬请期待2.0全新版本欢迎添加左边的微信一起探讨!项目地址:(https://www.aliyun.com/activity/daily/bestoffer?userCodesskuuw5n)\2.Bug修复更新日历2.情侣脸功能大家不要使用了,现在阿里云的接口已经要收费了(土豪请随意),\\和注意
晴空闲云 晴空闲云
5个月前
css中box-sizing解放盒子实际宽高计算
我们知道传统的盒子模型,如果增加内边距padding和边框border,那么会撑大整个盒子,造成盒子的宽度不好计算,在实务中特别不方便。boxsizing可以设置盒模型的方式,可以很好的设置固定宽高的盒模型。盒子宽高计算假如我们设置如下盒子:宽度和高度均为200px,那么这会这个盒子实际的宽高就都是200px。但是当我们设置这个盒子的边框和内间距的时候,那
艾木酱 艾木酱
5个月前
快速入门|使用MemFire Cloud构建React Native应用程序
MemFireCloud是一款提供云数据库,用户可以创建云数据库,并对数据库进行管理,还可以对数据库进行备份操作。它还提供后端即服务,用户可以在1分钟内新建一个应用,使用自动生成的API和SDK,访问云数据库、对象存储、用户认证与授权等功能,可专
Wesley13 Wesley13
1年前
TARS 服务信息上报|全方位服务监控
!(https://ftp.bmp.ovh/imgs/2020/10/b7fb603e17fc6529.jpg)作者|Eaton导语|服务上线运营后,出现异常是难免的事,通常情况下会通过服务日志排查问题。然而这种排查问题的方式有时候是低效的,特别是日志比较多,还不知道如何下手的时候,非常麻烦。那让服务主动报告出现的错误不就
密钥管理系统-为你的天翼云资产上把“锁
本文关键词:数据安全,密码机,密钥管理一、你的云上资产真的安全么?1.2021年1月,巴西的一个数据库30TB数据被破坏,泄露的数据包含有1.04亿辆汽车和约4000万家公司的详细信息,受影响的人员数量可能有2.2亿;2.2021年2月,广受欢迎的音频聊天室应用Clubhouse的用户数据被恶意黑客或间谍窃取。据悉,一位身份不明的用户能够将Clubho
NVIDIA安培架构下MIG技术分析
关键词:NVIDIA、MIG、安培一什么是MIG2020年5月,NVIDIA发布了最新的GPU架构:安培,以及基于安培架构的最新的GPU:A100。安培提供了许多新的特性,MIG是其中一项非常重要的新特性。MIG的全名是MultiInstanceGPU。NVIDIA安培架构中的MIG模式可以在A100GPU上并行运行七个作业。多实
helloworld_28799839 helloworld_28799839
5个月前
常用知识整理
Javascript判断对象是否为空jsObject.keys(myObject).length0经常使用的三元运算我们经常遇到处理表格列状态字段如status的时候可以用到vue