Tempo是Grafana Labs在ObservabilityCON 2020大会上新开源的一个用于做分布式式追踪的后端服务。它和Cortex、Loki一样,Tempo也是一个兼备高扩展低成本效应的系统。之前小白有提到Grafana Labs的云原生Observability宇宙只剩下trace部分,那么今天就拿Loki的分布式追踪来体验下这Observability的最后一环吧。

关于Tempo

Tempo本质上来说还是一个存储系统,它兼容一些开源的trace协议(包含Jaeger、Zipkin和OpenCensus等),将他们存在廉价的S3存储中,并利用TraceID与其他监控系统(比如Loki、Prometheus)进行协同工作。

可以看到Tempo的架构仍然分为distributoringesterqueriertempo-querycompactor这几个架构,熟悉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.1runtime: runcscale: 2environment:- 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分布式部署的情况下,需要有一个统一的入口对接口进行路由。之前小白用的Nginx,但是原生的Nginx并不支持OpenTracing。小白根据nginx1.14版本做了一个带jaeger模块的镜像用于Loki入口的trace生成和日志采集。

gateway:image: quay.io/cloudxiaobai/nginx-opentracing:1.14.0runtime: runcrestart: alwaysports:- 3100:3100volumes:- ./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 {#启用opentracingopentracing on;#加载jaeger库opentracing_load_tracer /usr/local/lib/libjaegertracing_plugin.so /etc/jaeger-config.json;#日志格式,打印traceidlog_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.20runtime: runcrestart: always# 转发给tempocommand: ["--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实例的处理,且处理时间没有明显差异。

总结

关于LoggingTracing两部分在Grafana上的展示还没有达到ObservabilityCON 2020上的流畅度,不过根据会上的消息,更精细话的trace <--> logmetrics <--> tracemetrics <--> log这三部分互相协作部分应该很快会发布。届时Grafana将是云上可观测性应用系统里的王者级产品(虽然有额外的各种查询语句学习成本)。


扫描二维码关注「云原生小白」,回复【入群】进入Loki学习群

Tempo - 分布式Loki链路追踪利器相关推荐

  1. G 分布式服务链路追踪-SkyWorking

    分布式服务链路追踪-SkyWorking 作者:田超凡 原创博文,仿冒必究,部分素材转载自每特教育蚂蚁课堂 1 服务链路追踪的意义 在微服务系统中,随着业务的发展,系统会变得越来越大,那么各个服务之间 ...

  2. PHP分布式链路追踪,SkyWalking:分布式架构链路追踪-SkyWalking介绍

    前面几篇文章提到了微服务相关系统的使用与搭建,在微服务架构下的问题也比较突出.正常系统下我们的每个请求都会在同一个系统中进行输出.但是在微服务架构中一个请求可能设置一到多个服务进行处理.服务之间相互依 ...

  3. mysql链路跟踪工具_SkyWalking全链路追踪利器

    随着目前系统架构的复杂度越来越高(中台.微服务),并且线上应用的多级监控覆盖到了通讯.应用处理过程监控并且实现端到端的应用监测,线上性能故障的快速定位修复:而传统的监控分析方式已经无法满足我们的需求, ...

  4. SpringCloud Sleuth分布式请求链路追踪

    概念 1. 为什么需要链路追踪? 在微服务框架中,一个由客户端发起的请求在后端系统中 会经过多个不同的的服务节点调用来协同产生最后的请求结果, 每一个前段请求都会形成一复杂的分布式服务调用链路, 链路 ...

  5. skywalking 安装_SkyWalking全链路追踪利器

    随着目前系统架构的复杂度越来越高(中台.微服务),并且线上应用的多级监控覆盖到了通讯.应用处理过程监控并且实现端到端的应用监测,线上性能故障的快速定位修复:而传统的监控分析方式已经无法满足我们的需求, ...

  6. 想了解Sleuth+zipkin分布式请求链路追踪,来看看这篇文章吧!

    目录 下载zipkin的jar包,运行 微服务配置 引入pom yml配置 访问结果: 在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的服务节点调用来协同产生最后的请求结果,每一个前 ...

  7. 京东云分布式链路追踪在金融场景的最佳实践

    微服务是近几年最流行的软件架构设计理念,和容器.devops一起构成了云原生的技术基础.微服务源于对产品快速交付的市场诉求,通过采取一系列的自动化测试.持续集成等敏捷开发实践,激活了组织效率,也增强了 ...

  8. 微服务链路追踪SkyWalking第一课 SkyWalking简介

    开篇词:从剖析 SkyWalking 源码到吃透 APM 核心知识 你好,我是你的 SkyWalking 老师徐郡明,网名吴小胖,你也可以叫我胖哥.进入互联网行业工作多年,主要从事基础组件开发相关的工 ...

  9. 【微服务】链路追踪 jaeger

    最近做了一点traces相关的工作,看了关于jaeger的一些内容,来水一篇.(艰难地保持着一月一篇) 为什么需要链路追踪 随着应用的发展,分布式是不可避免的趋势,无论是随着业务的复杂庞大由单体应用拆 ...

  10. 11|链路追踪:如何定制一个分布式链路跟踪系统?

    11|链路追踪:如何定制一个分布式链路跟踪系统 ? 你好,我是徐长龙,这节课我们讲一讲如何实现分布式链路跟踪. 分布式链路跟踪服务属于写多读少的服务,是我们线上排查问题的重要支撑.我经历过的一个系统, ...

最新文章

  1. userinits.exe, wupcltr.exe的分析及解决办法
  2. alter system switch logfile和alter system archive log current的区别
  3. python中until函数_等待应用程序窗口:python中的pywinauto.timings.WaitUntilPasses
  4. java mysql geo_GEO数据库简介
  5. c语言案例朗读工具源码,C语言编写简单朗读小工具(有源码)
  6. react前端显示图片_在 React 中使用 SVG 图标组件
  7. js 指定滚动条位置
  8. 一线互联网大厂中高级Java面试真题收录!面试必会
  9. Ubuntu 14.04/16.04 (使用apt-get进行安装) 安装Docker
  10. Android逆向分析实例(三)-解密微信EnMicroMsg.db数据库
  11. proteus设计教程-数码管使用方法
  12. Leetcode 75. 颜色分类
  13. java处理环比增长率
  14. 技术能力和工作能力的联系和区别
  15. springboot整合webservice接口以及碰到的问题
  16. 2021年R2移动式压力容器充装报名考试及R2移动式压力容器充装操作证考试
  17. Matplotlib绘图:plt?plt.subplots?plt.subplot?
  18. Revit开发之内建模型
  19. 什么是接口测试和功能测试?
  20. java实现手机扫码登录客户端

热门文章

  1. 658. 一元二次方程公式
  2. 猴子吃桃 java_【Java编程基本功】(六)猴子吃桃,运动员的出场顺序,abc三个数排序...
  3. 数学中的全微分(方程),全导数(公式),偏微分(方程),梯度,斜率,导数,方向导数等
  4. 经典小游戏开发思路和算法之拼图(1)
  5. 【转】Apache——世界使用排名第一的Web服务器
  6. 嘿,程序猿,你该学点经济学了!
  7. 关于射频技术在粮食安全的科研进展
  8. 下载书籍的网址【汇总】
  9. dn什么意思_给排水DN与dn分别是什么
  10. JAVA社区疫情防控系统毕业设计 开题报告