这篇文章的另一个版本之前已经发布过了新的堆栈

由多个微服务构建的大规模分布式系统通常具有隐藏的依赖关系。作为Leslie Lamport.有句名言“在分布式系统中,一台你甚至都不知道它存在的计算机出现故障,就会导致你自己的计算机无法使用。”

拥有它是无价的分布式跟踪,它允许您遵循单个请求,因为它在跨服务边界移动时。通过分布式跟踪,您可以在请求中发现延迟并识别瓶颈和故障。除了事件,日志和度量标准之外,分布式迹线是其中一个四种必需数据类型的可观察性

OpenTelemetry是由OpenTracing和openencenssus合并而成的开源遥测框架。为了实现健壮、可移植和易于跨多种语言实现的目标,它提供了一组api、库、代理和收集器服务,以捕获来自应用程序的分布式跟踪和指标。它还向后兼容OpenTracing和opencenssus,这意味着你可以从这两个项目中的任何一个迁移到OpenTelemetry而不需要做任何改变。

潜入OpenTeLemetry项目的测试版

在3月底,OpenteLemetry团队宣布作为OpenTelemetry项目的合作者,我们很高兴在New Relic宣布对OpenTelemetry的支持。由于它仍处于测试阶段,还不适合生产使用,但您应该研究OpenTelemetry提供的功能。

第一β版本包括写入仪器应用的规范和SDKerlangjava.JavaScript,Python。OpenTelemetry发布的每个SDK都包含一些常见用例示例,帮助您入门。这些示例提供了工作代码,说明了如何安装HTTP/gRPC服务器和客户端、数据库连接器等。

OpenTelemetry: future - proof Your Instrumentation,我们将更多地解释OpenTelemetry项目——它是如何工作的,它提供的好处——并描述组成该项目的各种架构组件,包括OpenTelemetry API、OpenTelemetry SDK和Collector。您可以将Collector配置为导出到各种开放源码格式(JaegerZipkin,OpenCensus)和可观察性工具,如New Relic的一

在这篇文章中,我们将展示如何手动和自动地使用OpenTelemetry测试Java应用程序,并将生成的数据发送给New Relic。

笔记:要运行这些示例,报名获得一个免费的New Relic帐户。你需要一个插入API键

示例1:使用OpenTelemetry手动检测Java应用程序

如果您有非常快速、可重复的服务,那么构建自定义手动检测可能不是必要的,但是对于运行时间较长的服务和更复杂的系统,这可能是合适的。OpenTelemetry提供了一种跟踪器,可以在整个应用程序中启用自定义检测,而且使用起来很简单。

在这个简单的示例中,您将看到如何创建示踪器,添加root和两个子跨度与某些属性,并将该数据导出到新的遗物。此示例使用Maven构建依赖项,但您也可以使用Gradle。请注意,OpenTeleMetry API仍在主动开发中,并可能会在未来版本中发生变化。

要开始,请将插入API键添加到字符串apikey.在以下代码中。

笔记:如果你在欧盟连接到New Relic,你也需要取消注释URI覆盖设置(.uriOverride)和设置适当的EU API端点

包com.conissaunce.otelnrexample;进口静态io.opentelemetry.sdk.resources.ResourceConstants.SERVICE_NAME;进口com.newrelic.telemetry.Attributes;进口com.newrelic.telemetry.opentelemetry.export.NewRelicSpanExporter;进口io.opentelemetry.OpenTelemetry;进口io.opentelemetry.context.Scope;进口io.opentelemetry.sdk.OpenTelemetrySdk;进口io.opentelemetry.sdk.trace.export.BatchSpanProcessor;进口io.opentelemetry.trace.Span;进口io.opentelemetry.trace.Status; import io.opentelemetry.trace.Tracer; import java.net.URI; import java.util.logging.Logger; public class MyApp { private static final Logger logger = Logger.getLogger(MyApp.class.getName()); public static void main(String[] args) { //Configure the New Relic SDK. String apiKey ="Put Your API key here!"; //Create a NewRelicSpanExporter for the EU data center - you can leave out the uriOverride if you are in the US NewRelicSpanExporter exporter = NewRelicSpanExporter.newBuilder() .apiKey(apiKey) //.uriOverride(URI.create("https://trace-api.eu.newrelic.com/")) .commonAttributes(new Attributes().put(SERVICE_NAME, "OpenTelemetry example")).build(); //Build the OpenTelemetry BatchSpansProcessor with the NewRelicSpanExporter BatchSpanProcessor spanProcessor = BatchSpanProcessor.newBuilder(exporter).build(); //Add the rootSpan processor to the default TracerSdkProvider penTelemetrySdk.getTracerProvider().addSpanProcessor(spanProcessor); //Create an OpenTelemetry Tracer Tracer tracer = OpenTelemetry.getTracerProvider().get("opentel-example", "1.0"); //Create a basic rootSpan. You only need to specify the name of the rootSpan. The start and end time of the // rootSpan is automatically set by the OpenTelemetry SDK. Span rootSpan = tracer.spanBuilder("getCustomerOrder").startSpan(); //Key:value pairs can be used to affix metadata to spans, events, metrics, and distributed contexts in order to // query, filter, and analyze trace data. Add a simple attribute to our rootSpan. rootSpan.setAttribute("Root-span-attribute", 1); try (Scope scope = tracer.withSpan(rootSpan)) { //Just pause to pretend we're doing something Thread.sleep(300); //Add a couple of child spans to the root span Span childSpan = tracer.spanBuilder("getCustomerRecord").startSpan(); logger.info("Active Span: " + tracer.getCurrentSpan().toString()); Thread.sleep(500); childSpan.end(); Span childSpan2 = tracer.spanBuilder("getOrderDetails").startSpan(); childSpan2.setAttribute("customer-id", 1); childSpan2.setAttribute("order-no", 100); Thread.sleep(1500); childSpan2.end(); Thread.sleep(1000); } catch (Throwable t) { Status status = Status.UNKNOWN.withDescription("Cunning error message goes here!"); rootSpan.setStatus(status); } finally { rootSpan.end(); // closing the scope does not end the rootSpan, this has to be done manually spanProcessor.shutdown(); } } }

接下来,添加Maven依赖项。

<依赖>  io.OpentEleMetry   OpenTeleMetry-API   0.5.0   <依赖项>  io.OpentEleMetry  OPENTELEMETRY-SDK   0.5.0   <依赖项>  com.newrelic.telemetry  遥测 <版本>0.6.0   <依赖项>  com.newrelic.telemetry   OpenTEleMetry-Exporters-Newrelic   0.5.0  

最后,运行应用程序。找到你的跨度,去新遗迹一并选择分布式跟踪从主页上。

在分布式跟踪中访问应用程序的范围

在New Relic中访问应用程序

单击标记的根跨度getCustomerOrder,您将看到一个展开的视图,它允许您查看子跨度和其他上下文数据。

查看Java应用程序的子跨度和其他上下文数据

查看Java应用程序的子跨度和其他上下文数据

示例2:具有OpenTeLemetry的Java应用程序的自动仪器

除了手动仪器外,OpenTeMetry项目还包括一个Java代理jar,您可以添加到运行Java版本7或更高版本的任何应用程序。该代理将动态注入字节码以从许多流行的库和框架中捕获遥测,允许您收集遥测数据,而无需手动介绍您的应用程序或进行任何代码更改。

虽然粒度低于手动授权自己的代码,但它提供了一个良好的起点,并克服了手动授权第三方图书馆的问题。此外,虽然OpenteLemetry项目是新的,但是支持的库范围是广泛的,因为它是在openencenssus和OpenTracing现有工作的基础上构建的。

OpenTelemetry包括一个简单的日志导出程序,您可以在终端中查看它的输出,以验证是否创建了跨度。因此,它对调试非常有帮助。

试试这个:

  1. 下载最新版本日志出口国
  2. 找一个合适的应用;你可以使用你自己的应用程序或抓取像春天宠物诊所
  3. 启动应用程序并添加代理jar:
    Java -JavaAgent:path / to / openteLemetry-auth-all.jar \ -dota.exporter = logging -jar target / *。jar

您应该看到终端中出现的遥测记录信息:

在终端中记录数据

如果扫描终端,您可以看到版本信息:

[opentelemetry.auto。trace 2020-06-16 10:15:48:157 +0100] [main] INFOtrace 2020-06-16 10:15:48:160 +0100] [main] INFO io. opentelemetre .auto. tools.versionlogger - opentelemetre -auto - version: 0.3.0~f4fde658d

您还可以看到春季PET诊所应用程序开始执行数据库工作的许多跨度。例如:

span.origin.type =“com.zaxxer.hikari.pool.hikariproxystatement”db.url =“h2:mem:”日志记录出口商

把自动仪器送到新遗迹

要将此数据发送到New Relic,请获取新的遗物OpenTeleMetry Java Exporter

您可以使用它来使用./gradlew build

现在,在命令行中使用Insert API Key运行以下命令。

java -javaagent:path/to/ opentelemetre -auto-.jar \ - dota . exports .jar=path/to/ opentelemetre - exports -newrelic-auto-.jar \ - dota . exports .newrelic.api. jarkey=INSERT_API_KEY \ - dota . exports .newrelic.service.name=your-service-name \ - dota . exports .newrelic.uri.override=https://trace-api.eu.newrelic.com/ \ -jar myapp.jar

笔记:同样,如果您的新遗物帐户位于欧盟,您需要包含手动URI覆盖。否则你可以把这个争论留出来。

从自动仪器发布0.7.0开始,-Dota选项被更新为-Dotel

java -javaagent:path/to/ opentelemetre -auto-.jar \ - dotele . exports .jar=path/to/ opentelemetre - exports - newlegacy -auto-.jar \ - dotele . exports . newlegacy .api。key=INSERT_API_KEY \ - dotel . exports .newrelic.service.name=your-service-name \ - dotel . exports .newrelic.uri.override=https://trace-api.eu.newrelic.com/ \ -jar myapp.jar

如果你遇到这样的问题,使用下面的系统属性为在自动检测代理中运行的导出器打开调试日志记录:

-Dio.opentelemetry.auto.slf4j.simpleLogger.log.com.newrelic.telemetry =调试

并且,如果要启用在自动检测代理中运行的导出商的审核日志记录,请使用此系统属性:

-Dota.exporter.newrelic.enable.audit.logging = true

自动检测版本0.7.0:

-Dotel.exporter.newrelic.enable.audit.logging = true

要找到你的跨度,去https://one.newrelic.com/并选择分布式跟踪从主页上。

从新遗物中的Java应用程序查看跨度

从新遗物中的Java应用程序查看跨度

下一个步骤

要了解更多信息,请查看OpenTeLemetryJava快速入门指南- 提供与跟踪器一起使用的完整详细示例。

新的遗物open-tetemetry-exporter-java项目有一个文件,BasicExample.java,它提供了更多示例代码,了解如何为应用程序设置自定义遥测,并将其发送到新的遗物。该示例包括我们这里未介绍的主题,包括指标仪器。

GitHub项目还提供了一个书面教程

了解更多关于新遗迹的贡献OpenTelemetry和其他开源项目新遗物参与,访问New Relic开源

要开始使用OpenTelemetry和New Relic,报名获得一个免费的New Relic帐户。

查尔斯谦卑是一支远程工程团队领导,具有软件交付和内容的经验。查看帖子

有兴趣为New Relic博客写作吗?亚搏体育登入网给我们一个推介!!