当我们开发和维护应用程序时,应用程序的性能和稳定性对于用户的体验至关重要。但是,应用程序的性能和稳定性通常是很难监控和调试的。一个消息丢失,一个API访问不可用,一个后端服务的延迟,这些问题都会导致应用程序性能的下降,从而影响整个业务。因此,应用程序需要一个强大的监控和追踪系统。Opentelemetry和Skywalking正是提供这样的解决方案。
一、为什么需要Opentelemetry和Skywalking?
Opentelemetry是一个开放式的观察性框架,它使开发人员能够现代化、标准化、自动化地捕捉分布式环境中应用程序的信息。它提供了一组标准API和SDK,可用于在应用程序组件中实现分布式跟踪、日志记录和度量信息收集。
Skywalking是一个基于APM(Application Performance Management)的开源系统,为分布式实时跟踪、服务网格和分布式系统中的性能监控提供支持。它提供了一个自动化的分布式跟踪系统,可以监控大规模分布式系统中的性能问题,并提供关键指标以帮助调试和优化性能。
Opentelemetry和Skywalking的结合,可以提供更全面的服务监控和度量,以帮助应用程序更好地处理分布式调用,保证应用程序的性能和稳定性。
二、如何实现Opentelemetry和Skywalking的集成?
1、安装Skywalking服务端
先从Skywalking官网下载最新版本的Skywalking服务端,并启动。具体可参考Skywalking的官方文档。
2、集成Opentelemetry SDK
为了在应用程序中启用Opentelemetry,我们需要添加Opentelemetry库和SDK以及与Skywalking协议的相应插件。
<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-trace</artifactId> <version>1.4.1</version> </dependency> <dependency> <groupId>org.apache.skywalking</groupId> <artifactId>apm-toolkit-trace-opentelemetry-bridge</artifactId> <version>8.7.0</version> </dependency>
3、添加Skywalking代理
为了将Opentelemetry SDK的跟踪数据发送到Skywalking服务器,我们需要添加Skywalking代理,并在应用程序中添加Skywalking自动代理插件。Skywalking代理可用于Java,.NET和PHP应用程序。
对于Java应用程序,我们需要添加以下虚拟机参数。
-javaagent:path/to/skywalking-agent.jar -Dskywalking.agent.service_name=my-service -Dskywalking.agent.instance_name=my-instance -Dskywalking.collector.backend_service=127.0.0.1:11800
这将启用Skywalking的自动代理插件,让Skywalking知道应用程序的服务和实例名称,并且将跟踪数据发送到Skywalking服务器。
三、如何使用Opentelemetry和Skywalking进行应用程序监控?
一旦集成了Opentelemetry和Skywalking,就可以开始监控应用程序的性能和稳定性。
1、分布式跟踪
Opentelemetry提供了一个跟踪API,用于帮助开发人员记录应用程序中发生的跨组件调用。Skywalking提供一个自动化分布式跟踪系统,可以自动检测应用程序中组件之间的调用,并存储和显示跨组件跟踪信息。
为了实现分布式跟踪,我们需要在应用程序的组件之间添加跟踪代码。例如,下面是一个使用Opentelemetry SDK记录跨越两个RPC调用的跟踪的例子:
private static final Tracer tracer = OpenTelemetry.getTracerProvider().get("my_service"); void doFirstRpcCall() { Span firstSpan = tracer.spanBuilder("my_span").startSpan(); try (Scope scope = tracer.withSpan(firstSpan)) { rpcCall(); // perform the RPC call firstSpan.setStatus(Status.OK); } catch (Throwable throwable) { firstSpan.setStatus(Status.ERROR); firstSpan.recordException(throwable); } finally { firstSpan.end(); } } void rpcCall() { Span span = tracer.spanBuilder("rpc_call_span").startSpan(); try (Scope scope = tracer.withSpan(span)) { // perform the RPC call span.setStatus(Status.OK); } catch (Throwable throwable) { span.setStatus(Status.ERROR); span.recordException(throwable); } finally { span.end(); } }
这将创建两个跟踪:第一个跨越第一个组件,第二个跨越RPC组件。
我们可以在Skywalking UI中查看跟踪信息:
2、指标收集
Opentelemetry提供了一个度量API,用于记录应用程序的关键指标。Skywalking提供了自动化的度量仪表板,可以显示这些指标,并帮助开发人员识别和解决性能问题。
例如,我们可以使用Opentelemetry SDK记录每个请求的延迟时间,并使用Skywalking Dashboard查看延迟时间的统计信息。
private static final Meter meter = OpenTelemetry.getMeterProvider().get("my_service"); private static final LongValueRecorder latencyRecorder = meter. .longValueRecorderBuilder("request_latency") .setUnit("ms") .setDescription("Request latency in milliseconds") .build(); void processRequest(Request request) { long startTime = System.currentTimeMillis(); // process the request long endTime = System.currentTimeMillis(); latencyRecorder.record(endTime - startTime); }
四、总结
Opentelemetry和Skywalking是两个强大的监控和追踪工具,可以帮助开发人员监控分布式环境中的应用程序,并为性能调优和性能问题解决提供指导和支持。通过将这两个工具集成在一起,我们可以更全面、更标准化地检测和解决性能问题。