Create a MANDATORY Resource instance containing mandatory attributes. Merge that into the default resource. (#2366)

* Assign a fallback service name to resources when building the signal Provider instances.

* Add a MANDATORY resource that will contain all mandatory attributes.

* some cleanups of leftover stuff

* make the MANDATORY resource instance private

* updates from ResourceAttributes changes

* be sure to set the service name in the jaeger tests
This commit is contained in:
John Watson 2021-01-21 09:01:16 -08:00 committed by GitHub
parent 7cfcc28f05
commit 1f84ec099b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 82 additions and 13 deletions

View File

@ -8,11 +8,14 @@ package io.opentelemetry.exporter.jaeger.thrift;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
import java.time.Duration;
import okhttp3.OkHttpClient;
import okhttp3.Request;
@ -64,6 +67,11 @@ class JaegerThriftIntegrationTest {
.setTracerProvider(
SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(jaegerExporter))
.setResource(
Resource.getDefault()
.merge(
Resource.create(
Attributes.of(ResourceAttributes.SERVICE_NAME, SERVICE_NAME))))
.build())
.build();
}

View File

@ -10,11 +10,14 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
import java.time.Duration;
import okhttp3.OkHttpClient;
import okhttp3.Request;
@ -68,6 +71,11 @@ class JaegerIntegrationTest {
.setTracerProvider(
SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(jaegerExporter))
.setResource(
Resource.getDefault()
.merge(
Resource.create(
Attributes.of(ResourceAttributes.SERVICE_NAME, SERVICE_NAME))))
.build())
.build();
}

View File

@ -8,11 +8,14 @@ package io.opentelemetry;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
import java.time.Duration;
public class SendTraceToJaeger {
@ -42,6 +45,12 @@ public class SendTraceToJaeger {
.setTracerProvider(
SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(jaegerExporter))
.setResource(
Resource.getDefault()
.merge(
Resource.create(
Attributes.of(
ResourceAttributes.SERVICE_NAME, "integration test"))))
.build())
.buildAndRegisterGlobal();
}

View File

@ -144,7 +144,7 @@ class OpenTelemetrySdkTest {
.addSpanProcessor(SimpleSpanProcessor.create(mock(SpanExporter.class)))
.setClock(mock(Clock.class))
.setIdGenerator(mock(IdGenerator.class))
.setResource(mock(Resource.class))
.setResource(Resource.getEmpty())
.setTraceConfig(newConfig)
.build());

View File

@ -5,6 +5,7 @@
package io.opentelemetry.sdk.resources;
import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME;
import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.TELEMETRY_SDK_LANGUAGE;
import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.TELEMETRY_SDK_NAME;
import static io.opentelemetry.semconv.resource.attributes.ResourceAttributes.TELEMETRY_SDK_VERSION;
@ -52,9 +53,15 @@ public abstract class Resource {
private static final String ERROR_MESSAGE_INVALID_VALUE =
" should be a ASCII string with a length not exceed " + MAX_LENGTH + " characters.";
private static final Resource EMPTY = create(Attributes.empty());
private static final Resource TELEMETRY_SDK;
/**
* The MANDATORY Resource instance contains the mandatory attributes that must be used if they are
* not provided by the Resource that is given to an SDK signal provider.
*/
private static final Resource MANDATORY =
create(Attributes.of(SERVICE_NAME, "unknown_service:java"));
static {
TELEMETRY_SDK =
create(
@ -65,7 +72,8 @@ public abstract class Resource {
.build());
}
private static final Resource DEFAULT = TELEMETRY_SDK.merge(readResourceFromProviders());
private static final Resource DEFAULT =
MANDATORY.merge(TELEMETRY_SDK.merge(readResourceFromProviders()));
@Nullable
private static String readVersion() {

View File

@ -8,6 +8,7 @@ package io.opentelemetry.sdk.metrics;
import static org.assertj.core.api.Assertions.assertThat;
import io.opentelemetry.api.metrics.GlobalMetricsProvider;
import io.opentelemetry.sdk.resources.Resource;
import org.junit.jupiter.api.Test;
class SdkMeterProviderBuilderTest {
@ -21,4 +22,13 @@ class SdkMeterProviderBuilderTest {
GlobalMetricsProvider.set(null);
}
}
@Test
void defaultResource() {
SdkMeterProvider meterProvider = SdkMeterProvider.builder().build();
assertThat(meterProvider)
.extracting("sharedState")
.hasFieldOrPropertyWithValue("resource", Resource.getDefault());
}
}

View File

@ -32,7 +32,7 @@ class SdkMeterRegistryTest {
assertThat(
SdkMeterProvider.builder()
.setClock(mock(Clock.class))
.setResource(mock(Resource.class))
.setResource(Resource.getEmpty())
.build())
.isNotNull();
}

View File

@ -10,6 +10,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.sdk.common.Clock;
@ -17,6 +18,7 @@ import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
import java.util.function.Supplier;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@ -42,15 +44,39 @@ class SdkTracerProviderTest {
}
@Test
void builder_HappyPath() {
assertThat(
SdkTracerProvider.builder()
.setClock(mock(Clock.class))
.setResource(mock(Resource.class))
.setIdGenerator(mock(IdGenerator.class))
.setTraceConfig(mock(TraceConfig.class))
.build())
.isNotNull();
void builder_defaultResource() {
Resource resourceWithDefaults = Resource.getDefault();
SdkTracerProvider tracerProvider =
SdkTracerProvider.builder()
.setClock(mock(Clock.class))
.setIdGenerator(mock(IdGenerator.class))
.setTraceConfig(mock(TraceConfig.class))
.build();
assertThat(tracerProvider).isNotNull();
assertThat(tracerProvider)
.extracting("sharedState")
.hasFieldOrPropertyWithValue("resource", resourceWithDefaults);
}
@Test
void builder_serviceNameProvided() {
Resource resource =
Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "mySpecialService"));
SdkTracerProvider tracerProvider =
SdkTracerProvider.builder()
.setClock(mock(Clock.class))
.setResource(resource)
.setIdGenerator(mock(IdGenerator.class))
.setTraceConfig(mock(TraceConfig.class))
.build();
assertThat(tracerProvider).isNotNull();
assertThat(tracerProvider)
.extracting("sharedState")
.hasFieldOrPropertyWithValue("resource", resource);
}
@Test