Skip to main content

OTel-LGTM

OTel-LGTM 是指的一组工具和库,主要用于在分布式系统中进行跟踪(Tracing)、日志(Logging)、度量(Metrics)等方面的 observability(可观察性)工作。它是 OpenTelemetry(OTel)的扩展和实现,目的是让开发者能够以更简单、集中的方式监控和调试他们的应用程序。

OTelemetry 负责收集数据,L 是指 Loki 日志数据库,G 指 Grafana 可视化工具,T 指 Tempo 链路数据库,M 指 Prometheus Metric 度量数据库。 这些工具通常组合在一起使用,支持实时收集数据并监控。

这些里面其实我们前面用过,但是并没有手动配。例如 istio 网格里有 Grafana 与 Prometheus,NacOS 也使用了。

启动

直接使用 docker 镜像即可,所有工具均已打包好,官方在 github 页面也提供了 k8s 版本。

version: '3'
services:
grafana-otel-lgtm:
image: grafana/otel-lgtm
ports:
- "3000:3000"
- "4317:4317"
- "4318:4318"
stdin_open: true
tty: true

要启动的内容比较多,因此启动时间有点长。

集成

这个栈目前对 Java 支持较好,不过其它语言也有支持。这里用 Spring 演示。

起个简单的 Spring 程序,用下面的 Controller。

package org.example;

import java.util.Optional;
import java.util.concurrent.ThreadLocalRandom;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RollController {
private static final Logger logger = LoggerFactory.getLogger(RollController.class);

@GetMapping("/rolldice")
public String index(@RequestParam("player") Optional<String> player) {
int result = this.getRandomNumber(1, 6);
if (player.isPresent()) {
logger.info("{} is rolling the dice: {}", player.get(), result);
} else {
logger.info("Anonymous player is rolling the dice: {}", result);
}
return Integer.toString(result);
}

public int getRandomNumber(int min, int max) {
return ThreadLocalRandom.current().nextInt(min, max + 1);
}
}

确保能运行后,打包成 jar 包。

gradle assemble
java -jar ./build/libs/app.jar

下载 Java Agent,相当于是一个代理,

curl -L -O https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar

Java 自带代理功能,直接运行即可,

java -jar -javaagent:opentelemetry-javaagent.jar ./build/libs/app.jar

现在执行后,logging 会被发送到 Open Telemetry,然后存入数据库,最后可以在 Grafana 的界面中看到。

之后的操作都是图形化的,参考文档即可,此处省略。