Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Supports for OpenTelemetry #336

Draft
wants to merge 4 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ dependencies {
// TL signing library
implementation group: 'com.truelayer', name: 'truelayer-signing', version: '0.2.6'

// OpenTelemetry
implementation group: 'io.opentelemetry.instrumentation', name: 'opentelemetry-okhttp-3.0', version: '2.11.0-alpha'

// Serialization
def jacksonVersion = '2.14.1'
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: jacksonVersion
Expand Down
46 changes: 46 additions & 0 deletions examples/quarkus-mvc/collector.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
receivers:
otlp:
protocols:
grpc:
endpoint: otel-collector:4317
processors:
attributes:
actions:
- key: test.key
value: hello!
action: insert
batch:
memory_limiter:
check_interval: 1s
limit_percentage: 75

exporters:
debug:
verbosity: detailed
otlp:
endpoint: jaeger:4317
tls:
insecure: true
prometheus:
endpoint: otel-collector:3000

extensions:
health_check:
zpages:
endpoint: "otel-collector:55679"

service:
extensions: [health_check, zpages]
pipelines:
traces:
receivers: [otlp]
processors: [batch, attributes, memory_limiter]
exporters: [otlp]
traces/2:
receivers: [ otlp ]
processors: [ batch, attributes, memory_limiter ]
exporters: [ debug ]
metrics:
receivers: [otlp]
processors: [batch, memory_limiter]
exporters: [prometheus]
34 changes: 34 additions & 0 deletions examples/quarkus-mvc/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: quarkus-mvc

services:

# backend:
# build: .
# depends_on:
# - db
# ports:
# - "8080:8080"

jaeger:
image: jaegertracing/jaeger:2.1.0
ports:
- "16686:16686"

otel-collector:
image: otel/opentelemetry-collector-contrib:0.116.1
depends_on:
- jaeger
ports:
- "4317:4317"
- "4318:4318"
- "55679:55679"
- "3000:3000"
volumes:
- "./collector.yaml:/etc/otelcol-contrib/config.yaml"

prometheus:
image: prom/prometheus:v3.0.1
ports:
- "9090:9090"
volumes:
- ./prometheus.yaml:/etc/prometheus/prometheus.yml
4 changes: 4 additions & 0 deletions examples/quarkus-mvc/justfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
alias r:= run

run:
docker compose up
10 changes: 10 additions & 0 deletions examples/quarkus-mvc/prometheus.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
global:
scrape_interval: 15s # By default, scrape targets every 15 seconds.

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
static_configs:
- targets: ['otel-collector:3000']
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
package com.truelayer.quarkusmvc;

import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_NAME;
import static io.opentelemetry.semconv.ServiceAttributes.SERVICE_VERSION;

import com.truelayer.java.*;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import jakarta.enterprise.context.ApplicationScoped;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import lombok.SneakyThrows;
Expand All @@ -21,26 +31,47 @@ public class TrueLayerClientProvider {
@ConfigProperty(name = "tl.signing.key_id")
String signingKeyId;

@ConfigProperty(name = "tl.signing.private_key_location")
String signingPrivateKeyLocation;
@ConfigProperty(name = "tl.signing.private_key")
String signingPrivateKey;

private static final Logger LOG = Logger.getLogger(TrueLayerClientProvider.class);

@ApplicationScoped
@SneakyThrows
public ITrueLayerClient producer() throws IOException {
return TrueLayerClient.New()
.withOpenTelemetry(buildOpenTelemetryConfig())
.environment(Environment.sandbox())
.clientCredentials(ClientCredentials.builder()
.clientId(clientId)
.clientSecret(clientSecret)
.build())
.signingOptions(SigningOptions.builder()
.keyId(signingKeyId)
.privateKey(Files.readAllBytes(Path.of(signingPrivateKeyLocation)))
.privateKey(signingPrivateKey.getBytes(StandardCharsets.UTF_8))
.build())
.withHttpLogs(LOG::info)
.withCredentialsCaching()
.build();
}

private OpenTelemetry buildOpenTelemetryConfig() {
Resource resource = Resource.getDefault().toBuilder()
.put(SERVICE_NAME, "truelayer-java")
.put(SERVICE_VERSION, "0.1.0")
.build();

SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(SimpleSpanProcessor.create(
OtlpGrpcSpanExporter.builder().build()))
.setResource(resource)
.build();

OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
.setTracerProvider(sdkTracerProvider)
// .setMeterProvider(sdkMeterProvider)
.build();

return openTelemetry;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import java.util.List;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.jboss.resteasy.annotations.Form;

@Path("/donations")
Expand All @@ -35,19 +33,6 @@ public TemplateInstance home() {
return donations.instance();
}

@GET
@Path("/test")
@SneakyThrows
public Response test() {
var token = trueLayerClient.auth().getOauthToken(List.of("payments")).get();

if (token.isError()) {
return Response.serverError().build();
}

return Response.ok("token expires in " + token.getData().getExpiresIn()).build();
}

@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public Response donate(@Form DonationRequest donationRequest) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.truelayer.java.ITrueLayerClient;
import com.truelayer.java.entities.CurrencyCode;
import com.truelayer.java.entities.ResourceType;
import com.truelayer.java.entities.User;
import com.truelayer.java.entities.accountidentifier.SortCodeAccountNumberAccountIdentifier;
import com.truelayer.java.payments.entities.CreatePaymentRequest;
Expand Down Expand Up @@ -63,10 +64,11 @@ public URI createDonationLink(DonationRequest req) {
throw new RuntimeException(String.format("create payment error: %s", paymentResponse.getError()));
}

return tlClient.hpp()
.getHostedPaymentPageLink(
paymentResponse.getData().getId(),
paymentResponse.getData().getResourceToken(),
URI.create("http://localhost:8080/donations/callback"));
return tlClient.hppLinkBuilder()
.resourceId(paymentResponse.getData().getId())
.resourceToken(paymentResponse.getData().getResourceToken())
.resourceType(ResourceType.PAYMENT)
.returnUri(URI.create("http://localhost:8080/donations/callback"))
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ quarkus.log.level=INFO
tl.client.id=to-set
tl.client.secret=to-set
tl.signing.key_id=to-set
tl.signing.private_key_location=to-set
tl.signing.private_key=to-set

quarkus.otel.trace.enabled=true
quarkus.otel.metrics.enabled=true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ <h1 class="display-4 mb-4 text-center">Make a donation</h1>
<div class="form-row">
<div class="form-group col-md-6">
<label for="name">Name</label>
<input type="text" class="form-control form-control-lg" id="name" name="name" required>
<input type="text" class="form-control form-control-lg" id="name" name="name" value="{name or "John Smith"}" required>
<div class="invalid-feedback">
Please choose a name.
</div>
</div>
<div class="form-group col-md-6">
<label for="email">Email</label>
<input type="text" class="form-control form-control-lg" id="email" name="email" required>
<input type="text" class="form-control form-control-lg" id="email" name="email" value="{email or "[email protected]"}" required>
<div class="invalid-feedback">
Please choose an email.
</div>
Expand All @@ -53,7 +53,7 @@ <h1 class="display-4 mb-4 text-center">Make a donation</h1>
<div class="input-group-prepend">
<span class="input-group-text">GBP</span>
</div>
<input type="text" placeholder="amount in minor" class="form-control form-control-lg" id="amount" name="amount" required/>
<input type="text" placeholder="amount in minor" class="form-control form-control-lg" id="amount" name="amount" value="{amount or "100"}" required/>
<div class="input-group-append">
<button type="submit" class="btn btn-primary btn-lg">Donate!</button>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.truelayer.quarkusmvc;

import io.quarkus.test.junit.QuarkusIntegrationTest;

@QuarkusIntegrationTest
class GreetingResourceIT extends GreetingResourceTest {
// Execute the same tests but in packaged mode.
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.truelayer.quarkusmvc;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

@QuarkusTest
class GreetingResourceTest {
@Test
void testHelloEndpoint() {
given().when().get("/hello").then().statusCode(200).body(is("Hello from Quarkus REST"));
}
}
Loading
Loading