Tempo
概述
参考:
Tempo是 Grafana Labs 在ObservabilityCON 2020大会上新开源的一个用于做分布式式追踪的后端服务。它和 Cortex、Loki 一样,Tempo 也是一个兼备高扩展和低成本效应的系统。
之前小白有提到 Grafana Labs 的云原生 Observability 宇宙只剩下 trace 部分,那么今天就拿 Loki 的分布式追踪来体验下这 Observability 的最后一环吧。正式开始前,先看下小白精心准备的 Tempo 体验视频吧。
关于 Tempo
Tempo 本质上来说还是一个存储系统,它兼容一些开源的 trace 协议(包含 Jaeger、Zipkin 和 OpenCensus 等),将他们存在廉价的 S3 存储中,并利用 TraceID 与其他监控系统(比如 Loki、Prometheus)进行协同工作。

可以看到 Tempo 的架构仍然分为distributor、ingester、querier、tempo-query、compactor这几个架构,熟悉 Loki 和 Cortex 的朋友可能光看名字就知道他们大概是做什么的。不熟悉的同学也没关系,下面简单说下各模块的作用:
- distributor
监听多个端口,分别接受来自 Jaeger、Zipkin 和 OpenCensus 协议的数据,按照 TraceID 进行哈希并映射到哈希环上,并交由 ingester 进行存储处理。当前 distributor 支持的 trace 协议如下:
| Protocol | Port |
|---|---|
| OpenTelemetry | 55680 |
| Jaeger - Thrift Compact | 6831 |
| Jaeger - Thrift Binary | 6832 |
| Jaeger - Thrift HTTP | 14268 |
| Jaeger - GRPC | 14250 |
| Zipkin | 9411 |
- ingester
具体负责 trace 数据的块存储(memcache、GCS、S3)、缓存(Memcache)和索引的处理
- querier
负责从 ingester 和后端存储里面捞取 trace 数据,并提供 api 给查询者
- compactor
负责后端存储块的压缩,减少数据块数量
- tempo-query
tempo 的一个可视化界面,用的jaeger query,可以在上面查询 tempo 的 trace 数据。
Loki 链路跟踪
要体验的同学,可以先下载小白在 GitHub 上的 Docker-Compose,推荐配合本篇内容一起实践
https://github.com/CloudXiaobai/loki-cluster-deploy/tree/master/demo/docker-compose-with-tempo
Loki 方面
在做之前我们先看下 Loki 的文档是怎么描述的:
The tracing_config block configures tracing for Jaeger. Currently limited to disable auto-configuration per environment variables only.
可以看到当前 Loki 对于 Trace 的支持集中在 Jaeger,而且配置是默认开启的,并且只能在环境变量里面读取 jaeger 的信息。docker-compose 下的案例如下:
querier-frontend: image: grafana/loki:1.6.1 runtime: runc scale: 2 environment: - JAEGER_AGENT_HOST=tempo \\tempo的地址 - JAEGER_ENDPOINT=http://tempo:14268/api/traces - JAEGER_SAMPLER_TYPE=const \\采样率类型 - JAEGER_SAMPLER_PARAM=100 \\采样率100
API 网关方面
API 网关并不是 Loki 的原生组件,而是在 Loki 分布式部署的情况下,需要有一个统一的入口对 Loki API 进行路由。之前小白用的 Nginx,但是原生的Nginx并不支持OpenTracing。小白根据 nginx1.14 版本做了一个带 jaeger 模块的镜像用于 Loki 入口的 trace 生成和日志采集。
gateway: image: quay.io/cloudxiaobai/nginx-jaeger:1.14.0 runtime: runc restart: always ports: - 3100:3100 volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./jaeger-config.json:/etc/jaeger-config.json - 'gateway_trace_log:/var/log/nginx/'
对于支持 OpenTracing 的 Nginx,我们需要修改 nginx.conf 配置文件如下:
...#加载opentracing库load_module modules/ngx_http_opentracing_module.so;http { #启用opentracing opentracing on; #加载jaeger库 opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/jaeger-config.json; #日志格式,打印traceid log_format opentracing '"traceID":"$opentracing_context_uber_trace_id"'; server { listen 3100 default_server; location = / { #向upstream转发时带上trace的头信息 opentracing_operation_name $uri; opentracing_trace_locations off; opentracing_propagate_context; proxy_pass http://querier:3100/ready; } }}
以上小白只截取了 Nginx 部分配置,完整的要参考 docker-compose 里的 nginx.conf
此外,nginx 还需要一个 jaeger-config.json,用于将 trace 数据转给 agent 处理。
{ "service_name": "gateway", \\服务名 "diabled": false, "reporter": { "logSpans": true, "localAgentHostPort": "jaeger-agent:6831" \\jaeger-agent地址 }, "sampler": { "type": "const", "param": "100" \\采样率 }}
为了方便演示,小白配置的采样率均为 100%
最后,我们为 API 网关启用一个 Jaeger-agent 用于收集 trace 信息并转给 Tempo,它的配置如下:
jaeger-agent: image: jaegertracing/jaeger-agent:1.20 runtime: runc restart: always # 转发给tempo command: ["--reporter.grpc.host-port=tempo:14250"] ports: - "5775:5775/udp" - "6831:6831/udp" - "6832:6832/udp" - "5778:5778"
为什么 API 网关不直接发给 Tempo 要经过 Jaeger-agent 转发一下,小白认为用 agent 的方式更加灵活一些。
以上,我们就完成了 Loki 分布式追踪的配置部分,接下来我们用docker-compose up -d将服务都运行起来。
Grafana 方面
当 docker 的所有服务运行正常后,我们访问 grafana 并添加两个数据源
- 添加 tempo 数据源
- 添加 Loki 数据源,并解析 API 网关 TraceID
Loki 提取 TraceID 的正则部分是从 API 网关的日志中匹配
体验 Tempo
数据源设置 OK 后,我们进入 Explore 选择 loki 查询 trace.log 就可以得到 API 网关的日志了。
从 Parsed Fields 里面我们就可以看到,Grafana 从 API 网关的日志里面提取了 16 位字符串作为 TraceID 了,而它关联了 Tempo 的数据源,我们点击
Tempo按钮就可以直接切到 Trace 的信息如下:
展开 Trace 信息,我们可以看到 Loki 的一次查询的链路会经过下面几个部分
gateway -> query-frontend -> querier -> ingester |-> SeriesStore.GetChunkRefs
并且得出结论,本次查询的耗时主要落在 Ingeter 上,原因是查询的日志还没被 flush 到存储当中,querier 需从 ingester 中取日志的数据。
我们再来看一个 Loki 接收日志的案例:
从 trace 的链路来看,当日志采集端往 Loki Post 日志时,请求的链路会经过如下部分:
gateway -> distributor -> ingester
同时,我们还看到了这次的提交的日志流经过两个 ingester 实例的处理,且处理时间没有明显差异。
总结
关于Logging和Tracing两部分在 Grafana 上的展示还没有达到 ObservabilityCON 2020 上的流畅度,不过根据会上的消息,更精细话的trace <--> log、metrics <--> trace和metrics <--> log这三部分互相协作部分应该很快会发布。届时 Grafana 将是云上可观测性应用系统里的王者级产品(虽然有额外的各种查询语句学习成本)
往期推荐
[
Loki 迎来 2.0 重大更新,LogQL 语法大幅增强!
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247485198&idx=1&sn=19a9c260e87854b4e063fc6a5531756d&chksm=97da51d3a0add8c50abf5a276dc3b499e6f40026a8f600cffa1e38cc644e6034847368e5174a&scene=21#wechat_redirect)
[
五分钟了解 LogQL 用法
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484742&idx=1&sn=5ba09dcb46ac0cc26e7f7be347ce760e&chksm=97da539ba0adda8d91a96655789170fcf590062418219a29434b6f36c8d7bc15764ebc95525f&scene=21#wechat_redirect)
[
Loki 告警的正确姿势
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484610&idx=1&sn=b3b1cdd4e7aad31c3b05d325f373183c&chksm=97da521fa0addb09e5537a75ce58a0005f709f39739eee19c0ea3755cacd09e0347ef487b52b&scene=21#wechat_redirect)
[
Loki 最佳实践(译)
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484453&idx=1&sn=f105fe83a54e906075cbf5f25e6869e8&chksm=97da52f8a0addbee4980a99c9a921673e53ed2cac66aa451c76197d0af510ead88d019ed4e23&scene=21#wechat_redirect)
[
听说,你的 Loki 还是单体?(下篇)
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484424&idx=1&sn=8ecd0a3d92743207c8ce2448dfcb952f&chksm=97da52d5a0addbc3467a1e51882c6dca2ccca4c1920eb7bdaebeda8bc0183d6edf454780bee7&scene=21#wechat_redirect)
[
听说,你的 Loki 还是单体?(上篇)
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484381&idx=1&sn=26826a2084897f8ad8fd7d14cff4d0a9&chksm=97da5500a0addc1694a084cc2412e47c74fdc60b2ac8e7bc564427e6b2d88aa5fc5e9c5f071b&scene=21#wechat_redirect)
[
Loki 和 Fluentd 的那点事儿
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484310&idx=1&sn=9bf9ade60e132bc0320f019e1af2e3b2&chksm=97da554ba0addc5dc879e2c8a9b0a6f45b1672451c8c7b77bb23f1517b6efb4f949a79e5d754&scene=21#wechat_redirect)
[
巧用缓存加速 Loki 查询
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484297&idx=1&sn=f6f30d5353664514db0aa82bf69ff78c&chksm=97da5554a0addc428412052b12c077a1d8fbd5fc498401a0e5e852457c52c63a2ab3367826d8&scene=21#wechat_redirect)
[
今日实践:Loki 丝滑般的数据切换
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484144&idx=1&sn=bb5c05895906919e94fb500f84a1cc93&chksm=97da542da0addd3b8d9f94e4e0234a76d784f950acf0b569db504e3026edc80bde6da8bbb0b1&scene=21#wechat_redirect)
[
今日实践:利用 Grafana 为你的 Loki 添加告警
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247483873&idx=1&sn=f1829a4af0ac89b56bcf838900b7561d&chksm=97da573ca0adde2aca7a1acc054e33115d6cda51f5db8b6527655c48d4ee104f066bd71e1e1b&scene=21#wechat_redirect)
体验更好的云原生日志查询系统?请关注我们的开源项目 Dagger
[
我们开源了一个日志查询的小工具 - Dagger <文末含福利>
](http://mp.weixin.qq.com/s?__biz=MzIxOTQ0ODI0Mg==&mid=2247484825&idx=1&sn=512d5c80d974b1a42c4b3f75af3b7069&chksm=97da5344a0adda52c9a7b4ba49e4dda32dbd064b037d2d114cffa4616c5049034f7bf91e9071&scene=21#wechat_redirect)
欢迎关注我的公众号【云原生小白】,长按图片识别二维码
点赞鼓励一下
反馈
此页是否对你有帮助?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.