Skip to content

Commit 1687b28

Browse files
author
Sina Kashipazha
committed
Show count of Active accounts and vms by size on grafana
1 parent 230d3d7 commit 1687b28

File tree

5 files changed

+105
-1
lines changed

5 files changed

+105
-1
lines changed

engine/schema/src/main/java/com/cloud/vm/dao/UserVmDao.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Set;
2323

2424
import com.cloud.utils.Pair;
25+
import com.cloud.utils.Ternary;
2526
import com.cloud.utils.db.GenericDao;
2627
import com.cloud.vm.UserVmVO;
2728
import com.cloud.vm.VirtualMachine;
@@ -92,4 +93,8 @@ public interface UserVmDao extends GenericDao<UserVmVO, Long> {
9293
List<UserVmVO> listByIsoId(Long isoId);
9394

9495
List<Pair<Pair<String, VirtualMachine.Type>, Pair<Long, String>>> getVmsDetailByNames(Set<String> vmNames, String detail);
96+
97+
List<Ternary<Integer, Integer, Integer>> countVmsBySize(long dcId, int limit);
98+
99+
int getActiveAccounts(final long dcId);
95100
}

engine/schema/src/main/java/com/cloud/vm/dao/UserVmDaoImpl.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.cloud.tags.dao.ResourceTagDao;
4141
import com.cloud.user.Account;
4242
import com.cloud.utils.Pair;
43+
import com.cloud.utils.Ternary;
4344
import com.cloud.utils.db.Attribute;
4445
import com.cloud.utils.db.GenericDaoBase;
4546
import com.cloud.utils.db.GenericSearchBuilder;
@@ -75,6 +76,7 @@ public class UserVmDaoImpl extends GenericDaoBase<UserVmVO, Long> implements Use
7576
protected SearchBuilder<UserVmVO> AccountDataCenterVirtualSearch;
7677
protected GenericSearchBuilder<UserVmVO, Long> CountByAccountPod;
7778
protected GenericSearchBuilder<UserVmVO, Long> CountByAccount;
79+
protected GenericSearchBuilder<UserVmVO, Long> CountActiveAccount;
7880
protected GenericSearchBuilder<UserVmVO, Long> PodsHavingVmsForAccount;
7981

8082
protected SearchBuilder<UserVmVO> UserVmSearch;
@@ -192,6 +194,15 @@ void init() {
192194
CountByAccount.and("displayVm", CountByAccount.entity().isDisplayVm(), SearchCriteria.Op.EQ);
193195
CountByAccount.done();
194196

197+
CountActiveAccount = createSearchBuilder(Long.class);
198+
CountActiveAccount.select(null, Func.COUNT, null);
199+
CountActiveAccount.and("account", CountActiveAccount.entity().getAccountId(), SearchCriteria.Op.EQ);
200+
CountActiveAccount.and("type", CountActiveAccount.entity().getType(), SearchCriteria.Op.EQ);
201+
CountActiveAccount.and("dataCenterId", CountActiveAccount.entity().getDataCenterId(), SearchCriteria.Op.EQ);
202+
CountActiveAccount.and("state", CountActiveAccount.entity().getState(), SearchCriteria.Op.NIN);
203+
CountActiveAccount.groupBy(CountActiveAccount.entity().getAccountId());
204+
CountActiveAccount.done();
205+
195206
SearchBuilder<NicVO> nicSearch = _nicDao.createSearchBuilder();
196207
nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ);
197208
nicSearch.and("ip4Address", nicSearch.entity().getIPv4Address(), SearchCriteria.Op.NNULL);
@@ -721,4 +732,35 @@ public List<Pair<Pair<String, VirtualMachine.Type>, Pair<Long, String>>> getVmsD
721732

722733
return vmsDetailByNames;
723734
}
735+
736+
@Override
737+
public List<Ternary<Integer, Integer, Integer>> countVmsBySize(long dcId, int limit) {
738+
TransactionLegacy txn = TransactionLegacy.currentTxn();
739+
String sql = "SELECT cpu,ram_size,count(1) AS count FROM (SELECT * FROM user_vm_view WHERE data_center_id = ? AND state NOT IN ('Destroyed', 'Error', 'Expunging') GROUP BY id) AS uvv GROUP BY cpu,ram_size ORDER BY count DESC ";
740+
if (limit >= 0)
741+
sql = sql + "limit " + limit;
742+
PreparedStatement pstmt = null;
743+
List<Ternary<Integer, Integer, Integer>> result = new ArrayList<>();
744+
try {
745+
pstmt = txn.prepareAutoCloseStatement(sql);
746+
pstmt.setLong(1, dcId);
747+
ResultSet rs = pstmt.executeQuery();
748+
while (rs.next()) {
749+
result.add(new Ternary<Integer, Integer, Integer>(rs.getInt(1), rs.getInt(2), rs.getInt(3)));
750+
}
751+
} catch (Exception e) {
752+
s_logger.warn("Error counting vms by size", e);
753+
}
754+
return result;
755+
}
756+
757+
@Override
758+
public int getActiveAccounts(final long dcId) {
759+
SearchCriteria<Long> sc = CountActiveAccount.create();
760+
sc.setParameters("type", VirtualMachine.Type.User);
761+
sc.setParameters("state", State.Destroyed, State.Error, State.Expunging, State.Stopped);
762+
sc.setParameters("dataCenterId", dcId);
763+
764+
return customSearch(sc, null).size();
765+
}
724766
}

plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterImpl.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,17 @@ private void addDomainMetrics(final List<Item> metricsList, final String zoneNam
401401
metricsList.add(new ItemActiveDomains(zoneName, zoneUuid, _accountDao.getActiveDomains()));
402402
}
403403

404+
private void addAccountMetrics(final List<Item> metricsList, final long dcId, final String zoneName, final String zoneUuid) {
405+
metricsList.add(new ItemActiveAccounts(zoneName, zoneUuid, uservmDao.getActiveAccounts(dcId)));
406+
}
407+
408+
private void addVMsBySizeMetrics(final List<Item> metricsList, final long dcId, final String zoneName, final String zoneUuid) {
409+
List<Ternary<Integer, Integer, Integer>> vms = uservmDao.countVmsBySize(dcId, PrometheusExporterServer.PrometheusExporterOfferingCountLimit.value());
410+
for (Ternary<Integer, Integer, Integer> vm : vms) {
411+
metricsList.add(new ItemVMsBySize(zoneName, zoneUuid, vm.first(), vm.second(), vm.third()));
412+
}
413+
}
414+
404415
@Override
405416
public void updateMetrics() {
406417
final List<Item> latestMetricsItems = new ArrayList<Item>();
@@ -416,6 +427,8 @@ public void updateMetrics() {
416427
addIpAddressMetrics(latestMetricsItems, dc.getId(), zoneName, zoneUuid);
417428
addVlanMetrics(latestMetricsItems, dc.getId(), zoneName, zoneUuid);
418429
addDomainMetrics(latestMetricsItems, zoneName, zoneUuid);
430+
addAccountMetrics(latestMetricsItems, dc.getId(), zoneName, zoneUuid);
431+
addVMsBySizeMetrics(latestMetricsItems, dc.getId(), zoneName, zoneUuid);
419432
}
420433
addDomainLimits(latestMetricsItems);
421434
addDomainResourceCount(latestMetricsItems);
@@ -918,4 +931,44 @@ public String toMetricsString() {
918931
return String.format("%s{domain=\"%s\", type=\"%s\"} %d", name, domainName, resourceType, miBytes);
919932
}
920933
}
934+
935+
class ItemActiveAccounts extends Item {
936+
String zoneName;
937+
String zoneUuid;
938+
int total;
939+
940+
public ItemActiveAccounts(final String zn, final String zu, final int cnt) {
941+
super("cloudstack_active_accounts_total");
942+
zoneName = zn;
943+
zoneUuid = zu;
944+
total = cnt;
945+
}
946+
947+
@Override
948+
public String toMetricsString() {
949+
return String.format("%s{zone=\"%s\"} %d", name, zoneName, total);
950+
}
951+
}
952+
953+
class ItemVMsBySize extends Item {
954+
String zoneName;
955+
String zoneUuid;
956+
int cpu;
957+
int memory;
958+
int total;
959+
960+
public ItemVMsBySize(final String zn, final String zu, final int c, final int m, int cnt) {
961+
super("cloudstack_vms_total_by_size");
962+
zoneName = zn;
963+
zoneUuid = zu;
964+
cpu = c;
965+
memory = m;
966+
total = cnt;
967+
}
968+
969+
@Override
970+
public String toMetricsString() {
971+
return String.format("%s{zone=\"%s\",cpu=\"%d\",memory=\"%d\"} %d", name, zoneName, cpu, memory, total);
972+
}
973+
}
921974
}

plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterServer.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,7 @@ public interface PrometheusExporterServer extends Manager {
3030

3131
ConfigKey<String> PrometheusExporterAllowedAddresses = new ConfigKey<>("Advanced", String.class, "prometheus.exporter.allowed.ips", "127.0.0.1",
3232
"List of comma separated prometheus server ips (with no spaces) that should be allowed to access the URLs", true);
33+
34+
ConfigKey<Integer> PrometheusExporterOfferingCountLimit = new ConfigKey<>("Advanced", Integer.class, "prometheus.exporter.offering.output.limit", "-1",
35+
"Limit the number of output for cloudstack_vms_total_by_size to the provided value. -1 for unlimited output.", true);
3336
}

plugins/integrations/prometheus/src/main/java/org/apache/cloudstack/metrics/PrometheusExporterServerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ public ConfigKey<?>[] getConfigKeys() {
112112
return new ConfigKey<?>[] {
113113
EnablePrometheusExporter,
114114
PrometheusExporterServerPort,
115-
PrometheusExporterAllowedAddresses
115+
PrometheusExporterAllowedAddresses,
116+
PrometheusExporterOfferingCountLimit
116117
};
117118
}
118119
}

0 commit comments

Comments
 (0)