Skip to content
Merged
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
1 change: 1 addition & 0 deletions hypertrace-graphql-impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ dependencies {
implementation(project(":hypertrace-graphql-explorer-context"))
implementation(project(":hypertrace-graphql-entity-type"))
implementation(project(":hypertrace-graphql-spaces-schema"))
implementation(project(":hypertrace-graphql-labels-schema"))

implementation("org.slf4j:slf4j-api")
implementation("com.google.inject:guice")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.hypertrace.graphql.entity.HypertraceEntityModule;
import org.hypertrace.graphql.explorer.ExplorerSchemaModule;
import org.hypertrace.graphql.explorer.context.HypertraceExplorerContextModule;
import org.hypertrace.graphql.label.LabelSchemaModule;
import org.hypertrace.graphql.metric.MetricModule;
import org.hypertrace.graphql.spaces.SpacesSchemaModule;
import org.hypertrace.graphql.utils.metrics.gateway.GatewayMetricUtilsModule;
Expand Down Expand Up @@ -71,5 +72,6 @@ protected void configure() {
install(new EntityIdModule());
install(new SpacesSchemaModule());
install(new RequestTransformationModule());
install(new LabelSchemaModule());
}
}
33 changes: 33 additions & 0 deletions hypertrace-graphql-labels-schema/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
plugins {
`java-library`
jacoco
id("org.hypertrace.jacoco-report-plugin")
}

dependencies {
api("com.google.inject:guice")
api("com.graphql-java:graphql-java")
api("org.hypertrace.core.graphql:hypertrace-core-graphql-spi")
api("io.github.graphql-java:graphql-java-annotations")
api("org.hypertrace.core.graphql:hypertrace-core-graphql-common-schema")

annotationProcessor("org.projectlombok:lombok")
compileOnly("org.projectlombok:lombok")

implementation("org.slf4j:slf4j-api")
implementation("io.reactivex.rxjava3:rxjava")
implementation("org.hypertrace.config.service:labels-config-service-api")
implementation("com.google.protobuf:protobuf-java-util")
implementation("com.google.guava:guava")

implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-context")
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-grpc-utils")
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-schema-utils")
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-rx-utils")

implementation(project(":hypertrace-graphql-service-config"))
}

tasks.test {
useJUnitPlatform()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.hypertrace.graphql.label;

import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
import org.hypertrace.graphql.label.schema.LabelSchema;

class LabelSchemaFragment implements GraphQlSchemaFragment {

@Override
public String fragmentName() {
return "Label schema";
}

@Override
public Class<LabelSchema> annotatedQueryClass() {
return LabelSchema.class;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.hypertrace.graphql.label;

import com.google.inject.AbstractModule;
import com.google.inject.multibindings.Multibinder;
import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
import org.hypertrace.graphql.label.dao.LabelDaoModule;

public class LabelSchemaModule extends AbstractModule {
@Override
protected void configure() {
Multibinder.newSetBinder(binder(), GraphQlSchemaFragment.class)
.addBinding()
.to(LabelSchemaFragment.class);

install(new LabelDaoModule());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package org.hypertrace.graphql.label.dao;

import static java.util.concurrent.TimeUnit.MILLISECONDS;

import io.grpc.CallCredentials;
import io.reactivex.rxjava3.core.Single;
import javax.inject.Inject;
import org.hypertrace.core.graphql.common.request.ContextualRequest;
import org.hypertrace.core.graphql.context.GraphQlRequestContext;
import org.hypertrace.core.graphql.utils.grpc.GrpcChannelRegistry;
import org.hypertrace.core.graphql.utils.grpc.GrpcContextBuilder;
import org.hypertrace.graphql.config.HypertraceGraphQlServiceConfig;
import org.hypertrace.graphql.label.schema.LabelResultSet;
import org.hypertrace.label.config.service.v1.GetLabelsRequest;
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
import org.hypertrace.label.config.service.v1.LabelsConfigServiceGrpc;
import org.hypertrace.label.config.service.v1.LabelsConfigServiceGrpc.LabelsConfigServiceFutureStub;

class LabelConfigServiceDao implements LabelDao {
private final LabelsConfigServiceFutureStub labelConfigServiceStub;
private final GrpcContextBuilder grpcContextBuilder;
private final HypertraceGraphQlServiceConfig serviceConfig;
private final LabelResponseConverter converter;

@Inject
LabelConfigServiceDao(
HypertraceGraphQlServiceConfig serviceConfig,
CallCredentials credentials,
GrpcContextBuilder grpcContextBuilder,
GrpcChannelRegistry grpcChannelRegistry,
LabelResponseConverter converter) {
this.grpcContextBuilder = grpcContextBuilder;
this.serviceConfig = serviceConfig;
this.converter = converter;
this.labelConfigServiceStub =
LabelsConfigServiceGrpc.newFutureStub(
grpcChannelRegistry.forAddress(
Comment thread
saxenakshitiz marked this conversation as resolved.
Resolved
serviceConfig.getConfigServiceHost(), serviceConfig.getConfigServicePort()))
.withCallCredentials(credentials);
}

@Override
public Single<LabelResultSet> getLabels(ContextualRequest request) {
return this.makeRequest(request.context(), GetLabelsRequest.getDefaultInstance())
.flatMap(serverResponse -> converter.convert(serverResponse));
}

private Single<GetLabelsResponse> makeRequest(
GraphQlRequestContext context, GetLabelsRequest request) {
return Single.fromFuture(
this.grpcContextBuilder
.build(context)
.call(
() ->
this.labelConfigServiceStub
.withDeadlineAfter(
serviceConfig.getConfigServiceTimeout().toMillis(), MILLISECONDS)
.getLabels(request)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.hypertrace.graphql.label.dao;

import io.reactivex.rxjava3.core.Single;
import org.hypertrace.core.graphql.common.request.ContextualRequest;
import org.hypertrace.graphql.label.schema.LabelResultSet;

public interface LabelDao {

Single<LabelResultSet> getLabels(ContextualRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.hypertrace.graphql.label.dao;

import com.google.inject.AbstractModule;
import io.grpc.CallCredentials;
import org.hypertrace.core.graphql.spi.config.GraphQlServiceConfig;
import org.hypertrace.core.graphql.utils.grpc.GrpcChannelRegistry;
import org.hypertrace.core.graphql.utils.grpc.GrpcContextBuilder;

public class LabelDaoModule extends AbstractModule {

@Override
protected void configure() {
bind(LabelDao.class).to(LabelConfigServiceDao.class);
requireBinding(CallCredentials.class);
requireBinding(GraphQlServiceConfig.class);
requireBinding(GrpcChannelRegistry.class);
requireBinding(GrpcContextBuilder.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.hypertrace.graphql.label.dao;

import io.reactivex.rxjava3.core.Single;
import java.util.List;
import java.util.stream.Collectors;
import lombok.Value;
import lombok.experimental.Accessors;
import org.hypertrace.graphql.label.schema.Label;
import org.hypertrace.graphql.label.schema.LabelResultSet;
import org.hypertrace.label.config.service.v1.GetLabelsResponse;

class LabelResponseConverter {

Single<LabelResultSet> convert(GetLabelsResponse response) {
List<Label> labelList =
response.getLabelsList().stream()
.map(label -> new DefaultLabel(label.getId(), label.getKey()))
.collect(Collectors.toUnmodifiableList());
return Single.just(new DefaultLabelResultSet(labelList, labelList.size(), labelList.size()));
}

@Value
@Accessors(fluent = true)
private static class DefaultLabelResultSet implements LabelResultSet {
List<Label> results;
long count;
long total;
}

@Value
@Accessors(fluent = true)
private static class DefaultLabel implements Label {
String id;
String key;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.hypertrace.graphql.label.fetcher;

import graphql.schema.DataFetcher;
import graphql.schema.DataFetchingEnvironment;
import java.util.concurrent.CompletableFuture;
import javax.inject.Inject;
import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher;
import org.hypertrace.core.graphql.common.request.ContextualRequestBuilder;
import org.hypertrace.graphql.label.dao.LabelDao;
import org.hypertrace.graphql.label.schema.LabelResultSet;

public class LabelFetcher extends InjectableDataFetcher<LabelResultSet> {

public LabelFetcher() {
super(LabelFetcherImpl.class);
}

static final class LabelFetcherImpl implements DataFetcher<CompletableFuture<LabelResultSet>> {
private final ContextualRequestBuilder requestBuilder;
private final LabelDao labelDao;

@Inject
LabelFetcherImpl(ContextualRequestBuilder requestBuilder, LabelDao labelDao) {
this.requestBuilder = requestBuilder;
this.labelDao = labelDao;
}

@Override
public CompletableFuture<LabelResultSet> get(DataFetchingEnvironment environment) {
return this.labelDao
.getLabels(this.requestBuilder.build(environment.getContext()))
.toCompletionStage()
.toCompletableFuture();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.hypertrace.graphql.label.schema;

import graphql.annotations.annotationTypes.GraphQLField;
import graphql.annotations.annotationTypes.GraphQLName;
import graphql.annotations.annotationTypes.GraphQLNonNull;
import org.hypertrace.core.graphql.common.schema.id.Identifiable;

@GraphQLName(Label.TYPE_NAME)
public interface Label extends Identifiable {
String TYPE_NAME = "Label";
String KEY = "key";

@GraphQLField
@GraphQLNonNull
@GraphQLName(KEY)
String key();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package org.hypertrace.graphql.label.schema;

import graphql.annotations.annotationTypes.GraphQLField;
import graphql.annotations.annotationTypes.GraphQLName;
import graphql.annotations.annotationTypes.GraphQLNonNull;
import java.util.List;
import org.hypertrace.core.graphql.common.schema.results.ResultSet;

@GraphQLName(LabelResultSet.TYPE_NAME)
public interface LabelResultSet extends ResultSet<Label> {
String TYPE_NAME = "LabelResultSet";

@Override
@GraphQLField
@GraphQLNonNull
@GraphQLName(RESULT_SET_RESULTS_NAME)
List<Label> results();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.hypertrace.graphql.label.schema;

import graphql.annotations.annotationTypes.GraphQLDataFetcher;
import graphql.annotations.annotationTypes.GraphQLField;
import graphql.annotations.annotationTypes.GraphQLName;
import graphql.annotations.annotationTypes.GraphQLNonNull;
import org.hypertrace.graphql.label.fetcher.LabelFetcher;

public interface LabelSchema {
String LABELS_QUERY_NAME = "labels";

@GraphQLField
@GraphQLNonNull
@GraphQLName(LABELS_QUERY_NAME)
@GraphQLDataFetcher(LabelFetcher.class)
LabelResultSet labels();
}
1 change: 1 addition & 0 deletions hypertrace-graphql-platform/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@ dependencies {
constraints {
api("org.hypertrace.entity.service:entity-type-service-rx-client:0.5.6")
api("org.hypertrace.config.service:spaces-config-service-api:0.1.1")
api("org.hypertrace.config.service:labels-config-service-api:0.1.8")
}
}
1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ include(":hypertrace-graphql-entity-type")
include(":hypertrace-graphql-service-config")
include(":hypertrace-graphql-platform")
include(":hypertrace-graphql-spaces-schema")
include(":hypertrace-graphql-labels-schema")