开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情
引言
这是 OpenTelemetry 探究的第四篇,本篇来了解如何开始使用 OpenTelemetry Java,通过一个 Hello world 的例子了解获取 tracing 遥测数据。
OpenTelemetry Java 的主要功能组件的现状如下:
| Traces | Metrics | Logs |
|---|---|---|
| Stable | Stable | Experimental |
跑一个没有埋点的 Hello-World 程序
运行一个没有集成 OpenTelemetry gRPC-Java 程序
gRPC in Java simple working example
源码下载
克隆 grpc-java v1.51.0 分支的最近一次提交(加快克隆的速度)
- -b --branch 选择分支
- --depth 1 浅层克隆,指定仅克隆最近一次 commit
$ git clone -b v1.51.0 --depth 1 https://github.com/grpc/grpc-java
切换到 examples 目录下
$ cd grpc-java/examples
Run the example
在 examples文件夹执行如下命令启动
编译 hello-world 客户端和服务端代码
$ ./gradlew installDist
运行 hello-world-server
$ ./build/install/examples/bin/hello-world-server
12月 10, 2022 6:49:56 下午 io.grpc.examples.helloworld.HelloWorldServer start
信息: Server started, listening on 50051
打开一个新的终端 tab,运行 hello-world-client
$ ./build/install/examples/bin/hello-world-client
信息: Will try to greet world ...
12月 10, 2022 6:51:03 下午 io.grpc.examples.helloworld.HelloWorldClient greet
信息: Greeting: Hello world
跑一个埋点的 Hello-World 程序
利用 OpenTelemetry Java agent 进行在客户端服务端程序运行时进行自动埋点,配置 OpenTelemetry Java agent 等方式有很多,Demo 通过环境变量的方式进行配置。
下载 agent
从 opentelemetry-java-instrumentation 仓库 Releases 下载 openTelemetry-javaagent.jar。这个 jar 包含 agent 和自动埋点相关的packages
配置环境变量
设置 openTelemetry-javaagent.jar 的环境变量
# 将 PATH/TO 替换成下载的 javaagent.jar 的环境变量
$ export JAVA_OPTS="-javaagent:PATH/TO/opentelemetry-javaagent.jar"
$ export OTEL_TRACES_EXPORTER=logging
$ export OTEL_METRICS_EXPORTER=logging
再次启动 hello-world-server
与第一次启动 hello-world-server 相比,otel.javaagent 生效并输出日志
$ ./build/install/examples/bin/hello-world-server
[otel.javaagent 2022-12-10 21:30:58:464 +0800] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 1.20.2
[otel.javaagent 2022-12-10 21:30:59:874 +0800] [main] INFO io.opentelemetry.javaagent.shaded.instrumentation.jmx.engine.JmxMetricInsight - Empty JMX configuration, no metrics will be collected for InstrumentationScope io.opentelemetry.jmx
12月 10, 2022 9:31:00 下午 io.grpc.examples.helloworld.HelloWorldServer start
信息: Server started, listening on 50051
在同一个终端下启动 hello-world-client
$ ./build/install/examples/bin/hello-world-client
[otel.javaagent 2022-12-10 21:37:00:726 +0800] [main] INFO io.opentelemetry.javaagent.tooling.VersionLogger - opentelemetry-javaagent - version: 1.20.2
[otel.javaagent 2022-12-10 21:37:01:940 +0800] [main] INFO io.opentelemetry.javaagent.shaded.instrumentation.jmx.engine.JmxMetricInsight - Empty JMX configuration, no metrics will be collected for InstrumentationScope io.opentelemetry.jmx
12月 10, 2022 9:37:02 下午 io.grpc.examples.helloworld.HelloWorldClient greet
信息: Will try to greet world ...
停止服务进程
$ jobs
[1]+ Running ./build/install/examples/bin/hello-world-server
$ kill %1
...
*** server shut down
openTelemetry-javaagent.jar 采集的信息
通过 openTelemetry-javaagent.jar 来看两类信息,一类是 Trace 的遥测信息,一类是 Log 的遥测信息。
- Trace 信息为运行时客户端和服务端 SayHello 的 Trace 信息
- Log 信息为 Stop Server 时采集的日志信息
Trace 遥测信息
[otel.javaagent 2022-12-10 21:37:03:210 +0800] [grpc-default-executor-0] INFO
io.opentelemetry.exporter.logging.LoggingSpanExporter - 'helloworld.Greeter/SayHello' : 60a46860d85a51e8df46245e6ce4e1c1 349b8b2e3abdc6be
SERVER [tracer: io.opentelemetry.grpc-1.6:1.20.2-alpha] AttributesMap{data={net.host.port=50051, rpc.system=grpc, thread.name=grpc-default-executor-0,
net.host.name=localhost, net.transport=ip_tcp, thread.id=26, net.sock.peer.port=59053, rpc.service=helloworld.Greeter, net.sock.peer.addr=127.0.0.1,
rpc.method=SayHello, rpc.grpc.status_code=0}, capacity=128, totalAddedValues=11}
[otel.javaagent 2022-12-10 21:37:03:276 +0800] [main] INFO
io.opentelemetry.exporter.logging.LoggingSpanExporter - 'helloworld.Greeter/SayHello' : 60a46860d85a51e8df46245e6ce4e1c1 60f26fc08efa2436
CLIENT [tracer: io.opentelemetry.grpc-1.6:1.20.2-alpha] AttributesMap{data={net.peer.port=50051, rpc.system=grpc, thread.name=main,
net.peer.name=localhost, thread.id=1, net.transport=ip_tcp, rpc.service=helloworld.Greeter, rpc.method=SayHello, rpc.grpc.status_code=0}, capacity=128, totalAddedValues=9}
12月 10, 2022 9:37:03 下午 io.grpc.examples.helloworld.HelloWorldClient greet
信息: Greeting: Hello world
Stop Server 遥测信息
[otel.javaagent 2022-12-10 21:41:19:821 +0800] [Thread-0] INFO io.opentelemetry.exporter.logging.LoggingMetricExporter - Received a collection of 17 metrics for export.
[otel.javaagent 2022-12-10 21:41:19:821 +0800] [Thread-0] INFO io.opentelemetry.exporter.logging.LoggingMetricExporter - metric: ImmutableMetricData{resource=Resource{schemaUrl=https://opentelemetry.io/schemas/1.13.0,
attributes={host.arch="x86_64", host.name="zhanganjindeMacBook-Pro.local", os.description="Mac OS X 10.16", os.type="darwin",
process.command_line="/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java
-javaagent:/***/opentelemetry-javaagent.jar",
process.executable.path="/Library/Java/JavaVirtualMachines/jdk-13.0.2.jdk/Contents/Home/bin/java",
process.pid=92627, process.runtime.description="Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 13.0.2+8",
process.runtime.name="Java(TM) SE Runtime Environment", process.runtime.version="13.0.2+8", service.name="unknown_service:java", telemetry.auto.version="1.20.2", telemetry.sdk.language="java", telemetry.sdk.name="opentelemetry", telemetry.sdk.version="1.20.1"}},
instrumentationScopeInfo=InstrumentationScopeInfo{name=io.opentelemetry.grpc-1.6, version=1.20.2-alpha, schemaUrl=null, attributes={}}, name=rpc.server.duration, description=The duration of an inbound RPC invocation, unit=ms, type=HISTOGRAM,
data=ImmutableHistogramData{aggregationTemporality=CUMULATIVE, points=[ImmutableHistogramPointData{getStartEpochNanos=1670679141485279000, getEpochNanos=1670679679819821000,
getAttributes={net.host.name="localhost", net.transport="ip_tcp", rpc.grpc.status_code=0, rpc.method="SayHello", rpc.service="helloworld.Greeter", rpc.system="grpc"},
getSum=41.515115, getCount=1, hasMin=true, getMin=41.515115, hasMax=true, getMax=41.515115, getBoundaries=[0.0, 5.0, 10.0, 25.0, 50.0, 75.0, 100.0, 250.0, 500.0, 750.0, 1000.0, 2500.0, 5000.0, 7500.0, 10000.0], getCounts=[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
getExemplars=[ImmutableDoubleExemplarData{filteredAttributes={}, epochNanos=1670679423209963000, spanContext=ImmutableSpanContext{traceId=60a46860d85a51e8df46245e6ce4e1c1,
spanId=349b8b2e3abdc6be, traceFlags=01, traceState=ArrayBasedTraceState{entries=[]}, remote=false, valid=true}, value=41.515115}]}]}}
……