利用Opentelemetry+Loki+Temp+Granafa构建端到端的可观测平台

3,132 阅读4分钟

前言

在之前的文章提到了云原生下的可观测性建设包含三个方面:指标监控(Metrics)、日志事件(Logging)、链路追踪(Tracing) 。 Peter Bourgon 在 metrics-tracing-and-logging 一文中简明扼要的描述了上述三种 observability signals 的关系。即,这三种 signals 在可观测性体系中都有各自的作用,但是相互之间又有一定的关联。如下图 ​

当我们收到告警(通常是Metrics、Tracing)以后需要先到监控平台查看异常指标,再根据某一唯一ID(例如,订单号)去日志平台查询日志,最后我们再通过TraceId 到 Trace 平台中定位到具体异常的服务。可见在传统监控平台中上述三种 signals 往往是孤立的,我们排查一个问题往往需要跨越多个平台,可观观测平台旨在关联上述三种signals 降低维护成本提升研发效率。 ​

在可观测性平台中我们可以快速的从一种 signals 关联到与其相关的另一种 signals,如下图 ​

image.png

而 Grafana 的目标正是使 Grafana 成为一个完整的可观测平台,它不仅能向用户展示 Metrics、Logs 和 Traces,还提供能够将他们相互关联,并能够使用这三个支柱快速解决问题的能力。 ​

本文将使用Opentelemetry+Loki+Temp+Granafa 构建一个端到端的可观测平台。

架构

image.png

部署

本次案例代码我已全部上传Github,请参考 opentelemetry-tutorial。 ​

  1. 宿主机节点安装 loki-docker-driver 日志驱动插件。利用 loki-docker-driver 采集容器 stdout 日志。

    docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
    
  2. 一站式部署 Loki、Tempo、OpenTelemetry Collector、Prometheus、Granafa。

    1. /opentelemetry-tutorial/opentelemetry/collector-contrib/docker-compose 目录下执行

      docker-compose up -d
      
    2. 此时应该启动以下容器

      docker-compose ps
      
                   Name                            Command               State                                       Ports                                     
      ---------------------------------------------------------------------------------------------------------------------------------------------------------
      docker-compose_grafana_1          /run.sh                          Up      0.0.0.0:3000->3000/tcp,:::3000->3000/tcp                                      
      docker-compose_loki_1             /usr/bin/loki -config.file ...   Up      0.0.0.0:3100->3100/tcp,:::3100->3100/tcp                                      
      docker-compose_minio_1            /usr/bin/docker-entrypoint ...   Up      9000/tcp, 0.0.0.0:9001->9001/tcp,:::9001->9001/tcp                            
      docker-compose_mysql_1            docker-entrypoint.sh mysqld      Up      0.0.0.0:3306->3306/tcp,:::3306->3306/tcp, 33060/tcp                           
      docker-compose_otel-collector_1   /otelcontribcol --config=/ ...   Up      0.0.0.0:4317->4317/tcp,:::4317->4317/tcp,                                     
                                                                                 0.0.0.0:55679->55679/tcp,:::55679->55679/tcp, 55680/tcp                       
      docker-compose_prometheus_1       /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp,:::9090->9090/tcp                                      
      docker-compose_tempo_1            /tempo -config.file=/etc/t ...   Up      0.0.0.0:3200->3200/tcp,:::3200->3200/tcp                                      
      pushgateway                       /bin/pushgateway                 Up      0.0.0.0:9091->9091/tcp,:::9091->9091/tcp
      
  3. 构建 otel-web-client 镜像,并在镜像内部安装 opentelemetry-javaagent.jar(当然也可以采用挂载的方式)。这是一个 web 项目,它唯一的作用就是从 Mysql 中查询用户数据。我已经将其上传到 Dockerhub,你也可以按照以下步骤制作镜像。

    1. /opentelemetry-tutorial/opentelemetry/otel-spring-webmvc/client 目录下打包,执行

      mvn package
      
    2. /opentelemetry-tutorial/opentelemetry/otel-spring-webmvc/client 目录下构建镜像,执行

      docker build --tag otel-web-client .
      
  4. 通过 docker-compose 部署 otel-web-client,并挂载自己的 appliaction.yml

    1. /opentelemetry-tutorial/opentelemetry/otel-spring-webmvc/web 目录下执行

      docker-compose up -d
      
    2. 此时应该启动以下容器

      docker-compose ps
      
              Name                       Command               State                    Ports                  
      ---------------------------------------------------------------------------------------------------------
      web_otel-web-client_1   sh -c java -javaagent:./op ...   Up      0.0.0.0:8081->8081/tcp,:::8081->8081/tcp
      

通过Granafa查看Logs和Traces

  1. 在 Explore 中 点击 logbrowser,可以查看到日志中的 lable,选择 container_name 标签后,可以loki-docker-driver 插件采集日志的容器,接下来选择 web_otel-web-client_1查看日志。

    image.png

  2. 在 Log 中我们已经通过 opentelemetry-java-instrumentation 的 Logger MDC auto-instrumentation 自动注入了 trace_id 等信息,接下来可以通过 trace_id 关联到 Tempo 中查询 Trace。

    image.png

  3. 查看 Trace

    image.png

最后

上述功能已经实现了 Logs to Traces 的功能,Granfa Tempo 还可以通过配置数据源(目前只支持Loki)实现 Traces to Logs 的功能。由于Loki 和 Prometheus 一样使用 lable 查询数据,那么通过使用相同 lable 就可以完成 Metrics to Logs 或 Logs to Metrics 的功能。

参考

如何在 Grafana 中关联指标、日志和跟踪