我們嘗試使用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/

在用户界面中,您可以显示服务地图和追踪信息。

这是一个服务地图。

image.png

已创建的应用程序遵循以下流程。
因此,在从[test_service]到[test_service2]的流程中,服务地图被展示出来。

    • [test_service]GETリクエストを受信。

 

    • 内部の別のGETを受け付けるRESTサービス[test_service2]をリクエスト。レスポンスを受信。

 

    PostgreSQLへJDBCでSELECTを実行。

接下来,可以通过追踪信息来搜索每个追踪的信息并显示如下。

搜索结果

image.png

追踪信息

image.png

出口商

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。

image.png

最后

上次我尝试了使用Elastic APM,感觉它的易用性更高。在Kibana的用户界面中,搜索功能和能够同时处理日志和指标的All in one功能非常有吸引力。
由于OpenTelemetry是标准化的,所以可以在后期更改后端(如Zipkin等),这种灵活性非常重要。每个后端的用户界面在显示追踪信息方面几乎都有相似的感觉,与Elastic APM相比,它缺少额外的功能。不过,Elastic APM也有一些只有付费用户才能使用的功能(如服务映射等)。
考虑到云端支持和其他各方面因素,决定选择哪一个取决于各个功能的重要性,可能会因项目(组织)而异。
就个人而言,我想推荐使用Elastic APM,因为它既方便又提供了丰富的信息。

可以参考

    • OpenTelemetry公式

 

    • OpenTelemetry公式ドキュメント

 

    OpenTelemetry Instrumentation for Java
广告
将在 10 秒后关闭
bannerAds