AppDash APM 使用

2018-10-23 language golang

目前的产品架构,分布式系统得到了大范围的应用,使得系统更加灵活,不过同时也给开发、运维人员也带来了很大的难题,如何监控和优化分布式系统的行为。

这里简单介绍下一个小众、简单的 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 example

数据被采集存储后,分布式追踪系统一般会选择使用包含时间轴的时序图来呈现这个 trace。

trace example timeline

但在数据采集过程中,部分的系统需要侵入用户代码,那么如果不同系统的 API 不兼容,就会导致如果要切换追踪系统,往往会带来较大改动。

为了提高不同 Trace 系统的兼容性,于是提出了 OpenTracing 标准,用于提供平台无关、厂商无关的 API,使得开发人员能够方便的添加追踪系统的实现。

Jaeger

目前在对 Opentracing 的实现中,使用比较广的是 Jaeger 和 Zipkin ,Jaeger 是 Uber 推出的一款开源分布式追踪系统。

jaeger architerure

如上所示,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 可以看到如下界面。

appdash

参考