我有一个应用程序是由多个服务组成的专有语言。我想收集痕迹和摄取到Jaeger或APM解决方案。没有插装库。但是,这些服务以专有格式生成跟踪。我想将这些跟踪转换为OpenTelemetry跟踪,并摄取到积家或APM解决方案。
我开始使用OpenTelemetry-Java SDK。
// This is a just converter service, trying to convert proprietary traces to OLTP
// Not interested in instrumenting this converter service. Following code does not show the proprietary trace reading and conversion for brevity.
// Converter service - reading first service
private static void convert() {
OpenTelemetry openTelemetry = ExampleConfiguration.initOpenTelemetry();
Tracer tracer = openTelemetry.getTracer("io.opentelemetry.example");
Span exampleSpan = tracer.spanBuilder("exampleSpan").startSpan();
childOne(exampleSpan, openTelemetry);
...
}
// Converter service - reading second service
private static void childOne(Span parentSpan, OpenTelemetry openTelemetry) {
Tracer tracer = openTelemetry.getTracer("service2");
Span childSpan = tracer.spanBuilder("child").setParent(Context.current().with(parentSpan)).startSpan();
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
childSpan.end();
}已配置适当的导出器。我可以像预期的那样在Jeager中看到这些痕迹。

但它只显示一个服务。

而我想描述两个不同的服务。使用OpenTelemetry可以吗?

发布于 2021-03-08 01:57:21
基于Opentelemetry Java社区提供的一些提示,创建了两个提供者,实际上创建了两个服务。重用同一个导出器,避免多个后端连接。在接下来的几天里,我将学习更多关于重用exporter在同一应用程序中创建两个或更多提供程序的知识。
OpenTelemetry openTelemetryParent = ExampleConfiguration.initOpenTelemetry(jaegerHostName, jaegerPort,
"FirstService");
Tracer tracerParent = openTelemetryParent.getTracer("FirstServiceInstrumentation");
OpenTelemetry openTelemetryChild = ExampleConfiguration.initOpenTelemetry(jaegerHostName, jaegerPort,
"SecondService");
Tracer tracerChild = openTelemetryChild.getTracer("SecondServiceInstrumentation");
Random randomNum = new Random();
for (int i = 0; i < 10; i++) {
Span parentSpan = tracerParent.spanBuilder("MyService1Span").startSpan();
try (Scope scope = parentSpan.makeCurrent()) {
Thread.sleep(1 + randomNum.nextInt(100));
secondService(parentSpan, tracerChild, randomNum.nextInt(300));
Thread.sleep(1 + randomNum.nextInt(100));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
parentSpan.end();
}
}
}
private static void secondService(Span parentSpan, Tracer tracer, int delay) {
Span childSpan = tracer.spanBuilder("MyService2Span").setParent(Context.current().with(parentSpan)).startSpan();
try {
Thread.sleep(delay);
} catch (InterruptedException e) {
e.printStackTrace();
}
childSpan.end();
}感谢令人惊叹的Opentelemetry java社区- @John Watson (jkwatson),Bogdan Drutu,Rupinder Singh,Anuraag Agrawal。
发布于 2021-03-05 21:54:28
您可以在代码中设置服务名称,如下所示:
Resource serviceNameResource = Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, serviceName));
// Set to process the spans by the Jaeger Exporter
SdkTracerProvider tracerProvider =
SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(jaegerExporter))
.setResource(Resource.getDefault().merge(serviceNameResource))
.build();
OpenTelemetrySdk openTelemetry =
OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();https://stackoverflow.com/questions/66487682
复制相似问题