Skip to content
Open
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
22 changes: 22 additions & 0 deletions build-extras.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,25 @@ tasks.named('test', Test) {
events "passed"
}
}

tasks.register('generatePomProperties') {

def propertiesFile = layout.buildDirectory.file("resources/main/META-INF/maven/com.clerk/backend-api/pom.properties").get().asFile
outputs.file(propertiesFile)

doLast {

def props = new Properties()
props.put("groupId", project.group)
props.put("version", project.version)

def jarTask = tasks.named("jar").get()
props.put("artifactId", jarTask.archiveBaseName.get())


propertiesFile.parentFile.mkdirs()
propertiesFile.withWriter { props.store(it, null) }
}
}

processResources.dependsOn generatePomProperties
37 changes: 34 additions & 3 deletions src/main/java/com/clerk/backend_api/hooks/SDKHooks.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/*
/*
* Code generated by Speakeasy (https://speakeasyapi.dev). DO NOT EDIT.
*/

Expand All @@ -10,6 +10,16 @@
// consequence any customization of this class will be preserved.
//

import com.clerk.backend_api.hooks.telemetry.TelemetryAfterErrorHook;
import com.clerk.backend_api.hooks.telemetry.TelemetryAfterSuccessHook;
import com.clerk.backend_api.hooks.telemetry.TelemetryBeforeRequestHook;
import com.clerk.backend_api.hooks.telemetry.TelemetryCollector;
import com.clerk.backend_api.utils.Hooks;
import io.jsonwebtoken.lang.Objects;

import java.util.ArrayList;
import java.util.List;

public final class SDKHooks {

private SDKHooks() {
Expand All @@ -18,12 +28,33 @@ private SDKHooks() {

public static final void initialize(com.clerk.backend_api.utils.Hooks hooks) {
// register hooks here

// for more information see
// https://www.speakeasyapi.dev/docs/additional-features/sdk-hooks

ClerkBeforeRequestHook clerkBeforeRequestHook = new ClerkBeforeRequestHook();
hooks.registerBeforeRequest(clerkBeforeRequestHook);

configureTelemetry(hooks, System.getenv("CLERK_TELEMETRY_DISABLED"), System.getenv("CLERK_TELEMETRY_DEBUG"));
}


static void configureTelemetry(
Hooks hooks,
String clerkTelemetryDisabledEnvVar,
String clerkTelemetryDebugEnvVar) {
if (Objects.nullSafeEquals(clerkTelemetryDisabledEnvVar, "1")) {
return;
}

List<TelemetryCollector> collectors = new ArrayList<>(2);
collectors.add(TelemetryCollector.live());
if (Objects.nullSafeEquals(clerkTelemetryDebugEnvVar, "1")) {
collectors.add(new TelemetryCollector.DebugCollector());
}

hooks.registerBeforeRequest(new TelemetryBeforeRequestHook(collectors));
hooks.registerAfterSuccess(new TelemetryAfterSuccessHook(collectors));
hooks.registerAfterError(new TelemetryAfterErrorHook(collectors));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.clerk.backend_api.hooks.telemetry;

import java.util.Map;
import java.util.TreeMap;

public class PreparedEvent {
public final String event;
public final String it;
public final String sdk;
public final String sdkv;
public final String sk;
public final Map<String, String> payload;

public PreparedEvent(String event, String it, String sdk, String sdkv, String sk, Map<String, String> payload) {
this.event = event;
this.it = it;
this.sdk = sdk;
this.sdkv = sdkv;
this.sk = sk;
this.payload = payload;
}

public TreeMap<String, String> sanitize() {
TreeMap<String, String> sanitizedEvent = new TreeMap<>();

sanitizedEvent.put("event", event);
sanitizedEvent.put("it", it);
sanitizedEvent.put("sdk", sdk);
sanitizedEvent.put("sdkv", sdkv);
sanitizedEvent.putAll(payload);

return sanitizedEvent;
}

}
54 changes: 54 additions & 0 deletions src/main/java/com/clerk/backend_api/hooks/telemetry/SdkInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.clerk.backend_api.hooks.telemetry;

import java.io.IOException;
import java.io.InputStream;
import java.util.Optional;
import java.util.Properties;

public class SdkInfo {
public String version;
public String name;
public String groupId;

public SdkInfo(String version, String name, String groupId) {
this.version = version;
this.name = name;
this.groupId = groupId;
}

@Override
public String toString() {
return "{" +
"\"version\":\"" + version + '"' +
",\"name\":\"" + name + '"' +
",\"groupId\":\"'" + groupId + '"' +
'}';
}


public static Optional<SdkInfo> loadFromResources() {
String[] possiblePaths = {
"/META-INF/maven/com.clerk/backend-api/pom.properties",
"META-INF/maven/com.clerk/backend-api/pom.properties",
"build/resources/main/META-INF/maven/com.clerk/backend-api/pom.properties"
};

for (String path : possiblePaths) {
try (InputStream input = SdkInfo.class.getClassLoader().getResourceAsStream(path)) {
if (input != null) {
Properties properties = new Properties();
properties.load(input);
return Optional.of(new SdkInfo(
properties.getProperty("version"),
properties.getProperty("artifactId"),
properties.getProperty("groupId")));
}
} catch (IOException e) {
return Optional.empty();
}
}

return Optional.empty();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.clerk.backend_api.hooks.telemetry;

import com.clerk.backend_api.utils.Hook;

import java.io.InputStream;
import java.net.http.HttpResponse;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class TelemetryAfterErrorHook implements Hook.AfterError {

// visible for testing
public final List<TelemetryCollector> collectors;

public TelemetryAfterErrorHook(List<TelemetryCollector> collectors) {
this.collectors = collectors;
}

@SuppressWarnings("OptionalIsPresent")
@Override
public HttpResponse<InputStream> afterError(Hook.AfterErrorContext context, Optional<HttpResponse<InputStream>> response, Optional<Exception> error) throws Exception {
Map<String, String> additionalPayload = new HashMap<>();
if (response.isPresent()) {
additionalPayload.put("status_code", String.valueOf(response.get().statusCode()));
}
if (error.isPresent()) {
additionalPayload.put("error_message", error.get().getMessage());
}

TelemetryEvent event = TelemetryEvent.fromContext(
context,
TelemetryEvent.EVENT_METHOD_FAILED,
0.1f,
additionalPayload
);
collectors.forEach(c -> c.collect(event));
if (response.isPresent()) {
return response.get();
} else if (error.isPresent()) {
throw error.get();
} else {
// should not happen since one of response or error should be present
throw new IllegalStateException("afterError called with no response or error");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.clerk.backend_api.hooks.telemetry;

import com.clerk.backend_api.utils.Hook;

import java.io.InputStream;
import java.net.http.HttpResponse;
import java.util.List;
import java.util.Map;

public class TelemetryAfterSuccessHook implements Hook.AfterSuccess {

// visible for testing
public final List<TelemetryCollector> collectors;

public TelemetryAfterSuccessHook(List<TelemetryCollector> collectors) {
this.collectors = collectors;
}

@Override
public HttpResponse<InputStream> afterSuccess(Hook.AfterSuccessContext context, HttpResponse<InputStream> response) throws Exception {
TelemetryEvent event = TelemetryEvent.fromContext(
context,
TelemetryEvent.EVENT_METHOD_SUCCEEDED,
0.1f,
Map.of("status_code", String.valueOf(response.statusCode()))
);
collectors.forEach(c -> c.collect(event));
return response;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.clerk.backend_api.hooks.telemetry;

import com.clerk.backend_api.utils.Hook;

import java.net.http.HttpRequest;
import java.util.List;
import java.util.Map;

public class TelemetryBeforeRequestHook implements Hook.BeforeRequest {

// only visible so we can test
public final List<TelemetryCollector> collectors;

public TelemetryBeforeRequestHook(List<TelemetryCollector> collectors) {
this.collectors = collectors;
}

@Override
public HttpRequest beforeRequest(Hook.BeforeRequestContext context, HttpRequest request) throws Exception {
TelemetryEvent event = TelemetryEvent.fromContext(
context,
TelemetryEvent.EVENT_METHOD_CALLED,
0.1f,
Map.of()
);
collectors.forEach(c -> c.collect(event));
return request;

}
}
Loading