Add more attrs for Service metrics (#12728)
This commit is contained in:
parent
25b2be13af
commit
8b6cd1c241
|
|
@ -235,8 +235,8 @@ top_n(<metric_name>, <top_number>, <order>, <attrs>)
|
|||
- `top_number` is the number of the top results, should be a positive integer.
|
||||
- `order` is the order of the top results. The value of `order` can be `asc` or `des`.
|
||||
- `attrs` optional, attrs is the attributes of the metrics, could be used to filter the topN results.
|
||||
SkyWalking supports 5 attrs: `attr0`, `attr1`, `attr2`, `attr3`, `attr4`.
|
||||
The format is `attr0='value', attr1='value'...attr4='value4'`, could use one or multiple attrs to filter the topN results.
|
||||
SkyWalking supports 6 attrs: `attr0`, `attr1`, `attr2`, `attr3`, `attr4`, `attr5`.
|
||||
The format is `attr0='value', attr1='value'...attr5='value5'`, could use one or multiple attrs to filter the topN results.
|
||||
**Notice**: The `attrs` only support Service metrics for now and should be added in the metrics first, see [Metrics Additional Attributes](../concepts-and-designs/metrics-additional-attributes.md).
|
||||
|
||||
For example:
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ A typical case is the `topN` query, when we query the top N services by the metr
|
|||
If we want to filter the services by `Layer` or `Group` or other specific conditions, it is impossible to do this with the current metrics fields.
|
||||
|
||||
Since 10.2.0, SkyWalking supports the metrics attributes through source decorate.
|
||||
SkyWalking provides additional attributes(`attr0...attr4`) fields to the metrics and source.
|
||||
SkyWalking provides additional attributes(`attr0...attr5`) fields to the metrics and source.
|
||||
By default, these fields are empty, we can fill them by set a specific decorate logic for source.
|
||||
According to the difference between the `OAL` and `MAL`, the usage of decorate is different.
|
||||
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ ATTR1: 'attr1';
|
|||
ATTR2: 'attr2';
|
||||
ATTR3: 'attr3';
|
||||
ATTR4: 'attr4';
|
||||
ATTR5: 'attr5';
|
||||
|
||||
// Literals
|
||||
INTEGER: Digit+;
|
||||
|
|
|
|||
|
|
@ -101,6 +101,6 @@ sort_label_values:
|
|||
SORT_LABEL_VALUES;
|
||||
|
||||
attributeName:
|
||||
ATTR0 | ATTR1 | ATTR2 | ATTR3 | ATTR4;
|
||||
ATTR0 | ATTR1 | ATTR2 | ATTR3 | ATTR4 | ATTR5;
|
||||
attribute: attributeName EQ VALUE_STRING;
|
||||
attributeList: attribute (COMMA attribute)*;
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ public class DeepAnalysisTest {
|
|||
Assertions.assertEquals("(long)(1)", method.getArgsExpressions().get(1));
|
||||
|
||||
List<SourceColumn> source = result.getFieldsFromSource();
|
||||
Assertions.assertEquals(6, source.size());
|
||||
Assertions.assertEquals(7, source.size());
|
||||
|
||||
List<DataColumn> persistentFields = result.getPersistentFields();
|
||||
Assertions.assertEquals(4, persistentFields.size());
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ public abstract class Meter extends Metrics implements WithMetadata {
|
|||
protected static final String ATTR2 = "attr2";
|
||||
protected static final String ATTR3 = "attr3";
|
||||
protected static final String ATTR4 = "attr4";
|
||||
protected static final String ATTR5 = "attr5";
|
||||
|
||||
private MetricsMetaInfo metadata = new MetricsMetaInfo("UNKNOWN", DefaultScopeDefine.UNKNOWN);
|
||||
|
||||
|
|
@ -66,6 +67,11 @@ public abstract class Meter extends Metrics implements WithMetadata {
|
|||
@Column(name = ATTR4)
|
||||
private String attr4;
|
||||
|
||||
@Setter
|
||||
@Getter
|
||||
@Column(name = ATTR5)
|
||||
private String attr5;
|
||||
|
||||
/**
|
||||
* @return entity ID to represent this metric object. Typically, meter function should have a String type field, named entityId.
|
||||
* See {@link org.apache.skywalking.oap.server.core.analysis.meter.function.avg.AvgFunction#getEntityId()} as an example.
|
||||
|
|
@ -101,5 +107,6 @@ public abstract class Meter extends Metrics implements WithMetadata {
|
|||
attr2 = entity.getAttr2();
|
||||
attr3 = entity.getAttr3();
|
||||
attr4 = entity.getAttr4();
|
||||
attr5 = entity.getAttr5();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -61,6 +61,8 @@ public class MeterEntity {
|
|||
private String attr3;
|
||||
@Setter
|
||||
private String attr4;
|
||||
@Setter
|
||||
private String attr5;
|
||||
|
||||
private MeterEntity() {
|
||||
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ public abstract class AvgFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -127,6 +128,7 @@ public abstract class AvgFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -163,6 +165,10 @@ public abstract class AvgFunction extends Meter implements AcceptableValue<Long>
|
|||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(6))) {
|
||||
setAttr4(remoteData.getDataStrings(6));
|
||||
}
|
||||
|
||||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(7))) {
|
||||
setAttr5(remoteData.getDataStrings(7));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -180,6 +186,7 @@ public abstract class AvgFunction extends Meter implements AcceptableValue<Long>
|
|||
remoteBuilder.addDataStrings(getAttr2() == null ? Const.EMPTY_STRING : getAttr2());
|
||||
remoteBuilder.addDataStrings(getAttr3() == null ? Const.EMPTY_STRING : getAttr3());
|
||||
remoteBuilder.addDataStrings(getAttr4() == null ? Const.EMPTY_STRING : getAttr4());
|
||||
remoteBuilder.addDataStrings(getAttr5() == null ? Const.EMPTY_STRING : getAttr5());
|
||||
return remoteBuilder;
|
||||
}
|
||||
|
||||
|
|
@ -225,6 +232,7 @@ public abstract class AvgFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2((String) converter.get(ATTR2));
|
||||
metrics.setAttr3((String) converter.get(ATTR3));
|
||||
metrics.setAttr4((String) converter.get(ATTR4));
|
||||
metrics.setAttr5((String) converter.get(ATTR5));
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -242,6 +250,7 @@ public abstract class AvgFunction extends Meter implements AcceptableValue<Long>
|
|||
converter.accept(ATTR2, storageData.getAttr2());
|
||||
converter.accept(ATTR3, storageData.getAttr3());
|
||||
converter.accept(ATTR4, storageData.getAttr4());
|
||||
converter.accept(ATTR5, storageData.getAttr5());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -98,6 +98,7 @@ public abstract class LatestFunction extends Meter implements AcceptableValue<Lo
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -114,6 +115,7 @@ public abstract class LatestFunction extends Meter implements AcceptableValue<Lo
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -149,6 +151,10 @@ public abstract class LatestFunction extends Meter implements AcceptableValue<Lo
|
|||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(6))) {
|
||||
setAttr4(remoteData.getDataStrings(6));
|
||||
}
|
||||
|
||||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(7))) {
|
||||
setAttr5(remoteData.getDataStrings(7));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -165,6 +171,7 @@ public abstract class LatestFunction extends Meter implements AcceptableValue<Lo
|
|||
remoteBuilder.addDataStrings(getAttr2() == null ? Const.EMPTY_STRING : getAttr2());
|
||||
remoteBuilder.addDataStrings(getAttr3() == null ? Const.EMPTY_STRING : getAttr3());
|
||||
remoteBuilder.addDataStrings(getAttr4() == null ? Const.EMPTY_STRING : getAttr4());
|
||||
remoteBuilder.addDataStrings(getAttr5() == null ? Const.EMPTY_STRING : getAttr5());
|
||||
return remoteBuilder;
|
||||
}
|
||||
|
||||
|
|
@ -199,6 +206,7 @@ public abstract class LatestFunction extends Meter implements AcceptableValue<Lo
|
|||
metrics.setAttr2((String) converter.get(ATTR2));
|
||||
metrics.setAttr3((String) converter.get(ATTR3));
|
||||
metrics.setAttr4((String) converter.get(ATTR4));
|
||||
metrics.setAttr5((String) converter.get(ATTR5));
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -214,6 +222,7 @@ public abstract class LatestFunction extends Meter implements AcceptableValue<Lo
|
|||
converter.accept(ATTR2, storageData.getAttr2());
|
||||
converter.accept(ATTR3, storageData.getAttr3());
|
||||
converter.accept(ATTR4, storageData.getAttr4());
|
||||
converter.accept(ATTR5, storageData.getAttr5());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@ public abstract class MaxFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -120,6 +121,7 @@ public abstract class MaxFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -154,6 +156,10 @@ public abstract class MaxFunction extends Meter implements AcceptableValue<Long>
|
|||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(6))) {
|
||||
setAttr4(remoteData.getDataStrings(6));
|
||||
}
|
||||
|
||||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(7))) {
|
||||
setAttr5(remoteData.getDataStrings(7));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -169,6 +175,7 @@ public abstract class MaxFunction extends Meter implements AcceptableValue<Long>
|
|||
remoteBuilder.addDataStrings(getAttr2() == null ? Const.EMPTY_STRING : getAttr2());
|
||||
remoteBuilder.addDataStrings(getAttr3() == null ? Const.EMPTY_STRING : getAttr3());
|
||||
remoteBuilder.addDataStrings(getAttr4() == null ? Const.EMPTY_STRING : getAttr4());
|
||||
remoteBuilder.addDataStrings(getAttr5() == null ? Const.EMPTY_STRING : getAttr5());
|
||||
return remoteBuilder;
|
||||
}
|
||||
|
||||
|
|
@ -204,6 +211,7 @@ public abstract class MaxFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2((String) converter.get(ATTR2));
|
||||
metrics.setAttr3((String) converter.get(ATTR3));
|
||||
metrics.setAttr4((String) converter.get(ATTR4));
|
||||
metrics.setAttr5((String) converter.get(ATTR5));
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -219,6 +227,7 @@ public abstract class MaxFunction extends Meter implements AcceptableValue<Long>
|
|||
converter.accept(ATTR2, storageData.getAttr2());
|
||||
converter.accept(ATTR3, storageData.getAttr3());
|
||||
converter.accept(ATTR4, storageData.getAttr4());
|
||||
converter.accept(ATTR5, storageData.getAttr5());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -105,6 +105,7 @@ public abstract class MinFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -121,6 +122,7 @@ public abstract class MinFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -155,6 +157,10 @@ public abstract class MinFunction extends Meter implements AcceptableValue<Long>
|
|||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(6))) {
|
||||
setAttr4(remoteData.getDataStrings(6));
|
||||
}
|
||||
|
||||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(7))) {
|
||||
setAttr5(remoteData.getDataStrings(7));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -170,6 +176,7 @@ public abstract class MinFunction extends Meter implements AcceptableValue<Long>
|
|||
remoteBuilder.addDataStrings(getAttr2() == null ? Const.EMPTY_STRING : getAttr2());
|
||||
remoteBuilder.addDataStrings(getAttr3() == null ? Const.EMPTY_STRING : getAttr3());
|
||||
remoteBuilder.addDataStrings(getAttr4() == null ? Const.EMPTY_STRING : getAttr4());
|
||||
remoteBuilder.addDataStrings(getAttr5() == null ? Const.EMPTY_STRING : getAttr5());
|
||||
return remoteBuilder;
|
||||
}
|
||||
|
||||
|
|
@ -205,6 +212,7 @@ public abstract class MinFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2((String) converter.get(ATTR2));
|
||||
metrics.setAttr3((String) converter.get(ATTR3));
|
||||
metrics.setAttr4((String) converter.get(ATTR4));
|
||||
metrics.setAttr5((String) converter.get(ATTR5));
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -220,6 +228,7 @@ public abstract class MinFunction extends Meter implements AcceptableValue<Long>
|
|||
converter.accept(ATTR2, storageData.getAttr2());
|
||||
converter.accept(ATTR3, storageData.getAttr3());
|
||||
converter.accept(ATTR4, storageData.getAttr4());
|
||||
converter.accept(ATTR5, storageData.getAttr5());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ public abstract class SumFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -102,6 +103,7 @@ public abstract class SumFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -137,6 +139,10 @@ public abstract class SumFunction extends Meter implements AcceptableValue<Long>
|
|||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(6))) {
|
||||
setAttr4(remoteData.getDataStrings(6));
|
||||
}
|
||||
|
||||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(7))) {
|
||||
setAttr5(remoteData.getDataStrings(7));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -154,6 +160,7 @@ public abstract class SumFunction extends Meter implements AcceptableValue<Long>
|
|||
remoteBuilder.addDataStrings(getAttr2() == null ? Const.EMPTY_STRING : getAttr2());
|
||||
remoteBuilder.addDataStrings(getAttr3() == null ? Const.EMPTY_STRING : getAttr3());
|
||||
remoteBuilder.addDataStrings(getAttr4() == null ? Const.EMPTY_STRING : getAttr4());
|
||||
remoteBuilder.addDataStrings(getAttr5() == null ? Const.EMPTY_STRING : getAttr5());
|
||||
return remoteBuilder;
|
||||
}
|
||||
|
||||
|
|
@ -196,6 +203,7 @@ public abstract class SumFunction extends Meter implements AcceptableValue<Long>
|
|||
metrics.setAttr2((String) converter.get(ATTR2));
|
||||
metrics.setAttr3((String) converter.get(ATTR3));
|
||||
metrics.setAttr4((String) converter.get(ATTR4));
|
||||
metrics.setAttr5((String) converter.get(ATTR5));
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -211,6 +219,7 @@ public abstract class SumFunction extends Meter implements AcceptableValue<Long>
|
|||
converter.accept(ATTR2, storageData.getAttr2());
|
||||
converter.accept(ATTR3, storageData.getAttr3());
|
||||
converter.accept(ATTR4, storageData.getAttr4());
|
||||
converter.accept(ATTR5, storageData.getAttr5());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -94,6 +94,7 @@ public abstract class SumPerMinFunction extends Meter implements AcceptableValue
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -110,6 +111,7 @@ public abstract class SumPerMinFunction extends Meter implements AcceptableValue
|
|||
metrics.setAttr2(getAttr2());
|
||||
metrics.setAttr3(getAttr3());
|
||||
metrics.setAttr4(getAttr4());
|
||||
metrics.setAttr5(getAttr5());
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -145,6 +147,10 @@ public abstract class SumPerMinFunction extends Meter implements AcceptableValue
|
|||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(6))) {
|
||||
setAttr4(remoteData.getDataStrings(6));
|
||||
}
|
||||
|
||||
if (StringUtil.isNotEmpty(remoteData.getDataStrings(7))) {
|
||||
setAttr5(remoteData.getDataStrings(7));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -162,6 +168,7 @@ public abstract class SumPerMinFunction extends Meter implements AcceptableValue
|
|||
remoteBuilder.addDataStrings(getAttr2() == null ? Const.EMPTY_STRING : getAttr2());
|
||||
remoteBuilder.addDataStrings(getAttr3() == null ? Const.EMPTY_STRING : getAttr3());
|
||||
remoteBuilder.addDataStrings(getAttr4() == null ? Const.EMPTY_STRING : getAttr4());
|
||||
remoteBuilder.addDataStrings(getAttr5() == null ? Const.EMPTY_STRING : getAttr5());
|
||||
return remoteBuilder;
|
||||
}
|
||||
|
||||
|
|
@ -205,6 +212,7 @@ public abstract class SumPerMinFunction extends Meter implements AcceptableValue
|
|||
metrics.setAttr2((String) converter.get(ATTR2));
|
||||
metrics.setAttr3((String) converter.get(ATTR3));
|
||||
metrics.setAttr4((String) converter.get(ATTR4));
|
||||
metrics.setAttr5((String) converter.get(ATTR5));
|
||||
return metrics;
|
||||
}
|
||||
|
||||
|
|
@ -221,6 +229,7 @@ public abstract class SumPerMinFunction extends Meter implements AcceptableValue
|
|||
converter.accept(ATTR2, storageData.getAttr2());
|
||||
converter.accept(ATTR3, storageData.getAttr3());
|
||||
converter.accept(ATTR4, storageData.getAttr4());
|
||||
converter.accept(ATTR5, storageData.getAttr5());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,10 @@ public class K8SService extends K8SMetrics {
|
|||
@Setter
|
||||
@ScopeDefaultColumn.DefinedByField(columnName = "attr4", isAttribute = true)
|
||||
private String attr4;
|
||||
@Getter
|
||||
@Setter
|
||||
@ScopeDefaultColumn.DefinedByField(columnName = "attr5", isAttribute = true)
|
||||
private String attr5;
|
||||
|
||||
@Override
|
||||
public int scope() {
|
||||
|
|
|
|||
|
|
@ -104,6 +104,10 @@ public class Service extends Source {
|
|||
@Setter
|
||||
@ScopeDefaultColumn.DefinedByField(columnName = "attr4", isAttribute = true)
|
||||
private String attr4;
|
||||
@Getter
|
||||
@Setter
|
||||
@ScopeDefaultColumn.DefinedByField(columnName = "attr5", isAttribute = true)
|
||||
private String attr5;
|
||||
|
||||
public String getTag(String key) {
|
||||
return originalTags.get(key);
|
||||
|
|
|
|||
|
|
@ -129,7 +129,7 @@ public class MQEVisitor extends MQEVisitorBase {
|
|||
if (topN <= 0) {
|
||||
throw new IllegalExpressionException("TopN value must be > 0.");
|
||||
}
|
||||
String[] attrsCondition = new String[5];
|
||||
String[] attrsCondition = new String[6];
|
||||
if (parent.attributeList() != null) {
|
||||
for (MQEParser.AttributeContext attributeContext : parent.attributeList().attribute()) {
|
||||
String attrName = attributeContext.attributeName().getText();
|
||||
|
|
|
|||
Loading…
Reference in New Issue