Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@ public Resource createResource(ConfigProperties config) {

@Override
public int order() {
// Environment resource takes precedent over all other ResourceProviders except
// ServiceInstanceIdResourceProvider.
// Environment resource takes precedent over all other ResourceProviders.
return Integer.MAX_VALUE - 1;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk.extension.incubator.resources;
package io.opentelemetry.sdk.autoconfigure.internal;

import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.Attributes;
Expand All @@ -14,13 +14,20 @@
import java.util.UUID;

/**
* A {@link ConditionalResourceProvider} for {@code service.instance.id}. It implements {@link
* ConditionalResourceProvider} rather than a plain {@link ResourceProvider} because it depends on
* the attributes discovered by the other providers.
* A {@link ResourceProvider} for {@code service.instance.id}. This provider generates a random
* UUID for {@code service.instance.id} if not already set by the user or another resource provider.
* The value is stable across calls to this provider within the same JVM instance.
*
* <p>This provider implements the internal {@link ConditionalResourceProvider} interface to
* conditionally apply the resource only when service.instance.id is not already set by other
* providers.
*
* <p>This class is internal and is not intended for public use.
*/
public final class ServiceInstanceIdResourceProvider implements ConditionalResourceProvider {
final class ServiceInstanceIdResourceProvider
implements ResourceProvider, ConditionalResourceProvider {

public static final AttributeKey<String> SERVICE_INSTANCE_ID =
static final AttributeKey<String> SERVICE_INSTANCE_ID =
AttributeKey.stringKey("service.instance.id");

// multiple calls to this resource provider should return the same value
Expand Down
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
io.opentelemetry.sdk.autoconfigure.EnvironmentResourceProvider
io.opentelemetry.sdk.autoconfigure.internal.ServiceInstanceIdResourceProvider
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,21 @@ void customConfigResourceWithDisabledKeys() {
.build());
}

@Test
void serviceInstanceIdAddedByDefault() {
Map<String, String> props = new HashMap<>();
props.put("otel.service.name", "test-service");

Resource result =
ResourceConfiguration.configureResource(
DefaultConfigProperties.create(props, componentLoader),
SpiHelper.create(ResourceConfigurationTest.class.getClassLoader()),
(r, c) -> r);

// Verify service.instance.id is added by default via ServiceInstanceIdResourceProvider
assertThat(result.getAttribute(stringKey("service.instance.id"))).isNotNull();
}

@ParameterizedTest
@MethodSource("decodeResourceAttributesArgs")
void decodeResourceAttributes(String input, String expectedKey, String expectedValue) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.sdk.autoconfigure.internal;

import static org.assertj.core.api.Assertions.assertThat;

import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
import io.opentelemetry.sdk.resources.Resource;
import java.util.Collections;
import org.junit.jupiter.api.Test;

class ServiceInstanceIdResourceProviderTest {

@Test
void createResource_generatesStableValue() {
ServiceInstanceIdResourceProvider provider = new ServiceInstanceIdResourceProvider();
DefaultConfigProperties config = DefaultConfigProperties.createFromMap(Collections.emptyMap());

// Multiple calls should return the same value
Resource resource1 = provider.createResource(config);
Resource resource2 = provider.createResource(config);

assertThat(resource1.getAttribute(ServiceInstanceIdResourceProvider.SERVICE_INSTANCE_ID))
.isNotNull();
assertThat(resource2.getAttribute(ServiceInstanceIdResourceProvider.SERVICE_INSTANCE_ID))
.isEqualTo(resource1.getAttribute(ServiceInstanceIdResourceProvider.SERVICE_INSTANCE_ID));
}

@Test
void shouldApply_returnsFalseWhenAlreadySet() {
ServiceInstanceIdResourceProvider provider = new ServiceInstanceIdResourceProvider();
DefaultConfigProperties config = DefaultConfigProperties.createFromMap(Collections.emptyMap());
Resource existing = Resource.empty();

assertThat(provider.shouldApply(config, existing)).isTrue();

Resource withId = existing.toBuilder()
.put(ServiceInstanceIdResourceProvider.SERVICE_INSTANCE_ID, "custom")
.build();

assertThat(provider.shouldApply(config, withId)).isFalse();
}

@Test
void order_returnsMaxValue() {
ServiceInstanceIdResourceProvider provider = new ServiceInstanceIdResourceProvider();
assertThat(provider.order()).isEqualTo(Integer.MAX_VALUE);
}
}

This file was deleted.

This file was deleted.

Loading