开放分布式追踪(OpenTracing)入门与 Jaeger 实现
分布式系统的运维挑战
容器、Serverless 编程方式的诞生极大提升了软件交付与部署的效率。在架构的演化过程中,可以看到两个变化:
应用架构开始从单体系统逐步转变为微服务,其中的业务逻辑随之而来就会变成微服务之间的调用与请求。
资源角度来看,传统服务器这个物理单位也逐渐淡化,变成了看不见摸不到的虚拟资源模式。
从以上两个变化可以看到这种弹性、标准化的架构背后,原先运维与诊断的需求也变得越来越复杂。为了应对这种变化趋势,诞生一系列面向 DevOps 的诊断与分析系统,包括集中式日志系统(Logging),集中式度量系统(Metrics)和分布式追踪系统(Tracing)。
Logging,Metrics 和 Tracing
Logging,Metrics 和 Tracing 有各自专注的部分。
Logging - 用于记录离散的事件。例如,应用程序的调试信息或错误信息。它是我们诊断问题的依据。
Metrics - 用于记录可聚合的数据。例如,队列的当前深度可被定义为一个度量值,在元素入队或出队时被更新;HTTP 请求个数可被定义为一个计数器,新请求到来时进行累加。
Tracing - 用于记录请求范围内的信息。例如,一次远程方法调用的执行过程和耗时。它是我们排查系统性能问题的利器。
这三者也有相互重叠的部分,如下图所示。
通过上述信息,我们可以对已有系统进行分类。例如,Zipkin 专注于 tracing 领域;Prometheus 开始专注于 metrics,随着时间推移可能会集成更多的 tracing 功能,但不太可能深入 logging 领域; ELK,阿里云日志服务这样的系统开始专注于 logging 领域,但同时也不断地集成其他领域的特性到系统中来,正向上图中的圆心靠近。
关于三者关系的更详细信息可参考 Metrics, tracing, and logging。下面我们重点介绍下 tracing。
Tracing 的诞生
Tracing 是在90年代就已出现的技术。但真正让该领域流行起来的还是源于 Google 的一篇论文"Dapper, a Large-Scale Distributed Systems Tracing Infrastructure",而另一篇论文"Uncertainty in Aggregate Estimates from Sampled Distributed Traces"中则包含关于采样的更详细分析。论文发表后一批优秀的 Tracing 软件孕育而生,比较流行的有:
Dapper(Google) : 各 tracer 的基础
StackDriver Trace (Google)
Zipkin(twitter)
Appdash(golang)
鹰眼(taobao)
谛听(盘古,阿里云云产品使用的Trace系统)
云图(蚂蚁Trace系统)
sTrace(神马)
X-ray(aws)
分布式追踪系统发展很快,种类繁多,但核心步骤一般有三个:代码埋点,数据存储、查询展示。
下图是一个分布式调用的例子,客户端发起请求,请求首先到达负载均衡器,接着经过认证服务,计费服务,然后请求资源,最后返回结果。
数据被采集存储后,分布式追踪系统一般会选择使用包含时间轴的时序图来呈现这个 Trace。
但在数据采集过程中,由于需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果您希望切换追踪系统,往往会带来较大改动。
OpenTracing
为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。
OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。
OpenTracing 的优势
OpenTracing 已进入 CNCF,正在为全球的分布式追踪,提供统一的概念和数据标准。
OpenTracing 通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。
OpenTracing 数据模型
OpenTracing 中的 Trace(调用链)通过归属于此调用链的 Span 来隐性的定义。
特别说明,一条 Trace(调用链)可以被认为是一个由多个 Span 组成的有向无环图(DAG图),Span 与 Span 的关系被命名为 References。
例如:下面的示例 Trace 就是由8个 Span 组成:
单个 Trace 中,span 间的因果关系 [Span A] ←←←(the root span) | +------+------+ | | [Span B] [Span C] ←←←(Span C 是 Span A 的孩子节点, ChildOf) | | [Span D] +---+-------+ | | [Span E] [Span F] >>> [Span G] >>> [Span H] ↑ ↑ ↑ (Span G 在 Span F 后被调用, FollowsFrom)
有些时候,使用下面这种,基于时间轴的时序图可以更好的展现 Trace(调用链):
单个 Trace 中,span 间的时间关系 ––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time [Span A···················································] [Span B··············································] [Span D··········································] [Span C········································] [Span E·······] [Span F··] [Span G··] [Span H··]
每个 Span 包含以下的状态:(译者注:由于这些状态会反映在 OpenTracing API 中,所以会保留部分英文说明)
An operation name,操作名称
A start timestamp,起始时间
A finish timestamp,结束时间
Span Tag,一组键值对构成的 Span 标签集合。键值对中,键必须为 string,值可以是字符串,布尔,或者数字类型。
Span Log,一组 span 的日志集合。
每次 log 操作包含一个键值对,以及一个时间戳。
键值对中,键必须为 string,值可以是任意类型。
但是需要注意,不是所有的支持 OpenTracing 的 Tracer,都需要支持所有的值类型。
SpanContext,Span 上下文对象 (下面会详细说明)
References(Span间关系),相关的零个或者多个 Span(Span 间通过 SpanContext 建立这种关系)
每一个 SpanContext 包含以下状态:
任何一个 OpenTracing 的实现,都需要将当前调用链的状态(例如:trace 和 span 的 id),依赖一个独特的 Span 去跨进程边界传输
Baggage Items,Trace 的随行数据,是一个键值对集合,它存在于 trace 中,也需要跨进程边界传输
更多关于 OpenTracing 数据模型的知识,请参考 OpenTracing语义标准。
OpenTracing 实现
这篇文档列出了所有 OpenTracing 实现。在这些实现中,比较流行的为 Jaeger 和 Zipkin。
Jaeger
Jaeger 是 Uber 推出的一款开源分布式追踪系统,兼容 OpenTracing API。
Jaeger 架构
如上图所示,Jaeger 主要由以下几部分组成。
Jaeger Client - 为不同语言实现了符合 OpenTracing 标准的 SDK。应用程序通过 API 写入数据,client library 把 trace 信息按照应用程序指定的采样策略传递给 jaeger-agent。
Agent - 它是一个监听在 UDP 端口上接收 span 数据的网络守护进程,它会将数据批量发送给 collector。它被设计成一个基础组件,部署到所有的宿主机上。Agent 将 client library 和 collector 解耦,为 client library 屏蔽了路由和发现 collector 的细节。
Collector - 接收 jaeger-agent 发送来的数据,然后将数据写入后端存储。Collector 被设计成无状态的组件,因此您可以同时运行任意数量的 jaeger-collector。
Data Store - 后端存储被设计成一个可插拔的组件,支持将数据写入 cassandra、elastic search。
Query - 接收查询请求,然后从后端存储系统中检索 trace 并通过 UI 进行展示。Query 是无状态的,您可以启动多个实例,把它们部署在 nginx 这样的负载均衡器后面。
Jaeger 存在的问题
需要架设并维护存储。
UI比较薄弱,有一些个性化的分析需求无法快速满足(例如对比,统计延迟分布等)。
Jaeger on Aliyun Log Service
Jaeger on Aliyun Log Service 是基于 Jeager 开发的分布式追踪系统,支持将采集到的追踪数据持久化到日志服务中,并通过 Jaeger 的原生接口进行查询和展示。
优势
原生 Jaeger 仅支持将数据持久化到 cassandra 和 elasticsearch 中,用户需要自行维护后端存储系统的稳定性,调节存储容量。Jaeger on Aliyun Log Service 借助阿里云日志服务的海量数据处理能力,让您享受 Jaeger 在分布式追踪领域给您带来便捷的同时无需过多关注后端存储系统的问题。
Jaeger UI 部分仅提供查询、展示 trace 的功能,对分析问题、排查问题支持不足。使用 Jaeger on Aliyun Log Service,您可以借助日志服务强大的查询分析能力,助您更快分析出系统中存在的问题。
相对于 Jaeger 使用 elasticsearch 作为后端存储,使用日志服务的好处是支持按量付费,成本仅为 elasticsearch 的13%。参阅自建ELK vs 日志服务(SLS)全方位对比
配置步骤
参阅:https://github.com/aliyun/jaeger/blob/master/README_CN.md
使用实例
HotROD 是由多个微服务组成的应用程序,它使用了 OpenTracing API 记录 trace 信息。
下面通过一段视频向您展示如何使用 Jaeger on Aliyun Log Service 诊断 HotROD 出现的问题。视频包含以下内容:
如何配置日志服务
如何通过 docker-compose 运行 Jaeger
如何运行 HotROD
通过 Jaeger UI 如何检索特定的 trace
通过 Jaeger UI 如何查看 trace 的详细信息
通过 Jaeger UI 如何定位应用的性能瓶颈
通过日志服务管理控制台,如何定位应用的性能瓶颈
应用程序如何使用 OpenTracing API
视频中用到的查询分析样例
1. 以分钟为单位统计 frontend服务的 HTTP GET /dispatch
操作的平均延迟以及请求个数。
2. 比较两条 trace 各个操作的耗时
3. 统计延迟大于 1.5s 的 trace 的 IP 情况
process.serviceName: "frontend" and operationName: "HTTP GET /dispatch" and duration > 1500000000 |select "process.tags.ip" as IP, truncate(avg(duration)/1000/1000) as avg_duration_ms, count(1) as countgroup by "process.tags.ip"
参考资料
Jaeger on Aliyun Log Service - https://github.com/aliyun/jaeger
OpenTracing 中文文档 - https://wu-sheng.gitbooks.io/opentracing-io/content/
Jaeger - http://jaeger.readthedocs.io/en/latest/getting_started/
OpenTracing tutorial - https://github.com/yurishkuro/opentracing-tutorial
http://peter.bourgon.org/blog/2017/02/21/metrics-tracing-and-logging.html
特别感谢
Jaeger on Aliyun Log Service 是基于阿里云MVP @WPH95 在业余时间工作整理而成,感谢 MVP
的杰出贡献!
安卓设备上实现无界浏览:Clash全局代理设置全攻略
在当今高度互联的数字时代,网络自由已成为许多用户的基本需求。无论是为了访问学术资源、获取全球资讯,还是单纯地享受无限制的网络体验,一款优秀的代理工具都显得尤为重要。在众多代理工具中,Clash以其强大的功能和灵活的配置脱颖而出,成为安卓用户实现全局代理的首选方案。本文将深入探讨如何在安卓设备上通过Clash设置全局代理,让您的网络体验不再受限。
Clash:您口袋里的网络自由钥匙
Clash不仅仅是一个简单的代理工具,它是一个功能全面的网络流量管理解决方案。与传统的VPN或单一代理工具不同,Clash支持多种代理协议,包括但不限于Shadowsocks、Vmess和Trojan等,为用户提供了丰富的选择空间。其核心优势在于:
- 全局代理能力:可以将所有设备流量通过指定代理服务器转发,实现真正的"无墙"体验。
- 智能分流系统:能够根据用户自定义规则,智能地将不同流量分配到不同代理或直连。
- 高度可定制性:从界面到规则,几乎每个环节都可以按照用户需求进行调整。
- 资源占用优化:相比同类工具,Clash在保持强大功能的同时,对系统资源的消耗更为友好。
从零开始:Clash安卓版安装指南
在开始设置全局代理之前,首先需要确保Clash已正确安装在您的安卓设备上。以下是详细步骤:
获取Clash安卓版
由于Clash并非主流应用商店的常客,用户通常需要通过以下渠道获取:
- 访问Clash官方GitHub仓库下载最新稳定版APK
- 从可信赖的第三方应用市场获取(需谨慎验证来源)
- 通过开发者社区推荐的镜像站点下载
安全提示:在下载任何APK文件时,务必验证其数字签名和哈希值,确保文件未被篡改。
安装与初步配置
安装过程与常规安卓应用无异,但需注意:
1. 在安装前,需在系统设置中允许"安装未知来源应用"
2. 安装完成后,首次启动时会请求VPN权限,这是Clash工作的基础,必须授予
3. 建议在系统电池优化设置中将Clash排除,防止系统自动终止其后台运行
全局代理设置:分步详解
现在进入核心环节——如何将Clash配置为全局代理模式。这种模式下,所有设备流量都将通过代理服务器传输,无需担心某些应用或网站"漏网"。
第一步:配置文件导入
Clash的运行依赖于配置文件,通常以.yaml或.yml为扩展名。获取途径包括:
- 从代理服务提供商处获取专用配置文件
- 使用公开的配置文件生成器创建
- 手动编写(适合高级用户)
在Clash主界面,点击"配置"→"新建配置",可选择通过URL导入或从本地文件导入。
第二步:代理模式选择
- 进入Clash主界面
- 点击顶部状态栏右侧的"地球"图标
- 在弹出的模式选择菜单中,选择"Global"(全局)模式
专业建议:初次使用建议先测试"Rule"(规则)模式,确认基本代理功能正常后再切换至全局模式。
第三步:服务器选择与验证
即使处于全局模式下,仍需选择具体的代理服务器:
1. 点击"代理"选项卡
2. 在服务器列表中选择合适的节点(通常按延迟排序,数值越低越好)
3. 可点击"测试延迟"按钮验证节点响应速度
关键点:全局模式下选择的服务器将处理所有流量,因此建议选择负载较低、带宽充足的节点。
第四步:系统级VPN配置
Clash通过安卓的VPN服务实现流量拦截,因此需要:
1. 返回Clash主界面
2. 点击大大的"启动"按钮
3. 系统将弹出VPN连接请求,勾选"我信任此应用"后确认
此时状态栏应出现钥匙图标,表示Clash已成功接管网络流量。
高级优化与故障排除
要让全局代理发挥最佳性能,还需注意以下细节:
性能调优技巧
- DNS设置:在配置文件中指定可靠的DNS服务器,防止DNS污染
- MTU调整:对于某些网络环境,适当降低MTU值可提高稳定性
- 绕过局域网:在设置中启用"绕过私有IP",避免本地网络访问被不必要的代理
常见问题解决方案
问题一:连接后无法访问任何网站
- 检查代理服务器状态
- 验证本地网络是否正常
- 尝试切换不同的代理协议
问题二:特定应用无法联网
- 检查应用是否被系统限制后台数据
- 在Clash的"应用绕过"设置中添加例外
问题三:电池消耗过快
- 关闭不必要的代理节点检测
- 减少规则列表更新频率
- 在系统设置中限制后台活动
安全与隐私考量
使用全局代理时,所有流量都将经过第三方服务器,因此必须重视:
- 选择可信赖的服务提供商:避免使用来历不明的免费代理
- 加密强度验证:确保配置中使用的是强加密算法(如AES-256)
- 流量监控:定期检查是否有异常流量消耗
- 敏感操作规避:尽量避免在代理环境下进行银行交易等敏感操作
全局代理的适用场景与替代方案
虽然全局代理功能强大,但并不总是最佳选择:
适用场景
- 需要所有应用无差别代理时
- 在严格网络管控环境下
- 当规则模式无法满足需求时
替代方案
- 规则模式:对国内国外流量智能分流,节省国际带宽
- 直连模式:完全禁用代理,适合信任的网络环境
- 混合模式:部分应用走代理,其余直连
专家点评:Clash全局代理的价值与局限
Clash在安卓平台实现的全局代理解决方案,代表了当前移动端代理技术的较高水平。其优势在于:
- 系统级集成:通过VPN API实现深度整合,兼容性极佳
- 协议支持广泛:几乎涵盖所有主流代理协议
- 社区生态丰富:拥有大量第三方配置和插件支持
然而,也存在一定局限:
- 对新手不够友好,学习曲线较陡
- 全局模式下无法实现精细化的流量管理
- 长期运行可能影响设备续航
总体而言,对于追求全面网络自由的用户,掌握Clash全局代理的设置技巧是一项极具价值的技能。通过本文的指导,即使是初学者也能快速上手,开启无边界网络体验。记住,技术本身是中性的,关键在于如何使用——希望每位用户都能在法律和道德框架内,合理利用这些工具拓展视野,获取知识。
在这个信息即力量的时代,拥有自由获取信息的能力,就等于拥有了开启未来的钥匙。Clash全局代理或许就是这样一把钥匙,而如何使用它,则完全取决于钥匙的持有者。愿您的网络之旅畅通无阻,充满发现与成长。
版权声明:
作者: freeclashnode
链接: https://www.freeclashnode.com/news/article-2476.htm
来源: FreeClashNode
文章版权归作者所有,未经允许请勿转载。
热门文章
- 11月4日|19.4M/S,Singbox节点/Shadowrocket节点/V2ray节点/Clash节点|免费订阅机场|每天更新免费梯子
- 11月15日|21M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费订阅机场|每天更新免费梯子
- 10月30日|22.4M/S,SSR节点/V2ray节点/Clash节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 11月1日|19.4M/S,Singbox节点/Clash节点/V2ray节点/Shadowrocket节点|免费订阅机场|每天更新免费梯子
- 10月29日|21M/S,V2ray节点/Singbox节点/SSR节点/Clash节点|免费订阅机场|每天更新免费梯子
- 11月6日|19.7M/S,Clash节点/V2ray节点/Shadowrocket节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 10月31日|19.4M/S,Clash节点/V2ray节点/SSR节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 11月8日|22.1M/S,Shadowrocket节点/Singbox节点/Clash节点/V2ray节点|免费订阅机场|每天更新免费梯子
- 10月25日|20.2M/S,Singbox节点/SSR节点/V2ray节点/Clash节点|免费订阅机场|每天更新免费梯子
- 11月5日|18.6M/S,Shadowrocket节点/Clash节点/V2ray节点/Singbox节点|免费订阅机场|每天更新免费梯子
最新文章
- 11月18日|19.6M/S,Singbox节点/Clash节点/V2ray节点/SSR节点|免费订阅机场|每天更新免费梯子
- 11月17日|22.9M/S,Clash节点/V2ray节点/Singbox节点/Shadowrocket节点|免费订阅机场|每天更新免费梯子
- 11月16日|21.4M/S,Shadowrocket节点/Singbox节点/V2ray节点/Clash节点|免费订阅机场|每天更新免费梯子
- 11月15日|21M/S,Clash节点/V2ray节点/Singbox节点/SSR节点|免费订阅机场|每天更新免费梯子
- 11月14日|18.2M/S,Singbox节点/Shadowrocket节点/Clash节点/V2ray节点|免费订阅机场|每天更新免费梯子
- 11月13日|21.1M/S,Singbox节点/SSR节点/Clash节点/V2ray节点|免费订阅机场|每天更新免费梯子
- 11月12日|22.4M/S,Shadowrocket节点/V2ray节点/Singbox节点/Clash节点|免费订阅机场|每天更新免费梯子
- 11月11日|22.8M/S,V2ray节点/Singbox节点/Clash节点/Shadowrocket节点|免费订阅机场|每天更新免费梯子
- 11月10日|19.4M/S,Clash节点/V2ray节点/Shadowrocket节点/Singbox节点|免费订阅机场|每天更新免费梯子
- 11月9日|20.4M/S,Singbox节点/Clash节点/V2ray节点/SSR节点|免费订阅机场|每天更新免费梯子
归档
- 2025-11 31
- 2025-10 56
- 2025-09 55
- 2025-08 49
- 2025-07 31
- 2025-06 30
- 2025-05 31
- 2025-04 31
- 2025-03 383
- 2025-02 360
- 2025-01 403
- 2024-12 403
- 2024-11 390
- 2024-10 403
- 2024-09 388
- 2024-08 402
- 2024-07 424
- 2024-06 446
- 2024-05 184
- 2024-04 33
- 2024-03 32
- 2024-02 29
- 2024-01 50
- 2023-12 53
- 2023-11 32
- 2023-10 32
- 2023-09 3