微服务场景下基于监控指标数据按照场景入口自动生成链路数据图实时展示前后端实现
1 背景2 效果展示3 后端实现逻辑
3.1 先决条件
3.2 场景四生成前端实现逻辑
4.1 创建画布高度和宽度并处理中英文显示长度
4.2 自定义节点样式4.3 节点或画布上的双击和单击事件
1 背景
在日常运维工作中,随着事务协调变得更加复杂,微服务的出现需要不断关注生产环境中各个服务组件的运行情况。这种复杂性使得传统方法难以进行手动操作,也难以获取提供云原生可观测性的实时链路监控指标。
使用的技术主要有Django、VUE、Element、Antv G6等。
2 效果展示
3 后端实现逻辑
3.1 前提
考虑到后端服务与有向图如(A,B) (B,C) (B,D) (C,D) (D,B) 之间成对调用关系的逻辑,可以如下提取它:从大量有向图访问关系数据中自动生成基于入口发起服务的交易链接,并实时展示相关指标。
3.2 生成场景
def queryServerByClient(dbcon,cloudtype,租户,命名空间,客户端,tplTupleList):
# tplTupleList存储基于一个客户端查询到的所有相关调用关系
sql=\’从tb\\_trace\\_info 中选择个人(服务器)\’ + \\
\’ 其中云类型=\’\’ + 云类型+ \\
\’\’ 和env=\’prod\’ + \\
\’ 和租户=\’\’ + 租户+ \\
\’\’ 和nameSpace=\’\’ + 命名空间+ \\
\’\’ 和客户端=\’\’ + 客户端+ \’\’;\’
if int(dbcon.select(sql)[\’代码\’]) !=1000:
返回值{\’code\’: 500,
\’context\’: \’查询数据库失败\’
}
: 其他
if len(dbcon.select(sql)[\’上下文\’])==0:
返回值{\’code\’: 600,
\’context\’: \’查询数据为空\’
}
server_res=dbcon.select(sql)[\’上下文\’]
如果len(server_res)==0:
返回tplTupleList
: 其他
对于server_res: 上的SVC
服务器=svc[0]
tpl=(客户端,服务器)
如果tpl 在tplTupleList: 中
休息
: 其他
tplTupleList.append(tpl)
queryServerByClient(dbcon、cloudtype、租户、命名空间、服务器、tplTupleList)
4 前端实现逻辑
4.1 创建画布高宽并对中英文展示长度处理
const width=document.getElementById(\’mountNode\’).scrollWidth;
const height=(document.getElementById(\’mountNode\’).scrollHeight * 0.8) || 600;
const FittingString=(str, maxWidth, fontSize)={
令当前宽度=0。
让res=str;
const pattern=new RegExp(\'[\\u4E00-\\u9FA5]+\’); //区分汉字。
str.split(\’\’).forEach((字母, i)={
返回if (currentWidth maxWidth)。
if (模式.测试(字符)) {
//中国文字
当前宽度+=字体大小;
} 除此之外{
//根据fontSize获取一个字符的宽度
currentWidth +=G6.Util.getLetterWidth(字母, fontSize);
}
如果(当前宽度最大宽度){
res=`${str.substr(0, i)}\\n${str.substr(i)}`;
}
});
返回响应。
};
常量图标\\_MAP={
pod: \’src/icons/pod.png\’,
service: \’src/icons/service.png\’,
trans: \’src/icons/trans.png\’,
警报: \’src/icons/alarm.png\’,
useTime: \’src/icons/time.png\’,
successRate: \’src/icons/success.png\’,
};
4.2 自定义节点样式
//自定义节点
G6.注册节点(
\’service\’, //第一个参数自定义节点名称
//第二个参数是该节点的图形组。
{
draw: 函数(cfg,组){
//根据数据动态改变颜色和图像
letduration_avg=cfg.statistics.duration_avg1 ?\’#F3FAFF\’ :\’#F3FAFF\’;
//let img2=cfg.statistics.duration_avg1 ?require(\’./././././assets/shouye backup 1.png\’) :require(\’./././././assets/shouye backup.png\’);
letalert_num=cfg.statistics.alert_num20 ?\’#F3FAFF\’ :\’#F3FAFF\’;
//let img3=cfg.statistics.alert_num20 ?require(\’./././././assets/a-fuwuqilan2.png\’) :require(\’./././././assets/fuwuqilan.png\’);
设置svc\\_fontsize=10
设置公制\\_fontsize=8
//添加图像最外层的虚线框
让keyShape=group.addShape(\’矩形\’,{
//表示矩形的一些属性
//设置节点部署的相对位置,节点整体布局
attrs:{
x: 0,
y: 0,
宽度: 130,
身高: 80、
Stroke : \’#1a66b2\’, //描边颜色
fill: \’#d7dae0\’, //填充颜色
半径: 3,
线宽: 2,
lineDash: [2,2] //设置虚线的样式
},
name:\’card-node-keyShape\’ //给它一个唯一的名称,以便于识别
});
//设置服务名称在节点上的显示布局
group.addShape(\’矩形\’,{
attrs:{
x:5,
y:1,
宽度: 120,
高度:25,
//描边:\’粉红色\’, //描边颜色
fill:\’#3d8ad7\’,
半径:3,
},
name:\’卡片节点标题形状\’
});
//左上角布局
group.addShape(\’rect\’,{ //显示指标部分
attrs:{
x: 5,
y: 29,
宽度: 59,
身高: 24、
//描边:\’粉红色\’, //描边颜色
fill: \’#F3FAFF\’,
半径: 3,
},
name:\’卡片节点计数形状\’
});
//右上角布局
group.addShape(\’rect\’,{ //显示指标部分
attrs:{
x: 66,
y: 29,
宽度: 59,
身高: 24、
fill: 持续时间_平均值,
半径: 3,
},
name:\’卡片节点时间形状\’
});
//左下布局
group.addShape(\’rect\’,{ //显示指标部分
attrs:{
x: 5,
y: 55,
宽度: 59,
身高: 24、
填写:报警号码,
半径: 3,
},
name:\’卡节点报警形状\’
});
//右下布局
group.addShape(\’rect\’,{ //显示指标部分
attrs:{
x: 66,
y: 55,
宽度: 59,
身高: 24、
fill: \’#F3FAFF\’,
半径: 3,
},
name:\’CardNode-successShape\’
});
//设置服务图标
group.addShape(\’图像\’, {
attrs: {
x: 4,
y: 2,
身高: 16,
宽度: 16,
光标: \’指针\’,
img: ICON_MAP[cfg.nodeType],
},
//在G6 3.3及以后版本中必须赋值,可以是任何字符串,但在自定义项目类型中必须是唯一的。
name: \’节点图标\’,
});
//设置服务名称的位置
group.addShape(\’文本\’,{
attrs:{
text: FittingString(cfg.name,80, 8), //fittingString(\’如果太长则换行\’, 80, globalFontSize),
x: 20,
y: 2,
字体大小: svc_fontsize,
fill: \’块\’,
textBaseline: \’顶部\’
},
name: \’卡片节点标题\’
});
//交易量布局
group.addShape(\’图像\’,{
attrs:{
x: 5,
y: 33,
宽度: 16,
身高: 16,
img: ICON_MAP[\’trans\’],
},
name:\’卡节点号ico\’
});
group.addShape(\’文本\’,{
attrs:{
text:cfg.statistics.trace_num,
x: 22,
y: 46,
fill: \’#226DFF\’,
fontSize: 公制字体大小,
},
name:\’卡节点数\’,
});
//平均响应时间布局
group.addShape(\’图像\’,{
attrs:{
x: 65,
y: 33,
宽度: 16,
身高: 16,
img: ICON_MAP[\’useTime\’],
},
name:\’卡节点时间ICO\’
});
group.addShape(\’文本\’,{
attrs:{
text:cfg.statistics.duration_avg*1000+\’ms\’,
x: 82,
y: 46,
fill: \’#226DFF\’,
fontSize: 公制字体大小,
},
name:\’卡节点时间\’,
});
//报警数量
group.addShape(\’图像\’,{
attrs:{
我们整理了数百道**【运维技术栈面试题】**,成为您运维面试的得力助手。这将帮助您在面试时不慌不忙,并为高质量的面试做好准备。付费报价!
这些面试题涵盖了从Shell、MySQL到K8等云原生技术栈,不仅适合运维行业新人的面试需求,也适合对运维感兴趣的朋友是适合的。升职或换工作以增加薪水。 **
![](https://img-blog.csdnimg.cn/img_convert/ef4a09bb24515440e3f97922ccff84e1.png)
本次访谈集内容为
* **174 运维工程师面试题**
* **128道k8s面试题**
* **108 个shell 脚本面试问题**
* **200 个Linux 面试问题**
* **51 个Docker 面试问题**
* **35 个Jenkis 面试问题**
* **78 MongoDB 面试问题**
* **17 Ansible 面试问题**
* **60 个Dubbo 面试问题**
* **53 次卡夫卡访谈**
* **18道mysql面试题**
* **40 个nginx 面试题**
* **77 个Redis 面试问题**
* **28 守门员**
**总共1000多道面试题,内容丰富、信息丰富**
* **174 运维工程师面试题**
1.什么是运维?
2、运维人员在工作场所经常需要与操作人员进行交互。运营人员做什么工作?
3. 给定300台服务器,如何管理它们?
4、我们简单解释一下raid0、raid1和raid5这两种运行模式的运行原理和特点。
5、LVS、Nginx、HAproxy有什么区别,工作中如何选择?
6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?
7.Tomcat和Resin有什么区别?
8.什么是中间件?
9. Tomcat 的三个端口8005、8009、8080 是什么意思?
10.什么是CDN?
11.什么是网站灰度发布?
12、请简单说明一下DNS域名解析的过程。
13.什么是RabbitMQ?
14.Keepalived如何工作?
15.描述LVS工作流程的三种模式。
16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?
工作中ginx和HAproxy有什么区别?
6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?
7.Tomcat和Resin有什么区别?
8.什么是中间件?
9. Tomcat 的三个端口8005、8009、8080 是什么意思?
10.什么是CDN?
11.什么是网站灰度发布?
12、请简单说明一下DNS域名解析的过程。
13.什么是RabbitMQ?
14.Keepalived如何工作?
15.描述LVS工作流程的三种模式。
16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?
17.如何重置mysql root密码?
#基于场景入口的微服务场景,根据监控指标数据实时展示自动生成的链路数据图以上相关内容来源网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/91284.html