自动检测是一个我没有多少经验的课题。在Grafanabob电竞频道实验室,我们主要用围棋进行开发,而围棋并不能负担得起这样的奢侈。然而,社区对Java自动插装有着巨大的兴趣,因此我开始确定使用这个闪亮的新功能可以实现什么OpenTelemetry auto-instrumentation库。
让我们深入研究这项技术,看看如何将跟踪卸载到节奏并记录到洛基创建一个引人注目的自动检测故事。
开始
所以我已经有5年多没有使用Java进行专业开发了,我的机器上没有Java IDE, Bean和Tomcat这样的词让我害怕。从哪里开始呢?值得庆幸的是,我能够找到一个现有的应用程序,它在关系数据库之上实现了一个简单的RESTful API。在这篇文章中,我们将继续跟进这种回购,所以你可以自由地克隆它,在家里一起玩。
设置自动仪表
为了自动检测应用程序,我只需要引用从OTel回购.我花了一些时间试图弄清楚如何通过maven获取必要的库,但运气不佳。如果你仔细看堆栈。yml文件,你会看到jar文件被挂载:
卷:—。/ opentelementary -javaagent-all.jar:/ opentelementary -javaagent-all.jar
并且使用JAVA_OPTS将适当的参数传递给JVM:
JAVA_OPTS = - javaagent: / opentelemetry-javaagent-all.jar
最后,我们需要告诉OTel库在哪里推动它的跨度。在我们的例子中,我们将使用Tempo和以下环境变量:
environment:—otel_export =otlp_span—OTEL_EXPORTER_OTLP_ENDPOINT=tempo:55680—OTEL_EXPORTER_OTLP_INSECURE=true—OTEL_RESOURCE_ATTRIBUTES=service.name=demo
我们将推动跨度到Tempo使用gRPC。我们已将insecure设置为true,因为在此端点上没有TLS设置。另外,otlp_span还明确地告诉工具在OTel proto中发送数据,并且只发送跟踪数据。请随意检查文档有关其他配置选项。
日志吗?
Tempo目前是a键值存储并依靠外部系统对痕迹进行索引和发现。由于这个原因,我们需要在应用程序中包含跟踪id和其他字段的某种日志记录,这样我们就可以轻松地找到跟踪。另外,我们会把这些日志推送给洛基。
准备好体验一些Java魔法吧。
首先,我添加了一个RequestLoggingFilterConfig因为网络让我这么做。我没有引用此文件或任何其他代码更改。
接下来在JAVA_OPTS中添加一些咒语:
JAVA_OPTS =…-Dlogging.level.org.springframework.web.filter.CommonsRequestLoggingFilter = -Dlogging.pattern调试。console=%d{yyyy-MM-dd HH:mm:ss} - %logger{36} - %msg traceID=%X{traceID} %n'
第一个获取RequestLoggingFilter,根据需要记录每个请求,第二个获取RequestLoggingFilter格式化日志行以包含跟踪id.
在我用maven重建战争文件后,下面的日志行开始出现在洛基中:
我猜这和@ bean
或@ configuration
注释。我没有问问题,Java也没有给出答案。
把它们放在一起
现在我们在Loki中有我们的日志,在Tempo中有我们的轨迹,我们可以很容易地搜索轨迹,然后通过Grafana中的一个方便的链接直接跳转到它们:
仔细观察跟踪,我们可以看到有价值的信息,比如请求的路径和执行的查询。干得好,OTel Java朋友们!
未来的工作
这已经很酷了,我们还可以做得更好!如果你仔细观察Loki查询,它只是通过路径进行过滤:
{container_name="tomcat_service"} |= "/api/users"
如果我们建了一个自定义请求记录器,我们可以在logfmt中记录一些字段,这会让Loki非常高兴。使用新的扩展LogQL,我们可以这样写查询:
{container_name="tomcat_service"} | logfmt | path =" /api/users " | duration > 1s
唉,也许改天吧!去看看回购,遵循主自述,并给自己一枪!
更多关于Tempo
要了解更多关于Tempo的信息,你可以观看我的网络研讨会,开始跟踪和Grafana Tempo,现可按需订购。你还可以免费获得Tempo的公开测试Grafana云.我们有新的免费和付费Grafana云计划,以适应每一个用例-现在免费注册.