Skip to content

Commit a922caf

Browse files
committed
add Azure container resource provider
1 parent d3f1582 commit a922caf

File tree

6 files changed

+123
-10
lines changed

6 files changed

+123
-10
lines changed

azure-resources/src/main/java/io/opentelemetry/contrib/azure/resource/AzureAppServiceResourceProvider.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,9 @@ public Resource createResource(ConfigProperties config) {
5858
return Resource.empty();
5959
}
6060
String name = Objects.requireNonNull(env.get(WEBSITE_SITE_NAME));
61-
AttributesBuilder builder = AzureVmResourceProvider.azureAttributeBuilder();
62-
builder.put(
63-
ResourceAttributes.CLOUD_PLATFORM,
64-
ResourceAttributes.CloudPlatformValues.AZURE_APP_SERVICE);
61+
AttributesBuilder builder =
62+
AzureVmResourceProvider.azureAttributeBuilder(
63+
ResourceAttributes.CloudPlatformValues.AZURE_APP_SERVICE);
6564
builder.put(ResourceAttributes.SERVICE_NAME, name);
6665

6766
String resourceUri = resourceUri(name);
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.azure.resource;
7+
8+
import io.opentelemetry.api.common.AttributeKey;
9+
import io.opentelemetry.api.common.AttributesBuilder;
10+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
11+
import io.opentelemetry.sdk.resources.Resource;
12+
import io.opentelemetry.semconv.ResourceAttributes;
13+
import java.util.HashMap;
14+
import java.util.Map;
15+
16+
public class AzureContainersResourceProvider extends CloudResourceProvider {
17+
18+
static final String CONTAINER_APP_NAME = "CONTAINER_APP_NAME";
19+
20+
private static final String CONTAINER_APP_REPLICA_NAME = "CONTAINER_APP_REPLICA_NAME";
21+
private static final String CONTAINER_APP_REVISION = "CONTAINER_APP_REVISION";
22+
23+
private static final Map<AttributeKey<String>, String> ENV_VAR_MAPPING = new HashMap<>();
24+
25+
static {
26+
ENV_VAR_MAPPING.put(ResourceAttributes.SERVICE_NAME, CONTAINER_APP_NAME);
27+
ENV_VAR_MAPPING.put(ResourceAttributes.SERVICE_INSTANCE_ID, CONTAINER_APP_REPLICA_NAME);
28+
ENV_VAR_MAPPING.put(ResourceAttributes.SERVICE_VERSION, CONTAINER_APP_REVISION);
29+
}
30+
31+
private final Map<String, String> env;
32+
33+
// SPI
34+
public AzureContainersResourceProvider() {
35+
this(System.getenv());
36+
}
37+
38+
// Visible for testing
39+
AzureContainersResourceProvider(Map<String, String> env) {
40+
this.env = env;
41+
}
42+
43+
@Override
44+
public Resource createResource(ConfigProperties config) {
45+
AzureEnvVarPlatform detect = AzureEnvVarPlatform.detect(env);
46+
if (detect != AzureEnvVarPlatform.CONTAINERS) {
47+
return Resource.empty();
48+
}
49+
50+
AttributesBuilder builder =
51+
AzureVmResourceProvider.azureAttributeBuilder("azure_container_apps");
52+
53+
AzureEnvVarPlatform.addAttributesFromEnv(ENV_VAR_MAPPING, env, builder);
54+
55+
return Resource.create(builder.build());
56+
}
57+
}

azure-resources/src/main/java/io/opentelemetry/contrib/azure/resource/AzureEnvVarPlatform.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,14 @@
1212
public enum AzureEnvVarPlatform {
1313
APP_SERVICE,
1414
FUNCTIONS,
15+
CONTAINERS,
1516
NONE;
1617

1718
static AzureEnvVarPlatform detect(Map<String, String> env) {
19+
String appName = env.get(AzureContainersResourceProvider.CONTAINER_APP_NAME);
20+
if (appName != null) {
21+
return CONTAINERS;
22+
}
1823
String name = env.get(AzureAppServiceResourceProvider.WEBSITE_SITE_NAME);
1924
if (name == null) {
2025
return NONE;

azure-resources/src/main/java/io/opentelemetry/contrib/azure/resource/AzureFunctionsResourceProvider.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ public Resource createResource(ConfigProperties config) {
4949
return Resource.empty();
5050
}
5151

52-
AttributesBuilder builder = AzureVmResourceProvider.azureAttributeBuilder();
53-
builder.put(
54-
ResourceAttributes.CLOUD_PLATFORM, ResourceAttributes.CloudPlatformValues.AZURE_FUNCTIONS);
52+
AttributesBuilder builder =
53+
AzureVmResourceProvider.azureAttributeBuilder(
54+
ResourceAttributes.CloudPlatformValues.AZURE_FUNCTIONS);
5555

5656
String limit = env.get(FUNCTIONS_MEM_LIMIT);
5757
if (limit != null) {

azure-resources/src/main/java/io/opentelemetry/contrib/azure/resource/AzureVmResourceProvider.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ public Resource createResource(ConfigProperties config) {
6969
}
7070

7171
private static Resource parseMetadata(String body) {
72-
AttributesBuilder builder = azureAttributeBuilder();
73-
builder.put(ResourceAttributes.CLOUD_PLATFORM, ResourceAttributes.CloudPlatformValues.AZURE_VM);
72+
AttributesBuilder builder =
73+
azureAttributeBuilder(ResourceAttributes.CloudPlatformValues.AZURE_VM);
7474
try (JsonParser parser = JSON_FACTORY.createParser(body)) {
7575
parser.nextToken();
7676
parseResponse(parser, builder);
@@ -81,9 +81,10 @@ private static Resource parseMetadata(String body) {
8181
}
8282

8383
@NotNull
84-
static AttributesBuilder azureAttributeBuilder() {
84+
static AttributesBuilder azureAttributeBuilder(String platform) {
8585
AttributesBuilder builder = Attributes.builder();
8686
builder.put(ResourceAttributes.CLOUD_PROVIDER, ResourceAttributes.CloudProviderValues.AZURE);
87+
builder.put(ResourceAttributes.CLOUD_PLATFORM, platform);
8788
return builder;
8889
}
8990

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.contrib.azure.resource;
7+
8+
import com.google.common.collect.ImmutableMap;
9+
import io.opentelemetry.sdk.testing.assertj.AttributesAssert;
10+
import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions;
11+
import io.opentelemetry.semconv.ResourceAttributes;
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
import org.jetbrains.annotations.NotNull;
15+
import org.junit.jupiter.api.Test;
16+
17+
class AzureContainersResourceProviderTest {
18+
private static final String TEST_APP_NAME = "TEST_APP_NAME";
19+
private static final String TEST_REPLICA_NAME = "TEST_REPLICA_NAME";
20+
private static final String TEST_REVISION = "TEST_REVISION";
21+
22+
private static final ImmutableMap<String, String> DEFAULT_ENV_VARS =
23+
ImmutableMap.of(
24+
"CONTAINER_APP_NAME", TEST_APP_NAME,
25+
"CONTAINER_APP_REPLICA_NAME", TEST_REPLICA_NAME,
26+
"CONTAINER_APP_REVISION", TEST_REVISION);
27+
28+
@Test
29+
void defaultValues() {
30+
createResource(DEFAULT_ENV_VARS)
31+
.containsEntry(ResourceAttributes.CLOUD_PROVIDER, "azure")
32+
.containsEntry(ResourceAttributes.CLOUD_PLATFORM, "azure_container_apps")
33+
.containsEntry(ResourceAttributes.SERVICE_NAME, TEST_APP_NAME)
34+
.containsEntry(ResourceAttributes.SERVICE_INSTANCE_ID, TEST_REPLICA_NAME)
35+
.containsEntry(ResourceAttributes.SERVICE_VERSION, TEST_REVISION);
36+
}
37+
38+
@Test
39+
void isNotContainer() {
40+
HashMap<String, String> map = new HashMap<>(DEFAULT_ENV_VARS);
41+
map.remove("CONTAINER_APP_NAME");
42+
43+
createResource(map).isEmpty();
44+
}
45+
46+
@NotNull
47+
private static AttributesAssert createResource(Map<String, String> map) {
48+
return OpenTelemetryAssertions.assertThat(
49+
new AzureContainersResourceProvider(map).createResource(null).getAttributes());
50+
}
51+
}

0 commit comments

Comments
 (0)