分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。
提供分布式追踪、服务网格遥测分析、度量聚合和可视化一体化解决方案。
多种监控手段。可以通过语言探针和 service mesh 获得监控是数据。
多个语言自动探针。包括 Java,.NET Core 和 Node.JS。
轻量高效。无需大数据平台,和大量的服务器资源。
模块化。UI、存储、集群管理都有多种机制可选。
支持告警。
优秀的可视化解决方案。
官方中文文档:https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/
下面我们简单来使用下
这里采用docker- composet进行部署
version: '3.3'
services:
skywalking-oap:
image: apache/skywalking-oap-server:8.0.1-es7
container_name: skywalking-oap
restart: always
ports:
- 11800:11800
- 12800:12800
environment:
SW_STORAGE: h2
skywalking-ui:
image: apache/skywalking-ui:8.0.1
container_name: skywalking-ui
depends_on:
- skywalking-oap
links:
- skywalking-oap
restart: always
ports:
- 8080:8080
environment:
SW_OAP_ADDRESS: skywalking-oap:12800
上面安装了server端和ui控制台
skywalking是业界比较常用的一款APM监控工具,采用java开发,对java应用适配比较好,应用不需要埋点上报,只需要在启动时加上 -javaagent: 参数即可。
而对于go应用想要上报指标到skywalking,则需要通过埋点的方式注入。skywalking官方提供了golang版的库github.com/SkyAPM/go2sky
demo代码:https://github.com/SkyAPM/go2sky/blob/38c3b84741dd6c0609965e9df0fcc633915d3ea5/test/e2e/example-server/main.go
和所有的链路监控工具一样,skywalking也遵循Open Tracing协议,首先需要创建一个Trace,表示一个调用链,然后再调用链上创建span和子span,每个span表示一次调用,因为span和子span是有关联关系的,所以通过span和子span可以了解链路的上下游调用情况。
在go-sky里,可以创建三种类型的span
LocalSpan:可以用来表示本程序内的一次调用。
span, ctx, err := tracer.CreateLocalSpan(context.Background())
EntrySpan:用来从下游服务提取context信息。
span, ctx, err := h.tracer.CreateEntrySpan(r.Context(), getOperationName(h.name, r), func() (string, error) {
return r.Header.Get(propagation.Header), nil
})
ExitSpan:用来向上游服务注入context信息。
span, err := t.tracer.CreateExitSpan(req.Context(), getOperationName(t.name, req), req.Host, func(header string) error {
req.Header.Set(propagation.Header, header)
return nil
})
其实在发起http请求时,也是注入式地上报skywalking,只不过通过github.com/SkyAPM/go2sky/plugins/http这个包进行了封装而已,其核心逻辑是创建span,并将span信息写入到header里来传递到上游服务。
Server端在处理请求时,其核心逻辑是从header里解析出下游的span信息,并基于此构造自己的span,并将span上报到skywalking。