Skip to content

Commit 1d53a97

Browse files
committed
Populate ai.application.version
1 parent 42bbcfd commit 1d53a97

File tree

4 files changed

+81
-48
lines changed

4 files changed

+81
-48
lines changed

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/AzureMonitorExporterBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ private BiConsumer<AbstractTelemetryBuilder, Resource> createDefaultsPopulator()
128128
builder.setResource(resource);
129129
builder.addTag(ContextTagKeys.AI_INTERNAL_SDK_VERSION.toString(), VersionGenerator.getSdkVersion());
130130
// TODO (trask) unify these
131-
resourceParser.updateRoleNameAndInstance(builder, resource);
131+
resourceParser.updateRoleNameAndInstanceAndVersion(builder, resource);
132132
};
133133
}
134134

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/main/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/utils/ResourceParser.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,7 @@ public ResourceParser() {
3232
}
3333

3434
// visible for testing
35-
public void updateRoleNameAndInstance(AbstractTelemetryBuilder builder, Resource resource) {
36-
37-
// update AKS role name and role instance
38-
if (AksResourceAttributes.isAks(resource)) {
39-
builder.addTag(ContextTagKeys.AI_CLOUD_ROLE.toString(), AksResourceAttributes.getAksRoleName(resource));
40-
builder.addTag(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(),
41-
AksResourceAttributes.getAksRoleInstance(resource));
42-
return;
43-
}
35+
public void updateRoleNameAndInstanceAndVersion(AbstractTelemetryBuilder builder, Resource resource) {
4436

4537
Map<String, String> tags = builder.build().getTags();
4638
if (tags == null || !tags.containsKey(ContextTagKeys.AI_CLOUD_ROLE.toString())) {
@@ -50,9 +42,20 @@ public void updateRoleNameAndInstance(AbstractTelemetryBuilder builder, Resource
5042
if (tags == null || !tags.containsKey(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())) {
5143
builder.addTag(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), getRoleInstance(resource));
5244
}
45+
46+
if (tags == null || !tags.containsKey(ContextTagKeys.AI_APPLICATION_VER.toString())) {
47+
String applicationVersion = resource.getAttribute(ServiceAttributes.SERVICE_VERSION);
48+
if (applicationVersion != null) {
49+
builder.addTag(ContextTagKeys.AI_APPLICATION_VER.toString(), applicationVersion);
50+
}
51+
}
5352
}
5453

5554
private String getRoleName(Resource resource) {
55+
if (AksResourceAttributes.isAks(resource)) {
56+
return AksResourceAttributes.getAksRoleName(resource);
57+
}
58+
5659
String serviceName = resource.getAttribute(ServiceAttributes.SERVICE_NAME);
5760
if (serviceName == null || DEFAULT_SERVICE_NAME.equals(serviceName)) {
5861
if (websiteSiteName != null) {
@@ -71,6 +74,10 @@ private String getRoleName(Resource resource) {
7174
}
7275

7376
private String getRoleInstance(Resource resource) {
77+
if (AksResourceAttributes.isAks(resource)) {
78+
return AksResourceAttributes.getAksRoleInstance(resource);
79+
}
80+
7481
String roleInstance = resource.getAttribute(ServiceIncubatingAttributes.SERVICE_INSTANCE_ID);
7582
if (roleInstance != null) {
7683
return roleInstance;
@@ -79,7 +86,11 @@ private String getRoleInstance(Resource resource) {
7986
if (roleInstance != null) {
8087
return roleInstance;
8188
}
82-
return HostName.get(); // default hostname
89+
roleInstance = HostName.get(); // default hostname
90+
if (roleInstance != null) {
91+
return roleInstance;
92+
}
93+
return "unknown"; // this is for backwards compatibility in the Java agent
8394
}
8495

8596
public static String getWebsiteSiteNameEnvVar(Function<String, String> envVars) {

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/utils/AksResourceAttributesTest.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ void testDefault() {
3333
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=unknown_service:java"));
3434
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
3535

36-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
36+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
3737
Map<String, String> map = new HashMap<>(2);
3838
map.put(ContextTagKeys.AI_CLOUD_ROLE.toString(), "unknown_service:java");
3939
map.put(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), HostName.get());
@@ -46,7 +46,7 @@ void testServiceNameAndK8sPodName() {
4646
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=test-service-name,k8s.pod.name=test-pod-name"));
4747
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
4848

49-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
49+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
5050
Map<String, String> tags = builder.build().getTags();
5151
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test-service-name");
5252
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test-pod-name");
@@ -58,7 +58,7 @@ void testK8sDeploymentName() {
5858
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=unknown_service:java,k8s.deployment.name=test-deployment-name,k8s.pod.name=test-pod-name"));
5959
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
6060

61-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
61+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
6262
Map<String, String> tags = builder.build().getTags();
6363
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test-deployment-name");
6464
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test-pod-name");
@@ -70,7 +70,7 @@ void testK8sReplicaSetName() {
7070
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=unknown_service:java,k8s.replicaset.name=test-replicaset-name,k8s.pod.name=test-pod-name"));
7171
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
7272

73-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
73+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
7474
Map<String, String> tags = builder.build().getTags();
7575
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test-replicaset-name");
7676
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test-pod-name");
@@ -82,7 +82,7 @@ void testK8sStatefulSetName() {
8282
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=unknown_service:java,k8s.statefulset.name=test-statefulset-name,k8s.pod.name=test-pod-name"));
8383
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
8484

85-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
85+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
8686
Map<String, String> tags = builder.build().getTags();
8787
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test-statefulset-name");
8888
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test-pod-name");
@@ -94,7 +94,7 @@ void testKsJobName() {
9494
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=unknown_service:java,k8s.job.name=test-job-name,k8s.pod.name=test-pod-name"));
9595
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
9696

97-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
97+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
9898
Map<String, String> tags = builder.build().getTags();
9999
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test-job-name");
100100
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test-pod-name");
@@ -106,7 +106,7 @@ void testK8sCronJobName() {
106106
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=unknown_service:java,k8s.cronjob.name=test-cronjob-name,k8s.pod.name=test-pod-name"));
107107
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
108108

109-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
109+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
110110
Map<String, String> tags = builder.build().getTags();
111111
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test-cronjob-name");
112112
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test-pod-name");
@@ -118,7 +118,7 @@ void testK8sDaemonSetName() {
118118
"cloud.provider=Azure,cloud.platform=azure_aks,service.name=unknown_service:java,k8s.daemonset.name=test-daemonset-name,k8s.pod.name=test-pod-name"));
119119
Resource resource = ResourceConfiguration.createEnvironmentResource(config);
120120

121-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
121+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
122122
Map<String, String> tags = builder.build().getTags();
123123
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test-daemonset-name");
124124
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test-pod-name");

sdk/monitor/azure-monitor-opentelemetry-autoconfigure/src/test/java/com/azure/monitor/opentelemetry/autoconfigure/implementation/utils/ResourceParserTest.java

Lines changed: 51 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,13 @@
77
import com.azure.monitor.opentelemetry.autoconfigure.implementation.models.ContextTagKeys;
88
import io.opentelemetry.api.common.Attributes;
99
import io.opentelemetry.api.common.AttributesBuilder;
10-
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
11-
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1210
import io.opentelemetry.sdk.resources.Resource;
1311
import io.opentelemetry.semconv.ServiceAttributes;
1412
import io.opentelemetry.semconv.incubating.ServiceIncubatingAttributes;
1513
import org.junit.jupiter.api.BeforeEach;
1614
import org.junit.jupiter.api.Test;
1715
import reactor.util.annotation.Nullable;
1816

19-
import java.util.Collections;
2017
import java.util.HashMap;
2118
import java.util.Map;
2219

@@ -25,6 +22,7 @@
2522

2623
class ResourceParserTest {
2724

25+
private static final String DEFAULT_ROLE_NAME = "unknown_service:java";
2826
private static final String DEFAULT_ROLE_INSTANCE = HostName.get();
2927
private MetricTelemetryBuilder builder;
3028

@@ -35,54 +33,80 @@ void setup() {
3533

3634
@Test
3735
void testDefaultResource() {
38-
new ResourceParser().updateRoleNameAndInstance(builder, Resource.create(Attributes.empty()));
39-
assertThat(builder.build().getTags())
40-
.contains(entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), DEFAULT_ROLE_INSTANCE));
36+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, Resource.create(Attributes.empty()));
37+
38+
Map<String, String> tags = builder.build().getTags();
39+
assertThat(tags).contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), DEFAULT_ROLE_NAME),
40+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), DEFAULT_ROLE_INSTANCE)).hasSize(2);
4141
}
4242

4343
@Test
4444
void testServiceNameFromResource() {
4545
Resource resource = createTestResource("fake-service-name", null, null);
46-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
46+
47+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
48+
4749
Map<String, String> tags = builder.build().getTags();
48-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("fake-service-name");
49-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo(DEFAULT_ROLE_INSTANCE);
50+
assertThat(tags).contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), "fake-service-name"),
51+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), DEFAULT_ROLE_INSTANCE)).hasSize(2);
5052
}
5153

5254
@Test
5355
void testServiceInstanceFromResource() {
5456
Resource resource = createTestResource(null, null, "fake-service-instance");
55-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
56-
assertThat(builder.build().getTags())
57-
.contains(entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), "fake-service-instance"));
57+
58+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
59+
60+
Map<String, String> tags = builder.build().getTags();
61+
assertThat(tags).contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), DEFAULT_ROLE_NAME),
62+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), "fake-service-instance")).hasSize(2);
63+
}
64+
65+
@Test
66+
void testVersionFromResource() {
67+
Resource resource = Resource.create(Attributes.of(ServiceAttributes.SERVICE_VERSION, "fake-service-version"));
68+
69+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
70+
71+
Map<String, String> tags = builder.build().getTags();
72+
assertThat(tags).contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), DEFAULT_ROLE_NAME),
73+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), DEFAULT_ROLE_INSTANCE),
74+
entry(ContextTagKeys.AI_APPLICATION_VER.toString(), "fake-service-version")).hasSize(3);
5875
}
5976

6077
@Test
6178
void testServiceNamespaceFromResource() {
6279
Resource resource = createTestResource(null, "fake-service-namespace", null);
63-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
80+
81+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
82+
6483
Map<String, String> tags = builder.build().getTags();
65-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("[fake-service-namespace]");
66-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo(DEFAULT_ROLE_INSTANCE);
84+
assertThat(tags).contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), "[fake-service-namespace]"),
85+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), DEFAULT_ROLE_INSTANCE)).hasSize(2);
6786
}
6887

6988
@Test
7089
void testServiceNameAndInstanceFromResource() {
7190
Resource resource = createTestResource("fake-service-name", null, "fake-instance");
72-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
91+
92+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
93+
7394
Map<String, String> tags = builder.build().getTags();
74-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("fake-service-name");
75-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("fake-instance");
95+
assertThat(tags).contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), "fake-service-name"),
96+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), "fake-instance")).hasSize(2);
7697
}
7798

7899
@Test
79100
void testServiceNameAndInstanceAndNamespaceFromResource() {
80101
Resource resource = createTestResource("fake-service-name", "fake-service-namespace", "fake-instance");
81-
new ResourceParser().updateRoleNameAndInstance(builder, resource);
102+
103+
new ResourceParser().updateRoleNameAndInstanceAndVersion(builder, resource);
104+
82105
Map<String, String> tags = builder.build().getTags();
83-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString()))
84-
.isEqualTo("[fake-service-namespace]/fake-service-name");
85-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("fake-instance");
106+
assertThat(tags)
107+
.contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), "[fake-service-namespace]/fake-service-name"),
108+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), "fake-instance"))
109+
.hasSize(2);
86110
}
87111

88112
@Test
@@ -91,14 +115,12 @@ void testWebsiteSiteNameAndWebsiteInstanceId() {
91115
envVars.put("WEBSITE_SITE_NAME", "test_website_site_name");
92116
envVars.put("WEBSITE_INSTANCE_ID", "test_website_instance_id");
93117
Resource resource = createTestResource(null, null, null);
94-
new ResourceParser(envVars).updateRoleNameAndInstance(builder, resource);
95-
Map<String, String> tags = builder.build().getTags();
96-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE.toString())).isEqualTo("test_website_site_name");
97-
assertThat(tags.get(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString())).isEqualTo("test_website_instance_id");
98-
}
99118

100-
private static ConfigProperties getConfiguration() {
101-
return DefaultConfigProperties.create(Collections.singletonMap("HOSTNAME", DEFAULT_ROLE_INSTANCE));
119+
new ResourceParser(envVars).updateRoleNameAndInstanceAndVersion(builder, resource);
120+
121+
Map<String, String> tags = builder.build().getTags();
122+
assertThat(tags).contains(entry(ContextTagKeys.AI_CLOUD_ROLE.toString(), "test_website_site_name"),
123+
entry(ContextTagKeys.AI_CLOUD_ROLE_INSTANCE.toString(), "test_website_instance_id")).hasSize(2);
102124
}
103125

104126
private static Resource createTestResource(@Nullable String serviceName, @Nullable String serviceNameSpace,

0 commit comments

Comments
 (0)