Skip to content

Commit

Permalink
Add Spring Boot service version finder / ResourceProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
Hayanesh committed Sep 17, 2023
1 parent 3136916 commit 8982fcc
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -293,6 +293,11 @@ InputStream openClasspathResource(String filename) {
return classLoader.getResourceAsStream(path);
}

InputStream openClasspathResource(String filename, String location) {
String path = location + "/" + filename;
return classLoader.getResourceAsStream(path);
}

InputStream openFile(String filename) throws Exception {
return Files.newInputStream(Paths.get(filename));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package io.opentelemetry.instrumentation.spring.resources;

import static java.util.logging.Level.FINE;

import com.google.auto.service.AutoService;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ResourceProvider;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.semconv.ResourceAttributes;
import java.io.IOException;
import java.io.InputStream;
import java.util.Optional;
import java.util.Properties;
import java.util.logging.Logger;
import io.opentelemetry.instrumentation.spring.resources.SpringBootServiceNameDetector.SystemHelper;

@AutoService(ResourceProvider.class)
public class SpringBootServiceVersionDetector implements ResourceProvider {

private static final Logger logger =
Logger.getLogger(SpringBootServiceVersionDetector.class.getName());

private final SystemHelper system;

public SpringBootServiceVersionDetector() {
this.system = new SystemHelper();
}

// Exists for testing
public SpringBootServiceVersionDetector(SystemHelper system){
this.system = system;
}

@Override
public Resource createResource(ConfigProperties config) {
return getServiceVersionFromBuildInfo()
.map(version -> {
logger.log(FINE, "Auto-detected Spring Boot service version: {0}", version);
return Resource.builder().put(ResourceAttributes.SERVICE_VERSION, version).build();
})
.orElseGet(Resource::empty);
}


private Optional<String> getServiceVersionFromBuildInfo(){
try(InputStream in = system.openClasspathResource("build-info.properties", "META-INF")){
return getServiceVersionPropertyFromStream(in);
}catch (Exception e){
return Optional.empty();
}
}

private static Optional<String> getServiceVersionPropertyFromStream(InputStream in){
Properties properties = new Properties();
try {
// Note: load() uses ISO 8859-1 encoding, same as spring uses by default for property files
properties.load(in);
return Optional.ofNullable(properties.getProperty("build.version"));
} catch (IOException e) {
return Optional.empty();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package io.opentelemetry.instrumentation.spring.resources;

import static io.opentelemetry.semconv.ResourceAttributes.SERVICE_VERSION;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;

import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.resources.Resource;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.io.InputStream;

@ExtendWith(MockitoExtension.class)
class SpringBootServiceVersionDetectorTest {

static final String BUILD_PROPS = "build-info.properties";
static final String META_INFO = "META-INF";

@Mock
ConfigProperties config;
@Mock
SpringBootServiceNameDetector.SystemHelper system;

@Test
void givenBuildVersionIsPresentInBuildInfProperties_thenReturnBuildVersion() {
when(system.openClasspathResource(BUILD_PROPS, META_INFO))
.thenReturn(openClasspathResource(META_INFO + "/" + BUILD_PROPS));

SpringBootServiceVersionDetector guesser = new SpringBootServiceVersionDetector(system);
Resource result = guesser.createResource(config);
assertThat(result.getAttribute(SERVICE_VERSION)).isEqualTo("0.0.2");
}

private InputStream openClasspathResource(String resource) {
return getClass().getClassLoader().getResourceAsStream(resource);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
build.artifact=something
build.name=some-name
build.version=0.0.2

0 comments on commit 8982fcc

Please sign in to comment.