diff --git a/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml b/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml
index 90b6c98..eff4041 100644
--- a/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml
+++ b/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml
@@ -66,12 +66,22 @@
io.opentelemetry
opentelemetry-exporter-logging
+
+ io.opentelemetry
+ opentelemetry-exporter-otlp
+
io.opentelemetry.semconv
opentelemetry-semconv
1.26.0-alpha
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
diff --git a/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/OpenTelemetryConfiguration.java b/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/OpenTelemetryConfiguration.java
index 5606413..925543d 100644
--- a/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/OpenTelemetryConfiguration.java
+++ b/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/OpenTelemetryConfiguration.java
@@ -1,16 +1,22 @@
package io.novatec.todobackend;
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Scope;
//Basic Otel
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.exporter.logging.LoggingSpanExporter;
+import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
//Tracing and Spans
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
+import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import io.opentelemetry.semconv.ResourceAttributes;
@@ -19,18 +25,29 @@
public class OpenTelemetryConfiguration {
@Bean
+ @Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public OpenTelemetry openTelemetry(){
Resource resource = Resource.getDefault().toBuilder().put(ResourceAttributes.SERVICE_NAME, "todobackend").put(ResourceAttributes.SERVICE_VERSION, "0.1.0").build();
+ OtlpGrpcSpanExporter jaegerOtlpExporter =
+ OtlpGrpcSpanExporter.builder()
+ .setEndpoint("http://localhost:4317")
+ .setTimeout(30, TimeUnit.SECONDS)
+ .build();
+
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create()))
+ .addSpanProcessor(SimpleSpanProcessor.create(jaegerOtlpExporter))
+ // .addSpanProcessor(BatchSpanProcessor.builder(LoggingSpanExporter.create()).build()) // same results for now
.setResource(resource)
- .build();
+ .build();
+ // .buildAndRegisterGlobal();
+
OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
- .buildAndRegisterGlobal();
+ .build();
return openTelemetry;
}
diff --git a/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java b/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java
index 433bedf..a23a9ec 100644
--- a/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java
+++ b/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java
@@ -21,6 +21,7 @@
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.StatusCode;
import io.opentelemetry.context.Scope;
import jakarta.persistence.Entity;
@@ -86,21 +87,29 @@ String addTodo(@PathVariable String todo) {
Span span = tracer.spanBuilder("addTodo").startSpan();
+ System.out.println("Span initial:"+span.toString());
+
+ span.setAttribute("http.method", "POST");
+ span.setAttribute("http.url", "/todos/{todo}");
+
+ System.out.println("Span with attribute:"+span.toString());
+
try (Scope scope = span.makeCurrent()) {
this.someInternalMethod(todo);
- // todoRepository.save(new Todo(todo));
logger.info("POST /todos/ " + todo.toString());
-
return todo;
} catch (Throwable t) {
+ span.setStatus(StatusCode.ERROR, "Something bad happened!");
span.recordException(t);
- throw t;
} finally {
+ System.out.println("Span before completion:"+span.toString());
span.end();
}
+ return "";
+
}
String someInternalMethod(String todo) {