当前位置: 首页 > news >正文

云原生网关可观测性综合实践

作者:钰诚

可观测性

可观测性(Observability)是指系统、应用程序或服务的运行状态、性能和行为能够被有效地监测、理解和调试的能力。

随着系统架构从单体架构到集群架构再到微服务架构的演进,业务越来越庞大,也越来越复杂。云原生时代背景下,随着微服务、Service Mesh、 Serverless 等新技术的出现,业务的复杂度很快就超过了个人的极限,可观测性在现代分布式系统的设计和运维中变得越来越重要。传统的监控和告警方法往往只关注系统的一些基本指标,而忽略了更细粒度的信息和上下文。可观测性的目标是通过全面的数据收集和分析,提供更深入和全面的洞察力,使运维和开发人员能够更好地理解系统的行为、排查问题、预测性能瓶颈和应对故障。

日志、指标和分布式追踪被称为可观测性的三大支柱:

  1. 日志(Logging): 日志是记录系统运行过程中产生的事件和信息的记录。通过记录应用程序的日志,可以了解系统的运行状态、错误和异常信息,方便故障排查和系统分析。常见的日志系统包括 ELK(Elasticsearch、Logstash、Kibana)和 Splunk 等。
  2. 指标(Metrics): 指标是用于衡量系统各个方面性能的度量标准。通过采集和记录指标数据,可以实时监控系统的运行情况,包括 CPU 使用率、内存占用、请求响应时间等。常用的指标系统有 Prometheus 和 InfluxDB 等。
  3. 分布式追踪(Distributed Tracing): 分布式追踪是用于跟踪和监控分布式系统中请求的路径和性能的技术。通过将请求在系统中的不同组件之间传递一个唯一标识符,可以追踪请求的流程和耗时,帮助分析和优化系统性能。常见的分布式追踪系统有 Zipkin 和 Apache Skywalking 等。

通过提供全面且精确的可观测性,系统的开发和运维人员可以更快速地发现问题、理解系统行为,并做出相应的优化和决策,从而提高系统的性能、稳定性和可靠性。

云原生网关可观测体系

MSE 云原生网关依托阿里云现有的云产品(日志服务 SLS、应用实时监控服务 ARMS)以及对开源软件的良好支持构建了丰富的可观测体系,为用户提供了强大的日志、监控、链路追踪以及告警功能,功能大图如下所示:

图片

网关的可观测性能力致力于帮助客户构建产品的可靠性体验,为客户提供故障发现与故障定位的能力,减少故障的发生以及降低故障的影响面。 基于网关的监控与告警管理功能,实现故障的及时发现与通知到客户;基于监控与日志,实现故障的快速定位;基于链路追踪,实现请求调用的全链路故障根因排查。

云原生网关可观测实践

过程概览

本文将依据下图中标注的功能模块出发,帮助读者体验网关可观测性在故障发现与故障定位中的能力。

图片

整体流程如下图所示:

  1. 用户收到网关发出的告警
  2. 用户查看 prometheus 监控找到出问题的路由、服务
  3. 用户查看 SLS 日志获取更详细的报错信息
  4. 用户通过链路追踪排故障的根因

图片

测试环境架构概览

图片

本文在 ACK 集群中部署了一系列 Springboot 的服务,调用关系如上图所示,其中 Spring SVC 4-2 发生了 crash。通过网关接入 ACK 集群,创建路由如下:

图片

测试过程中会通过以下三种请求去访问网关:

  1. 正常的请求,网关路由到 httpbin
  2. 在网关处就返回错误的请求,本文使用无法命中路由的请求
  3. 在上游服务返回错误的请求,网关路由到 Spring SVC 1

此时网关的错误率会出现明显上升。

故障发现与定位过程

通过告警策略及时发现故障

首先配置网关的告警策略,从网关实例粒度设置告警规则与通知策略,本文中采用了邮件通知的方式,除此之外还有电话、短信等方式。配置告警策略的示例如下图所示:

图片

通过以下邮件信息可以得知网关出现了故障:

图片

通过 Arms Prometheus 监控初步定位问题

接下来,查看网关观测分析->业务监控->全局看板的错误信息概览板块,当前监控信息如下:

图片

根据图中内容,可以得到以下信息:

  1. “网关粒度失败率”看板中,网关整体失败率是大于上游服务失败率的,这意味着一部分请求在网关处返回了错误码,一部分请求在上游服务处返回了错误码
  2. “路由粒度失败率”看板中,能够看到只有路由名称为 “spring” 的路由失败率不是 0
  3. “上游服务粒度失败率”看板中,能够看到只有服务名称为 “springboot-svc-1.app-system.svc.cluster.local” 的服务失败率不是 0

点击图中“路由失败请求数排行”或者“上游服务失败请求数排行”中的路由名或者服务名可以查看路由或者服务的详细信息。

路由名为 “spring” 的路由监控信息如下图所示:

图片

服务名为 “springboot-svc-1.app-system.svc.cluster.local” 的服务监控信息如下图所示:

图片

上图中显示出现错误的路由和服务返回的错误码为 5xx,至此,已经初步定位到问题所在:

路由 “spring” 指向的上游服务 “springboot-svc-1.app-system.svc.cluster.local” 出现了问题。

但是,目前还有两个问题需要解决:

  1. 在网关处返回错误的请求是什么原因?
  2. 服务 “springboot-svc-1.app-system.svc.cluster.local” 的错误是什么原因造成的?
通过 SLS 网关日志获取详细信息

接下来通过网关日志中心的 SLS 日志获取更详细的信息。

图片

首先点击 response_code,此时会自动生成查询请求,可以看到这段时间内网关的响应码只有三种:200,404,500。

在网关问题排查页面,输入响应码,可以查看错误码可能的原因:

图片

可以看到返回 404 响应码的原因是没有命中路由导致。

类似的,当选择响应码为 500 时,可以看到相应的路由名以及服务名,如下图所示:

图片

通过问题排查工具可以看到,错误是后端服务造成的:

图片

到现在为止,只剩下一个问题:

服务 “springboot-svc-1.app-system.svc.cluster.local” 的错误根因是什么?

通过 Arms xtrace 链路追踪分析调用链

借助于链路追踪技术,可以获取更细粒度的错误信息。只需要简单的配置,网关即可接入 Arms xtrace:

图片

ACK 集群上的 Java 应用按照以下文档进行配置:为容器服务 Kubernetes 版 Java 应用安装探针 [ 1]

图片

在 SLS 日志中找到一条错误请求的 traceid,根据 traceid 在链路追踪页面搜索相应的调用链路分析调用链路错误的根因:

图片

从链路追踪结果看,故障根因是 springboot-svc-4-2 服务错误,至此,一次完整的故障发现与故障定位已经完成。

总结

本次通过云原生网关可观测性进行故障发现和故障定位的实践过程中,首先通过网关的告警策略将故障通知到用户,然后通过 arms 提供的 prometheus 监控服务初步定位到出现故障的路由以及服务,之后通过 SLS 日志服务提供的网关的结构化日志进行查询分析,排查出部分错误是客户端请求路径错误导致,最后通过链路追踪对服务调用链路进行分析,最终成功对故障根因进行定位。

相关链接:

[1] 为容器服务 Kubernetes 版 Java 应用安装探针****

https://help.aliyun.com/zh/arms/application-monitoring/getting-started/install-arms-agent-for-java-applications-deployed-in-ack?spm=a2c4g.11186623.0.i6#arms-cs-k8s-java

相关文章:

云原生网关可观测性综合实践

作者:钰诚 可观测性 可观测性(Observability)是指系统、应用程序或服务的运行状态、性能和行为能够被有效地监测、理解和调试的能力。 随着系统架构从单体架构到集群架构再到微服务架构的演进,业务越来越庞大,也越来…...

vue-element-admin—登录页面添加自定义背景

一、效果图 初始效果: 更改背景后效果: 二、操作步骤 1、准备图片 2、更改代码 打开下面路径的 index.vue 文件: vue-element-admin-master\src\views\login\index.vue 也就是登录页面。 对 .login-container 样式代码块内代码做如下…...

软设上午题-错题知识点一

软设上午题-错题知识点一 1、ipconfig 显示信息; ipconfig /all 显示详细信息 ,可查看DHCP服务是否已启用; ipconfig /renew 更新所有适配器; ipconfig /release 释放所有匹配的连接。 2、耦合性也叫块间联系。指软件系统结构中各…...

微信小程序(小程序入门)

一,介绍 1、什么是小程序 小程序是一种轻量级的应用程序,可以在移动设备上运行,不需要用户下载和安装。它们通常由企业或开发者开发,用于提供特定功能或服务。 微信小程序(wei xin xiao cheng xu)&#xf…...

虹科分享 | 想买车无忧?AR为您带来全新体验!

新能源汽车的蓬勃发展,推动着汽车行业加速进行数字化变革。据数据显示,全球新能源汽车销售额持续上升,预计到2025年,新能源汽车市场规模将达到约 4200亿美元,年复合增长率超过 30%。这表明消费者对清洁能源出行的需求不…...

easyUI重新渲染

问题 使用Easyui 时&#xff0c;动态后添加的元素样式无法生效。 解决颁发 全页面重新渲染 $.parser.parse();单一元素重新渲染 var obj $("#div1").append("<input classeasyui-textbox typetext>"); $.parser.parse(obj);...

html和css基础练习

vscode快捷键 alt b 在浏览器中打开 alt shift b 在其他浏览器打开 ctrl / 注释 ctrl y 快捷键删除 参考文章 https://www.bilibili.com/video/BV1m84y1w7Tb 基础html标签 img&#xff1a;图像&#xff0c;title&#xff1a;头部文字&#xff0c;body&#xff1a;主…...

Linux信号 signal()编程

在Linux的进程间通信中可以用signal&#xff08;&#xff09;函数进行信号与信息传递。 1.信号 信号的名字和编号&#xff1a; 每个信号都有一个名字和编号&#xff0c;这些名字都以“SIG”开头&#xff0c;例如“SIGIO ”、“SIGCHLD”等等。 信号定义在signal.h头文件中&am…...

【LeetCode】16.最接近的三数之和

1 问题 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4], target 1 输出&…...

嵌入式开发学习之STM32F407点亮LED及J-Link下载(二)

嵌入式开发学习之STM32F407点亮LED及J-Link下载&#xff08;二&#xff09; 开发涉及工具控制端口配置端口的设定与确认端口配置方法实现点亮LED程序下载与仿真 有工程实例&#xff0c;链接在最底部。 开发涉及工具 开发环境&#xff08;IDE&#xff09;&#xff1a;IAR-ARM8…...

智能呼叫中心系统的未来发展趋势:为企业开启全新服务模式

随着人工智能技术的不断发展&#xff0c;智能呼叫中心系统已经成为现代企业服务的重要组成部分。随着客户需求的不断升级&#xff0c;智能呼叫中心系统的未来发展趋势也受到了广泛关注。以下是一些关于未来发展趋势的观点和建议。 1、大数据和人工智能技术 未来的系统将更多地…...

UE5中实现沿样条线创建网格体2-SplineMesh版本

我在之前的一篇文章中写过沿样条线创建网格体的方法&#xff1a; https://blog.csdn.net/grayrail/article/details/130453733 但该方法没有网格变形操作&#xff0c;就会导致每一段网格对象是无法连接的&#xff1a; 后来发现了SplineMesh方法可以比较好的解决这个问题&…...

实现Element Select选择器滚动加载

<template><el-selectpopper-class"more-tag-data"v-model"tagId"filterableplaceholder"请选择"focus"focusTag"><el-optionv-for"(item, index) in taskTagLists":key"index":label"item.n…...

C++ 之 Vector 和 List

Vector vector 是C STL中最常用的容器&#xff0c;支持存储多种类型的数据。 与数组相比&#xff0c;它的大小是可变的&#xff0c;因此也会被称为动态数组。 使用它&#xff0c;需要包含头文件&#xff1a; #include <vector>定义的结构&#xff1a; vector<数据类…...

力扣-448.找到所有数组中消失的数字

Idea 模拟 class Solution { public:vector<int> findDisappearedNumbers(vector<int>& nums) {int n nums.size();vector<int> a(n 1, 0);for(int i : nums) a[i];vector<int> ans;for(int i 1; i < n; i) if(!a[i]) ans.emplace_back(i);r…...

常用gdb调试命令

常见gdb调试命令 命令名 命令缩写 命令说明 backtrace bt 查看函数调用堆栈 frame f 查看栈帧 list l 查看源码 print p 打印内部变量值 info i 查看程序状态 display disp 跟踪某变量,每次停下来则显示值 run r 开始运行程序 continue c 继续程序运行&#xff0c;直到下一个断…...

【动手学深度学习-Pytorch版】BERT预测系列——用于预测的BERT数据集

本小节的主要任务即是将wiki数据集转成BERT输入序列&#xff0c;具体的任务包括&#xff1a; 读取wiki数据集生成下一句预测任务的数据—>主要用于_get_nsp_data_from_paragraph函数从输入paragraph生成用于下一句预测的训练样本&#xff1a;_get_nsp_data_from_paragraph生…...

【数据结构-字符串 三】【栈的应用】字符串解码

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【字符串转换】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…...

Stm32_标准库_10_TIM_显示时间日期

利用TIM计数耗费1s,启动中断&#xff0c;秒表加一 时间显示代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"uint16_t num 0; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_I…...

10-SRCNN-使用CNN实现超分辨成像

文章目录 utils_dataset.pymodel.pytrain.pyuse.py主要文件 utils_dataset.py 工具文件,主要用来制作dataset,便于加入dataloader,用于实现数据集的加载和并行读取 model.py 主要写入网络(模型) train.py 主要用于训练 use.py 加载训练好的模型,用于测试或使用 utils_dat…...

cmd/bat 输出符,控制台日志输出到文件

前言 略 输出符 A > B将A执行结果覆盖写入B A >> B将A执行结果追加写入B 常用句柄 句柄句柄的数字代号描述STDIN0键盘输入STDOUT1输出到命令提示符窗口STDERR2错误输出到命令提示符窗口 控制台日志输出到文件 1.bat 1>d:\log.log将控制台日志输出到文件 d:…...

ODrive移植keil(七)—— 插值算法和偏置校准

目录 一、角度读取1.1、硬件接线1.2、程序演示1.3、代码说明 二、锁相环和插值算法2.1、锁相环2.2、插值2.3、角度补偿 三、偏置校准3.1、硬件接线3.2、官方代码操作3.3、移植后的代码操作3.4、代码说明3.5、SimpleFOC的偏置校准对比 ODrive、VESC和SimpleFOC 教程链接汇总&…...

【肌电信号】OpenSignals使用方法 --- 肌电信号采集及导入matlab

一、 多通道采集教学 1. 数据线连接 将PLUX设备通过USB或蓝牙与电脑连接&#xff0c;注意确认在几号通道接线。 2.实时数据采集可视化 进行设置。需要在软件中选择你的PLUX设备&#xff0c;并配置相关的参数&#xff0c;如采样率、分辨率、信号类型等 3 支持数据回放和…...

STM32 多功能按键中断

key1 开关实现led1亮灭,key2开关实现蜂鸣器开关,key3开关实现风扇开关 main.c #include "uart.h" #include "key_it.h" #include "led.h" int main() {char c;char *s;uart4_init();//串口初始化all_led_init();key_it_config();fengshan_init…...

Linux-文件管理命令

绝对路径&#xff1a;从根目录开始描述的路径 pwd输入即为绝对路径&#xff0c; 开头一定是“/”&#xff0c;因为一定是从根目录开始走 相对路径&#xff1a;从当前路径开始描述的路径&#xff0c;开头不一定是“/”&#xff0c;因为不一定是从根目录开始走的 .:是当前目录 。…...

JS DataTable中导出PDF右侧列被截断的问题解决

JS DataTable中导出PDF右侧列被截断的问题解决 文章目录 JS DataTable中导出PDF右侧列被截断的问题解决一. 问题二. 解决办法三. 代码四. 参考资料 一. 问题 二. 解决办法 设置PDF大小和版型 orientation: landscape, pageSize: LEGAL,上述代码设置打印的PDF尺寸为LEGAL&…...

学习笔记-MongoDB(复制集,分片集集群搭建)

复制集群搭建 基本介绍 什么是复制集&#xff1f; 复制集是由一组拥有相同数据集的MongoDB实例做组成的集群。 复制集是一个集群&#xff0c;它是2台及2台以上的服务器组成&#xff0c;以及复制集成员包括Primary主节点&#xff0c;Secondary从节点和投票节点。 复制集提供了…...

Servlet与设计模式

1 过滤器和包装器 过滤器可以拦截请求及控制响应&#xff0c;而servlet对此毫无感知。过滤器有如下作用&#xff1a; 1&#xff09;请求过滤器&#xff1a;完成安全检查、重新格式化请求首部或体、建立请求审计日志。 2&#xff09;响应过滤器&#xff1a;压缩响应流、追加或…...

Python学习基础笔记六十五——布尔值

布尔对象&#xff1a; Python中有一种对象类型称之为布尔对象&#xff08;英文叫bool&#xff09;。 布尔对象只有两种取值&#xff0c;True和False。对应的是真和假&#xff0c;或者说是和否。True对应的是&#xff0c;False对应的是否。 我觉得这句话是一个关键&#xff1a…...

ChatGPT生产力|实用指令(prompt)

GPT已经成为一个不可或缺的科研生产力了&#xff0c;但是大多数人只知晓采用直接提问、持续追问以及细节展开的方式来查阅相关资料&#xff0c;本文侧重于探讨“限定场景限定角色限定主题”、“可持续追问细节展开”等多种方式来获取更多信息&#xff0c;帮人们解决更多问题。 …...