Skip to content

Commit c1ceb5e

Browse files
ENG-11104: Added labels schema to retrieve all labels (#96)
1 parent e10614c commit c1ceb5e

File tree

15 files changed

+285
-0
lines changed

15 files changed

+285
-0
lines changed

hypertrace-graphql-impl/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ dependencies {
3131
implementation(project(":hypertrace-graphql-explorer-context"))
3232
implementation(project(":hypertrace-graphql-entity-type"))
3333
implementation(project(":hypertrace-graphql-spaces-schema"))
34+
implementation(project(":hypertrace-graphql-labels-schema"))
3435

3536
implementation("org.slf4j:slf4j-api")
3637
implementation("com.google.inject:guice")

hypertrace-graphql-impl/src/main/java/org/hypertrace/graphql/impl/GraphQlModule.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.hypertrace.graphql.entity.HypertraceEntityModule;
2727
import org.hypertrace.graphql.explorer.ExplorerSchemaModule;
2828
import org.hypertrace.graphql.explorer.context.HypertraceExplorerContextModule;
29+
import org.hypertrace.graphql.label.LabelSchemaModule;
2930
import org.hypertrace.graphql.metric.MetricModule;
3031
import org.hypertrace.graphql.spaces.SpacesSchemaModule;
3132
import org.hypertrace.graphql.utils.metrics.gateway.GatewayMetricUtilsModule;
@@ -71,5 +72,6 @@ protected void configure() {
7172
install(new EntityIdModule());
7273
install(new SpacesSchemaModule());
7374
install(new RequestTransformationModule());
75+
install(new LabelSchemaModule());
7476
}
7577
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
plugins {
2+
`java-library`
3+
jacoco
4+
id("org.hypertrace.jacoco-report-plugin")
5+
}
6+
7+
dependencies {
8+
api("com.google.inject:guice")
9+
api("com.graphql-java:graphql-java")
10+
api("org.hypertrace.core.graphql:hypertrace-core-graphql-spi")
11+
api("io.github.graphql-java:graphql-java-annotations")
12+
api("org.hypertrace.core.graphql:hypertrace-core-graphql-common-schema")
13+
14+
annotationProcessor("org.projectlombok:lombok")
15+
compileOnly("org.projectlombok:lombok")
16+
17+
implementation("org.slf4j:slf4j-api")
18+
implementation("io.reactivex.rxjava3:rxjava")
19+
implementation("org.hypertrace.config.service:labels-config-service-api")
20+
implementation("com.google.protobuf:protobuf-java-util")
21+
implementation("com.google.guava:guava")
22+
23+
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-context")
24+
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-grpc-utils")
25+
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-schema-utils")
26+
implementation("org.hypertrace.core.graphql:hypertrace-core-graphql-rx-utils")
27+
28+
implementation(project(":hypertrace-graphql-service-config"))
29+
}
30+
31+
tasks.test {
32+
useJUnitPlatform()
33+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.hypertrace.graphql.label;
2+
3+
import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
4+
import org.hypertrace.graphql.label.schema.LabelSchema;
5+
6+
class LabelSchemaFragment implements GraphQlSchemaFragment {
7+
8+
@Override
9+
public String fragmentName() {
10+
return "Label schema";
11+
}
12+
13+
@Override
14+
public Class<LabelSchema> annotatedQueryClass() {
15+
return LabelSchema.class;
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.hypertrace.graphql.label;
2+
3+
import com.google.inject.AbstractModule;
4+
import com.google.inject.multibindings.Multibinder;
5+
import org.hypertrace.core.graphql.spi.schema.GraphQlSchemaFragment;
6+
import org.hypertrace.graphql.label.dao.LabelDaoModule;
7+
8+
public class LabelSchemaModule extends AbstractModule {
9+
@Override
10+
protected void configure() {
11+
Multibinder.newSetBinder(binder(), GraphQlSchemaFragment.class)
12+
.addBinding()
13+
.to(LabelSchemaFragment.class);
14+
15+
install(new LabelDaoModule());
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package org.hypertrace.graphql.label.dao;
2+
3+
import static java.util.concurrent.TimeUnit.MILLISECONDS;
4+
5+
import io.grpc.CallCredentials;
6+
import io.reactivex.rxjava3.core.Single;
7+
import javax.inject.Inject;
8+
import org.hypertrace.core.graphql.common.request.ContextualRequest;
9+
import org.hypertrace.core.graphql.context.GraphQlRequestContext;
10+
import org.hypertrace.core.graphql.utils.grpc.GrpcChannelRegistry;
11+
import org.hypertrace.core.graphql.utils.grpc.GrpcContextBuilder;
12+
import org.hypertrace.graphql.config.HypertraceGraphQlServiceConfig;
13+
import org.hypertrace.graphql.label.schema.LabelResultSet;
14+
import org.hypertrace.label.config.service.v1.GetLabelsRequest;
15+
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
16+
import org.hypertrace.label.config.service.v1.LabelsConfigServiceGrpc;
17+
import org.hypertrace.label.config.service.v1.LabelsConfigServiceGrpc.LabelsConfigServiceFutureStub;
18+
19+
class LabelConfigServiceDao implements LabelDao {
20+
private final LabelsConfigServiceFutureStub labelConfigServiceStub;
21+
private final GrpcContextBuilder grpcContextBuilder;
22+
private final HypertraceGraphQlServiceConfig serviceConfig;
23+
private final LabelResponseConverter converter;
24+
25+
@Inject
26+
LabelConfigServiceDao(
27+
HypertraceGraphQlServiceConfig serviceConfig,
28+
CallCredentials credentials,
29+
GrpcContextBuilder grpcContextBuilder,
30+
GrpcChannelRegistry grpcChannelRegistry,
31+
LabelResponseConverter converter) {
32+
this.grpcContextBuilder = grpcContextBuilder;
33+
this.serviceConfig = serviceConfig;
34+
this.converter = converter;
35+
this.labelConfigServiceStub =
36+
LabelsConfigServiceGrpc.newFutureStub(
37+
grpcChannelRegistry.forAddress(
38+
serviceConfig.getConfigServiceHost(), serviceConfig.getConfigServicePort()))
39+
.withCallCredentials(credentials);
40+
}
41+
42+
@Override
43+
public Single<LabelResultSet> getLabels(ContextualRequest request) {
44+
return this.makeRequest(request.context(), GetLabelsRequest.getDefaultInstance())
45+
.flatMap(serverResponse -> converter.convert(serverResponse));
46+
}
47+
48+
private Single<GetLabelsResponse> makeRequest(
49+
GraphQlRequestContext context, GetLabelsRequest request) {
50+
return Single.fromFuture(
51+
this.grpcContextBuilder
52+
.build(context)
53+
.call(
54+
() ->
55+
this.labelConfigServiceStub
56+
.withDeadlineAfter(
57+
serviceConfig.getConfigServiceTimeout().toMillis(), MILLISECONDS)
58+
.getLabels(request)));
59+
}
60+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.hypertrace.graphql.label.dao;
2+
3+
import io.reactivex.rxjava3.core.Single;
4+
import org.hypertrace.core.graphql.common.request.ContextualRequest;
5+
import org.hypertrace.graphql.label.schema.LabelResultSet;
6+
7+
public interface LabelDao {
8+
9+
Single<LabelResultSet> getLabels(ContextualRequest request);
10+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.hypertrace.graphql.label.dao;
2+
3+
import com.google.inject.AbstractModule;
4+
import io.grpc.CallCredentials;
5+
import org.hypertrace.core.graphql.spi.config.GraphQlServiceConfig;
6+
import org.hypertrace.core.graphql.utils.grpc.GrpcChannelRegistry;
7+
import org.hypertrace.core.graphql.utils.grpc.GrpcContextBuilder;
8+
9+
public class LabelDaoModule extends AbstractModule {
10+
11+
@Override
12+
protected void configure() {
13+
bind(LabelDao.class).to(LabelConfigServiceDao.class);
14+
requireBinding(CallCredentials.class);
15+
requireBinding(GraphQlServiceConfig.class);
16+
requireBinding(GrpcChannelRegistry.class);
17+
requireBinding(GrpcContextBuilder.class);
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.hypertrace.graphql.label.dao;
2+
3+
import io.reactivex.rxjava3.core.Single;
4+
import java.util.List;
5+
import java.util.stream.Collectors;
6+
import lombok.Value;
7+
import lombok.experimental.Accessors;
8+
import org.hypertrace.graphql.label.schema.Label;
9+
import org.hypertrace.graphql.label.schema.LabelResultSet;
10+
import org.hypertrace.label.config.service.v1.GetLabelsResponse;
11+
12+
class LabelResponseConverter {
13+
14+
Single<LabelResultSet> convert(GetLabelsResponse response) {
15+
List<Label> labelList =
16+
response.getLabelsList().stream()
17+
.map(label -> new DefaultLabel(label.getId(), label.getKey()))
18+
.collect(Collectors.toUnmodifiableList());
19+
return Single.just(new DefaultLabelResultSet(labelList, labelList.size(), labelList.size()));
20+
}
21+
22+
@Value
23+
@Accessors(fluent = true)
24+
private static class DefaultLabelResultSet implements LabelResultSet {
25+
List<Label> results;
26+
long count;
27+
long total;
28+
}
29+
30+
@Value
31+
@Accessors(fluent = true)
32+
private static class DefaultLabel implements Label {
33+
String id;
34+
String key;
35+
}
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.hypertrace.graphql.label.fetcher;
2+
3+
import graphql.schema.DataFetcher;
4+
import graphql.schema.DataFetchingEnvironment;
5+
import java.util.concurrent.CompletableFuture;
6+
import javax.inject.Inject;
7+
import org.hypertrace.core.graphql.common.fetcher.InjectableDataFetcher;
8+
import org.hypertrace.core.graphql.common.request.ContextualRequestBuilder;
9+
import org.hypertrace.graphql.label.dao.LabelDao;
10+
import org.hypertrace.graphql.label.schema.LabelResultSet;
11+
12+
public class LabelFetcher extends InjectableDataFetcher<LabelResultSet> {
13+
14+
public LabelFetcher() {
15+
super(LabelFetcherImpl.class);
16+
}
17+
18+
static final class LabelFetcherImpl implements DataFetcher<CompletableFuture<LabelResultSet>> {
19+
private final ContextualRequestBuilder requestBuilder;
20+
private final LabelDao labelDao;
21+
22+
@Inject
23+
LabelFetcherImpl(ContextualRequestBuilder requestBuilder, LabelDao labelDao) {
24+
this.requestBuilder = requestBuilder;
25+
this.labelDao = labelDao;
26+
}
27+
28+
@Override
29+
public CompletableFuture<LabelResultSet> get(DataFetchingEnvironment environment) {
30+
return this.labelDao
31+
.getLabels(this.requestBuilder.build(environment.getContext()))
32+
.toCompletionStage()
33+
.toCompletableFuture();
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)