Skip to content

Commit 8982fcc

Browse files
committed
Add Spring Boot service version finder / ResourceProvider
1 parent 3136916 commit 8982fcc

File tree

4 files changed

+112
-0
lines changed

4 files changed

+112
-0
lines changed

instrumentation/spring/spring-boot-resources/library/src/main/java/io/opentelemetry/instrumentation/spring/resources/SpringBootServiceNameDetector.java

+5
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,11 @@ InputStream openClasspathResource(String filename) {
293293
return classLoader.getResourceAsStream(path);
294294
}
295295

296+
InputStream openClasspathResource(String filename, String location) {
297+
String path = location + "/" + filename;
298+
return classLoader.getResourceAsStream(path);
299+
}
300+
296301
InputStream openFile(String filename) throws Exception {
297302
return Files.newInputStream(Paths.get(filename));
298303
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package io.opentelemetry.instrumentation.spring.resources;
2+
3+
import static java.util.logging.Level.FINE;
4+
5+
import com.google.auto.service.AutoService;
6+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
7+
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
8+
import io.opentelemetry.sdk.resources.Resource;
9+
import io.opentelemetry.semconv.ResourceAttributes;
10+
import java.io.IOException;
11+
import java.io.InputStream;
12+
import java.util.Optional;
13+
import java.util.Properties;
14+
import java.util.logging.Logger;
15+
import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector.SystemHelper;
16+
17+
@AutoService(ResourceProvider.class)
18+
public class SpringBootServiceVersionDetector implements ResourceProvider {
19+
20+
private static final Logger logger =
21+
Logger.getLogger(SpringBootServiceVersionDetector.class.getName());
22+
23+
private final SystemHelper system;
24+
25+
public SpringBootServiceVersionDetector() {
26+
this.system = new SystemHelper();
27+
}
28+
29+
// Exists for testing
30+
public SpringBootServiceVersionDetector(SystemHelper system){
31+
this.system = system;
32+
}
33+
34+
@Override
35+
public Resource createResource(ConfigProperties config) {
36+
return getServiceVersionFromBuildInfo()
37+
.map(version -> {
38+
logger.log(FINE, "Auto-detected Spring Boot service version: {0}", version);
39+
return Resource.builder().put(ResourceAttributes.SERVICE_VERSION, version).build();
40+
})
41+
.orElseGet(Resource::empty);
42+
}
43+
44+
45+
private Optional<String> getServiceVersionFromBuildInfo(){
46+
try(InputStream in = system.openClasspathResource("build-info.properties", "META-INF")){
47+
return getServiceVersionPropertyFromStream(in);
48+
}catch (Exception e){
49+
return Optional.empty();
50+
}
51+
}
52+
53+
private static Optional<String> getServiceVersionPropertyFromStream(InputStream in){
54+
Properties properties = new Properties();
55+
try {
56+
// Note: load() uses ISO 8859-1 encoding, same as spring uses by default for property files
57+
properties.load(in);
58+
return Optional.ofNullable(properties.getProperty("build.version"));
59+
} catch (IOException e) {
60+
return Optional.empty();
61+
}
62+
}
63+
64+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.opentelemetry.instrumentation.spring.resources;
2+
3+
import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION;
4+
import static org.assertj.core.api.Assertions.assertThat;
5+
import static org.mockito.Mockito.when;
6+
7+
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
8+
import io.opentelemetry.sdk.resources.Resource;
9+
import org.junit.jupiter.api.Test;
10+
import org.junit.jupiter.api.extension.ExtendWith;
11+
import org.mockito.Mock;
12+
import org.mockito.junit.jupiter.MockitoExtension;
13+
import java.io.InputStream;
14+
15+
@ExtendWith(MockitoExtension.class)
16+
class SpringBootServiceVersionDetectorTest {
17+
18+
static final String BUILD_PROPS = "build-info.properties";
19+
static final String META_INFO = "META-INF";
20+
21+
@Mock
22+
ConfigProperties config;
23+
@Mock
24+
SpringBootServiceNameDetector.SystemHelper system;
25+
26+
@Test
27+
void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() {
28+
when(system.openClasspathResource(BUILD_PROPS, META_INFO))
29+
.thenReturn(openClasspathResource(META_INFO + "/" + BUILD_PROPS));
30+
31+
SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system);
32+
Resource result = guesser.createResource(config);
33+
assertThat(result.getAttribute(SERVICE_VERSION)).isEqualTo("0.0.2");
34+
}
35+
36+
private InputStream openClasspathResource(String resource) {
37+
return getClass().getClassLoader().getResourceAsStream(resource);
38+
}
39+
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
build.artifact=something
2+
build.name=some-name
3+
build.version=0.0.2

0 commit comments

Comments
 (0)