Skip to content

Commit f50426a

Browse files
add in operator and segment matching based config
1 parent a03e544 commit f50426a

14 files changed

+196
-39
lines changed

hypertrace-graphql-platform/build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ dependencies {
1313
api("org.hypertrace.config.service:spaces-config-service-api:0.1.1")
1414
api("org.hypertrace.config.service:labels-config-service-api:0.1.15")
1515
api("org.hypertrace.config.service:label-application-rule-config-service-api:0.1.16")
16-
api("org.hypertrace.config.service:span-processing-config-service-api:0.1.26")
16+
api("org.hypertrace.config.service:span-processing-config-service-api:0.1.27")
1717
}
1818
}

hypertrace-graphql-span-processing-schema/src/main/java/org/hypertrace/graphql/spanprocessing/dao/ConfigServiceSpanFilterConverter.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRelationalOperator;
1616
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRuleFilter;
1717
import org.hypertrace.span.processing.config.service.v1.Field;
18+
import org.hypertrace.span.processing.config.service.v1.ListValue;
1819
import org.hypertrace.span.processing.config.service.v1.LogicalOperator;
1920
import org.hypertrace.span.processing.config.service.v1.LogicalSpanFilterExpression;
2021
import org.hypertrace.span.processing.config.service.v1.RelationalOperator;
@@ -56,6 +57,7 @@ public class ConfigServiceSpanFilterConverter {
5657
.put(
5758
RelationalOperator.RELATIONAL_OPERATOR_REGEX_MATCH,
5859
SpanProcessingRelationalOperator.REGEX_MATCH)
60+
.put(RelationalOperator.RELATIONAL_OPERATOR_IN, SpanProcessingRelationalOperator.IN)
5961
.build();
6062

6163
private static final ImmutableBiMap<SpanProcessingRelationalOperator, RelationalOperator>
@@ -148,11 +150,19 @@ private Object convertSpanFilterValue(SpanFilterValue spanFilterValue) {
148150
switch (spanFilterValue.getValueCase()) {
149151
case STRING_VALUE:
150152
return spanFilterValue.getStringValue();
153+
case LIST_VALUE:
154+
return convertListSpanFilterValue(spanFilterValue.getListValue());
151155
default:
152156
throw new NoSuchElementException("Unsupported right operand type");
153157
}
154158
}
155159

160+
private Object convertListSpanFilterValue(ListValue value) {
161+
return value.getValuesList().stream()
162+
.map(this::convertSpanFilterValue)
163+
.collect(Collectors.toUnmodifiableList());
164+
}
165+
156166
private RelationalSpanFilterExpression convertRelationalFilter(
157167
SpanProcessingRelationalFilter spanProcessingRelationalFilter) {
158168
RelationalSpanFilterExpression.Builder relationalSpanFilterExpressionBuilder =
@@ -180,10 +190,23 @@ private SpanFilterValue convertToSpanFilterValue(Object value) {
180190
SpanFilterValue.Builder spanFilterValueBuilder = SpanFilterValue.newBuilder();
181191
if (String.class.equals(value.getClass())) {
182192
spanFilterValueBuilder = spanFilterValueBuilder.setStringValue(value.toString());
193+
} else if (List.class.equals(value.getClass())) {
194+
spanFilterValueBuilder =
195+
spanFilterValueBuilder.setListValue(convertToListSpanFilterValue(value));
183196
}
184197
return spanFilterValueBuilder.build();
185198
}
186199

200+
private ListValue convertToListSpanFilterValue(Object value) {
201+
List<Object> objectList = (List<Object>) value;
202+
return ListValue.newBuilder()
203+
.addAllValues(
204+
objectList.stream()
205+
.map(this::convertToSpanFilterValue)
206+
.collect(Collectors.toUnmodifiableList()))
207+
.build();
208+
}
209+
187210
@Value
188211
@Accessors(fluent = true)
189212
private static class ConvertedSpanProcessingRelationalFilter

hypertrace-graphql-span-processing-schema/src/main/java/org/hypertrace/graphql/spanprocessing/dao/ConfigServiceSpanProcessingRequestConverter.java

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.hypertrace.graphql.spanprocessing.dao;
22

3+
import java.util.NoSuchElementException;
34
import javax.inject.Inject;
45
import org.hypertrace.graphql.spanprocessing.request.mutation.ApiNamingCreateRuleRequest;
56
import org.hypertrace.graphql.spanprocessing.request.mutation.ApiNamingDeleteRuleRequest;
@@ -18,6 +19,7 @@
1819
import org.hypertrace.span.processing.config.service.v1.DeleteApiNamingRuleRequest;
1920
import org.hypertrace.span.processing.config.service.v1.DeleteExcludeSpanRuleRequest;
2021
import org.hypertrace.span.processing.config.service.v1.ExcludeSpanRuleInfo;
22+
import org.hypertrace.span.processing.config.service.v1.SegmentMatchingBasedConfig;
2123
import org.hypertrace.span.processing.config.service.v1.UpdateApiNamingRule;
2224
import org.hypertrace.span.processing.config.service.v1.UpdateApiNamingRuleRequest;
2325
import org.hypertrace.span.processing.config.service.v1.UpdateExcludeSpanRule;
@@ -77,14 +79,27 @@ private org.hypertrace.span.processing.config.service.v1.ApiNamingRuleInfo conve
7779
.setName(apiNamingRuleCreate.name())
7880
.setFilter(this.filterConverter.convert(apiNamingRuleCreate.spanFilter()))
7981
.setDisabled(apiNamingRuleCreate.disabled())
80-
.setRuleConfig(
81-
ApiNamingRuleConfig.newBuilder()
82-
.setRegex(apiNamingRuleCreate.regex())
83-
.setValue(apiNamingRuleCreate.value())
84-
.build())
82+
.setRuleConfig(convertRuleConfig(apiNamingRuleCreate.apiNamingRuleConfig()))
8583
.build();
8684
}
8785

86+
private ApiNamingRuleConfig convertRuleConfig(
87+
org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfig apiNamingRuleConfig) {
88+
switch (apiNamingRuleConfig.apiNamingRuleConfigType()) {
89+
case SEGMENT_MATCHING:
90+
return ApiNamingRuleConfig.newBuilder()
91+
.setSegmentMatchingBasedConfig(
92+
SegmentMatchingBasedConfig.newBuilder()
93+
.addAllRegexes(apiNamingRuleConfig.segmentMatchingBasedRuleConfig().regexes())
94+
.addAllValues(apiNamingRuleConfig.segmentMatchingBasedRuleConfig().values())
95+
.build())
96+
.build();
97+
default:
98+
throw new NoSuchElementException(
99+
"Unsupported api naming rule config type: " + apiNamingRuleConfig);
100+
}
101+
}
102+
88103
UpdateApiNamingRuleRequest convert(ApiNamingUpdateRuleRequest request) {
89104
return UpdateApiNamingRuleRequest.newBuilder()
90105
.setRule(convertInput(request.updateInput()))
@@ -97,11 +112,7 @@ private UpdateApiNamingRule convertInput(ApiNamingRuleUpdate apiNamingRuleUpdate
97112
.setName(apiNamingRuleUpdate.name())
98113
.setFilter(this.filterConverter.convert(apiNamingRuleUpdate.spanFilter()))
99114
.setDisabled(apiNamingRuleUpdate.disabled())
100-
.setRuleConfig(
101-
ApiNamingRuleConfig.newBuilder()
102-
.setRegex(apiNamingRuleUpdate.regex())
103-
.setValue(apiNamingRuleUpdate.value())
104-
.build())
115+
.setRuleConfig(convertRuleConfig(apiNamingRuleUpdate.apiNamingRuleConfig()))
105116
.build();
106117
}
107118

hypertrace-graphql-span-processing-schema/src/main/java/org/hypertrace/graphql/spanprocessing/dao/ConfigServiceSpanProcessingRuleConverter.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@
22

33
import io.reactivex.rxjava3.core.Single;
44
import java.time.Instant;
5+
import java.util.List;
6+
import java.util.NoSuchElementException;
57
import javax.inject.Inject;
68
import lombok.Value;
79
import lombok.experimental.Accessors;
810
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRule;
11+
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfig;
12+
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfigType;
913
import org.hypertrace.graphql.spanprocessing.schema.rule.ExcludeSpanRule;
14+
import org.hypertrace.graphql.spanprocessing.schema.rule.SegmentMatchingBasedRuleConfig;
1015
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRuleFilter;
1116
import org.hypertrace.span.processing.config.service.v1.ApiNamingRuleDetails;
17+
import org.hypertrace.span.processing.config.service.v1.SegmentMatchingBasedConfig;
1218

1319
class ConfigServiceSpanProcessingRuleConverter {
1420

@@ -48,8 +54,7 @@ public Single<ApiNamingRule> convert(ApiNamingRuleDetails ruleDetails) {
4854
ruleDetails.getRule().getRuleInfo().getName(),
4955
spanProcessingRuleFilter,
5056
ruleDetails.getRule().getRuleInfo().getDisabled(),
51-
ruleDetails.getRule().getRuleInfo().getRuleConfig().getRegex(),
52-
ruleDetails.getRule().getRuleInfo().getRuleConfig().getValue(),
57+
convertApiNamingRuleConfig(ruleDetails.getRule().getRuleInfo().getRuleConfig()),
5358
Instant.ofEpochSecond(
5459
ruleDetails.getMetadata().getCreationTimestamp().getSeconds(),
5560
ruleDetails.getMetadata().getCreationTimestamp().getNanos()),
@@ -58,6 +63,22 @@ public Single<ApiNamingRule> convert(ApiNamingRuleDetails ruleDetails) {
5863
ruleDetails.getMetadata().getLastUpdatedTimestamp().getNanos())));
5964
}
6065

66+
private ApiNamingRuleConfig convertApiNamingRuleConfig(
67+
org.hypertrace.span.processing.config.service.v1.ApiNamingRuleConfig apiNamingRuleConfig) {
68+
switch (apiNamingRuleConfig.getRuleConfigCase()) {
69+
case SEGMENT_MATCHING_BASED_CONFIG:
70+
SegmentMatchingBasedConfig segmentMatchingBasedConfig =
71+
apiNamingRuleConfig.getSegmentMatchingBasedConfig();
72+
return new ConvertedApiNamingRuleConfig(
73+
ApiNamingRuleConfigType.SEGMENT_MATCHING,
74+
new ConvertedSegmentMatchingBasedRuleConfig(
75+
segmentMatchingBasedConfig.getRegexesList(),
76+
segmentMatchingBasedConfig.getValuesList()));
77+
default:
78+
throw new NoSuchElementException("Unsupported Rule config type: " + apiNamingRuleConfig);
79+
}
80+
}
81+
6182
@Value
6283
@Accessors(fluent = true)
6384
private static class ConvertedExcludeSpanRule implements ExcludeSpanRule {
@@ -76,9 +97,23 @@ private static class ConvertedApiNamingRule implements ApiNamingRule {
7697
String name;
7798
SpanProcessingRuleFilter spanFilter;
7899
boolean disabled;
79-
String regex;
80-
String value;
100+
ApiNamingRuleConfig apiNamingRuleConfig;
81101
Instant creationTime;
82102
Instant lastUpdatedTime;
83103
}
104+
105+
@Value
106+
@Accessors(fluent = true)
107+
private static class ConvertedApiNamingRuleConfig implements ApiNamingRuleConfig {
108+
ApiNamingRuleConfigType apiNamingRuleConfigType;
109+
SegmentMatchingBasedRuleConfig segmentMatchingBasedRuleConfig;
110+
}
111+
112+
@Value
113+
@Accessors(fluent = true)
114+
private static class ConvertedSegmentMatchingBasedRuleConfig
115+
implements SegmentMatchingBasedRuleConfig {
116+
List<String> regexes;
117+
List<String> values;
118+
}
84119
}

hypertrace-graphql-span-processing-schema/src/main/java/org/hypertrace/graphql/spanprocessing/deserialization/ApiNamingCreateInputDeserializationConfig.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import lombok.extern.jackson.Jacksonized;
1010
import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig;
1111
import org.hypertrace.graphql.spanprocessing.schema.mutation.ApiNamingRuleCreate;
12+
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfig;
13+
import org.hypertrace.graphql.spanprocessing.schema.rule.SegmentMatchingBasedRuleConfig;
1214
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingLogicalFilter;
1315
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRelationalFilter;
1416
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRuleFilter;
@@ -29,6 +31,9 @@ public List<Module> jacksonModules() {
2931
return List.of(
3032
new SimpleModule()
3133
.addAbstractTypeMapping(ApiNamingRuleCreate.class, DefaultApiNamingRuleCreate.class)
34+
.addAbstractTypeMapping(ApiNamingRuleConfig.class, DefaultApiNamingRuleConfig.class)
35+
.addAbstractTypeMapping(
36+
SegmentMatchingBasedRuleConfig.class, DefaultSegmentMatchingBasedRuleConfig.class)
3237
.addAbstractTypeMapping(
3338
SpanProcessingRuleFilter.class, DefaultSpanProcessingRuleFilter.class)
3439
.addAbstractTypeMapping(
@@ -44,8 +49,7 @@ public List<Module> jacksonModules() {
4449
private static class DefaultApiNamingRuleCreate implements ApiNamingRuleCreate {
4550
String name;
4651
SpanProcessingRuleFilter spanFilter;
47-
String regex;
48-
String value;
52+
ApiNamingRuleConfig apiNamingRuleConfig;
4953
boolean disabled;
5054
}
5155
}

hypertrace-graphql-span-processing-schema/src/main/java/org/hypertrace/graphql/spanprocessing/deserialization/ApiNamingUpdateInputDeserializationConfig.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import lombok.extern.jackson.Jacksonized;
1010
import org.hypertrace.core.graphql.deserialization.ArgumentDeserializationConfig;
1111
import org.hypertrace.graphql.spanprocessing.schema.mutation.ApiNamingRuleUpdate;
12+
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfig;
13+
import org.hypertrace.graphql.spanprocessing.schema.rule.SegmentMatchingBasedRuleConfig;
1214
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingLogicalFilter;
1315
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRelationalFilter;
1416
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRuleFilter;
@@ -29,6 +31,9 @@ public List<Module> jacksonModules() {
2931
return List.of(
3032
new SimpleModule()
3133
.addAbstractTypeMapping(ApiNamingRuleUpdate.class, DefaultApiNamingRuleUpdate.class)
34+
.addAbstractTypeMapping(ApiNamingRuleConfig.class, DefaultApiNamingRuleConfig.class)
35+
.addAbstractTypeMapping(
36+
SegmentMatchingBasedRuleConfig.class, DefaultSegmentMatchingBasedRuleConfig.class)
3237
.addAbstractTypeMapping(
3338
SpanProcessingRuleFilter.class, DefaultSpanProcessingRuleFilter.class)
3439
.addAbstractTypeMapping(
@@ -46,7 +51,6 @@ private static class DefaultApiNamingRuleUpdate implements ApiNamingRuleUpdate {
4651
String name;
4752
SpanProcessingRuleFilter spanFilter;
4853
boolean disabled;
49-
String regex;
50-
String value;
54+
ApiNamingRuleConfig apiNamingRuleConfig;
5155
}
5256
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.hypertrace.graphql.spanprocessing.deserialization;
2+
3+
import lombok.Builder;
4+
import lombok.Value;
5+
import lombok.experimental.Accessors;
6+
import lombok.extern.jackson.Jacksonized;
7+
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfig;
8+
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfigType;
9+
import org.hypertrace.graphql.spanprocessing.schema.rule.SegmentMatchingBasedRuleConfig;
10+
11+
@Value
12+
@Accessors(fluent = true)
13+
@Jacksonized
14+
@Builder
15+
public class DefaultApiNamingRuleConfig implements ApiNamingRuleConfig {
16+
ApiNamingRuleConfigType apiNamingRuleConfigType;
17+
SegmentMatchingBasedRuleConfig segmentMatchingBasedRuleConfig;
18+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package org.hypertrace.graphql.spanprocessing.deserialization;
2+
3+
import java.util.List;
4+
import lombok.Builder;
5+
import lombok.Value;
6+
import lombok.experimental.Accessors;
7+
import lombok.extern.jackson.Jacksonized;
8+
import org.hypertrace.graphql.spanprocessing.schema.rule.SegmentMatchingBasedRuleConfig;
9+
10+
@Value
11+
@Accessors(fluent = true)
12+
@Jacksonized
13+
@Builder
14+
public class DefaultSegmentMatchingBasedRuleConfig implements SegmentMatchingBasedRuleConfig {
15+
List<String> regexes;
16+
List<String> values;
17+
}

hypertrace-graphql-span-processing-schema/src/main/java/org/hypertrace/graphql/spanprocessing/schema/mutation/ApiNamingRuleUpdate.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import graphql.annotations.annotationTypes.GraphQLName;
55
import graphql.annotations.annotationTypes.GraphQLNonNull;
66
import org.hypertrace.core.graphql.common.schema.id.Identifiable;
7+
import org.hypertrace.graphql.spanprocessing.schema.rule.ApiNamingRuleConfig;
78
import org.hypertrace.graphql.spanprocessing.schema.rule.filter.SpanProcessingRuleFilter;
89

910
@GraphQLName(ApiNamingRuleUpdate.TYPE_NAME)
@@ -14,8 +15,7 @@ public interface ApiNamingRuleUpdate extends Identifiable {
1415
String NAME_KEY = "name";
1516
String SPAN_PROCESSING_FILTER_KEY = "spanFilter";
1617
String DISABLED_KEY = "disabled";
17-
String REGEX_KEY = "regex";
18-
String VALUE_KEY = "value";
18+
String API_NAMING_RULE_CONFIG_KEY = "apiNamingRuleConfig";
1919

2020
@GraphQLField
2121
@GraphQLName(NAME_KEY)
@@ -33,12 +33,7 @@ public interface ApiNamingRuleUpdate extends Identifiable {
3333
boolean disabled();
3434

3535
@GraphQLField
36-
@GraphQLName(REGEX_KEY)
36+
@GraphQLName(API_NAMING_RULE_CONFIG_KEY)
3737
@GraphQLNonNull
38-
String regex();
39-
40-
@GraphQLField
41-
@GraphQLName(VALUE_KEY)
42-
@GraphQLNonNull
43-
String value();
38+
ApiNamingRuleConfig apiNamingRuleConfig();
4439
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.hypertrace.graphql.spanprocessing.schema.rule;
2+
3+
import graphql.annotations.annotationTypes.GraphQLField;
4+
import graphql.annotations.annotationTypes.GraphQLName;
5+
import graphql.annotations.annotationTypes.GraphQLNonNull;
6+
7+
@GraphQLName(ApiNamingRuleConfig.TYPE_NAME)
8+
public interface ApiNamingRuleConfig {
9+
String TYPE_NAME = "ApiNamingRuleConfig";
10+
11+
String API_NAMING_RULE_CONFIG_TYPE = "apiNamingRuleConfigType";
12+
String SEGMENT_MATCHING_BASED_RULE_CONFIG_TYPE = "segmentMatchingBasedRuleConfig";
13+
14+
@GraphQLField
15+
@GraphQLName(API_NAMING_RULE_CONFIG_TYPE)
16+
@GraphQLNonNull
17+
ApiNamingRuleConfigType apiNamingRuleConfigType();
18+
19+
@GraphQLField
20+
@GraphQLName(SEGMENT_MATCHING_BASED_RULE_CONFIG_TYPE)
21+
SegmentMatchingBasedRuleConfig segmentMatchingBasedRuleConfig();
22+
}

0 commit comments

Comments
 (0)