前言
在之前的文章提到了云原生下的可观测性建设包含三个方面:指标监控(Metrics)、日志事件(Logging)、链路追踪(Tracing) 。 Peter Bourgon 在 metrics-tracing-and-logging 一文中简明扼要的描述了上述三种 observability signals 的关系。即,这三种 signals 在可观测性体系中都有各自的作用,但是相互之间又有一定的关联。如下图
当我们收到告警(通常是Metrics、Tracing)以后需要先到监控平台查看异常指标,再根据某一唯一ID(例如,订单号)去日志平台查询日志,最后我们再通过TraceId 到 Trace 平台中定位到具体异常的服务。可见在传统监控平台中上述三种 signals 往往是孤立的,我们排查一个问题往往需要跨越多个平台,可观观测平台旨在关联上述三种signals 降低维护成本提升研发效率。
在可观测性平台中我们可以快速的从一种 signals 关联到与其相关的另一种 signals,如下图
而 Grafana 的目标正是使 Grafana 成为一个完整的可观测平台,它不仅能向用户展示 Metrics、Logs 和 Traces,还提供能够将他们相互关联,并能够使用这三个支柱快速解决问题的能力。
本文将使用Opentelemetry+Loki+Temp+Granafa 构建一个端到端的可观测平台。
架构
部署
本次案例代码我已全部上传Github,请参考 opentelemetry-tutorial。
-
宿主机节点安装
loki-docker-driver
日志驱动插件。利用loki-docker-driver
采集容器 stdout 日志。docker plugin install grafana/loki-docker-driver:latest --alias loki --grant-all-permissions
-
一站式部署 Loki、Tempo、OpenTelemetry Collector、Prometheus、Granafa。
-
在
/opentelemetry-tutorial/opentelemetry/collector-contrib/docker-compose
目录下执行docker-compose up -d
-
此时应该启动以下容器
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
-
-
构建 otel-web-client 镜像,并在镜像内部安装
opentelemetry-javaagent.jar
(当然也可以采用挂载的方式)。这是一个 web 项目,它唯一的作用就是从 Mysql 中查询用户数据。我已经将其上传到 Dockerhub,你也可以按照以下步骤制作镜像。-
在
/opentelemetry-tutorial/opentelemetry/otel-spring-webmvc/client
目录下打包,执行mvn package
-
在
/opentelemetry-tutorial/opentelemetry/otel-spring-webmvc/client
目录下构建镜像,执行docker build --tag otel-web-client .
-
-
通过 docker-compose 部署 otel-web-client,并挂载自己的
appliaction.yml
-
在
/opentelemetry-tutorial/opentelemetry/otel-spring-webmvc/web
目录下执行docker-compose up -d
-
此时应该启动以下容器
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
-
在 Explore 中 点击 logbrowser,可以查看到日志中的 lable,选择 container_name 标签后,可以
loki-docker-driver
插件采集日志的容器,接下来选择web_otel-web-client_1
查看日志。 -
在 Log 中我们已经通过 opentelemetry-java-instrumentation 的 Logger MDC auto-instrumentation 自动注入了 trace_id 等信息,接下来可以通过 trace_id 关联到 Tempo 中查询 Trace。
-
查看 Trace
最后
上述功能已经实现了 Logs to Traces 的功能,Granfa Tempo 还可以通过配置数据源(目前只支持Loki)实现 Traces to Logs 的功能。由于Loki 和 Prometheus 一样使用 lable 查询数据,那么通过使用相同 lable 就可以完成 Metrics to Logs 或 Logs to Metrics 的功能。