Skip to content

Commit

Permalink
[pinpoint-apm#8004] support multi grouping by tag data
Browse files Browse the repository at this point in the history
  • Loading branch information
minwoo-jung committed Sep 16, 2021
1 parent 9ab644d commit 0860017
Show file tree
Hide file tree
Showing 10 changed files with 381 additions and 15 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* Copyright 2021 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.metric.web.model;

import com.navercorp.pinpoint.metric.common.model.StringPrecondition;

import java.util.List;
import java.util.Objects;

/**
* @author minwoo.jung
*/
public class MetricValueGroup<Y extends Number> {

private final String groupName;
private final List<MetricValue<Y>> metricValueList;

public MetricValueGroup(List<MetricValue<Y>> metricValueList, String groupName) {
this.groupName = StringPrecondition.requireHasLength(groupName, "groupName");
this.metricValueList = Objects.requireNonNull(metricValueList, "metricValueList");;
}

public List<MetricValue<Y>> getMetricValueList() {
return metricValueList;
}

public String getGroupName() {
return groupName;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,19 @@
*/
public class SystemMetricData<Y extends Number> {
private final String title;
private final String unit;
private final List<Long> timeStampList;
private final List<MetricValue<Y>> metricValueList;
private final List<MetricValueGroup<Y>> metricValueGroupList;

public SystemMetricData(String title, List<Long> timeStampList, List<MetricValue<Y>> metricValueList) {
public SystemMetricData(String title, String unit, List<Long> timeStampList, List<MetricValueGroup<Y>> metricValueGroupList) {
this.title = StringPrecondition.requireHasLength(title, "title");
this.unit = StringPrecondition.requireHasLength(unit, "unit");
this.timeStampList = Objects.requireNonNull(timeStampList, "timeStampList");
this.metricValueList = Objects.requireNonNull(metricValueList, "metricValueList");
this.metricValueGroupList = Objects.requireNonNull(metricValueGroupList, "metricValueGroupList");
}

public String getUnit() {
return unit;
}

public String getTitle() {
Expand All @@ -43,7 +49,8 @@ public List<Long> getTimeStampList() {
return timeStampList;
}

public List<MetricValue<Y>> getMetricValueList() {
return metricValueList;
public List<MetricValueGroup<Y>> getMetricValueGroupList() {
return metricValueGroupList;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/*
* Copyright 2021 NAVER Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.navercorp.pinpoint.metric.web.model.basic.metric.group;

import java.util.Objects;

/**
* @author minwoo.jung
*/
public enum GroupingRule {
TAG(1, "tag"),
UNKNOWN(100, "unknown");

private final int code;
private final String value;

GroupingRule(int code, String value) {
this.code = code;
this.value = Objects.requireNonNull(value, "value");
}

public static GroupingRule getByCode(int code) {
for (GroupingRule groupingRule : GroupingRule.values()) {
if (groupingRule.code == code) {
return groupingRule;
}
}
throw new IllegalArgumentException("Unknown code : " + code);
}

public static GroupingRule getByValue(String value) {
for (GroupingRule groupingRule : GroupingRule.values()) {
if (groupingRule.value.equalsIgnoreCase(value)) {
return groupingRule;
}
}
throw new IllegalArgumentException("Unknown value : " + value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
public enum MatchingRule {
EXACT(1, "exact"),
CONTAIN(2, "contain"),
ALL(3, "all"),
UNKNOWN(100, "unknown");

private final int code;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import com.navercorp.pinpoint.metric.common.model.Tag;
import com.navercorp.pinpoint.metric.web.model.basic.metric.group.ElementOfBasicGroup;
import com.navercorp.pinpoint.metric.web.model.basic.metric.group.GroupingRule;
import com.navercorp.pinpoint.metric.web.model.basic.metric.group.MatchingRule;
import org.springframework.stereotype.Service;

Expand All @@ -32,22 +33,56 @@
@Service
public class SystemMetricBasicGroupManager {

private static final String UNIT_PERCENT = "percent";
private static final String UNIT_COUNT = "count";
private static final String UNIT_BYTE = "byte";

//TODO : (minwoo) 추후 좀더 정의가 쌓이면 domain(객체)로 만들예정, 현재로써는 구조를 잡기보다는 데이터 조합 사례가 더 쌓여야할 필요가 있음.
private static final String CPU_METRIC_NAME = "cpu";
private static final String CPU_DEFINITION_ID = "cpu";
private static final String CPU_TITLE = "cpu";
private static final GroupingRule CPU_GROUPING_RULE = GroupingRule.TAG;
private static final List<ElementOfBasicGroup> CPU_METRIC;
private static final String CPU_UNIT = UNIT_PERCENT;

private static final String MEMORY_METRIC_NAME = "mem";

private static final String MEMORY_PERCENT_METRIC_NAME = MEMORY_METRIC_NAME;
private static final String MEMORY_PERCENT_DEFINITION_ID = "memoryPercent";
private static final String MEMORY_PERCENT_TITLE = "memory usage percent";
private static final GroupingRule MEMORY_PERCENT_GROUPING_RULE = GroupingRule.TAG;
private static final List<ElementOfBasicGroup> MEMORY_PERCENT_METRIC;
private static final String MEMORY_PERCENT_UNIT = UNIT_PERCENT;

private static final String MEMORY_USAGE_METRIC_NAME = MEMORY_METRIC_NAME;
private static final String MEMORY_USAGE_DEFINITION_ID = "memoryUsage";
private static final String MEMORY_USAGE_TITLE = "memory usage";
private static final GroupingRule MEMORY_USAGE_GROUPING_RULE = GroupingRule.TAG;
private static final List<ElementOfBasicGroup> MEMORY_USAGE_METRIC;
private static final String MEMORY_USAGE_UNIT = UNIT_BYTE;

private static final String DISK_METRIC_NAME = "disk";

private static final String DISK_USAGE_METRIC_NAME = DISK_METRIC_NAME;
private static final String DISK_USAGE_DEFINITION_ID = "diskUsage";
private static final String DISK_USAGE_TITLE = "disk usage";
private static final GroupingRule DISK_USAGE_GROUPING_RULE = GroupingRule.TAG;
private static final List<ElementOfBasicGroup> DISK_USAGE_METRIC;
private static final String DISK_USAGE_UNIT = UNIT_BYTE;

private static final String DISK_PERCENT_METRIC_NAME = DISK_METRIC_NAME;
private static final String DISK_PERCENT_DEFINITION_ID = "diskPercent";
private static final String DISK_PERCENT_TITLE = "disk usage percent";
private static final GroupingRule DISK_PERCENT_GROUPING_RULE = GroupingRule.TAG;
private static final List<ElementOfBasicGroup> DISK_PERCENT_METRIC;
private static final String DISK_PERCENT_UNIT = UNIT_PERCENT;

private static final String DISK_INODE_METRIC_NAME = DISK_METRIC_NAME;
private static final String DISK_INODE_DEFINITION_ID = "inodeUsage";
private static final String DISK_INODE_TITLE = "inode usage percent";
private static final GroupingRule DISK_INODE_GROUPING_RULE = GroupingRule.TAG;
private static final List<ElementOfBasicGroup> DISK_INODE_METRIC;
private static final String DISK_INODE_UNIT = UNIT_COUNT;

static {
//CPU
Expand Down Expand Up @@ -90,6 +125,42 @@ public class SystemMetricBasicGroupManager {
MEMORY_USAGE_METRIC = Collections.unmodifiableList(elementOfBasicGroupList);
}

static {
//disk usage
List<Tag> tagList = new ArrayList<Tag>(0);
ElementOfBasicGroup diskTotal = new ElementOfBasicGroup(DISK_USAGE_METRIC_NAME, "total", tagList, MatchingRule.ALL);
ElementOfBasicGroup diskUsed = new ElementOfBasicGroup(DISK_USAGE_METRIC_NAME, "used", tagList, MatchingRule.ALL);
List<ElementOfBasicGroup> elementOfBasicGroupList = new ArrayList<>(2);
elementOfBasicGroupList.add(diskTotal);
elementOfBasicGroupList.add(diskUsed);

DISK_USAGE_METRIC = Collections.unmodifiableList(elementOfBasicGroupList);
}

static {
//disk usage percent
List<Tag> tagList = new ArrayList<Tag>(0);
ElementOfBasicGroup diskUsedPercent = new ElementOfBasicGroup(DISK_PERCENT_METRIC_NAME, "used_percent", tagList, MatchingRule.ALL);
List<ElementOfBasicGroup> elementOfBasicGroupList = new ArrayList<>(1);
elementOfBasicGroupList.add(diskUsedPercent);

DISK_PERCENT_METRIC = Collections.unmodifiableList(elementOfBasicGroupList);
}

static {
//disk usage
List<Tag> tagList = new ArrayList<Tag>(0);
ElementOfBasicGroup inodeTotal = new ElementOfBasicGroup(DISK_INODE_METRIC_NAME, "inodes_total", tagList, MatchingRule.ALL);
ElementOfBasicGroup inodeUsed = new ElementOfBasicGroup(DISK_INODE_METRIC_NAME, "inodes_used", tagList, MatchingRule.ALL);
ElementOfBasicGroup inodeFree = new ElementOfBasicGroup(DISK_INODE_METRIC_NAME, "inodes_free", tagList, MatchingRule.ALL);
List<ElementOfBasicGroup> elementOfBasicGroupList = new ArrayList<>(3);
elementOfBasicGroupList.add(inodeTotal);
elementOfBasicGroupList.add(inodeUsed);
elementOfBasicGroupList.add(inodeFree);

DISK_INODE_METRIC = Collections.unmodifiableList(elementOfBasicGroupList);
}


public List<ElementOfBasicGroup> findElementOfBasicGroup(String metricDefinitionId) {
if (CPU_DEFINITION_ID.equals(metricDefinitionId)) {
Expand All @@ -98,6 +169,12 @@ public List<ElementOfBasicGroup> findElementOfBasicGroup(String metricDefinition
return MEMORY_PERCENT_METRIC;
} else if (MEMORY_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return MEMORY_USAGE_METRIC;
} else if (DISK_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_USAGE_METRIC;
} else if (DISK_PERCENT_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_PERCENT_METRIC;
} else if (DISK_INODE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_INODE_METRIC;
}

throw new UnsupportedOperationException("unsupported metric :" + metricDefinitionId);
Expand All @@ -110,6 +187,12 @@ public String findMetricName(String metricDefinitionId) {
return MEMORY_PERCENT_METRIC_NAME;
} else if (MEMORY_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return MEMORY_USAGE_METRIC_NAME;
} else if (DISK_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_USAGE_METRIC_NAME;
} else if (DISK_PERCENT_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_PERCENT_METRIC_NAME;
} else if (DISK_INODE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_INODE_METRIC_NAME;
}

throw new UnsupportedOperationException("unsupported metric :" + metricDefinitionId);
Expand All @@ -122,6 +205,48 @@ public String findMetricTitle(String metricDefinitionId) {
return MEMORY_PERCENT_TITLE;
} else if (MEMORY_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return MEMORY_USAGE_TITLE;
} else if (DISK_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_USAGE_TITLE;
} else if (DISK_PERCENT_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_PERCENT_TITLE;
} else if (DISK_INODE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_INODE_TITLE;
}

throw new UnsupportedOperationException("unsupported metric :" + metricDefinitionId);
}

public GroupingRule findGroupingRule(String metricDefinitionId) {
if (CPU_DEFINITION_ID.equals(metricDefinitionId)) {
return CPU_GROUPING_RULE;
} else if (MEMORY_PERCENT_DEFINITION_ID.equals(metricDefinitionId)) {
return MEMORY_PERCENT_GROUPING_RULE;
} else if (MEMORY_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return MEMORY_USAGE_GROUPING_RULE;
} else if (DISK_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_USAGE_GROUPING_RULE;
} else if (DISK_PERCENT_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_PERCENT_GROUPING_RULE;
} else if (DISK_INODE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_INODE_GROUPING_RULE;
}

throw new UnsupportedOperationException("unsupported metric :" + metricDefinitionId);
}

public String findUnit(String metricDefinitionId) {
if (CPU_DEFINITION_ID.equals(metricDefinitionId)) {
return CPU_UNIT;
} else if (MEMORY_PERCENT_DEFINITION_ID.equals(metricDefinitionId)) {
return MEMORY_PERCENT_UNIT;
} else if (MEMORY_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return MEMORY_USAGE_UNIT;
} else if (DISK_USAGE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_USAGE_UNIT;
} else if (DISK_PERCENT_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_PERCENT_UNIT;
} else if (DISK_INODE_DEFINITION_ID.equals(metricDefinitionId)) {
return DISK_INODE_UNIT;
}

throw new UnsupportedOperationException("unsupported metric :" + metricDefinitionId);
Expand All @@ -134,6 +259,10 @@ public List<String> findMetricDefinitionIdList(String metricName) {
} else if (MEMORY_METRIC_NAME.equals(metricName)) {
definitionIdList.add(MEMORY_PERCENT_DEFINITION_ID);
definitionIdList.add(MEMORY_USAGE_DEFINITION_ID);
} else if (DISK_METRIC_NAME.equals(metricName)) {
definitionIdList.add(DISK_USAGE_DEFINITION_ID);
definitionIdList.add(DISK_PERCENT_DEFINITION_ID);
definitionIdList.add((DISK_INODE_DEFINITION_ID));
}

return definitionIdList;
Expand Down
Loading

0 comments on commit 0860017

Please sign in to comment.