我在一个java spring Boot 应用程序中使用openemetry(以elastic search 8.3.2作为后端),这是一个多租户应用程序。我希望在ElasticSearch中将每个租户的跟踪数据隔离在其自己的索引中使用opentelemetry实现这一点的最佳方法是什么?
我尝试使用下面的方法,但看起来ElasticsearchSpanExporter不支持
@Bean
public SpanExporter otelElasticsearchExporter() {
return ElasticsearchSpanExporter.builder()
.setEndpoint(elasticsearchEndpoint)
.setCompression(Compression.GZIP)
.setIndex(exporterProperties.getSpan().getSpanName() + "-{tenant-id}")
.build();
}
字符串
接下来,我尝试了以下方法,但ElasticSearch8.3.2不支持RestHighLevelClient
import org.elasticsearch.client.RestHighLevelClient;
@Bean
public SpanExporter otelElasticsearchExporter(RestHighLevelClient elasticsearchClient) {
return new SpanExporter() {
@Override
public SpanExporterResult export(Collection<SpanData> spanDataList) {
BulkRequest bulkRequest = new BulkRequest();
spanDataList.forEach(spanData -> {
bulkRequest.add(
new IndexRequest("your_index_name")
.source(spanDataToJson(spanData), XContentType.JSON)
);
});
try {
BulkResponse bulkResponse = elasticsearchClient.bulk(bulkRequest, RequestOptions.DEFAULT);
if (bulkResponse.hasFailures()) {
return SpanExporterResult.FAILURE;
}
} catch (IOException e) {
return SpanExporterResult.FAILURE;
}
return SpanExporterResult.SUCCESS;
}
型
我看到,如果我在创建跟踪提供程序时使用setResource方法,我的跟踪将进入每个租户的单独索引中。但不确定这是否是一个好方法。
SdkTracerProvider tracerProvider =
SdkTracerProvider.builder()
.addSpanProcessor(BatchSpanProcessor.builder(otlpExporter).build())
.setResource(Resource.getDefault().merge(tenantId))
.build();
型
保持每个租户的跟踪数据隔离的首选方法是什么?
1条答案
按热度按时间monwx1rj1#
如何使用跟踪数据?它是通过Elastic APM,还是你使用Elasticsearch作为一个持久层,上面有一个不同的可观察性工具?
根据上面的问题,范围数据的导出看起来会有所不同。
如果您使用的是Elastic APM,则此is the documentation for exporting OTel data to Elastic APM。
在后一种情况下,您可以使用第二种方法,使用Java API Client而不是RestHighLevelClient。使用这种方法,您可以控制将span写入哪个索引。