目前的产品架构,分布式系统得到了大范围的应用,使得系统更加灵活,不过同时也给开发、运维人员也带来了很大的难题,如何监控和优化分布式系统的行为。
这里简单介绍下一个小众、简单的 APM 监控工具。
简介
Google 在 2010 年发表了著名论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》(中文版),一个 Google 内部使用的一个分布式系统跟踪基础设施。
这里介绍的 Appdash 是开源的一款用 Go 实现的分布式系统跟踪工具套件,它同样是以 Google 的 dapper 为原型设计和实现的。
业界按照对业务的侵入性排序为 Pinpoint->Zipkin(Java)->CAT
,其中 GoLang 可参考 Jaeger(GoLang)
,这是参考 Zipkin 的实现。
常见概念
下图是一个分布式调用的例子,客户端发起请求,请求首先到达负载均衡器,接着经过认证服务、计费服务,然后请求资源,最后返回结果。
数据被采集存储后,分布式追踪系统一般会选择使用包含时间轴的时序图来呈现这个 trace。
但在数据采集过程中,部分的系统需要侵入用户代码,那么如果不同系统的 API 不兼容,就会导致如果要切换追踪系统,往往会带来较大改动。
为了提高不同 Trace 系统的兼容性,于是提出了 OpenTracing 标准,用于提供平台无关、厂商无关的 API,使得开发人员能够方便的添加追踪系统的实现。
Jaeger
目前在对 Opentracing 的实现中,使用比较广的是 Jaeger 和 Zipkin ,Jaeger 是 Uber 推出的一款开源分布式追踪系统。
如上所示,Jaeger 的架构分成了如下几个模块:
- Jaeger Client 为不同语言实现了符合 OpenTracing 标准的 SDK,应用程序通过 API 写入数据,然后发送给 Agent 。
- Agent 安装在宿主机上的一个监听 UDP 端口常驻进程,用来接收 span 数据,它会将数据批量发送给 collector。
- Collector 接收 Agent 发送来的数据,然后将数据写入后端存储,被设计成无状态的组件。
- Data Store 后端存储支持将数据写入 Cassandra、Elastic Search。
- Query 接收查询请求,从后端存储系统中检索 trace 并通过 UI 进行展示。
AppDash
可以直接从 sourcegraph.com 上下载,在 appdash/cmd
中包含了一个简单的示例,也可以通过如下命令安装。
$ go get -u sourcegraph.com/sourcegraph/appdash/cmd/...
另外,appdash 自带一个服务端的示例,在源码的 examples/cmd/webapp
目录下,在编译执行 webapp 会看到如下结果:
$ webapp
... ... Appdash web UI running on HTTP :8700
[negroni] listening on :8699
这一示例包含了 appdash server、front service、backend service,直接运行上述编译后的程序,然后打开 http://localhost:8700 连接就可以看到 appdash server 的 UI 界面,一个非常简单的 trace 页面展示。
然后访问 http://localhost:8699/ ,就可以触发了一次 trace,然后在 appdash server UI 可以看到如下界面。
参考
- The OpenTracing Semantic Specification OpenTracing 标准的定义,规定了不同语言间需要实现的函数、类型等。