我們嘗試使用OpenTelemetry(+Zipkin)來測量Java應用程序
首先
在Java应用程序中使用OpenTelemetry进行可视化的备忘录。
请参考其他人的帖子以了解有关APM和OpenTelemetry的说明。
以下是OpenTelemetry(+Zipkin)版本的帖子。
- JavaアプリケーションをElastic APMで計測してみる
环境
我所使用的环境如下。
-
- CentOS 7.5
-
- OpenTelemetry(agent) 0.6.0
- Zipkin Server 2.21.5
这个应用程序在Windows操作系统上运行,可以用来测试目标应用程序。
安装OpenJDK
首先,安装OpenJDK 8。
# yum install java-1.8.0-openjdk-devel
# java -version
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
我正在设置JAVA_HOME并将Java路径添加到PATH。
# echo "export JAVA_HOME=$(readlink -e $(which java)|sed 's:/bin/java::')" > /etc/profile.d/java.sh
# echo "PATH=\$PATH:\$JAVA_HOME/bin" >> /etc/profile.d/java.sh
# source /etc/profile
Zipkin的安装
安装Zipkin以进行可视化。
通过Zipkin发送的测量数据可以存储在Elasticsearch、Cassandra等数据存储中,但由于本次只是试用,我们将把数据存储在内存中。
安装本身只需要下载jar文件。
# mkdir /opt/zipkin
# curl -L "https://search.maven.org/remote_content?g=io.zipkin&a=zipkin-server&v=LATEST&c=exec" -o /opt/zipkin/zipkin-server.jar
使用以下命令启动Zipkin服务器。
启动时添加”–logging.level.zipkin2=DEBUG”可以将日志级别更改为DEBUG。
STORAGE_TYPE="mem" MEM_MAX_SPANS=1000000 java -Xmx1G -jar /opt/zipkin/zipkin-server.jar
最后进行操作确认。
# curl -L http://[サーバーのホスト名]:9411/health
{
"status" : "UP",
"zipkin" : {
"status" : "UP",
"details" : {
"InMemoryStorage{}" : {
"status" : "UP"
}
}
}
Java agent的设置
执行Java代理的设置方法可以参考以下网站。
- https://github.com/open-telemetry/opentelemetry-java-instrumentation
请从以下位置下载Java代理模块。
- https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent-all.jar
使用javaagent标志进行手动设置
在运行Java命令时,需要指定”-javaagent”标志,如下所示。
-javaagent:opentelemetry-javaagent-all.jar -Dota.exporter=zipkin -Dotel.zipkin.endpoint=http://[Zipkinサーバーのホスト名]:9411/api/v2/spans -Dotel.zipkin.service.name=test_service
加上「-Dio.opentelemetry.auto.slf4j.simpleLogger.defaultLogLevel=debug」可以输出调试日志。
以下是关于使用Zipkin导出器的VM选项的说明。
- Zipkin exporter
以下支持的库和框架的数据会自动被收集(测量)。
- https://github.com/open-telemetry/opentelemetry-java-instrumentation#supported-java-libraries-and-frameworks
Zipkin 用户界面 (Zipkin UI)
Java agent将从应用程序收集的信息发送到Zipkin服务器。
在本次配置中,Zipkin服务器将这些信息存储在内存中,并可以在Zipkin UI中进行可视化。
UI的URL如下所示。
- http://[Zipkinサーバーのホスト名]:9411/zipkin/
在用户界面中,您可以显示服务地图和追踪信息。
这是一个服务地图。
已创建的应用程序遵循以下流程。
因此,在从[test_service]到[test_service2]的流程中,服务地图被展示出来。
-
- [test_service]GETリクエストを受信。
-
- 内部の別のGETを受け付けるRESTサービス[test_service2]をリクエスト。レスポンスを受信。
- PostgreSQLへJDBCでSELECTを実行。
接下来,可以通过追踪信息来搜索每个追踪的信息并显示如下。
搜索结果
追踪信息
出口商
OpenTelemetry的代理可以选择向服务器发送数据的导出器。
默认情况下,似乎有以下4种导出器可用。
-
- In-Memory Exporter(メモリにデータを保持する。デバッグ用。)
-
- Jaeger Exporter
-
- Zipkin Exporter
- Logging Exporter
以下是可以利用的其他导出器的列表,包括Elastic APM和New Relic等。
- https://opentelemetry.io/registry/?s=exporter
使用OpenTelemetry API来创建Span。
我之前尝试了自动获取跟踪的方法,现在我将尝试手动使用OpenTelemetry API创建正在跟踪的Span。
我正在参考以下内容进行编码。
- OpenTelemetry QuickStart
首先在pom.xml中添加以下内容。
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-api</artifactId>
<version>0.6.0</version>
</dependency>
接下来,我们将使用OpenTelemetry API在代码中创建Span。Span的名称设置为”my span”。
Tracer tracer =
OpenTelemetry.getTracer("instrumentation-library-name","semver:1.0.0");
Span parentSpan = tracer.getCurrentSpan();
Span childSpan = tracer.spanBuilder("my span")
.setParent(parentSpan)
.startSpan();
childSpan.setAttribute("hoge", "hoge2");
try (Scope scope = tracer.withSpan(childSpan)) {
// ここに計測対象のロジックが入る。
} finally {
childSpan.end(); // closing the scope does not end the span, this has to be done manually
}
在Zipkin UI上查看跟踪数据时,会显示如下内容:
可以确认在图表的最底部添加了名为”my span”的Span。
最后
上次我尝试了使用Elastic APM,感觉它的易用性更高。在Kibana的用户界面中,搜索功能和能够同时处理日志和指标的All in one功能非常有吸引力。
由于OpenTelemetry是标准化的,所以可以在后期更改后端(如Zipkin等),这种灵活性非常重要。每个后端的用户界面在显示追踪信息方面几乎都有相似的感觉,与Elastic APM相比,它缺少额外的功能。不过,Elastic APM也有一些只有付费用户才能使用的功能(如服务映射等)。
考虑到云端支持和其他各方面因素,决定选择哪一个取决于各个功能的重要性,可能会因项目(组织)而异。
就个人而言,我想推荐使用Elastic APM,因为它既方便又提供了丰富的信息。
可以参考
-
- OpenTelemetry公式
-
- OpenTelemetry公式ドキュメント
- OpenTelemetry Instrumentation for Java