diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8e1a769 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ + + +# EditorConfig is awesome: https://editorconfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.xml] +indent_size = 4 +indent_style = tab diff --git a/.github/workflows/provide-docker-images.yml b/.github/workflows/provide-docker-images.yml new file mode 100644 index 0000000..e1b992c --- /dev/null +++ b/.github/workflows/provide-docker-images.yml @@ -0,0 +1,48 @@ +name: Provide needed docker images in ghcr.io + +on: + workflow_dispatch: + push: + +env: + REGISTRY_IMAGE: ghcr.io/novatecconsulting/opentelemetry-training + +jobs: + retag_and_push: + name: Provide docker image ${{ matrix.image.namespace }}/${{ matrix.image.name }}:${{ matrix.image.tag }} on ghcr.io + runs-on: [ubuntu-latest] + strategy: + matrix: + image: + - name: todobackend-springboot + tag: v2404 + namespace: maeddes + - name: todoui-thymeleaf + tag: v2404 + namespace: maeddes + - name: todoui-flask + tag: v2404 + namespace: maeddes + - name: simple-generator + tag: v2404 + namespace: maeddes + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Pull image from Docker Hub + run: | + docker pull docker.io/${{ matrix.image.namespace }}/${{ matrix.image.name }}:${{ matrix.image.tag }} + - name: Retag the image for GitHub Container Registry + run: | + docker tag ${{ matrix.image.namespace }}/${{ matrix.image.name }}:${{ matrix.image.tag }} ${{ env.REGISTRY_IMAGE }}-${{ matrix.image.name }}:${{ matrix.image.tag }} + - name: Push image to GitHub Container Registry + run: | + docker push ${{ env.REGISTRY_IMAGE }}-${{ matrix.image.name }}:${{ matrix.image.tag }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 993cf53..422f008 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ *.jar settings.json +.direnv +.devenv +.envrc \ No newline at end of file diff --git a/exercises/automatic-instrumentation/initial/todobackend-springboot/Dockerfile b/exercises/automatic-instrumentation/initial/todobackend-springboot/Dockerfile index bcc02e7..4d74f68 100644 --- a/exercises/automatic-instrumentation/initial/todobackend-springboot/Dockerfile +++ b/exercises/automatic-instrumentation/initial/todobackend-springboot/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/maven:3-eclipse-temurin-21 as build +FROM docker.io/maven:3-eclipse-temurin-21 AS build WORKDIR /workspace/app COPY pom.xml . @@ -20,4 +20,4 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /opt/todobackend/app ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.8.0/opentelemetry-javaagent.jar /opt/todobackend -ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","io.novatec.todobackend.TodobackendApplication"] \ No newline at end of file +ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","info.novatec.todobackend.TodobackendApplication"] diff --git a/exercises/automatic-instrumentation/initial/todobackend-springboot/pom.xml b/exercises/automatic-instrumentation/initial/todobackend-springboot/pom.xml index efe02e6..0d2d33f 100644 --- a/exercises/automatic-instrumentation/initial/todobackend-springboot/pom.xml +++ b/exercises/automatic-instrumentation/initial/todobackend-springboot/pom.xml @@ -11,7 +11,7 @@ - io.novatec + info.novatec todobackend-automatic 0.0.1-SNAPSHOT todobackend-automatic @@ -53,6 +53,20 @@ org.springframework.boot spring-boot-starter-test test + + + org.mockito + mockito-core + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + diff --git a/exercises/automatic-instrumentation/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java b/exercises/automatic-instrumentation/initial/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java similarity index 98% rename from exercises/automatic-instrumentation/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java rename to exercises/automatic-instrumentation/initial/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java index 5c1cc18..7f15ea1 100644 --- a/exercises/automatic-instrumentation/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java +++ b/exercises/automatic-instrumentation/initial/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import java.util.ArrayList; import java.util.List; @@ -87,13 +87,13 @@ String someInternalMethod(String todo){ } catch (InterruptedException e) { e.printStackTrace(); } - } + } if(todo.equals("fail")){ System.out.println("Failing ..."); throw new RuntimeException(); - - } + + } return todo; } @@ -136,4 +136,4 @@ public void setTodo(String todo) { interface TodoRepository extends CrudRepository { -} \ No newline at end of file +} diff --git a/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java b/exercises/automatic-instrumentation/initial/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java similarity index 85% rename from exercises/manual-instrumentation-java/initial/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java rename to exercises/automatic-instrumentation/initial/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java index b18589d..b4f245c 100755 --- a/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java +++ b/exercises/automatic-instrumentation/initial/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -9,4 +9,4 @@ public class TodobackendApplicationIntegrationTests { @Test void contextLoads() { } -} \ No newline at end of file +} diff --git a/exercises/automatic-instrumentation/solution/todobackend-springboot/Dockerfile b/exercises/automatic-instrumentation/solution/todobackend-springboot/Dockerfile index bcc02e7..4d74f68 100644 --- a/exercises/automatic-instrumentation/solution/todobackend-springboot/Dockerfile +++ b/exercises/automatic-instrumentation/solution/todobackend-springboot/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/maven:3-eclipse-temurin-21 as build +FROM docker.io/maven:3-eclipse-temurin-21 AS build WORKDIR /workspace/app COPY pom.xml . @@ -20,4 +20,4 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /opt/todobackend/app ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.8.0/opentelemetry-javaagent.jar /opt/todobackend -ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","io.novatec.todobackend.TodobackendApplication"] \ No newline at end of file +ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","info.novatec.todobackend.TodobackendApplication"] diff --git a/exercises/automatic-instrumentation/solution/todobackend-springboot/pom.xml b/exercises/automatic-instrumentation/solution/todobackend-springboot/pom.xml index 6d99fd4..fb8205f 100644 --- a/exercises/automatic-instrumentation/solution/todobackend-springboot/pom.xml +++ b/exercises/automatic-instrumentation/solution/todobackend-springboot/pom.xml @@ -11,7 +11,7 @@ - io.novatec + info.novatec todobackend-automatic-solution 0.0.1-SNAPSHOT todobackend-automatic-solution @@ -53,6 +53,20 @@ org.springframework.boot spring-boot-starter-test test + + + org.mockito + mockito-core + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + io.opentelemetry.instrumentation @@ -71,4 +85,4 @@ todobackend-${version} - \ No newline at end of file + diff --git a/exercises/automatic-instrumentation/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java b/exercises/automatic-instrumentation/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java similarity index 98% rename from exercises/automatic-instrumentation/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java rename to exercises/automatic-instrumentation/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java index cf69f70..a1940ba 100644 --- a/exercises/automatic-instrumentation/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java +++ b/exercises/automatic-instrumentation/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import java.util.ArrayList; import java.util.List; @@ -91,13 +91,13 @@ String someInternalMethod(@SpanAttribute String todo){ } catch (InterruptedException e) { e.printStackTrace(); } - } + } if(todo.equals("fail")){ System.out.println("Failing ..."); throw new RuntimeException(); - - } + + } return todo; } @@ -140,4 +140,4 @@ public void setTodo(String todo) { interface TodoRepository extends CrudRepository { -} \ No newline at end of file +} diff --git a/exercises/automatic-instrumentation/initial/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java b/exercises/automatic-instrumentation/solution/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java similarity index 85% rename from exercises/automatic-instrumentation/initial/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java rename to exercises/automatic-instrumentation/solution/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java index b18589d..b4f245c 100755 --- a/exercises/automatic-instrumentation/initial/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java +++ b/exercises/automatic-instrumentation/solution/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -9,4 +9,4 @@ public class TodobackendApplicationIntegrationTests { @Test void contextLoads() { } -} \ No newline at end of file +} diff --git a/exercises/manual-instrumentation-java/initial/todobackend-springboot/Dockerfile b/exercises/manual-instrumentation-java/initial/todobackend-springboot/Dockerfile index bcc02e7..4d74f68 100644 --- a/exercises/manual-instrumentation-java/initial/todobackend-springboot/Dockerfile +++ b/exercises/manual-instrumentation-java/initial/todobackend-springboot/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/maven:3-eclipse-temurin-21 as build +FROM docker.io/maven:3-eclipse-temurin-21 AS build WORKDIR /workspace/app COPY pom.xml . @@ -20,4 +20,4 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /opt/todobackend/app ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.8.0/opentelemetry-javaagent.jar /opt/todobackend -ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","io.novatec.todobackend.TodobackendApplication"] \ No newline at end of file +ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","info.novatec.todobackend.TodobackendApplication"] diff --git a/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml b/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml index 1e8f51c..a56df71 100644 --- a/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml +++ b/exercises/manual-instrumentation-java/initial/todobackend-springboot/pom.xml @@ -11,7 +11,7 @@ - io.novatec + info.novatec todobackend-manual 0.0.1-SNAPSHOT todobackend-manual @@ -53,6 +53,20 @@ org.springframework.boot spring-boot-starter-test test + + + org.mockito + mockito-core + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + org.springframework.boot @@ -72,4 +86,4 @@ todobackend-${version} - \ No newline at end of file + 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/info/novatec/todobackend/TodobackendApplication.java similarity index 98% rename from exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java rename to exercises/manual-instrumentation-java/initial/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java index 35694f8..b9a5fa5 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/info/novatec/todobackend/TodobackendApplication.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import java.util.ArrayList; import java.util.List; @@ -82,25 +82,25 @@ String addTodo(HttpServletRequest request, HttpServletResponse response, @PathVa return todo; - } + } String someInternalMethod(String todo){ todoRepository.save(new Todo(todo)); - + if(todo.equals("slow")){ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } - } + } if(todo.equals("fail")){ System.out.println("Failing ..."); throw new RuntimeException(); - - } + + } return todo; @@ -146,4 +146,4 @@ public void setTodo(String todo) { interface TodoRepository extends CrudRepository { -} \ No newline at end of file +} diff --git a/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java b/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java similarity index 85% rename from exercises/manual-instrumentation-java/solution/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java rename to exercises/manual-instrumentation-java/initial/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java index b18589d..b4f245c 100755 --- a/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java +++ b/exercises/manual-instrumentation-java/initial/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -9,4 +9,4 @@ public class TodobackendApplicationIntegrationTests { @Test void contextLoads() { } -} \ No newline at end of file +} diff --git a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/Dockerfile b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/Dockerfile index ba32ead..d6b71ae 100644 --- a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/Dockerfile +++ b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/maven:3-eclipse-temurin-21 as build +FROM docker.io/maven:3-eclipse-temurin-21 AS build WORKDIR /workspace/app COPY pom.xml . @@ -21,6 +21,6 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /opt/todoui/app ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.8.0/opentelemetry-javaagent.jar /opt/todoui -ENTRYPOINT ["java","-cp","/opt/todoui/app:/opt/todoui/app/lib/*", "-javaagent:/opt/todoui/opentelemetry-javaagent.jar", "io.novatec.todoui.TodouiApplication"] -#ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","io.novatec.todobackend.TodobackendApplication"] +ENTRYPOINT ["java","-cp","/opt/todoui/app:/opt/todoui/app/lib/*", "-javaagent:/opt/todoui/opentelemetry-javaagent.jar", "info.novatec.todoui.TodouiApplication"] +#ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","info.novatec.todobackend.TodobackendApplication"] diff --git a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/pom.xml b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/pom.xml index 781505c..e42b3dc 100644 --- a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/pom.xml +++ b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/pom.xml @@ -1,9 +1,10 @@ - 4.0.0 - io.novatec + info.novatec todoui-manual 0.0.1-SNAPSHOT jar @@ -15,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent 2.7.16 - + @@ -41,42 +42,56 @@ org.springframework.boot spring-boot-starter-test test + + + org.mockito + mockito-core + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + + + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry + opentelemetry-sdk + + + io.opentelemetry + opentelemetry-exporter-logging + + + io.opentelemetry + opentelemetry-exporter-otlp + + + + io.opentelemetry.semconv + opentelemetry-semconv + 1.26.0-alpha - - io.opentelemetry - opentelemetry-api - - - io.opentelemetry - opentelemetry-sdk - - - io.opentelemetry - opentelemetry-exporter-logging - - - io.opentelemetry - opentelemetry-exporter-otlp - - - - io.opentelemetry.semconv - opentelemetry-semconv - 1.26.0-alpha - - - - io.opentelemetry - opentelemetry-bom - 1.40.0 - pom - import - - - + + + io.opentelemetry + opentelemetry-bom + 1.40.0 + pom + import + + + diff --git a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/io/novatec/todoui/OpenTelemetryConfiguration.java b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/info/novatec/todoui/OpenTelemetryConfiguration.java similarity index 96% rename from exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/io/novatec/todoui/OpenTelemetryConfiguration.java rename to exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/info/novatec/todoui/OpenTelemetryConfiguration.java index 06582e7..8766eb5 100644 --- a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/io/novatec/todoui/OpenTelemetryConfiguration.java +++ b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/info/novatec/todoui/OpenTelemetryConfiguration.java @@ -1,4 +1,4 @@ -package io.novatec.todoui; +package info.novatec.todoui; import java.util.concurrent.TimeUnit; @@ -45,8 +45,8 @@ public OpenTelemetry openTelemetry(){ .addSpanProcessor(SimpleSpanProcessor.create(jaegerOtlpExporter)) // .addSpanProcessor(BatchSpanProcessor.builder(LoggingSpanExporter.create()).build()) // same results for now .setResource(resource) - .build(); - // .buildAndRegisterGlobal(); + .build(); + // .buildAndRegisterGlobal(); OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() diff --git a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/io/novatec/todoui/TodouiApplication.java b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/info/novatec/todoui/TodouiApplication.java similarity index 99% rename from exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/io/novatec/todoui/TodouiApplication.java rename to exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/info/novatec/todoui/TodouiApplication.java index dd9f5e9..ec80cfd 100644 --- a/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/io/novatec/todoui/TodouiApplication.java +++ b/exercises/manual-instrumentation-java/initial/todoui-thymeleaf/src/main/java/info/novatec/todoui/TodouiApplication.java @@ -1,4 +1,4 @@ -package io.novatec.todoui; +package info.novatec.todoui; import java.util.ArrayList; import java.util.List; @@ -122,7 +122,7 @@ public String addItem(String toDo){ template.postForEntity(endpoint+"/todos/"+toDo, null, String.class); - + span.end(); diff --git a/exercises/manual-instrumentation-java/solution/todobackend-springboot/Dockerfile b/exercises/manual-instrumentation-java/solution/todobackend-springboot/Dockerfile index bcc02e7..4d74f68 100644 --- a/exercises/manual-instrumentation-java/solution/todobackend-springboot/Dockerfile +++ b/exercises/manual-instrumentation-java/solution/todobackend-springboot/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/maven:3-eclipse-temurin-21 as build +FROM docker.io/maven:3-eclipse-temurin-21 AS build WORKDIR /workspace/app COPY pom.xml . @@ -20,4 +20,4 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /opt/todobackend/app ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.8.0/opentelemetry-javaagent.jar /opt/todobackend -ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","io.novatec.todobackend.TodobackendApplication"] \ No newline at end of file +ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","info.novatec.todobackend.TodobackendApplication"] diff --git a/exercises/manual-instrumentation-java/solution/todobackend-springboot/pom.xml b/exercises/manual-instrumentation-java/solution/todobackend-springboot/pom.xml index 12abece..721aed7 100644 --- a/exercises/manual-instrumentation-java/solution/todobackend-springboot/pom.xml +++ b/exercises/manual-instrumentation-java/solution/todobackend-springboot/pom.xml @@ -11,7 +11,7 @@ - io.novatec + info.novatec todobackend-manual-solution 0.0.1-SNAPSHOT todobackend-manual-solution @@ -53,6 +53,20 @@ org.springframework.boot spring-boot-starter-test test + + + org.mockito + mockito-core + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + org.springframework.boot @@ -60,27 +74,27 @@ runtime true - - io.opentelemetry - opentelemetry-api - - - io.opentelemetry - opentelemetry-sdk - - - io.opentelemetry - opentelemetry-exporter-logging - - - io.opentelemetry - opentelemetry-exporter-otlp - - - io.opentelemetry.semconv - opentelemetry-semconv - 1.26.0-alpha - + + io.opentelemetry + opentelemetry-api + + + io.opentelemetry + opentelemetry-sdk + + + io.opentelemetry + opentelemetry-exporter-logging + + + io.opentelemetry + opentelemetry-exporter-otlp + + + io.opentelemetry.semconv + opentelemetry-semconv + 1.26.0-alpha + @@ -94,16 +108,16 @@ todobackend-${version} - - - - io.opentelemetry - opentelemetry-bom - 1.40.0 - pom - import - - - + + + + io.opentelemetry + opentelemetry-bom + 1.40.0 + pom + import + + + - \ No newline at end of file + diff --git a/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/OpenTelemetryConfiguration.java b/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/OpenTelemetryConfiguration.java similarity index 98% rename from exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/OpenTelemetryConfiguration.java rename to exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/OpenTelemetryConfiguration.java index e4026e9..4c54b37 100644 --- a/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/OpenTelemetryConfiguration.java +++ b/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/OpenTelemetryConfiguration.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import java.time.Duration; diff --git a/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java b/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java similarity index 99% rename from exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java rename to exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java index c51907d..155f694 100644 --- a/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java +++ b/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import static io.opentelemetry.api.common.AttributeKey.stringKey; @@ -197,4 +197,4 @@ public void setTodo(String todo) { interface TodoRepository extends CrudRepository { -} \ No newline at end of file +} diff --git a/exercises/automatic-instrumentation/solution/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java b/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java similarity index 85% rename from exercises/automatic-instrumentation/solution/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java rename to exercises/manual-instrumentation-java/solution/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java index b18589d..b4f245c 100755 --- a/exercises/automatic-instrumentation/solution/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java +++ b/exercises/manual-instrumentation-java/solution/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @@ -9,4 +9,4 @@ public class TodobackendApplicationIntegrationTests { @Test void contextLoads() { } -} \ No newline at end of file +} diff --git a/exercises/manual-instrumentation-java/steps b/exercises/manual-instrumentation-java/steps index 05f164a..166f2d2 100644 --- a/exercises/manual-instrumentation-java/steps +++ b/exercises/manual-instrumentation-java/steps @@ -105,7 +105,7 @@ export BACKEND_URL=http://localhost:8080 Put everything in own Config class: -package io.novatec.todobackend; +package info.novatec.todobackend; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/exercises/otel-in-action/docker-compose.yaml b/exercises/otel-in-action/docker-compose.yaml index ed3565b..5cf6f26 100644 --- a/exercises/otel-in-action/docker-compose.yaml +++ b/exercises/otel-in-action/docker-compose.yaml @@ -14,7 +14,7 @@ services: - POSTGRES_DB=mydb todobackend-springboot: - image: maeddes/todobackend-springboot:v2404 + image: ghcr.io/novatecconsulting/opentelemetry-training-todobackend-springboot:v2404 networks: - todonet build: @@ -37,7 +37,7 @@ services: - postgresdb todoui-thymeleaf: - image: maeddes/todoui-thymeleaf:v2404 + image: ghcr.io/novatecconsulting/opentelemetry-training-todoui-thymeleaf:v2404 build: context: ./todoui-thymeleaf dockerfile: Dockerfile #-multistage @@ -56,7 +56,7 @@ services: - OTEL_LOGS_EXPORTER=none todoui-flask: - image: maeddes/todoui-flask:v2404 + image: ghcr.io/novatecconsulting/opentelemetry-training-todoui-flask:v2404 build: context: ./todoui-flask networks: @@ -70,7 +70,7 @@ services: - OTEL_METRICS_EXPORTER=otlp loadgenerator: - image: maeddes/simple-generator:v2404 + image: ghcr.io/novatecconsulting/opentelemetry-training-simple-generator:v2404 build: context: ./loadgenerator networks: @@ -159,4 +159,4 @@ networks: # # - DISABLE_INSTALL_DEMO_CONFIG=true # # - DISABLE_SECURITY_PLUGIN=true # # ports: -# # - "9200:9200" \ No newline at end of file +# # - "9200:9200" diff --git a/exercises/otel-in-action/todobackend-springboot/Dockerfile b/exercises/otel-in-action/todobackend-springboot/Dockerfile index bcc02e7..4d74f68 100644 --- a/exercises/otel-in-action/todobackend-springboot/Dockerfile +++ b/exercises/otel-in-action/todobackend-springboot/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/maven:3-eclipse-temurin-21 as build +FROM docker.io/maven:3-eclipse-temurin-21 AS build WORKDIR /workspace/app COPY pom.xml . @@ -20,4 +20,4 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /opt/todobackend/app ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.8.0/opentelemetry-javaagent.jar /opt/todobackend -ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","io.novatec.todobackend.TodobackendApplication"] \ No newline at end of file +ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","info.novatec.todobackend.TodobackendApplication"] diff --git a/exercises/otel-in-action/todobackend-springboot/pom.xml b/exercises/otel-in-action/todobackend-springboot/pom.xml index 79c0651..8a37ea9 100644 --- a/exercises/otel-in-action/todobackend-springboot/pom.xml +++ b/exercises/otel-in-action/todobackend-springboot/pom.xml @@ -11,7 +11,7 @@ - io.novatec + info.novatec todobackend 0.0.1-SNAPSHOT todobackend @@ -53,6 +53,20 @@ org.springframework.boot spring-boot-starter-test test + + + org.mockito + mockito-core + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + io.opentelemetry.instrumentation @@ -71,4 +85,4 @@ - \ No newline at end of file + diff --git a/exercises/otel-in-action/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java b/exercises/otel-in-action/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java similarity index 98% rename from exercises/otel-in-action/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java rename to exercises/otel-in-action/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java index a595a0f..4cef808 100644 --- a/exercises/otel-in-action/todobackend-springboot/src/main/java/io/novatec/todobackend/TodobackendApplication.java +++ b/exercises/otel-in-action/todobackend-springboot/src/main/java/info/novatec/todobackend/TodobackendApplication.java @@ -1,4 +1,4 @@ -package io.novatec.todobackend; +package info.novatec.todobackend; import java.util.ArrayList; import java.util.List; @@ -98,13 +98,13 @@ String someInternalMethod(@SpanAttribute String todo){ } catch (InterruptedException e) { e.printStackTrace(); } - } + } if(todo.equals("fail")){ System.out.println("Failing ..."); throw new RuntimeException(); - - } + + } return todo; } @@ -147,4 +147,4 @@ public void setTodo(String todo) { interface TodoRepository extends CrudRepository { -} \ No newline at end of file +} diff --git a/exercises/otel-in-action/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java b/exercises/otel-in-action/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java new file mode 100755 index 0000000..b4f245c --- /dev/null +++ b/exercises/otel-in-action/todobackend-springboot/src/test/java/info/novatec/todobackend/TodobackendApplicationIntegrationTests.java @@ -0,0 +1,12 @@ +package info.novatec.todobackend; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class TodobackendApplicationIntegrationTests { + + @Test + void contextLoads() { + } +} diff --git a/exercises/otel-in-action/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java b/exercises/otel-in-action/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java deleted file mode 100755 index b18589d..0000000 --- a/exercises/otel-in-action/todobackend-springboot/src/test/java/io/novatec/todobackend/TodobackendApplicationIntegrationTests.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.novatec.todobackend; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class TodobackendApplicationIntegrationTests { - - @Test - void contextLoads() { - } -} \ No newline at end of file diff --git a/exercises/otel-in-action/todoui-thymeleaf/Dockerfile b/exercises/otel-in-action/todoui-thymeleaf/Dockerfile index ba32ead..d6b71ae 100644 --- a/exercises/otel-in-action/todoui-thymeleaf/Dockerfile +++ b/exercises/otel-in-action/todoui-thymeleaf/Dockerfile @@ -1,4 +1,4 @@ -FROM docker.io/maven:3-eclipse-temurin-21 as build +FROM docker.io/maven:3-eclipse-temurin-21 AS build WORKDIR /workspace/app COPY pom.xml . @@ -21,6 +21,6 @@ COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /opt/todoui/app ADD https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/download/v2.8.0/opentelemetry-javaagent.jar /opt/todoui -ENTRYPOINT ["java","-cp","/opt/todoui/app:/opt/todoui/app/lib/*", "-javaagent:/opt/todoui/opentelemetry-javaagent.jar", "io.novatec.todoui.TodouiApplication"] -#ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","io.novatec.todobackend.TodobackendApplication"] +ENTRYPOINT ["java","-cp","/opt/todoui/app:/opt/todoui/app/lib/*", "-javaagent:/opt/todoui/opentelemetry-javaagent.jar", "info.novatec.todoui.TodouiApplication"] +#ENTRYPOINT ["java", "-cp", "/opt/todobackend/app:/opt/todobackend/app/lib/*", "-javaagent:/opt/todobackend/opentelemetry-javaagent.jar","info.novatec.todobackend.TodobackendApplication"] diff --git a/exercises/otel-in-action/todoui-thymeleaf/pom.xml b/exercises/otel-in-action/todoui-thymeleaf/pom.xml index 3dc4994..f751cbc 100644 --- a/exercises/otel-in-action/todoui-thymeleaf/pom.xml +++ b/exercises/otel-in-action/todoui-thymeleaf/pom.xml @@ -1,9 +1,10 @@ - 4.0.0 - io.novatec + info.novatec todoui 0.0.1-SNAPSHOT jar @@ -15,7 +16,7 @@ org.springframework.boot spring-boot-starter-parent 2.7.16 - + @@ -42,16 +43,30 @@ org.springframework.boot spring-boot-starter-test test + + + org.mockito + mockito-core + + + net.bytebuddy + byte-buddy + + + net.bytebuddy + byte-buddy-agent + + - - +--> + - + diff --git a/exercises/otel-in-action/todoui-thymeleaf/src/main/java/io/novatec/todoui/TodouiApplication.java b/exercises/otel-in-action/todoui-thymeleaf/src/main/java/info/novatec/todoui/TodouiApplication.java similarity index 99% rename from exercises/otel-in-action/todoui-thymeleaf/src/main/java/io/novatec/todoui/TodouiApplication.java rename to exercises/otel-in-action/todoui-thymeleaf/src/main/java/info/novatec/todoui/TodouiApplication.java index f98c072..935e946 100644 --- a/exercises/otel-in-action/todoui-thymeleaf/src/main/java/io/novatec/todoui/TodouiApplication.java +++ b/exercises/otel-in-action/todoui-thymeleaf/src/main/java/info/novatec/todoui/TodouiApplication.java @@ -1,4 +1,4 @@ -package io.novatec.todoui; +package info.novatec.todoui; import javax.annotation.PostConstruct; diff --git a/tutorial/Dockerfile b/tutorial/Dockerfile index 4761136..b778657 100644 --- a/tutorial/Dockerfile +++ b/tutorial/Dockerfile @@ -1,10 +1,10 @@ -FROM golang:1.21-alpine as base +FROM golang:1.21-alpine AS base RUN apk add --update --no-cache --repository=https://dl-cdn.alpinelinux.org/alpine/edge/community \ bash \ hugo -FROM base as rt-dev +FROM base AS rt-dev WORKDIR /workspace @@ -13,7 +13,7 @@ COPY --chmod=0755 entrypoint.sh /tmp CMD [ "sh", "-c", "/tmp/entrypoint.sh" ] -FROM base as builder +FROM base AS builder WORKDIR /opt/app @@ -24,7 +24,7 @@ RUN wget -qO- https://github.com/McShelby/hugo-theme-relearn/archive/main.zip | RUN hugo -FROM nginx:1.25-alpine as rt +FROM nginx:1.25-alpine AS rt ARG USER=otel diff --git a/tutorial/content/exercises/instrumentation/automatic/code-based/index.md b/tutorial/content/exercises/instrumentation/automatic/code-based/index.md index 18124ab..a0b3418 100644 --- a/tutorial/content/exercises/instrumentation/automatic/code-based/index.md +++ b/tutorial/content/exercises/instrumentation/automatic/code-based/index.md @@ -32,7 +32,7 @@ While instrumentation libraries offer a valuable solution for enhancing observab ### How to perform the exercise -* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) +* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) * All exercises are in the subdirectory `exercises`. There is also an environment variable `$EXERCISES` pointing to this directory. All directories given are relative to this one. * Initial directory: `automatic-instrumentation/initial` * Solution directory: `automatic-instrumentation/solution` @@ -51,7 +51,7 @@ Developers often encapsulate related logic in dedicated functions to improve cod The OpenTelemetry agent may lack awareness of these custom functions. It has no way of knowing whether they are important and what telemetry data to capture from them. -To apply a more granular configuration to the already existing agent you can use the `opentelemetry-instrumentation-annotations` library. +To apply a more granular configuration to the already existing agent you can use the `opentelemetry-instrumentation-annotations` library. If the Java part of the application is still running from this exercise, stop it using `Ctrl+C` in the corresponding terminal window. @@ -87,7 +87,7 @@ Add the following dependency to it and make sure to align/indent with the alread and save the file. -Now re-run the build command +Now re-run the build command ```sh mvn clean package @@ -231,7 +231,7 @@ Among other details you will be able to see the details of the method and name o ``` code.function - someInternalMethod -code.namespace - io.novatec.todobackend.TodobackendApplication +code.namespace - info.novatec.todobackend.TodobackendApplication otel.library.name - io.opentelemetry.opentelemetry-instrumentation-annotations-1.16 otel.library.version - 2.5.0-alpha @@ -279,7 +279,7 @@ This means you can now also see the specific parameter which has been passed and Leave the Java application running, you will need it for the Python part as well. -### Alternative approach +### Alternative approach These are no exercise steps, this is just supporting information. @@ -293,13 +293,13 @@ As the name already implies they configure methods to be included as spans or ex In our example the corresponding environment setting to include the `someInternalMethod` to the spans without using the `@WithSpan` annotation in code would be: ``` -export OTEL_INSTRUMENTATION_METHODS_INCLUDE=io.novatec.todobackend.TodobackendApplication[someInternalMethod] +export OTEL_INSTRUMENTATION_METHODS_INCLUDE=info.novatec.todobackend.TodobackendApplication[someInternalMethod] ``` In case the `@WithSpan` annotation was already present in the compiled jar and you want to exclude it without rebuild you have to set: ``` -export OTEL_INSTRUMENTATION_OPENTELEMETRY_INSTRUMENTATION_ANNOTATIONS_EXCLUDE_METHODS=io.novatec.todobackend.TodobackendApplication[someInternalMethod] +export OTEL_INSTRUMENTATION_OPENTELEMETRY_INSTRUMENTATION_ANNOTATIONS_EXCLUDE_METHODS=info.novatec.todobackend.TodobackendApplication[someInternalMethod] ``` Both environment variables only correspond with the `@WithSpan` annotation. There is no possibility (yet) to configure span attributes through environment setting. This only works on code level. @@ -308,7 +308,7 @@ The part of the Java library exercise completes with this step. --- -### exercise - Python mixed automatic and manual instrumentation +### exercise - Python mixed automatic and manual instrumentation Change to the directory within to `exercises/automatic-instrumentation/initial/todoui-flask` path, if you are in the project root directory it is: @@ -457,7 +457,7 @@ The following chapter `manual instrumentatoin` will do this in full depth. Please stop all Java, Python and docker processes. - diff --git a/tutorial/content/exercises/instrumentation/automatic/zero-code/index.md b/tutorial/content/exercises/instrumentation/automatic/zero-code/index.md index a532211..17f972d 100644 --- a/tutorial/content/exercises/instrumentation/automatic/zero-code/index.md +++ b/tutorial/content/exercises/instrumentation/automatic/zero-code/index.md @@ -83,7 +83,7 @@ Therefore, not all languages come with support for auto-instrumentation. ## Exercise ### How to perform the exercise -* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) +* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) * All exercises are in the subdirectory `exercises`. There is also an environment variable `$EXERCISES` pointing to this directory. All directories given are relative to this one. * Initial directory: `automatic-instrumentation/initial` * Solution directory: `automatic-instrumentation/solution` @@ -227,9 +227,9 @@ If you switch back to the terminal of the Java application process you should se ``` [otel.javaagent 2024-04-17 07:04:57:384 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'SELECT testdb.todo' : 22571b7a308941882c3d203a2c1b2179 fcabde9f56343650 CLIENT [tracer: io.opentelemetry.jdbc:2.3.0-alpha] AttributesMap{data={db.operation=SELECT, db.sql.table=todo, db.name=testdb, thread.name=http-nio-8080-exec-1, thread.id=44, db.user=sa, db.connection_string=h2:mem:, db.system=h2, db.statement=select t1_0.todo from todo t1_0}, capacity=128, totalAddedValues=9} -[otel.javaagent 2024-04-17 07:04:57:387 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'SELECT io.novatec.todobackend.Todo' : 22571b7a308941882c3d203a2c1b2179 8a64843c1fb5217d INTERNAL [tracer: io.opentelemetry.hibernate-6.0:2.3.0-alpha] AttributesMap{data={thread.name=http-nio-8080-exec-1, thread.id=44}, capacity=128, totalAddedValues=2} +[otel.javaagent 2024-04-17 07:04:57:387 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'SELECT info.novatec.todobackend.Todo' : 22571b7a308941882c3d203a2c1b2179 8a64843c1fb5217d INTERNAL [tracer: io.opentelemetry.hibernate-6.0:2.3.0-alpha] AttributesMap{data={thread.name=http-nio-8080-exec-1, thread.id=44}, capacity=128, totalAddedValues=2} [otel.javaagent 2024-04-17 07:04:57:397 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'Transaction.commit' : 22571b7a308941882c3d203a2c1b2179 a5b7712f0edab44e INTERNAL [tracer: io.opentelemetry.hibernate-6.0:2.3.0-alpha] AttributesMap{data={thread.name=http-nio-8080-exec-1, thread.id=44}, capacity=128, totalAddedValues=2} -[otel.javaagent 2024-04-17 07:04:57:397 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'TodoRepository.findAll' : 22571b7a308941882c3d203a2c1b2179 0463a11569155a8d INTERNAL [tracer: io.opentelemetry.spring-data-1.8:2.3.0-alpha] AttributesMap{data={thread.name=http-nio-8080-exec-1, code.namespace=io.novatec.todobackend.TodoRepository, thread.id=44, code.function=findAll}, capacity=128, totalAddedValues=4} +[otel.javaagent 2024-04-17 07:04:57:397 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'TodoRepository.findAll' : 22571b7a308941882c3d203a2c1b2179 0463a11569155a8d INTERNAL [tracer: io.opentelemetry.spring-data-1.8:2.3.0-alpha] AttributesMap{data={thread.name=http-nio-8080-exec-1, code.namespace=info.novatec.todobackend.TodoRepository, thread.id=44, code.function=findAll}, capacity=128, totalAddedValues=4} 2024-04-17T07:04:57.397+02:00 INFO 79699 --- [springboot-backend ] [nio-8080-exec-1] i.n.todobackend.TodobackendApplication : GET /todos/ [] [otel.javaagent 2024-04-17 07:04:57:422 +0200] [http-nio-8080-exec-1] INFO io.opentelemetry.exporter.logging.LoggingSpanExporter - 'GET /todos/' : 22571b7a308941882c3d203a2c1b2179 61a3089ef357ce36 SERVER [tracer: io.opentelemetry.tomcat-10.0:2.3.0-alpha] AttributesMap{data={url.path=/todos/, thread.id=44, network.peer.address=0:0:0:0:0:0:0:1, server.address=localhost, client.address=0:0:0:0:0:0:0:1, http.response.status_code=200, http.route=/todos/, server.port=8080, http.request.method=GET, url.scheme=http, thread.name=http-nio-8080-exec-1, user_agent.original=curl/8.4.0, network.protocol.version=1.1, network.peer.port=52219}, capacity=128, totalAddedValues=14} ``` @@ -619,4 +619,4 @@ Therefore, it is crucial to find the right balance between them to create an obs - https://www.youtube.com/watch?v=hXTlV_RnELc - https://opentelemetry.io/docs/instrumentation/java/automatic/extensions/ - https://github.com/open-telemetry/opentelemetry-java-instrumentation/tree/main/examples/extension ---> \ No newline at end of file +--> diff --git a/tutorial/content/exercises/instrumentation/manual_java/metrics/index.md b/tutorial/content/exercises/instrumentation/manual_java/metrics/index.md index 8b57309..ea10e89 100644 --- a/tutorial/content/exercises/instrumentation/manual_java/metrics/index.md +++ b/tutorial/content/exercises/instrumentation/manual_java/metrics/index.md @@ -26,7 +26,7 @@ By the end of this lab, you will be able to: - Use the OpenTelemetry API and configure the SDK to generate metrics - Understand the basic structure and dimensions of a metric - Generate custom metrics from your application and configure the exporting - @@ -43,7 +43,7 @@ In this lab, we output metrics to the local console to keep things simple. The environment consists of a Java service that we want to instrument. -* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) +* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) * All exercises are in the subdirectory `exercises`. There is also an environment variable `$EXERCISES` pointing to this directory. All directories given are relative to this one. * Initial directory: `manual-instrumentation-java/initial` * Solution directory: `manual-instrumentation-java/solution` @@ -62,7 +62,7 @@ The environment consists of one component: To start with this lab, open **two terminals**. 1. Terminal to run the echo server -Navigate to +Navigate to ```sh cd $EXERCISES @@ -72,7 +72,7 @@ cd manual-instrumentation-java/initial/todobackend-springboot Run: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` @@ -99,7 +99,7 @@ If you get stuck, you can find the solution in the `exercises/manual-instrumenta Before we can make changes to the Java code we need to make sure some necessary dependencies are in place. -In the first window stop the app using `Ctrl+C` and edit the `pom.xml` file. +In the first window stop the app using `Ctrl+C` and edit the `pom.xml` file. Add the following dependencies. Do not add the dots (...). Just embed the dependencies. @@ -158,7 +158,7 @@ We'll use it to separate tracing-related configuration from the main application Add the following content to this file: ```java { title="OpenTelemetryConfiguration.java" } -package io.novatec.todobackend; +package info.novatec.todobackend; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -210,7 +210,7 @@ Your integrated code will look like this then: .build(); ``` -Let’s begin by importing OpenTelemetry’s meter API and the MeterProvider from the SDK in our main Java application as shown below. +Let’s begin by importing OpenTelemetry’s meter API and the MeterProvider from the SDK in our main Java application as shown below. Open `TodobackendApplication.java` in your editor and tart by addind the following import statements. Place them below the already existing ones: ```java { title="TodobackendApplication.java" } @@ -253,7 +253,7 @@ At this point it is recommended to rebuild and run the application to verify if In your main terminal window run: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` If there are any errors review the changes and repeat. @@ -325,7 +325,7 @@ Let's test the behaviour. Go back to your terminal and execute the following com In case your application is not running any more, start it in the first terminal: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` In your second terminal issue the REST request again. @@ -339,7 +339,7 @@ Observe the logs in your main terminal, this should display something like: ```sh 2024-07-25T12:23:47.929Z INFO 20323 --- [springboot-backend ] [nio-8080-exec-1] i.n.todobackend.TodobackendApplication : GET /todos/ [] 2024-07-25T12:23:54.267Z INFO 20323 --- [springboot-backend ] [cMetricReader-1] i.o.e.logging.LoggingMetricExporter : Received a collection of 1 metrics for export. -2024-07-25T12:23:54.267Z INFO 20323 --- [springboot-backend ] [cMetricReader-1] i.o.e.logging.LoggingMetricExporter : metric: ImmutableMetricData{resource=Resource{schemaUrl=null, attributes={service.name="todobackend", service.version="0.1.0", telemetry.sdk.language="java", telemetry.sdk.name="opentelemetry", telemetry.sdk.version="1.40.0"}}, instrumentationScopeInfo=InstrumentationScopeInfo{name=io.novatec.todobackend.TodobackendApplication, version=null, schemaUrl=null, attributes={}}, name=todobackend.requests.counter, description=How many times the GET call has been invoked., unit=requests, type=LONG_SUM, data=ImmutableSumData{points=[ImmutableLongPointData{startEpochNanos=1721910224265851430, epochNanos=1721910234267050129, attributes={}, value=1, exemplars=[]}], monotonic=true, aggregationTemporality=CUMULATIVE}} +2024-07-25T12:23:54.267Z INFO 20323 --- [springboot-backend ] [cMetricReader-1] i.o.e.logging.LoggingMetricExporter : metric: ImmutableMetricData{resource=Resource{schemaUrl=null, attributes={service.name="todobackend", service.version="0.1.0", telemetry.sdk.language="java", telemetry.sdk.name="opentelemetry", telemetry.sdk.version="1.40.0"}}, instrumentationScopeInfo=InstrumentationScopeInfo{name=info.novatec.todobackend.TodobackendApplication, version=null, schemaUrl=null, attributes={}}, name=todobackend.requests.counter, description=How many times the GET call has been invoked., unit=requests, type=LONG_SUM, data=ImmutableSumData{points=[ImmutableLongPointData{startEpochNanos=1721910224265851430, epochNanos=1721910234267050129, attributes={}, value=1, exemplars=[]}], monotonic=true, aggregationTemporality=CUMULATIVE}} ``` The second line of logs written by the `LoggingMetricExporter` contains the information we just generated: `value=1`. @@ -357,7 +357,7 @@ This because we specified this behaviour in the configuration class: .build()) .setResource(resource) .build(); - + ``` The standard interval is 60 seconds. We apply 10 seconds here for demo purposes. @@ -391,7 +391,7 @@ Change the counter statement in the following way: After generating some more traffic, you will see that the logging statement has changed to this: ```sh -2024-07-25T12:50:09.567Z INFO 20323 --- [springboot-backend ] [cMetricReader-1] i.o.e.logging.LoggingMetricExporter : metric: ImmutableMetricData{resource=Resource{schemaUrl=null, attributes={service.name="todobackend", service.version="0.1.0", telemetry.sdk.language="java", telemetry.sdk.name="opentelemetry", telemetry.sdk.version="1.40.0"}}, instrumentationScopeInfo=InstrumentationScopeInfo{name=io.novatec.todobackend.TodobackendApplication, version=null, schemaUrl=null, attributes={}}, name=todobackend.requests.counter, description=How many times the GET call has been invoked., unit=requests, type=LONG_SUM, data=ImmutableSumData{points=[ImmutableLongPointData{startEpochNanos=1721911669561139043, epochNanos=1721911809567179469, attributes={http.method="GET"}, value=1, exemplars=[]}], monotonic=true, aggregationTemporality=CUMULATIVE}} +2024-07-25T12:50:09.567Z INFO 20323 --- [springboot-backend ] [cMetricReader-1] i.o.e.logging.LoggingMetricExporter : metric: ImmutableMetricData{resource=Resource{schemaUrl=null, attributes={service.name="todobackend", service.version="0.1.0", telemetry.sdk.language="java", telemetry.sdk.name="opentelemetry", telemetry.sdk.version="1.40.0"}}, instrumentationScopeInfo=InstrumentationScopeInfo{name=info.novatec.todobackend.TodobackendApplication, version=null, schemaUrl=null, attributes={}}, name=todobackend.requests.counter, description=How many times the GET call has been invoked., unit=requests, type=LONG_SUM, data=ImmutableSumData{points=[ImmutableLongPointData{startEpochNanos=1721911669561139043, epochNanos=1721911809567179469, attributes={http.method="GET"}, value=1, exemplars=[]}], monotonic=true, aggregationTemporality=CUMULATIVE}} ``` The attributes are now listed, too: @@ -452,7 +452,7 @@ def create_meter(name: str, version: str) -> metric_api.Meter: return meter ``` -- TODO re-use resource_utils +- TODO re-use resource_utils Finally, open `app.py` and import `create_meter`. Invoke the function and assign the return value to a global variable `meter`. @@ -528,12 +528,12 @@ if __name__ == "__main__": # ... ``` -Start the web server using +Start the web server using ```sh python app.py ``` -Use the second terminal to send a request to `/` via +Use the second terminal to send a request to `/` via ```bash curl -XGET localhost:5000; echo @@ -614,7 +614,7 @@ def index(): ) ``` -Send a couple of POST and GET requests to `/` via +Send a couple of POST and GET requests to `/` via ```bash curl -XPOST localhost:5000; echo @@ -713,7 +713,7 @@ def index(): do_stuff() current_time = time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime()) return f"Hello, World! It's currently {current_time}" -``` +``` Instead, let's create a custom function `before_request_func` and annotate it with Flask's `@app.before_request` decorator. Thereby, the function is executed on incoming requests before they are handled by the view serving a route. @@ -726,7 +726,7 @@ def before_request_func(): ) ``` -Send a couple of POST and GET requests to `/` via +Send a couple of POST and GET requests to `/` via ```bash curl -XPOST localhost:5000; echo diff --git a/tutorial/content/exercises/instrumentation/manual_java/traces/index.md b/tutorial/content/exercises/instrumentation/manual_java/traces/index.md index c43a756..beffd80 100644 --- a/tutorial/content/exercises/instrumentation/manual_java/traces/index.md +++ b/tutorial/content/exercises/instrumentation/manual_java/traces/index.md @@ -26,7 +26,7 @@ In this lab, we output spans to the local console to keep things simple and expo ## Learning Objectives By the end of this lab, you will be able to: -- Apply manual instrumentation for tracing to a Java application +- Apply manual instrumentation for tracing to a Java application - Use the OpenTelemetry API and configure the SDK to generate spans - Understand the basic structure of a span - Enrich spans with additional metadata @@ -34,7 +34,7 @@ By the end of this lab, you will be able to: ### How to perform the exercises -* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) +* This exercise is based on the following repository [repository](https://github.com/NovatecConsulting/opentelemetry-training/) * All exercises are in the subdirectory `exercises`. There is also an environment variable `$EXERCISES` pointing to this directory. All directories given are relative to this one. * Initial directory: `manual-instrumentation-java/initial` * Solution directory: `manual-instrumentation-java/solution` @@ -50,7 +50,7 @@ The environment consists of one component: To start with this lab, open **two terminals**. 1. Terminal to run the echo server -Navigate to +Navigate to ```sh cd $EXERCISES @@ -60,7 +60,7 @@ cd manual-instrumentation-java/initial/todobackend-springboot Run: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` @@ -87,7 +87,7 @@ If you get stuck, you can find the solution in the `exercises/manual-instrumenta The application has not been modified for OpenTelemetry, so we start entirely from scratch. Before we can make changes to the Java code we need to add some necessary dependencies. -In the first window stop the app using `Ctrl+C` and edit the `pom.xml` file. +In the first window stop the app using `Ctrl+C` and edit the `pom.xml` file. Add the following dependencies. Do not add the dots (...). Just embed the dependencies. @@ -146,7 +146,7 @@ We'll use it to separate tracing-related configuration from the main application Add the following content to this file: ```java { title="OpenTelemetryConfiguration.java" } -package io.novatec.todobackend; +package info.novatec.todobackend; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -175,7 +175,7 @@ public class OpenTelemetryConfiguration { SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) .setResource(resource) - .build(); + .build(); OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() .setTracerProvider(sdkTracerProvider) @@ -188,7 +188,7 @@ public class OpenTelemetryConfiguration { ``` Explanation about the contents of this file: -This Configuration class will create a Bean to access OpenTelemetry API functionality. +This Configuration class will create a Bean to access OpenTelemetry API functionality. It is an initial configuration for tracing properties only. For easy debugging purposes, we'll instantiate a `LoggingSpanExporter` to output spans to the local console. @@ -207,7 +207,7 @@ We created a `SimpleSpanProcessor` and pass the exporter to the `create` method It is recommended to keep this file open in the editor as there will be addition to it over the course of this exercise. -Let’s begin by importing OpenTelemetry’s tracing API and the TracerProvider from the SDK in our main Java application as shown below. +Let’s begin by importing OpenTelemetry’s tracing API and the TracerProvider from the SDK in our main Java application as shown below. Open `TodobackendApplication.java` in your editor and tart by addind the following import statements. Place them below the already existing ones: ```java { title="TodobackendApplication.java" } @@ -243,7 +243,7 @@ In this constuctor we instantiate the OpenTelemetry and Tracer object and make t public TodobackendApplication(OpenTelemetry openTelemetry) { this.openTelemetry = openTelemetry; tracer = openTelemetry.getTracer(TodobackendApplication.class.getName(), "0.1.0"); - + } ``` @@ -252,7 +252,7 @@ At this point it is recommended to rebuild and run the application to verify if In your main terminal window run: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` If there are any errors review the changes and repeat. @@ -289,11 +289,11 @@ The resulting code is supposed to look like this: String addTodo(@PathVariable String todo){ Span span = tracer.spanBuilder("addTodo").startSpan(); - + this.someInternalMethod(todo); logger.info("POST /todos/ "+todo.toString()); - span.end(); + span.end(); return todo; @@ -305,7 +305,7 @@ As you can see we referenced the `tracer` object which was initialized in the co Stop, rebuild and restart the application: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` Switch to your other terminal and use the following command to send a request to the `/` endpoint: @@ -319,7 +319,7 @@ Take a look at the terminal where you application is running. You should see a log statement similar to the one shown below. ```log -2024-07-21T12:58:04.842Z INFO 23816 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : ba6c894e6774d02d78fe2d48acbdfcc6 72cba2d03eab76a8 INTERNAL [tracer: io.novatec.todobackend.TodobackendApplication:0.1.0] {} +2024-07-21T12:58:04.842Z INFO 23816 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : ba6c894e6774d02d78fe2d48acbdfcc6 72cba2d03eab76a8 INTERNAL [tracer: info.novatec.todobackend.TodobackendApplication:0.1.0] {} ``` This shows that it actually works, however the output is still a bit cryptic. @@ -339,7 +339,7 @@ Add the following log statement between the `span.end()` call and the return sta Stop, rebuild and restart the application: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` Switch to your other terminal and use the following command to send a request to the `/` endpoint: @@ -351,7 +351,7 @@ curl -XPOST localhost:8080/todos/NEW; echo Below the logging statement from the `LoggingExporter` you should now see more descriptive details: ```log -2024-07-21T13:05:27.650Z INFO 23816 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : 49fa6e942dd137fdc11ef1178f938078 eeda77d2bfd15a0c INTERNAL [tracer: io.novatec.todobackend.TodobackendApplication:0.1.0] {} +2024-07-21T13:05:27.650Z INFO 23816 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : 49fa6e942dd137fdc11ef1178f938078 eeda77d2bfd15a0c INTERNAL [tracer: info.novatec.todobackend.TodobackendApplication:0.1.0] {} 2024-07-21T13:05:27.651Z INFO 23816 --- [springboot-backend ] [nio-8080-exec-1] i.n.todobackend.TodobackendApplication : Span.toString():SdkSpan{traceId=49fa6e942dd137fdc11ef1178f938078, spanId=eeda77d2bfd15a0c, parentSpanContext=ImmutableSpanContext{traceId=00000000000000000000000000000000, spanId=0000000000000000, traceFlags=00, traceState=ArrayBasedTraceState{entries=[]}, remote=false, valid=false}, name=addTodo, kind=INTERNAL, attributes=null, status=ImmutableStatusData{statusCode=UNSET, description=}, totalRecordedEvents=0, totalRecordedLinks=0, startEpochNanos=1721567127643127423, endEpochNanos=1721567127650834923} ``` @@ -361,7 +361,7 @@ A span in OpenTelemetry represents a single operation within a trace and carries This is also tells us a bit more about the output of the LoggingSpanExporter: ```log -2024-07-21T13:05:27.650Z INFO 23816 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : 49fa6e942dd137fdc11ef1178f938078 eeda77d2bfd15a0c INTERNAL [tracer: io.novatec.todobackend.TodobackendApplication:0.1.0] {} +2024-07-21T13:05:27.650Z INFO 23816 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : 49fa6e942dd137fdc11ef1178f938078 eeda77d2bfd15a0c INTERNAL [tracer: info.novatec.todobackend.TodobackendApplication:0.1.0] {} ``` The first identifier is the `traceId`, the second one is `spandId` followed by `SpanKind`. @@ -381,7 +381,7 @@ And specify two attributes: ```java { title="TodobackendApplication.java" } Span span = tracer.spanBuilder("addTodo").setSpanKind(SpanKind.SERVER).startSpan(); - + span.setAttribute("http.method", "POST"); span.setAttribute("http.url", "/todos/{todo}"); ``` @@ -389,7 +389,7 @@ And specify two attributes: Stop, rebuild and restart the application: ```sh -mvn spring-boot:run +mvn spring-boot:run ``` Switch to your other terminal and use the following command to send a request to the `/` endpoint: @@ -401,7 +401,7 @@ curl -XPOST localhost:8080/todos/NEW; echo The resulting output will look like: ```log -2024-07-24T09:22:07.460Z INFO 7977 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : f150c6404cf8c58398d94bbecb094fdb cd93535232b8d8ca SERVER [tracer: io.novatec.todobackend.TodobackendApplication:0.1.0] AttributesMap{data={http.url=/todos/{todo}, http.method=POST}, capacity=128, totalAddedValues=2} +2024-07-24T09:22:07.460Z INFO 7977 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : f150c6404cf8c58398d94bbecb094fdb cd93535232b8d8ca SERVER [tracer: info.novatec.todobackend.TodobackendApplication:0.1.0] AttributesMap{data={http.url=/todos/{todo}, http.method=POST}, capacity=128, totalAddedValues=2} 2024-07-24T09:22:07.461Z INFO 7977 --- [springboot-backend ] [nio-8080-exec-1] i.n.todobackend.TodobackendApplication : Span.toString():SdkSpan{traceId=f150c6404cf8c58398d94bbecb094fdb, spanId=cd93535232b8d8ca, parentSpanContext=ImmutableSpanContext{traceId=00000000000000000000000000000000, spanId=0000000000000000, traceFlags=00, traceState=ArrayBasedTraceState{entries=[]}, remote=false, valid=false}, name=addTodo, kind=SERVER, attributes=AttributesMap{data={http.url=/todos/{todo}, http.method=POST}, capacity=128, totalAddedValues=2}, status=ImmutableStatusData{statusCode=UNSET, description=}, totalRecordedEvents=0, totalRecordedLinks=0, startEpochNanos=1721812927453408887, endEpochNanos=1721812927460726137} ``` @@ -420,7 +420,7 @@ Modify the entire method to look like this: span.setAttribute("http.url", request.getRequestURL().toString()); span.setAttribute("client.address", request.getRemoteAddr()); span.setAttribute("user.agent",request.getHeader("User-Agent")); - + this.someInternalMethod(todo); logger.info("POST /todos/ "+todo.toString()); @@ -433,7 +433,7 @@ Modify the entire method to look like this: return todo; } -``` +``` If your editor does not automatically add the import statements, you need to do this manually. Make sure the following import statements are in place: @@ -441,14 +441,14 @@ Make sure the following import statements are in place: ```java { title="TodobackendApplication.java" } import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -``` +``` Restart the app and repeat the curl call. The resulting output will look like: ```log -2024-07-21T13:46:08.336Z INFO 43453 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : 21d97f2813576a1a2942457e9f0c671b 7474ed21e4081af8 SERVER [tracer: io.novatec.todobackend.TodobackendApplication:0.1.0] AttributesMap{data={client.address=127.0.0.1, user.agent=curl/7.81.0, http.url=http://localhost:8080/todos/NEW, response.status=201, http.method=POST}, capacity=128, totalAddedValues=5} +2024-07-21T13:46:08.336Z INFO 43453 --- [springboot-backend ] [nio-8080-exec-1] i.o.e.logging.LoggingSpanExporter : 'addTodo' : 21d97f2813576a1a2942457e9f0c671b 7474ed21e4081af8 SERVER [tracer: info.novatec.todobackend.TodobackendApplication:0.1.0] AttributesMap{data={client.address=127.0.0.1, user.agent=curl/7.81.0, http.url=http://localhost:8080/todos/NEW, response.status=201, http.method=POST}, capacity=128, totalAddedValues=5} 2024-07-21T13:46:08.336Z INFO 43453 --- [springboot-backend ] [nio-8080-exec-1] i.n.todobackend.TodobackendApplication : Span.toString():SdkSpan{traceId=21d97f2813576a1a2942457e9f0c671b, spanId=7474ed21e4081af8, parentSpanContext=ImmutableSpanContext{traceId=00000000000000000000000000000000, spanId=0000000000000000, traceFlags=00, traceState=ArrayBasedTraceState{entries=[]}, remote=false, valid=false}, name=addTodo, kind=SERVER, attributes=AttributesMap{data={client.address=127.0.0.1, user.agent=curl/7.81.0, http.url=http://localhost:8080/todos/NEW, response.status=201, http.method=POST}, capacity=128, totalAddedValues=5}, status=ImmutableStatusData{statusCode=UNSET, description=}, totalRecordedEvents=0, totalRecordedLinks=0, startEpochNanos=1721569568329729512, endEpochNanos=1721569568336094221} ``` @@ -531,15 +531,15 @@ The OpenTelemetry API offers also an automated way to propagate the parent span ### Handling an error -The `someInternalMethod` can simulate an error behaviour and throw an exception, if somebody uses the todo with name `fail`. +The `someInternalMethod` can simulate an error behaviour and throw an exception, if somebody uses the todo with name `fail`. ```java { title="TodobackendApplication.java" } if(todo.equals("fail")){ System.out.println("Failing ..."); throw new RuntimeException(); - - } + + } ``` We can catch this exception in the `addTodo` method. @@ -561,7 +561,7 @@ Extend the `try{}` block we created in the previous step with the following code } ``` -Restart the app. +Restart the app. This time execute the curl call with the todo triggering a failure. @@ -603,7 +603,7 @@ Modify the beginning of the class to the code shown below: .addSpanProcessor(SimpleSpanProcessor.create(LoggingSpanExporter.create())) .addSpanProcessor(SimpleSpanProcessor.create(jaegerOtlpExporter)) .setResource(resource) - .build(); + .build(); ``` Also make sure the following import exists: @@ -618,10 +618,10 @@ As you can see we created an instance of `OtlpGrpcSpanExporter` called `jaegerOt In the Tracer Provider we just added another `addSpanProcessor` call to the already existing one. OpenTelemetry is able to handle mulitple different and parallel processors. -Rebuild, restart and issue a curl call. +Rebuild, restart and issue a curl call. ```sh -mvn spring-boot:run +mvn spring-boot:run ``` ```bash @@ -635,7 +635,7 @@ Besides the familiar logging statements, you will see two errors in the logs now 2024-07-21T16:18:20.179Z WARN 70461 --- [springboot-backend ] [alhost:4317/...] i.o.exporter.internal.grpc.GrpcExporter : Failed to export spans. Server responded with gRPC status code 2. Error message: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4317 ``` -This is because there is nothing listening on `http://localhost:4317`. +This is because there is nothing listening on `http://localhost:4317`. Open another terminal window and start a docker container like this: @@ -652,7 +652,7 @@ After this container has started, execute a couple of traces and investigate the The exercise completes with this step. - -