云原生时代下链路追踪的最终形态:OpenTelemetry
云原生时代下链路追踪的最终形态:OpenTelemetry
本文部分内容参考 https://opentelemetry.io/
基本概念分布式链路追踪分布式链路追踪(Distributed Traces),更常见的说法是链路追踪(Trace),用于记录由应用程序或最终用户提出的请求在多服务架构(如微服务或 serverless 应用程序)中所传播的路径。
如果没有链路追踪,要想找出分布式系统中性能问题的原因是很困难的。
链路追踪提高了我们的应用或系统健康状况的可见性,让我们能够调试难以在本地重现的行为。链路追踪对于分布式系统来说是必不可少的,因为这些系统通常有非确定性的问题,或者过于复杂而无法在本地重现。
链路追踪使调试和理解分布式系统变得不那么困难,因为它分解了一个请求在分布式系统中流动时发生的情况。
一个链路追踪是由一个或多个 Span 组成的。第一个 Span 代表根 Span。每个根 Span 代表一个请求从开始到结束。父级 Span 下面的 Span 提供了一个更深入的背景,即在一个请求中发生了什么(或者说哪些步骤构成了一个请求)。
许多提供链路观测的后端将一个 Trac ...
一个函数实现 Python 超大文件的流式下载与断点续传
一个函数实现 Python 超大文件的流式下载与断点续传在做项目的时候有了超大文件连续高速下载这个需求,然后上网查了不少资料。最后总结并在项目中不断迭代,实现了这个函数。
函数接口非常简单,性能却出人意料的好,因此这个函数无论是用在项目里,还是平时写写脚本下点大东西都非常好用。
这个函数主要的亮点是在于信号量 signal 的使用。requests 库的 timeout 参数实际上是针对请求阶段的超时进行处理,不能通过设置 timeout 限制整个请求下载过程的时间 。而我们在下载大文件时,往往有这样的需求:当一个大文件下载时间过长(例如超过 10 分钟),我们更倾向于放弃此次下载,转而重新开始一次新的下载。因此,我们需要一个能够限制整个下载过程的时间的方法。
为此,我采用了 Python 的 signal 模块,通过设置信号量 signal.alarm() 来限制整个下载过程的时间。当下载时间超过设定值时,会抛出 TimeoutException 异常,从而中断下载。
1234567891011121314151617181920212223242526272829303132333 ...
如何通过 Docker 部署 n2n
如何通过 docker 部署 n2n在以往,部署 n2n 往往需要通过 make 进行源码编译,或是通过包管理器下载安装。安装过程繁琐且难以迁移,配置也容易造成混乱
我在 docker hub 上找到了一个制作水平很高的 n2n v2.9 docker,仅仅只有 7 MB 且运行良好。下面介绍如何通过这个镜像实现 n2n 的 docker 部署。
镜像获取与测试首先需要下载镜像,通过以下代码将镜像从 docker hub 下载到本地:
1docker push yingftf/n2n
运行以下指令就能在不运行容器的情况下测试镜像是否可用及其 n2n 版本:
123docker run --rm --network host yingftf/n2n supernode -hdocker run --rm --cap-add=NET_ADMIN --cap-add=NET_RAW --device=/dev/net/tun --network host yingftf/n2n edge -h
n2n 的容器化部署在 docker hub 页面上,作者介绍了通过映射卷操作配置文件部署的方 ...
如何利用 Screen 运行后台任务
如何利用 Screen 运行后台任务在很多文档中,建议我们使用以下方法后台运行代码以便 ssh 退出后服务器仍然能继续执行命令
123nohup <cmd> &ornohup <cmd> & >> outfile.out
然而,这有两个缺点
nohup 后台运行会在 nohup.out 或是你所指定的重定向文件中,实时打印程序的标准输出和标准错误输出。它的大小是无限量增长的,但一旦直接删除了 nohup.out ,该任务进程就再也无法输出任何内容。更重要的是,项目中已经有了一个独立的较为成熟的日志系统,nohup.out 的内容对我们来说实际上几乎没有作用
停止 nohup 任务很不直观,需要 ps -def | grep "<target_file_name>" 找到 pid ,然后 kill 掉
因此,可以使用大部分 linux 自带的 screen 指令来实现后台运行任务,无视 ssh 的退出。
咱们服务器这个版本的 CentOS 属于那些小部分的 linux :),因此先需要执行 yum ...
如何将 Python 项目打包为 Docker
如何将 Python 项目打包为 Docker编写 requirement.txt在封装打包为 docker 镜像前,需要确定 Python 项目所需要的 pip 依赖,并且必须确定该依赖的包的版本。浏览各个 .py 文件,检查 import 语句后的包是否非 Python 自带。以 requests 为例,确定项目引用了 requests 后,在控制台输入 pip list | grep requests 即可查看其版本。
请注意,并非每个 Python 包版本都能用该方法查询。例如 import yaml 指代的就是 PyYAML 包,然而 “yaml” 和 “PyYAML” 二者没有一个字母是相同的。在这种情况下,只能直接输入 pip list 手动查看包版本
确认了第三方包及其版本后,编写 requirement.txt ,下方是一个例子:
12PyYAML==6.0requests==2.28.1
整理项目文件夹将项目文件全部复制到一个新的文件夹中,此处我取名为 /docker 文件夹。复制时需要注意:
清空 /data 、/config 、/logs 文件夹
无需复 ...
如何将 Vue 项目打包为 Docker 镜像并运行容器
如何将 Vue 项目打包为 docker
本文在安装了 Docker 的 Linux 或 WSL 环境下可用
配置文件Vue 配置首先需要在 Vue 项目的 .env 文件中配置项目路径,以保证建项目后资源路径正确。同时特别关注配置的端口号,接下来将用 Nginx 监听该端口
12345678# port 端口号VITE_PORT = 8888# open 运行 npm run dev 时自动打开浏览器VITE_OPEN = false# public path 配置线上环境路径(打包)、本地通过 http-server 访问时,请置空即可VITE_PUBLIC_PATH = ./
然后,在 Vue 项目目录输入 npm run bulid ,随后会生成 dist 文件夹,内容是 Vue 项目的静态文件,拷贝该文件到你喜欢的任意目录文件夹下。下文假设该文件夹叫做 /docker-bulid
Nginx 配置在 docker-bulid 文件夹中新建 nginx.conf 文件,内容配置如下
注意,Nginx 监听的端口号必须与你在 Vue 项目中配置的一致
1234567891 ...
我的 2022 年
三个词总结我的 2022,大概就是 游戏、旅行和成长
今天是 2022 年的最后一天,每年的这个时候我都会感慨时光荏苒、日月如梭,但也仅此而已 ,随后很快就投入无尽快乐的游戏中。但今年对我而言也算是充满意义的一年(正面负面都有),再加上刚好有了博客这个载体,还是决定在这个博客里浅浅记录一下我的 2022 。
封面图是沙漠里的绿洲(只要不拍人, 特别是拍自己, 我还是对自己的拍照技术有点自信的)
年初:荒废于玩乐,奔波于疫情自从保研资格到手后,我和一起末位保研的舍友 L 携手开始了摆烂生活。整整 2022 年上半年,都是游戏、游戏、游戏然后睡觉。实际上无论是从同龄的保研人还是往届的学长学姐的经验来说,这都是找多段实习的一个黄金时间,从现在的我看来它确确实实是被我自己浪费了。但说非常后悔,那也不太至于,因为这种毫无顾虑为所欲为的放空生活真的很快乐。当时的我总有一种感觉,这样的时光可能一辈子都不会再有了,那么及时行乐又有何不可?
我真正后悔的事情,是没能及时和我的亲人告别。2 月份寒假结束的时候,我家乡这里的疫情有明显转坏的趋势,家人都劝我趁着窗口期,赶紧回北京。但在北京没落脚几天,家 ...
极致游戏 IT运维 日常实习面经
之前投了简历大概3天后 HR 才和我联系,安排了一个没课的上午面试。我提前半小时在飞书等,面试官很准时就到了,其本人应该也是极致的运维工程师。
提问环节
自我介绍
你的项目经历很多,有落地实践的项目吗?
这是我第一次实习并且实验室几乎没有横向所以我说的没有,但实际上其实那个空教室查询软件还是能说说的,毕竟当时还是部署到酷安上了,只能说自己太老实了
本科是网络工程,有做过相关的项目吗?
说了一下简历没有写上的一个 DNS 服务器,当时用的字典树写的域名解析,效果还不错。不过我只是参与者,那个项目 Leader 是个大牛,现在去了人大高瓴。
对Linux系统的特点做个基本阐述,举出和Windows的差别?
这个问题我觉得太泛了,我就回答了一下多线程是不同的,比如 Linux 用的主要是 Fork() 效率高一些,Windows 则是用的不同的方法(具体什么方法一时想不出来),这也是 Redis 弃用 Windows 的主要原因之一。
感觉面试官对我这个回答不太满意 QAQ
常用的 Linux 指令有哪些?
top 用来看CUP负载, netstat 来看端口占用。
让我惊讶的是 ...
两步解决 SSH 免密码登陆服务器
在 VSCode 上使用 SSH 登陆我们实验室的服务器的时候需要每次都输入密码。虽然很早之前就知道可以配置 SSH 公钥实现免密登陆,但是当时我被配置公钥这几个字唬住了,以为是一件很繁琐的事情。这次硬着头皮配置了一下没想到这么简单,只需要两步就能够彻底消灭 SSH 的密码。
两步实现生成公钥我生成的是 rsa 算法的公钥,比较方便,如果有需要也可以更改为别的加密算法。
在 Windows 的终端中直接输入以下指令:
1ssh-keygen -t rsa
弹出的提示全部按回车跳过即可。
执行完毕后将会在当前用户根目录的 .ssh 文件夹(在 Windows 下是 C:\Users\%在这里替换为你的用户名%\.ssh)中生成文件名为 id_rsa.pub 的 rsa 公钥。
如果你需要连接多个 SSH 服务器或是以前已经配置过公钥了,就无需执行这步生成新的公钥,直接使用第一次配置的 .pub 文件就行了
将公钥发送给服务器输入以下指令将上一步生成的公钥发送给服务器。在这里, Windows 下的文件路径正反斜杠不敏感:
1scp C:/Users/%在这里替换为你的用户名%/.s ...
无需指定Windows IP ,一劳永逸的 WSL2 代理服务器配置
为了复现一篇论文的实验结果,我需要在 Linux 环境下配置深度学习的开发环境,为此需要配置 WSL 的网络代理以实现科学上网。
网络上绝大部分教程都是获取 Windows 主机的 IP 并通过配置全局变量进行代理的方式,这种方式配置最大的问题是一旦网络环境改变, IP 地址也会发生改变,还需要重新配置。不过文章WSL2 中访问 Windows 的代理的最简易方案中则提到了一种利用 Windows 自带的 mDNS 实现建议配置的方法,经过测试在 Win 11 的 WSL2 上稳定可用。
准备工作
首先,需要得到你的代理工具的端口并打开其局域网功能,在代理工具中一般都能查看。我使用的是 Clash ,其默认端口为 7890 。
你还需要找到你的主机名称(电脑名称),推荐以下两种方法
Win 11 下打开 设置\系统\系统信息\设备规格 ,设备名称即为主机名称
控制台输入 systeminfo ,输出的主机名即为主机名称
测试 mDNS 是否可用在 WSL 中执行
1ping <你的主机名>.local
能够收到返回包则继续接下来的步骤,否则说明你的 Window ...