diff --git a/hypertrace-trace-enricher/enriched-span-constants/build.gradle.kts b/hypertrace-trace-enricher/enriched-span-constants/build.gradle.kts index acdceed1f..707636513 100644 --- a/hypertrace-trace-enricher/enriched-span-constants/build.gradle.kts +++ b/hypertrace-trace-enricher/enriched-span-constants/build.gradle.kts @@ -69,7 +69,7 @@ dependencies { implementation(project(":span-normalizer:raw-span-constants")) implementation(project(":span-normalizer:span-normalizer-constants")) implementation(project(":semantic-convention-utils")) - implementation("org.hypertrace.entity.service:entity-service-api:0.6.10") + implementation("org.hypertrace.entity.service:entity-service-api:0.8.0") testImplementation("org.junit.jupiter:junit-jupiter:5.7.1") testImplementation("org.mockito:mockito-core:3.8.0") diff --git a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/build.gradle.kts b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/build.gradle.kts index a5c3e52e3..7712fba12 100644 --- a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/build.gradle.kts +++ b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/build.gradle.kts @@ -17,7 +17,7 @@ dependencies { implementation(project(":hypertrace-trace-enricher:trace-reader")) implementation("org.hypertrace.core.datamodel:data-model:0.1.18") - implementation("org.hypertrace.entity.service:entity-service-client:0.6.10") + implementation("org.hypertrace.entity.service:entity-service-client:0.8.0") implementation("org.hypertrace.core.serviceframework:platform-metrics:0.1.28") implementation("org.hypertrace.core.grpcutils:grpc-client-utils:0.5.2") implementation("org.hypertrace.config.service:spaces-config-service-api:0.1.0") diff --git a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/ClientRegistry.java b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/ClientRegistry.java index 41302ba95..d81c90962 100644 --- a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/ClientRegistry.java +++ b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/ClientRegistry.java @@ -5,8 +5,8 @@ import org.hypertrace.core.datamodel.Event; import org.hypertrace.core.datamodel.StructuredTrace; import org.hypertrace.entity.data.service.client.EdsCacheClient; +import org.hypertrace.trace.accessor.entities.TraceEntityAccessor; import org.hypertrace.trace.reader.attributes.TraceAttributeReader; -import org.hypertrace.trace.reader.entities.TraceEntityReader; import org.hypertrace.traceenricher.enrichment.enrichers.cache.EntityCache; public interface ClientRegistry { @@ -17,7 +17,7 @@ public interface ClientRegistry { Channel getConfigServiceChannel(); - TraceEntityReader getEntityReader(); + TraceEntityAccessor getTraceEntityAccessor(); TraceAttributeReader getAttributeReader(); diff --git a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/DefaultClientRegistry.java b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/DefaultClientRegistry.java index ef2ecb2ed..05c1a293d 100644 --- a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/DefaultClientRegistry.java +++ b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/clients/DefaultClientRegistry.java @@ -14,10 +14,10 @@ import org.hypertrace.entity.data.service.rxclient.EntityDataClient; import org.hypertrace.entity.service.client.config.EntityServiceClientConfig; import org.hypertrace.entity.type.service.rxclient.EntityTypeClient; +import org.hypertrace.trace.accessor.entities.TraceEntityAccessor; +import org.hypertrace.trace.accessor.entities.TraceEntityAccessorBuilder; import org.hypertrace.trace.reader.attributes.TraceAttributeReader; import org.hypertrace.trace.reader.attributes.TraceAttributeReaderFactory; -import org.hypertrace.trace.reader.entities.TraceEntityReader; -import org.hypertrace.trace.reader.entities.TraceEntityReaderBuilder; import org.hypertrace.traceenricher.enrichment.enrichers.cache.EntityCache; public class DefaultClientRegistry implements ClientRegistry { @@ -36,7 +36,7 @@ public class DefaultClientRegistry implements ClientRegistry { private final EdsCacheClient edsCacheClient; private final CachingAttributeClient cachingAttributeClient; private final EntityCache entityCache; - private final TraceEntityReader entityReader; + private final TraceEntityAccessor entityAccessor; private final TraceAttributeReader attributeReader; private final GrpcChannelRegistry grpcChannelRegistry = new GrpcChannelRegistry(); @@ -64,8 +64,8 @@ public DefaultClientRegistry(Config config) { new EntityDataServiceClient(this.entityServiceChannel), EntityServiceClientConfig.from(config).getCacheConfig()); this.entityCache = new EntityCache(this.edsCacheClient); - this.entityReader = - new TraceEntityReaderBuilder( + this.entityAccessor = + new TraceEntityAccessorBuilder( EntityTypeClient.builder(this.entityServiceChannel).build(), EntityDataClient.builder(this.entityServiceChannel).build(), this.cachingAttributeClient) @@ -92,8 +92,8 @@ public Channel getConfigServiceChannel() { } @Override - public TraceEntityReader getEntityReader() { - return this.entityReader; + public TraceEntityAccessor getTraceEntityAccessor() { + return this.entityAccessor; } @Override diff --git a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/enrichers/EntitySpanEnricher.java b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/enrichers/EntitySpanEnricher.java index 8beb9ee66..d95903a3d 100644 --- a/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/enrichers/EntitySpanEnricher.java +++ b/hypertrace-trace-enricher/hypertrace-trace-enricher-impl/src/main/java/org/hypertrace/traceenricher/enrichment/enrichers/EntitySpanEnricher.java @@ -3,7 +3,7 @@ import com.typesafe.config.Config; import org.hypertrace.core.datamodel.Event; import org.hypertrace.core.datamodel.StructuredTrace; -import org.hypertrace.trace.reader.entities.TraceEntityReader; +import org.hypertrace.trace.accessor.entities.TraceEntityAccessor; import org.hypertrace.traceenricher.enrichment.AbstractTraceEnricher; import org.hypertrace.traceenricher.enrichment.clients.ClientRegistry; import org.slf4j.Logger; @@ -11,20 +11,19 @@ public class EntitySpanEnricher extends AbstractTraceEnricher { private static final Logger LOG = LoggerFactory.getLogger(EntitySpanEnricher.class); - private TraceEntityReader entityReader; + private TraceEntityAccessor entityAccessor; @Override public void enrichEvent(StructuredTrace trace, Event event) { - // Don't block, this is just meant to eventually write the entities - this.entityReader - .getAssociatedEntitiesForSpan(trace, event) - .doOnError(error -> LOG.error("Failed to enrich entities on span", error)) - .onErrorComplete() - .subscribe(); + try { + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(trace, event); + } catch (Exception exception) { + LOG.error("Failed to enrich entities on span", exception); + } } @Override public void init(Config enricherConfig, ClientRegistry clientRegistry) { - this.entityReader = clientRegistry.getEntityReader(); + this.entityAccessor = clientRegistry.getTraceEntityAccessor(); } } diff --git a/hypertrace-trace-enricher/hypertrace-trace-enricher/build.gradle.kts b/hypertrace-trace-enricher/hypertrace-trace-enricher/build.gradle.kts index c627cbc33..818180c41 100644 --- a/hypertrace-trace-enricher/hypertrace-trace-enricher/build.gradle.kts +++ b/hypertrace-trace-enricher/hypertrace-trace-enricher/build.gradle.kts @@ -38,7 +38,7 @@ dependencies { implementation("org.hypertrace.core.datamodel:data-model:0.1.18") implementation("org.hypertrace.core.serviceframework:platform-service-framework:0.1.26") implementation("org.hypertrace.core.serviceframework:platform-metrics:0.1.26") - implementation("org.hypertrace.entity.service:entity-service-client:0.6.10") + implementation("org.hypertrace.entity.service:entity-service-client:0.8.0") implementation("com.typesafe:config:1.4.1") implementation("org.hypertrace.core.kafkastreams.framework:kafka-streams-framework:0.1.21") diff --git a/hypertrace-trace-enricher/trace-reader/build.gradle.kts b/hypertrace-trace-enricher/trace-reader/build.gradle.kts index 67b03429b..1a1dfa980 100644 --- a/hypertrace-trace-enricher/trace-reader/build.gradle.kts +++ b/hypertrace-trace-enricher/trace-reader/build.gradle.kts @@ -8,8 +8,8 @@ plugins { dependencies { api("org.hypertrace.core.attribute.service:attribute-service-api:0.12.3") api("org.hypertrace.core.attribute.service:caching-attribute-service-client:0.12.3") - api("org.hypertrace.entity.service:entity-type-service-rx-client:0.6.10") - api("org.hypertrace.entity.service:entity-data-service-rx-client:0.6.10") + api("org.hypertrace.entity.service:entity-type-service-rx-client:0.8.0") + api("org.hypertrace.entity.service:entity-data-service-rx-client:0.8.0") api("org.hypertrace.core.datamodel:data-model:0.1.17") implementation("org.hypertrace.core.attribute.service:attribute-projection-registry:0.12.3") implementation("org.hypertrace.core.grpcutils:grpc-client-rx-utils:0.5.2") diff --git a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/AttributeValueConverter.java b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/AttributeValueConverter.java similarity index 96% rename from hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/AttributeValueConverter.java rename to hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/AttributeValueConverter.java index 96853239c..4d7d93edb 100644 --- a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/AttributeValueConverter.java +++ b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/AttributeValueConverter.java @@ -1,4 +1,4 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; import io.reactivex.rxjava3.core.Maybe; import org.hypertrace.core.attribute.service.v1.LiteralValue; diff --git a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/AvroEntityConverter.java b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/AvroEntityConverter.java similarity index 99% rename from hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/AvroEntityConverter.java rename to hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/AvroEntityConverter.java index f942df556..90fd2ed38 100644 --- a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/AvroEntityConverter.java +++ b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/AvroEntityConverter.java @@ -1,4 +1,4 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; import static java.util.Objects.nonNull; diff --git a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/DefaultTraceEntityReader.java b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/DefaultTraceEntityAccessor.java similarity index 74% rename from hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/DefaultTraceEntityReader.java rename to hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/DefaultTraceEntityAccessor.java index 6ff3b704a..39135c225 100644 --- a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/DefaultTraceEntityReader.java +++ b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/DefaultTraceEntityAccessor.java @@ -1,23 +1,23 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; import static io.reactivex.rxjava3.core.Maybe.zip; import static java.util.function.Predicate.not; import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.Single; import java.time.Duration; -import java.util.Collections; import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; -import org.apache.avro.generic.GenericRecord; import org.hypertrace.core.attribute.service.cachingclient.CachingAttributeClient; import org.hypertrace.core.attribute.service.v1.AttributeMetadata; import org.hypertrace.core.attribute.service.v1.AttributeSource; import org.hypertrace.core.attribute.service.v1.LiteralValue; +import org.hypertrace.core.datamodel.Event; +import org.hypertrace.core.datamodel.StructuredTrace; import org.hypertrace.core.grpcutils.client.rx.GrpcRxExecutionContext; +import org.hypertrace.core.grpcutils.context.RequestContext; import org.hypertrace.entity.data.service.rxclient.EntityDataClient; import org.hypertrace.entity.data.service.v1.AttributeValue; import org.hypertrace.entity.data.service.v1.AttributeValue.TypeCase; @@ -32,19 +32,18 @@ import org.hypertrace.trace.reader.attributes.TraceAttributeReader; @Slf4j -class DefaultTraceEntityReader - implements TraceEntityReader { +class DefaultTraceEntityAccessor implements TraceEntityAccessor { private final EntityTypeClient entityTypeClient; private final EntityDataClient entityDataClient; private final CachingAttributeClient attributeClient; - private final TraceAttributeReader traceAttributeReader; + private final TraceAttributeReader traceAttributeReader; private final Duration writeThrottleDuration; - DefaultTraceEntityReader( + DefaultTraceEntityAccessor( EntityTypeClient entityTypeClient, EntityDataClient entityDataClient, CachingAttributeClient attributeClient, - TraceAttributeReader traceAttributeReader, + TraceAttributeReader traceAttributeReader, Duration writeThrottleDuration) { this.entityTypeClient = entityTypeClient; this.entityDataClient = entityDataClient; @@ -54,41 +53,32 @@ class DefaultTraceEntityReader } @Override - public Maybe getAssociatedEntityForSpan(String entityType, T trace, S span) { - return spanTenantContext(span) - .wrapSingle(() -> this.entityTypeClient.get(entityType)) - .flatMapMaybe( - entityTypeDefinition -> this.getAndWriteEntity(entityTypeDefinition, trace, span)); + public void writeAssociatedEntitiesForSpanEventually(StructuredTrace trace, Event span) { + this.spanTenantContext(span) + .wrapSingle(() -> this.entityTypeClient.getAll().toList()) + .blockingGet() + .forEach(entityType -> this.writeEntityIfExists(entityType, trace, span)); } - @Override - public Single> getAssociatedEntitiesForSpan(T trace, S span) { - return spanTenantContext(span) - .wrapSingle( - () -> - this.entityTypeClient - .getAll() - .flatMapMaybe(entityType -> this.getAndWriteEntity(entityType, trace, span)) - .toMap(Entity::getEntityType) - .map(Collections::unmodifiableMap)); - } - - private Maybe getAndWriteEntity(EntityType entityType, T trace, S span) { - return this.buildEntity(entityType, trace, span) - .flatMapSingle( - entity -> - this.buildUpsertCondition(entityType, trace, span) - .defaultIfEmpty(UpsertCondition.getDefaultInstance()) - .flatMap( - condition -> - spanTenantContext(span) - .wrapSingle( - () -> - this.entityDataClient.createOrUpdateEntityEventually( - entity, condition, this.writeThrottleDuration)))); + private void writeEntityIfExists(EntityType entityType, StructuredTrace trace, Event span) { + Entity entity = this.buildEntity(entityType, trace, span).blockingGet(); + if (entity == null) { + return; + } + UpsertCondition upsertCondition = + this.buildUpsertCondition(entityType, trace, span) + .defaultIfEmpty(UpsertCondition.getDefaultInstance()) + .blockingGet(); + + this.entityDataClient.createOrUpdateEntityEventually( + RequestContext.forTenantId(this.traceAttributeReader.getTenantId(span)), + entity, + upsertCondition, + this.writeThrottleDuration); } - private Maybe buildUpsertCondition(EntityType entityType, T trace, S span) { + private Maybe buildUpsertCondition( + EntityType entityType, StructuredTrace trace, Event span) { if (entityType.getTimestampAttributeKey().isEmpty()) { return Maybe.empty(); } @@ -106,7 +96,7 @@ private Maybe buildUpsertCondition(EntityType entityType, T tra } private Maybe buildUpsertCondition( - AttributeMetadata attribute, PredicateOperator operator, T trace, S span) { + AttributeMetadata attribute, PredicateOperator operator, StructuredTrace trace, Event span) { return this.traceAttributeReader .getSpanValue(trace, span, attribute.getScopeString(), attribute.getKey()) @@ -128,7 +118,7 @@ private Maybe buildUpsertCondition( .build()); } - private Maybe buildEntity(EntityType entityType, T trace, S span) { + private Maybe buildEntity(EntityType entityType, StructuredTrace trace, Event span) { Maybe> attributes = this.resolveAllAttributes(entityType.getAttributeScope(), trace, span).cache(); @@ -171,7 +161,8 @@ private boolean passesFormationCondition(Entity entity, EntityFormationCondition } } - private Maybe> resolveAllAttributes(String scope, T trace, S span) { + private Maybe> resolveAllAttributes( + String scope, StructuredTrace trace, Event span) { return spanTenantContext(span) .wrapSingle(() -> this.attributeClient.getAllInScope(scope)) .flattenAsObservable(list -> list) @@ -182,7 +173,7 @@ private Maybe> resolveAllAttributes(String scope, T } private Maybe> resolveAttribute( - AttributeMetadata attributeMetadata, T trace, S span) { + AttributeMetadata attributeMetadata, StructuredTrace trace, Event span) { return this.traceAttributeReader .getSpanValue(trace, span, attributeMetadata.getScopeString(), attributeMetadata.getKey()) .onErrorComplete() @@ -200,7 +191,7 @@ private Optional extractNonEmptyString( .filter(not(String::isEmpty)); } - private GrpcRxExecutionContext spanTenantContext(S span) { + private GrpcRxExecutionContext spanTenantContext(Event span) { return GrpcRxExecutionContext.forTenantContext(traceAttributeReader.getTenantId(span)); } diff --git a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityAccessor.java b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityAccessor.java new file mode 100644 index 000000000..5ea66a203 --- /dev/null +++ b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityAccessor.java @@ -0,0 +1,9 @@ +package org.hypertrace.trace.accessor.entities; + +import org.hypertrace.core.datamodel.Event; +import org.hypertrace.core.datamodel.StructuredTrace; + +public interface TraceEntityAccessor { + + void writeAssociatedEntitiesForSpanEventually(StructuredTrace trace, Event span); +} diff --git a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityReaderBuilder.java b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityAccessorBuilder.java similarity index 72% rename from hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityReaderBuilder.java rename to hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityAccessorBuilder.java index efcbc25ce..2f22f2398 100644 --- a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityReaderBuilder.java +++ b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityAccessorBuilder.java @@ -1,20 +1,18 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; import java.time.Duration; import org.hypertrace.core.attribute.service.cachingclient.CachingAttributeClient; -import org.hypertrace.core.datamodel.Event; -import org.hypertrace.core.datamodel.StructuredTrace; import org.hypertrace.entity.data.service.rxclient.EntityDataClient; import org.hypertrace.entity.type.service.rxclient.EntityTypeClient; import org.hypertrace.trace.reader.attributes.TraceAttributeReaderFactory; -public class TraceEntityReaderBuilder { +public class TraceEntityAccessorBuilder { private final EntityTypeClient entityTypeClient; private final EntityDataClient entityDataClient; private final CachingAttributeClient attributeClient; private Duration entityWriteThrottleDuration = Duration.ofSeconds(15); - public TraceEntityReaderBuilder( + public TraceEntityAccessorBuilder( EntityTypeClient entityTypeClient, EntityDataClient entityDataClient, CachingAttributeClient attributeClient) { @@ -23,13 +21,13 @@ public TraceEntityReaderBuilder( this.attributeClient = attributeClient; } - public TraceEntityReaderBuilder withEntityWriteThrottleDuration(Duration duration) { + public TraceEntityAccessorBuilder withEntityWriteThrottleDuration(Duration duration) { this.entityWriteThrottleDuration = duration; return this; } - public TraceEntityReader build() { - return new DefaultTraceEntityReader<>( + public TraceEntityAccessor build() { + return new DefaultTraceEntityAccessor( this.entityTypeClient, this.entityDataClient, this.attributeClient, diff --git a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityClientContext.java b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityClientContext.java similarity index 97% rename from hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityClientContext.java rename to hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityClientContext.java index e8930e006..31e9a26eb 100644 --- a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityClientContext.java +++ b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/accessor/entities/TraceEntityClientContext.java @@ -1,4 +1,4 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; import io.grpc.Channel; import org.hypertrace.core.attribute.service.cachingclient.CachingAttributeClient; diff --git a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityReader.java b/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityReader.java deleted file mode 100644 index c147ee1f0..000000000 --- a/hypertrace-trace-enricher/trace-reader/src/main/java/org/hypertrace/trace/reader/entities/TraceEntityReader.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.hypertrace.trace.reader.entities; - -import io.reactivex.rxjava3.core.Maybe; -import io.reactivex.rxjava3.core.Single; -import java.util.Map; -import org.apache.avro.generic.GenericRecord; -import org.hypertrace.entity.data.service.v1.Entity; - -public interface TraceEntityReader { - - Maybe getAssociatedEntityForSpan(String entityType, T trace, S span); - - Single> getAssociatedEntitiesForSpan(T trace, S span); -} diff --git a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AttributeValueConverterTest.java b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AttributeValueConverterTest.java similarity index 77% rename from hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AttributeValueConverterTest.java rename to hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AttributeValueConverterTest.java index 253bb7d2c..efdede23c 100644 --- a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AttributeValueConverterTest.java +++ b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AttributeValueConverterTest.java @@ -1,14 +1,14 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; +import static org.hypertrace.trace.accessor.entities.AttributeValueConverter.convertToAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.booleanAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.doubleAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.longAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.stringAttributeValue; import static org.hypertrace.trace.reader.attributes.LiteralValueUtil.booleanLiteral; import static org.hypertrace.trace.reader.attributes.LiteralValueUtil.doubleLiteral; import static org.hypertrace.trace.reader.attributes.LiteralValueUtil.longLiteral; import static org.hypertrace.trace.reader.attributes.LiteralValueUtil.stringLiteral; -import static org.hypertrace.trace.reader.entities.AttributeValueConverter.convertToAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.booleanAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.doubleAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.longAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.stringAttributeValue; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AttributeValueUtil.java b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AttributeValueUtil.java similarity index 98% rename from hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AttributeValueUtil.java rename to hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AttributeValueUtil.java index 18ad8b642..fff1c8b6c 100644 --- a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AttributeValueUtil.java +++ b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AttributeValueUtil.java @@ -1,4 +1,4 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; import java.util.Arrays; import java.util.List; diff --git a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AvroEntityConverterTest.java b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AvroEntityConverterTest.java similarity index 80% rename from hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AvroEntityConverterTest.java rename to hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AvroEntityConverterTest.java index 1f773f3b3..58b81d43b 100644 --- a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/AvroEntityConverterTest.java +++ b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/AvroEntityConverterTest.java @@ -1,18 +1,18 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.booleanAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.booleanListAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.doubleAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.doubleListAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.longAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.longListAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.stringAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.stringListAttributeValue; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.stringMapAttributeValue; +import static org.hypertrace.trace.accessor.entities.AvroEntityConverter.convertToAvroEntity; import static org.hypertrace.trace.reader.attributes.AvroUtil.buildAttributeValue; import static org.hypertrace.trace.reader.attributes.AvroUtil.buildAttributeValueList; import static org.hypertrace.trace.reader.attributes.AvroUtil.buildAttributeValueMap; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.booleanAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.booleanListAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.doubleAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.doubleListAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.longAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.longListAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.stringAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.stringListAttributeValue; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.stringMapAttributeValue; -import static org.hypertrace.trace.reader.entities.AvroEntityConverter.convertToAvroEntity; import static org.junit.jupiter.api.Assertions.assertEquals; import java.util.List; diff --git a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/DefaultTraceEntityReaderTest.java b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/DefaultTraceEntityAccessorTest.java similarity index 73% rename from hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/DefaultTraceEntityReaderTest.java rename to hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/DefaultTraceEntityAccessorTest.java index 4104397fd..8c2200ea1 100644 --- a/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/reader/entities/DefaultTraceEntityReaderTest.java +++ b/hypertrace-trace-enricher/trace-reader/src/test/java/org/hypertrace/trace/accessor/entities/DefaultTraceEntityAccessorTest.java @@ -1,14 +1,13 @@ -package org.hypertrace.trace.reader.entities; +package org.hypertrace.trace.accessor.entities; +import static org.hypertrace.trace.accessor.entities.AttributeValueUtil.longAttributeValue; import static org.hypertrace.trace.reader.attributes.AvroUtil.defaultedEventBuilder; import static org.hypertrace.trace.reader.attributes.AvroUtil.defaultedStructuredTraceBuilder; import static org.hypertrace.trace.reader.attributes.EntityUtil.buildAttributesWithKeyValues; import static org.hypertrace.trace.reader.attributes.LiteralValueUtil.longLiteral; import static org.hypertrace.trace.reader.attributes.LiteralValueUtil.stringLiteral; -import static org.hypertrace.trace.reader.entities.AttributeValueUtil.longAttributeValue; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -28,6 +27,7 @@ import org.hypertrace.core.attribute.service.v1.LiteralValue; import org.hypertrace.core.datamodel.Event; import org.hypertrace.core.datamodel.StructuredTrace; +import org.hypertrace.core.grpcutils.context.RequestContext; import org.hypertrace.entity.data.service.rxclient.EntityDataClient; import org.hypertrace.entity.data.service.v1.Entity; import org.hypertrace.entity.data.service.v1.MergeAndUpsertEntityRequest.UpsertCondition; @@ -40,11 +40,12 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.ArgumentMatcher; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @ExtendWith(MockitoExtension.class) -class DefaultTraceEntityReaderTest { +class DefaultTraceEntityAccessorTest { private static final String TENANT_ID = "tenant-id"; private static final String TEST_ENTITY_TYPE_NAME = "ENTITY_TYPE_1"; private static final String TEST_ENTITY_ID_ATTRIBUTE_KEY = "id"; @@ -94,107 +95,75 @@ class DefaultTraceEntityReaderTest { TEST_ENTITY_ID_ATTRIBUTE_KEY, TEST_ENTITY_ID_ATTRIBUTE_VALUE, TEST_ENTITY_NAME_ATTRIBUTE_KEY, TEST_ENTITY_NAME_ATTRIBUTE_VALUE))) .build(); + private static final ArgumentMatcher MATCHING_TENANT_REQUEST_CONTEXT = + arg -> + arg.buildContextualKey() + .equals(RequestContext.forTenantId(TENANT_ID).buildContextualKey()); + private static final Duration DEFAULT_DURATION = Duration.ofSeconds(15); @Mock EntityTypeClient mockTypeClient; @Mock EntityDataClient mockDataClient; @Mock CachingAttributeClient mockAttributeClient; @Mock TraceAttributeReader mockAttributeReader; - private DefaultTraceEntityReader entityReader; + private DefaultTraceEntityAccessor entityAccessor; @BeforeEach void beforeEach() { - this.entityReader = - new DefaultTraceEntityReader<>( + this.entityAccessor = + new DefaultTraceEntityAccessor( this.mockTypeClient, this.mockDataClient, this.mockAttributeClient, this.mockAttributeReader, - Duration.ofSeconds(15)); + DEFAULT_DURATION); } @Test - void canReadAnEntity() { - mockSingleEntityType(); - mockGetAllAttributes(TEST_ENTITY_ID_ATTRIBUTE, TEST_ENTITY_NAME_ATTRIBUTE); - mockTenantId(); - mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, stringLiteral(TEST_ENTITY_ID_ATTRIBUTE_VALUE)); - mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); - mockEntityUpsert(); - - assertEquals( - EXPECTED_ENTITY, - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .blockingGet()); - } - - @Test - void canReadAllEntities() { + void canWriteAllEntities() { mockAllEntityTypes(); mockGetAllAttributes(TEST_ENTITY_ID_ATTRIBUTE, TEST_ENTITY_NAME_ATTRIBUTE); mockTenantId(); mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, stringLiteral(TEST_ENTITY_ID_ATTRIBUTE_VALUE)); mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); - mockEntityUpsert(); - assertEquals( - Map.of(TEST_ENTITY_TYPE_NAME, EXPECTED_ENTITY), - this.entityReader.getAssociatedEntitiesForSpan(TEST_TRACE, TEST_SPAN).blockingGet()); + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(TEST_TRACE, TEST_SPAN); + + verify(mockDataClient, times(1)) + .createOrUpdateEntityEventually( + argThat(MATCHING_TENANT_REQUEST_CONTEXT), + eq(EXPECTED_ENTITY), + eq(UpsertCondition.getDefaultInstance()), + eq(DEFAULT_DURATION)); } @Test void omitsEntityBasedOnMissingAttributes() { - mockSingleEntityType(); + mockAllEntityTypes(); mockGetAllAttributes(TEST_ENTITY_ID_ATTRIBUTE, TEST_ENTITY_NAME_ATTRIBUTE); mockTenantId(); mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, LiteralValue.getDefaultInstance()); mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); - assertTrue( - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .isEmpty() - .blockingGet()); + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(TEST_TRACE, TEST_SPAN); verifyNoInteractions(mockDataClient); } @Test void omitsEntityBasedOnEmptyId() { - mockSingleEntityType(); + mockAllEntityTypes(); mockGetAllAttributes(TEST_ENTITY_ID_ATTRIBUTE, TEST_ENTITY_NAME_ATTRIBUTE); mockTenantId(); mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, stringLiteral("")); mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); - assertTrue( - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .isEmpty() - .blockingGet()); + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(TEST_TRACE, TEST_SPAN); verifyNoInteractions(mockDataClient); } - @Test - void omitsUpsertConditionIfNoTimestampAttributeDefined() { - mockSingleEntityType(); - mockGetAllAttributes(TEST_ENTITY_ID_ATTRIBUTE, TEST_ENTITY_NAME_ATTRIBUTE); - mockTenantId(); - mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, stringLiteral(TEST_ENTITY_ID_ATTRIBUTE_VALUE)); - mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); - mockEntityUpsert(); - - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .blockingSubscribe(); - - verify(mockDataClient, times(1)) - .createOrUpdateEntityEventually(any(), eq(UpsertCondition.getDefaultInstance()), any()); - } - @Test void includesUpsertConditionIfTimestampAttributeDefined() { - mockSingleEntityType( + mockAllEntityTypes( TEST_ENTITY_TYPE.toBuilder() .setTimestampAttributeKey(TEST_ENTITY_TIMESTAMP_ATTRIBUTE_KEY) .build()); @@ -205,11 +174,8 @@ void includesUpsertConditionIfTimestampAttributeDefined() { mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, stringLiteral(TEST_ENTITY_ID_ATTRIBUTE_VALUE)); mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); mockAttributeRead(TEST_ENTITY_TIMESTAMP_ATTRIBUTE, longLiteral(30)); - mockEntityUpsert(); - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .blockingSubscribe(); + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(TEST_TRACE, TEST_SPAN); UpsertCondition expectedCondition = UpsertCondition.newBuilder() @@ -221,14 +187,21 @@ void includesUpsertConditionIfTimestampAttributeDefined() { .build()) .build(); verify(mockDataClient, times(1)) - .createOrUpdateEntityEventually(any(), eq(expectedCondition), any()); + .createOrUpdateEntityEventually( + argThat(MATCHING_TENANT_REQUEST_CONTEXT), + eq( + EXPECTED_ENTITY.toBuilder() + .putAttributes(TEST_ENTITY_TIMESTAMP_ATTRIBUTE_KEY, longAttributeValue(30)) + .build()), + eq(expectedCondition), + eq(DEFAULT_DURATION)); } @Test void enforceFormationConditions() { AttributeMetadata otherAttribute = TEST_ENTITY_NAME_ATTRIBUTE.toBuilder().setKey("other").build(); - mockSingleEntityType( + mockAllEntityTypes( TEST_ENTITY_TYPE.toBuilder() .addRequiredConditions( EntityFormationCondition.newBuilder() @@ -237,47 +210,38 @@ void enforceFormationConditions() { .build()); mockGetAllAttributes(TEST_ENTITY_ID_ATTRIBUTE, TEST_ENTITY_NAME_ATTRIBUTE, otherAttribute); mockTenantId(); - mockEntityUpsert(); mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, stringLiteral(TEST_ENTITY_ID_ATTRIBUTE_VALUE)); mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); mockAttributeReadError(otherAttribute); // No "other" attribute, should not form entity - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .blockingSubscribe(); - + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(TEST_TRACE, TEST_SPAN); verifyNoInteractions(mockDataClient); // Now add "other" mockAttributeRead(otherAttribute, stringLiteral("other-value")); - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .blockingSubscribe(); + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(TEST_TRACE, TEST_SPAN); - verify(mockDataClient, times(1)).createOrUpdateEntityEventually(any(), any(), any()); + verify(mockDataClient, times(1)).createOrUpdateEntityEventually(any(), any(), any(), any()); } @Test void skipsUnsetFormationConditions() { - mockSingleEntityType( + mockAllEntityTypes( TEST_ENTITY_TYPE.toBuilder() .addRequiredConditions(EntityFormationCondition.newBuilder()) .build()); mockGetAllAttributes(TEST_ENTITY_ID_ATTRIBUTE, TEST_ENTITY_NAME_ATTRIBUTE); mockTenantId(); - mockEntityUpsert(); mockAttributeRead(TEST_ENTITY_ID_ATTRIBUTE, stringLiteral(TEST_ENTITY_ID_ATTRIBUTE_VALUE)); mockAttributeRead(TEST_ENTITY_NAME_ATTRIBUTE, stringLiteral(TEST_ENTITY_NAME_ATTRIBUTE_VALUE)); - this.entityReader - .getAssociatedEntityForSpan(TEST_ENTITY_TYPE_NAME, TEST_TRACE, TEST_SPAN) - .blockingSubscribe(); + this.entityAccessor.writeAssociatedEntitiesForSpanEventually(TEST_TRACE, TEST_SPAN); - verify(mockDataClient, times(1)).createOrUpdateEntityEventually(any(), any(), any()); + verify(mockDataClient, times(1)).createOrUpdateEntityEventually(any(), any(), any(), any()); } private void mockTenantId() { @@ -296,12 +260,6 @@ private void mockAttributeReadError(AttributeMetadata attributeMetadata) { .thenReturn(Single.error(new NoSuchElementException())); } - private void mockEntityUpsert() { - when(this.mockDataClient.createOrUpdateEntityEventually( - any(Entity.class), any(UpsertCondition.class), any(Duration.class))) - .thenAnswer(invocation -> Single.just(invocation.getArgument(0))); - } - private void mockGetAllAttributes(AttributeMetadata... attributeMetadata) { when(this.mockAttributeClient.getAllInScope(TEST_ENTITY_TYPE_NAME)) .thenReturn(Single.just(Arrays.asList(attributeMetadata))); @@ -313,15 +271,11 @@ private void mockGetSingleAttribute(AttributeMetadata attributeMetadata) { .thenReturn(Single.just(attributeMetadata)); } - private void mockSingleEntityType() { - mockSingleEntityType(TEST_ENTITY_TYPE); - } - - private void mockSingleEntityType(EntityType entityType) { - when(this.mockTypeClient.get(entityType.getName())).thenReturn(Single.just(entityType)); + private void mockAllEntityTypes(EntityType entityType) { + when(this.mockTypeClient.getAll()).thenReturn(Observable.just(entityType)); } private void mockAllEntityTypes() { - when(this.mockTypeClient.getAll()).thenReturn(Observable.just(TEST_ENTITY_TYPE)); + mockAllEntityTypes(TEST_ENTITY_TYPE); } } diff --git a/hypertrace-view-generator/hypertrace-view-generator/build.gradle.kts b/hypertrace-view-generator/hypertrace-view-generator/build.gradle.kts index 108de3c45..bc038aa4d 100644 --- a/hypertrace-view-generator/hypertrace-view-generator/build.gradle.kts +++ b/hypertrace-view-generator/hypertrace-view-generator/build.gradle.kts @@ -36,7 +36,7 @@ dependencies { implementation("org.hypertrace.core.datamodel:data-model:0.1.18") implementation("org.hypertrace.core.serviceframework:platform-metrics:0.1.26") - implementation("org.hypertrace.entity.service:entity-service-api:0.6.10") + implementation("org.hypertrace.entity.service:entity-service-api:0.8.0") implementation("org.apache.avro:avro:1.10.2") implementation("org.apache.commons:commons-lang3:3.12.0") diff --git a/semantic-convention-utils/build.gradle.kts b/semantic-convention-utils/build.gradle.kts index 860b157ef..65582dc0e 100644 --- a/semantic-convention-utils/build.gradle.kts +++ b/semantic-convention-utils/build.gradle.kts @@ -12,7 +12,7 @@ dependencies { implementation(project(":span-normalizer:span-normalizer-constants")) implementation("org.hypertrace.core.datamodel:data-model:0.1.18") - implementation("org.hypertrace.entity.service:entity-service-client:0.6.10") + implementation("org.hypertrace.entity.service:entity-service-client:0.8.0") implementation("org.apache.commons:commons-lang3:3.12.0") testImplementation("org.junit.jupiter:junit-jupiter:5.7.1")