Skip to content

Commit

Permalink
Adds OLTP GRPC span exporter support
Browse files Browse the repository at this point in the history
Signed-off-by: Gagan Juneja <gjjuneja@amazon.com>
  • Loading branch information
Gagan Juneja committed Jul 4, 2023
1 parent 544b1ca commit 4583a6f
Show file tree
Hide file tree
Showing 6 changed files with 150 additions and 0 deletions.
5 changes: 5 additions & 0 deletions plugins/telemetry-otel/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@ dependencies {
api "io.opentelemetry:opentelemetry-semconv:${versions.opentelemetry}-alpha"
api "io.opentelemetry:opentelemetry-sdk-logs:${versions.opentelemetry}-alpha"
api "io.opentelemetry:opentelemetry-api-logs:${versions.opentelemetry}-alpha"
api "io.opentelemetry:opentelemetry-exporter-otlp-common:${versions.opentelemetry}"
api "io.opentelemetry:opentelemetry-exporter-otlp:${versions.opentelemetry}"
api 'com.squareup.okhttp3:okhttp:4.10.0'
api 'org.jetbrains.kotlin:kotlin-stdlib:1.6.20'
api 'com.squareup.okio:okio-jvm:3.0.0'
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import org.opensearch.common.settings.Settings;

import java.util.concurrent.TimeUnit;
import org.opensearch.telemetry.tracing.exporter.SpanExporterFactory;

import static org.opensearch.telemetry.OTelTelemetryPlugin.TRACER_EXPORTER_BATCH_SIZE_SETTING;
import static org.opensearch.telemetry.OTelTelemetryPlugin.TRACER_EXPORTER_DELAY_SETTING;
Expand All @@ -32,6 +33,8 @@
* This class encapsulates all OpenTelemetry related resources
*/
public final class OTelResourceProvider {

private static final SpanExporterFactory spanExporterFactory = new SpanExporterFactory();
private OTelResourceProvider() {}

/**
Expand All @@ -40,6 +43,7 @@ private OTelResourceProvider() {}
* @return OpenTelemetry instance
*/
public static OpenTelemetry get(Settings settings) {
SpanExporter spanExporter = spanExporterFactory.create(settings);
return get(
settings,
new LoggingSpanExporter(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.telemetry.tracing.exporter;

import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import org.opensearch.common.settings.Setting;
import org.opensearch.common.settings.Settings;

import static org.opensearch.telemetry.OTelTelemetryPlugin.TRACER_EXPORTER_DELAY_SETTING;

/**
* Factory class to create the {@link SpanExporter} instance.
*/
public class SpanExporterFactory {

/**
* Span Exporter type setting.
*/
public static final Setting<SpanExporterType> TRACER_SPAN_EXPORTER_TYPE_SETTING = new Setting<>(
"telemetry.tracer.span.exporter.type",
SpanExporterType.LOGGING.name(),
SpanExporterType::fromString,
Setting.Property.NodeScope,
Setting.Property.Dynamic
);

/**
* Base constructor.
*/
public SpanExporterFactory() {

}

/**
* Creates the {@link SpanExporter} instaces based on the TRACER_SPAN_EXPORTER_TYPE_SETTING value.
* @param settings settings.
* @return SpanExporter instance.
*/
public SpanExporter create(Settings settings) {
SpanExporterType exporterType = TRACER_SPAN_EXPORTER_TYPE_SETTING.get(settings);
switch (exporterType) {
case OLTP_GRPC:
//TODO: For now just giving default implementation, but we need to use otel autoconfigue to expose
// all the configurations.
return OtlpGrpcSpanExporter.builder().build();
case LOGGING:
default:
return LoggingSpanExporter.create();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.telemetry.tracing.exporter;

import java.util.Arrays;

/**
* Span Exporter type. For now, we are just supporting the 2 main types. But the idea is to make it configurable
* through otel autoconfigure.
*/
public enum SpanExporterType {

LOGGING, OLTP_GRPC;

/**
* Creates the {@link SpanExporterType} instance from the String.
* @param name
* @return
*/
public static SpanExporterType fromString(String name) {
for (SpanExporterType exporterType : values()) {
if (exporterType.name().equalsIgnoreCase(name)) {
return exporterType;
}
}
throw new IllegalArgumentException(
"invalid value for tracing level [" + name + "], " + "must be in " + Arrays.asList(SpanExporterType.values())
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
*/

grant {
permission java.net.NetPermission "getProxySelector";
permission java.net.SocketPermission "127.0.0.1:4317", "connect,resolve";
};


Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.telemetry.tracing.exporter;

import io.opentelemetry.exporter.logging.LoggingSpanExporter;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import org.opensearch.common.settings.Settings;
import org.opensearch.test.OpenSearchTestCase;


public class SpanExporterFactoryTest extends OpenSearchTestCase {

private final SpanExporterFactory spanExporterFactory = new SpanExporterFactory();

public void testSpanExporterDefault() {
Settings settings = Settings.builder().build();
SpanExporter spanExporter = spanExporterFactory.create(settings);
assertTrue(spanExporter instanceof LoggingSpanExporter);
}

public void testSpanExporterLogging() {
Settings settings = Settings.builder().put(SpanExporterFactory.TRACER_SPAN_EXPORTER_TYPE_SETTING.getKey(), "logging").build();
SpanExporter spanExporter = spanExporterFactory.create(settings);
assertTrue(spanExporter instanceof LoggingSpanExporter);
}

public void testSpanExporterGrpc() {
Settings settings = Settings.builder().put(SpanExporterFactory.TRACER_SPAN_EXPORTER_TYPE_SETTING.getKey(), "OLTP_GRPC").build();
SpanExporter spanExporter = spanExporterFactory.create(settings);
assertTrue(spanExporter instanceof OtlpGrpcSpanExporter);
}

public void testSpanExporterInvalid() {
Settings settings = Settings.builder().put(SpanExporterFactory.TRACER_SPAN_EXPORTER_TYPE_SETTING.getKey(), "abc").build();
assertThrows(IllegalArgumentException.class, () -> spanExporterFactory.create(settings));
}
}

0 comments on commit 4583a6f

Please sign in to comment.