Skip to content
This repository was archived by the owner on Jun 26, 2024. It is now read-only.
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
6 changes: 3 additions & 3 deletions gateway-service-api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ protobuf {
// the identifier, which can be referred to in the "plugins"
// container of the "generateProtoTasks" closure.
id("grpc_java") {
artifact = "io.grpc:protoc-gen-grpc-java:1.42.0"
artifact = "io.grpc:protoc-gen-grpc-java:1.43.1"
}
}
generateProtoTasks {
Expand All @@ -47,9 +47,9 @@ sourceSets {
}

dependencies {
api("io.grpc:grpc-protobuf:1.42.0")
api("io.grpc:grpc-protobuf:1.43.1")
api("com.google.api.grpc:proto-google-common-protos:2.3.2")
api("io.grpc:grpc-stub:1.42.0")
api("io.grpc:grpc-stub:1.43.1")
api("javax.annotation:javax.annotation-api:1.3.2")

constraints {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ message Expression {
FunctionExpression function = 3;
OrderByExpression orderBy = 4;
HealthExpression health = 5;
AttributeExpression attribute_expression = 6;
}
}

Expand Down Expand Up @@ -181,3 +182,9 @@ message Row {
// key is column_name from metadata
map<string, Value> columns = 1;
}

message AttributeExpression {
string attributeId = 1;
optional string subpath = 2;
optional string alias = 3;
}
8 changes: 4 additions & 4 deletions gateway-service-impl/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@ dependencies {
api(project(":gateway-service-api"))
api(project(":gateway-service-baseline-lib"))

implementation("org.hypertrace.core.query.service:query-service-client:0.6.2")
implementation("org.hypertrace.core.query.service:query-service-client:0.7.0")
implementation("org.hypertrace.core.attribute.service:attribute-service-client:0.12.5")
implementation("org.hypertrace.entity.service:entity-service-client:0.8.11")
implementation("org.hypertrace.entity.service:entity-service-api:0.8.11")
implementation("org.hypertrace.core.grpcutils:grpc-context-utils:0.6.2")
implementation("org.hypertrace.core.grpcutils:grpc-context-utils:0.7.0")
implementation("org.hypertrace.core.serviceframework:platform-metrics:0.1.29")

// Config
Expand All @@ -33,6 +33,6 @@ dependencies {
testImplementation("org.junit.jupiter:junit-jupiter:5.7.0")
testImplementation("org.mockito:mockito-core:3.9.0")
testImplementation("org.mockito:mockito-inline:3.9.0")
testImplementation("org.apache.logging.log4j:log4j-slf4j-impl:2.17.0")
testImplementation("io.grpc:grpc-netty:1.42.0")
testImplementation("org.apache.logging.log4j:log4j-slf4j-impl:2.17.1")
testImplementation("io.grpc:grpc-netty:1.43.1")
}
Original file line number Diff line number Diff line change
Expand Up @@ -189,9 +189,8 @@ public void getSpans(
public void getEntities(
org.hypertrace.gateway.service.v1.entity.EntitiesRequest request,
StreamObserver<org.hypertrace.gateway.service.v1.entity.EntitiesResponse> responseObserver) {
if (LOG.isDebugEnabled()) {
LOG.debug("Received request: {}", request);
}

LOG.debug("Received request: {}", request);

Optional<String> tenantId =
org.hypertrace.core.grpcutils.context.RequestContext.CURRENT.get().getTenantId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ public QueryRequest getQueryRequest(

builder.addAllGroupBy(
entityIdAttributes.stream()
.map(QueryRequestUtil::createColumnExpression)
.map(QueryRequestUtil::createAttributeExpression)
.collect(Collectors.toList()));

builder.addGroupBy(createTimeColumnGroupByExpression(timeColumn, periodSecs));
Expand Down Expand Up @@ -167,7 +167,7 @@ public BaselineEntitiesResponse parseQueryResponse(

Value convertedValue =
QueryAndGatewayDtoConverter.convertToGatewayValueForMetricValue(
MetricAggregationFunctionUtil.getValueTypeFromFunction(
MetricAggregationFunctionUtil.getValueTypeForFunctionType(
timeAggregation.getAggregation(), attributeMetadataMap),
attributeMetadataMap,
metadata,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class QueryRequestContext extends RequestContext {
private final Map<String, FunctionExpression> aliasToFunctionExpressionMap = new HashMap<>();
private final long startTimeMillis;
private final long endTimeMillis;
private final Map<String, TimeAggregation> aliasToTimeAggregation = new HashMap();
private final Map<String, TimeAggregation> aliasToTimeAggregation = new HashMap<>();

public QueryRequestContext(
String tenantId, long startTimeMillis, long endTimeMillis, Map<String, String> headers) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.Comparator;
import java.util.List;
import org.hypertrace.gateway.service.common.util.MetricAggregationFunctionUtil;
import org.hypertrace.gateway.service.common.util.ExpressionReader;
import org.hypertrace.gateway.service.v1.common.OrderByExpression;
import org.hypertrace.gateway.service.v1.common.SortOrder;

Expand Down Expand Up @@ -37,28 +37,33 @@ public OrderByComparator(List<OrderByExpression> orderByList) {
@Override
public int compare(T o1, T o2) {
for (OrderByExpression orderBy : orderByList) {

// Check if we need to order by an aggregated metric.
switch (orderBy.getExpression().getValueCase()) {
case FUNCTION:
org.hypertrace.gateway.service.v1.common.FunctionExpression function =
orderBy.getExpression().getFunction();
String alias = MetricAggregationFunctionUtil.getAggregationFunctionAlias(function);
int value = compareFunctionExpressionValues(o1, o2, alias);
if (value == 0) {
int functionComparisonResult =
compareFunctionExpressionValues(
o1,
o2,
ExpressionReader.getSelectionResultName(orderBy.getExpression()).orElseThrow());
if (functionComparisonResult == 0) {
continue;
}
return orderBy.getOrder() == SortOrder.ASC ? value : Math.negateExact(value);
return orderBy.getOrder() == SortOrder.ASC
? functionComparisonResult
: Math.negateExact(functionComparisonResult);

case COLUMNIDENTIFIER:
// Otherwise, this is either a simple attribute/metric or entity name itself.
String attr = orderBy.getExpression().getColumnIdentifier().getColumnName();
value = compareColumnExpressionValues(o1, o2, attr);
if (value == 0) {
case ATTRIBUTE_EXPRESSION:
int selectionComparisonResult =
compareColumnExpressionValues(
o1,
o2,
ExpressionReader.getSelectionResultName(orderBy.getExpression()).orElseThrow());
if (selectionComparisonResult == 0) {
continue;
}
return orderBy.getOrder() == SortOrder.ASC ? value : Math.negateExact(value);

return orderBy.getOrder() == SortOrder.ASC
? selectionComparisonResult
: Math.negateExact(selectionComparisonResult);
default:
throw new IllegalArgumentException(
"Invalid orderBy: " + orderBy.getExpression().getValueCase());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

public class ScopeFilterConfig {
private final String scope;
private final List<ScopeFilter> scopeFilters;
private final List<ScopeFilter<String>> scopeFilters;

public ScopeFilterConfig(String scope, List<ScopeFilter> scopeFilters) {
public ScopeFilterConfig(String scope, List<ScopeFilter<String>> scopeFilters) {
this.scope = scope;
this.scopeFilters = scopeFilters;
}
Expand All @@ -15,7 +15,7 @@ public String getScope() {
return scope;
}

public List<ScopeFilter> getScopeFilters() {
public List<ScopeFilter<String>> getScopeFilters() {
return scopeFilters;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,9 @@
import org.hypertrace.core.attribute.service.v1.AttributeMetadata;
import org.hypertrace.gateway.service.common.AttributeMetadataProvider;
import org.hypertrace.gateway.service.common.RequestContext;
import org.hypertrace.gateway.service.v1.common.ColumnIdentifier;
import org.hypertrace.gateway.service.v1.common.Expression;
import org.hypertrace.gateway.service.common.util.QueryExpressionUtil;
import org.hypertrace.gateway.service.v1.common.Filter;
import org.hypertrace.gateway.service.v1.common.LiteralConstant;
import org.hypertrace.gateway.service.v1.common.Operator;
import org.hypertrace.gateway.service.v1.common.Value;
import org.hypertrace.gateway.service.v1.common.ValueType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -69,10 +65,10 @@ private void addScopeFilterConfig(Config config) {
String attributeScope = config.getString(SCOPE_CONFIG);
List<? extends Config> filterConfigsList = config.getConfigList(FILTERS_CONFIG);
try {
List<ScopeFilter> scopeFilters =
List<ScopeFilter<String>> scopeFilters =
filterConfigsList.stream()
.map(
(filterConfig) ->
filterConfig ->
new ScopeFilter<>(
filterConfig.getString(SCOPE_CONFIG),
filterConfig.getString(FILTER_KEY_CONFIG),
Expand Down Expand Up @@ -119,35 +115,23 @@ private Filter.Builder createScopeFilter(
scopeFilterConfig
.getScopeFilters()
.forEach(
(scopeFilter ->
scopeFilter ->
filterBuilder.addChildFilter(
createScopeChildFilter(
scopeFilter, attributeMetadataProvider, requestContext))));
scopeFilter, attributeMetadataProvider, requestContext)));

return filterBuilder;
}

private Filter.Builder createScopeChildFilter(
ScopeFilter scopeFilter,
private Filter createScopeChildFilter(
ScopeFilter<String> scopeFilter,
AttributeMetadataProvider attributeMetadataProvider,
RequestContext requestContext) {
AttributeMetadata attributeMetadata =
attributeMetadataProvider
.getAttributeMetadata(requestContext, scopeFilter.getScope(), scopeFilter.getKey())
.orElseThrow();
return Filter.newBuilder()
.setLhs(
Expression.newBuilder()
.setColumnIdentifier(
ColumnIdentifier.newBuilder().setColumnName(attributeMetadata.getId())))
.setOperator(scopeFilter.getOperator())
.setRhs(
Expression.newBuilder()
.setLiteral(
LiteralConstant.newBuilder()
.setValue(
Value.newBuilder()
.setValueType(ValueType.STRING)
.setString((String) scopeFilter.getFilterValue()))));
return QueryExpressionUtil.buildStringFilter(
attributeMetadata.getId(), scopeFilter.getOperator(), scopeFilter.getFilterValue());
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.hypertrace.gateway.service.common.converters;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.hypertrace.core.attribute.service.v1.AttributeMetadata;
import org.hypertrace.entity.query.service.v1.BulkEntityArrayAttributeUpdateRequest.Operation;
Expand All @@ -18,8 +17,10 @@
import org.hypertrace.entity.query.service.v1.ValueType;
import org.hypertrace.gateway.service.common.AttributeMetadataProvider;
import org.hypertrace.gateway.service.common.util.AttributeMetadataUtil;
import org.hypertrace.gateway.service.common.util.ExpressionReader;
import org.hypertrace.gateway.service.entity.EntitiesRequestContext;
import org.hypertrace.gateway.service.entity.config.TimestampConfigs;
import org.hypertrace.gateway.service.v1.common.AttributeExpression;
import org.hypertrace.gateway.service.v1.entity.EntitiesRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -128,6 +129,10 @@ public static Expression.Builder convertToEntityServiceExpression(
builder.setColumnIdentifier(
convertToQueryColumnIdentifier(expression.getColumnIdentifier()));
break;
case ATTRIBUTE_EXPRESSION:
builder.setColumnIdentifier(
convertToQueryColumnIdentifier(expression.getAttributeExpression()));
break;
case FUNCTION:
builder.setFunction(convertToQueryFunction(expression.getFunction()));
break;
Expand All @@ -151,6 +156,20 @@ public static ColumnIdentifier.Builder convertToQueryColumnIdentifier(
.setAlias(columnIdentifier.getAlias());
}

public static ColumnIdentifier convertToQueryColumnIdentifier(
AttributeExpression attributeExpression) {
if (attributeExpression.hasSubpath()) {
throw new IllegalArgumentException(
"Attribute expression with subpath not supported by entity service "
+ attributeExpression.toString());
}

return ColumnIdentifier.newBuilder()
.setColumnName(attributeExpression.getAttributeId())
.setAlias(attributeExpression.getAlias())
.build();
}

public static LiteralConstant convertToQueryLiteral(
org.hypertrace.gateway.service.v1.common.LiteralConstant literal) {
return LiteralConstant.newBuilder()
Expand Down Expand Up @@ -186,7 +205,7 @@ private static Function convertToQueryFunction(
// percentile.
List<org.hypertrace.gateway.service.v1.common.Expression> columns =
function.getArgumentsList().stream()
.filter(org.hypertrace.gateway.service.v1.common.Expression::hasColumnIdentifier)
.filter(ExpressionReader::isAttributeSelection)
.collect(Collectors.toList());
columns.forEach(e -> builder.addArguments(convertToEntityServiceExpression(e)));
break;
Expand Down Expand Up @@ -284,16 +303,6 @@ public static Expression.Builder createColumnExpression(String columnName) {
.setColumnIdentifier(ColumnIdentifier.newBuilder().setColumnName(columnName));
}

public static org.hypertrace.gateway.service.v1.common.Value convertToGatewayValue(
String attributeName, Value value, Map<String, AttributeMetadata> attributeMetadataMap) {
AttributeMetadata attributeMetadata = attributeMetadataMap.get(attributeName);
if (null == attributeMetadata) {
LOG.warn("No attribute metadata found for {}", attributeName);
return convertQueryValueToGatewayValue(value);
}
return convertQueryValueToGatewayValue(value, attributeMetadata);
}

public static org.hypertrace.gateway.service.v1.common.Value convertQueryValueToGatewayValue(
Value value) {
org.hypertrace.gateway.service.v1.common.Value.Builder builder =
Expand Down
Loading