您的位置:

提升应用监控能力:尝试Opentelemetry集成Skywalking

当我们开发和维护应用程序时,应用程序的性能和稳定性对于用户的体验至关重要。但是,应用程序的性能和稳定性通常是很难监控和调试的。一个消息丢失,一个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是两个强大的监控和追踪工具,可以帮助开发人员监控分布式环境中的应用程序,并为性能调优和性能问题解决提供指导和支持。通过将这两个工具集成在一起,我们可以更全面、更标准化地检测和解决性能问题。