Adding back metrics for users, languages, installations, dmps with grants for prometheus
This commit is contained in:
parent
5257e41109
commit
c477eb5460
|
@ -2,13 +2,11 @@ package eu.eudat.query;
|
||||||
|
|
||||||
import eu.eudat.authorization.AuthorizationFlags;
|
import eu.eudat.authorization.AuthorizationFlags;
|
||||||
import eu.eudat.authorization.Permission;
|
import eu.eudat.authorization.Permission;
|
||||||
import eu.eudat.commons.enums.DmpAccessType;
|
import eu.eudat.commons.enums.*;
|
||||||
import eu.eudat.commons.enums.DmpStatus;
|
|
||||||
import eu.eudat.commons.enums.DmpVersionStatus;
|
|
||||||
import eu.eudat.commons.enums.IsActive;
|
|
||||||
import eu.eudat.commons.scope.user.UserScope;
|
import eu.eudat.commons.scope.user.UserScope;
|
||||||
import eu.eudat.data.DmpDescriptionTemplateEntity;
|
import eu.eudat.data.DmpDescriptionTemplateEntity;
|
||||||
import eu.eudat.data.DmpEntity;
|
import eu.eudat.data.DmpEntity;
|
||||||
|
import eu.eudat.data.DmpReferenceEntity;
|
||||||
import eu.eudat.data.DmpUserEntity;
|
import eu.eudat.data.DmpUserEntity;
|
||||||
import eu.eudat.model.Dmp;
|
import eu.eudat.model.Dmp;
|
||||||
import eu.eudat.model.PublicDmp;
|
import eu.eudat.model.PublicDmp;
|
||||||
|
@ -57,6 +55,10 @@ public class DmpQuery extends QueryBase<DmpEntity> {
|
||||||
|
|
||||||
private DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery;
|
private DmpDescriptionTemplateQuery dmpDescriptionTemplateQuery;
|
||||||
|
|
||||||
|
private DmpReferenceQuery dmpReferenceQuery;
|
||||||
|
|
||||||
|
private EntityDoiQuery entityDoiQuery;
|
||||||
|
|
||||||
private EnumSet<AuthorizationFlags> authorize = EnumSet.of(AuthorizationFlags.None);
|
private EnumSet<AuthorizationFlags> authorize = EnumSet.of(AuthorizationFlags.None);
|
||||||
|
|
||||||
private final UserScope userScope;
|
private final UserScope userScope;
|
||||||
|
@ -226,6 +228,17 @@ public class DmpQuery extends QueryBase<DmpEntity> {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public DmpQuery dmpReferenceSubQuery(DmpReferenceQuery subQuery) {
|
||||||
|
this.dmpReferenceQuery = subQuery;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DmpQuery entityDoiSubQuery(EntityDoiQuery subQuery) {
|
||||||
|
this.entityDoiQuery = subQuery;
|
||||||
|
this.entityDoiQuery.types(EntityType.DMP);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public DmpQuery authorize(EnumSet<AuthorizationFlags> values) {
|
public DmpQuery authorize(EnumSet<AuthorizationFlags> values) {
|
||||||
this.authorize = values;
|
this.authorize = values;
|
||||||
return this;
|
return this;
|
||||||
|
@ -345,6 +358,12 @@ public class DmpQuery extends QueryBase<DmpEntity> {
|
||||||
QueryContext<DmpDescriptionTemplateEntity, UUID> subQuery = this.applySubQuery(this.dmpDescriptionTemplateQuery, queryContext, UUID.class, dmpDescriptionTemplateEntityRoot -> dmpDescriptionTemplateEntityRoot.get(DmpDescriptionTemplateEntity._dmpId));
|
QueryContext<DmpDescriptionTemplateEntity, UUID> subQuery = this.applySubQuery(this.dmpDescriptionTemplateQuery, queryContext, UUID.class, dmpDescriptionTemplateEntityRoot -> dmpDescriptionTemplateEntityRoot.get(DmpDescriptionTemplateEntity._dmpId));
|
||||||
predicates.add(queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpEntity._id)).value(subQuery.Query));
|
predicates.add(queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpEntity._id)).value(subQuery.Query));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.dmpReferenceQuery != null) {
|
||||||
|
QueryContext<DmpReferenceEntity, UUID> subQuery = this.applySubQuery(this.dmpReferenceQuery, queryContext, UUID.class, dmpReferenceEntityRoot -> dmpReferenceEntityRoot.get(DmpReferenceEntity._dmpId));
|
||||||
|
predicates.add(queryContext.CriteriaBuilder.in(queryContext.Root.get(DmpEntity._id)).value(subQuery.Query));
|
||||||
|
}
|
||||||
|
|
||||||
if (!predicates.isEmpty()) {
|
if (!predicates.isEmpty()) {
|
||||||
Predicate[] predicatesArray = predicates.toArray(new Predicate[0]);
|
Predicate[] predicatesArray = predicates.toArray(new Predicate[0]);
|
||||||
return queryContext.CriteriaBuilder.and(predicatesArray);
|
return queryContext.CriteriaBuilder.and(predicatesArray);
|
||||||
|
|
|
@ -7,16 +7,13 @@ import org.keycloak.representations.idm.UserRepresentation;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class MyUsersModule {
|
public class MyUsersModule {
|
||||||
|
|
||||||
private final RealmResource realm;
|
private final RealmResource realm;
|
||||||
|
|
||||||
MyUsersModule(RealmResource realm) {
|
MyUsersModule(RealmResource realm) {
|
||||||
this.realm = realm;
|
this.realm = realm;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<UserRepresentation> getUsers() {
|
|
||||||
return this.realm.users().list();
|
|
||||||
}
|
|
||||||
|
|
||||||
public UserRepresentation findUserById(String id) {
|
public UserRepresentation findUserById(String id) {
|
||||||
return this.realm.users().get(id).toRepresentation();
|
return this.realm.users().get(id).toRepresentation();
|
||||||
}
|
}
|
||||||
|
@ -45,6 +42,14 @@ public class MyUsersModule {
|
||||||
return this.realm.users().get(userId).groups();
|
return this.realm.users().get(userId).groups();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getUserSessionsCountByClientId(String clientId) {
|
||||||
|
return this.realm.clients().get(clientId).getUserSessions(0, Integer.MAX_VALUE).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getAllUsersCount() {
|
||||||
|
return this.realm.users().count();
|
||||||
|
}
|
||||||
|
|
||||||
public void updateUser(String userId, UserRepresentation user) {
|
public void updateUser(String userId, UserRepresentation user) {
|
||||||
UserRepresentation existing = this.realm.users().get(userId).toRepresentation();
|
UserRepresentation existing = this.realm.users().get(userId).toRepresentation();
|
||||||
existing.setFirstName(user.getFirstName());
|
existing.setFirstName(user.getFirstName());
|
||||||
|
|
|
@ -3,15 +3,24 @@ package eu.eudat.service.metrics;
|
||||||
import eu.eudat.commons.enums.*;
|
import eu.eudat.commons.enums.*;
|
||||||
import eu.eudat.commons.metrics.MetricLabels;
|
import eu.eudat.commons.metrics.MetricLabels;
|
||||||
import eu.eudat.commons.metrics.MetricNames;
|
import eu.eudat.commons.metrics.MetricNames;
|
||||||
|
import eu.eudat.data.DmpEntity;
|
||||||
import eu.eudat.data.TenantEntityManager;
|
import eu.eudat.data.TenantEntityManager;
|
||||||
|
import eu.eudat.model.Dmp;
|
||||||
import eu.eudat.query.*;
|
import eu.eudat.query.*;
|
||||||
|
import eu.eudat.service.keycloak.KeycloakService;
|
||||||
|
import eu.eudat.service.keycloak.MyKeycloakAdminRestApi;
|
||||||
|
import gr.cite.commons.web.keycloak.api.configuration.KeycloakClientProperties;
|
||||||
import gr.cite.tools.data.query.QueryFactory;
|
import gr.cite.tools.data.query.QueryFactory;
|
||||||
|
import gr.cite.tools.fieldset.BaseFieldSet;
|
||||||
|
import gr.cite.tools.fieldset.FieldSet;
|
||||||
import io.micrometer.prometheus.PrometheusMeterRegistry;
|
import io.micrometer.prometheus.PrometheusMeterRegistry;
|
||||||
import io.prometheus.client.Gauge;
|
import io.prometheus.client.Gauge;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.management.InvalidApplicationException;
|
import javax.management.InvalidApplicationException;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
@ -24,13 +33,24 @@ public class MetricsServiceImpl implements MetricsService {
|
||||||
|
|
||||||
private final TenantEntityManager entityManager;
|
private final TenantEntityManager entityManager;
|
||||||
|
|
||||||
|
private final MyKeycloakAdminRestApi keycloakAdminRestApi;
|
||||||
|
|
||||||
private final UpdateMetricsTaskProperties _config;
|
private final UpdateMetricsTaskProperties _config;
|
||||||
|
|
||||||
public MetricsServiceImpl(PrometheusMeterRegistry registry, QueryFactory queryFactory, TenantEntityManager entityManager, UpdateMetricsTaskProperties config) {
|
private final KeycloakClientProperties _keycloakConfig;
|
||||||
|
|
||||||
|
public MetricsServiceImpl(
|
||||||
|
PrometheusMeterRegistry registry,
|
||||||
|
QueryFactory queryFactory,
|
||||||
|
TenantEntityManager entityManager,
|
||||||
|
MyKeycloakAdminRestApi keycloakAdminRestApi,
|
||||||
|
UpdateMetricsTaskProperties config, KeycloakClientProperties keycloakConfig) {
|
||||||
this.registry = registry;
|
this.registry = registry;
|
||||||
this.queryFactory = queryFactory;
|
this.queryFactory = queryFactory;
|
||||||
this.entityManager = entityManager;
|
this.entityManager = entityManager;
|
||||||
|
this.keycloakAdminRestApi = keycloakAdminRestApi;
|
||||||
this._config = config;
|
this._config = config;
|
||||||
|
this._keycloakConfig = keycloakConfig;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -48,6 +68,16 @@ public class MetricsServiceImpl implements MetricsService {
|
||||||
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculatePublishedDmps(true), MetricLabels.PUBLISHED);
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculatePublishedDmps(true), MetricLabels.PUBLISHED);
|
||||||
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateDoiedDmps(true), MetricLabels.DOIED);
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateDoiedDmps(true), MetricLabels.DOIED);
|
||||||
|
|
||||||
|
this.setGaugeValue(gauges, MetricNames.DMP, calculateDraftDmpsWithGrant(false), MetricLabels.DRAFT);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.DMP, calculateFinalizedDmpsWithGrant(false), MetricLabels.FINALIZED);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.DMP, calculatePublishedDmpsWithGrant(false), MetricLabels.PUBLISHED);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.DMP, calculateDoiedDmpsWithGrant(false), MetricLabels.DOIED);
|
||||||
|
|
||||||
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateDraftDmpsWithGrant(true), MetricLabels.DRAFT);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateFinalizedDmpsWithGrant(true), MetricLabels.FINALIZED);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculatePublishedDmpsWithGrant(true), MetricLabels.PUBLISHED);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DMP, calculateDoiedDmpsWithGrant(true), MetricLabels.DOIED);
|
||||||
|
|
||||||
this.setGaugeValue(gauges, MetricNames.FUNDERS, calculateAllFunders(false), null);
|
this.setGaugeValue(gauges, MetricNames.FUNDERS, calculateAllFunders(false), null);
|
||||||
this.setGaugeValue(gauges, MetricNames.GRANTS, calculateAllGrants(false), null);
|
this.setGaugeValue(gauges, MetricNames.GRANTS, calculateAllGrants(false), null);
|
||||||
this.setGaugeValue(gauges, MetricNames.PROJECTS, calculateAllProjects(false), null);
|
this.setGaugeValue(gauges, MetricNames.PROJECTS, calculateAllProjects(false), null);
|
||||||
|
@ -76,7 +106,13 @@ public class MetricsServiceImpl implements MetricsService {
|
||||||
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, calculateFinalizedTemplates(true), MetricLabels.ACTIVE);
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, calculateFinalizedTemplates(true), MetricLabels.ACTIVE);
|
||||||
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, calculateUsedTemplates(true), MetricLabels.USED);
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.DATASET_TEMPLATE, calculateUsedTemplates(true), MetricLabels.USED);
|
||||||
|
|
||||||
|
this.setGaugeValue(gauges, MetricNames.USERS, calculateActiveUsers(), MetricLabels.LOGGEDIN);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.USERS, calculateAllUsers(), MetricLabels.TOTAL);
|
||||||
|
|
||||||
|
this.setGaugeValue(gauges, MetricNames.LANGUAGES, calculateLanguages(), null);
|
||||||
|
|
||||||
this.setGaugeValue(gauges, MetricNames.INSTALLATIONS, 1d, null);
|
this.setGaugeValue(gauges, MetricNames.INSTALLATIONS, 1d, null);
|
||||||
|
this.setGaugeValue(gauges, MetricNames.NEXUS_PREFIX + MetricNames.INSTALLATIONS, 1d, null);
|
||||||
} finally {
|
} finally {
|
||||||
this.entityManager.enableTenantFilters();
|
this.entityManager.enableTenantFilters();
|
||||||
}
|
}
|
||||||
|
@ -140,10 +176,54 @@ public class MetricsServiceImpl implements MetricsService {
|
||||||
}
|
}
|
||||||
|
|
||||||
private double calculateDoiedDmps(boolean forNexus) {
|
private double calculateDoiedDmps(boolean forNexus) {
|
||||||
EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).types(EntityType.DMP).isActive(IsActive.Active);
|
DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active);
|
||||||
if (forNexus)
|
if (forNexus)
|
||||||
entityDoiQuery.after(_config.getNexusDate());
|
dmpQuery.after(_config.getNexusDate());
|
||||||
return entityDoiQuery.count();
|
EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).types(EntityType.DMP).isActive(IsActive.Active);
|
||||||
|
dmpQuery.entityDoiSubQuery(entityDoiQuery);
|
||||||
|
return dmpQuery.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double calculateDraftDmpsWithGrant(boolean forNexus) {
|
||||||
|
DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Draft).isActive(IsActive.Active);
|
||||||
|
if (forNexus)
|
||||||
|
dmpQuery.after(_config.getNexusDate());
|
||||||
|
ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active);
|
||||||
|
DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active);
|
||||||
|
dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery);
|
||||||
|
return dmpQuery.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double calculateFinalizedDmpsWithGrant(boolean forNexus) {
|
||||||
|
DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Finalized).isActive(IsActive.Active);
|
||||||
|
if (forNexus)
|
||||||
|
dmpQuery.after(_config.getNexusDate());
|
||||||
|
ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active);
|
||||||
|
DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active);
|
||||||
|
dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery);
|
||||||
|
return dmpQuery.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double calculatePublishedDmpsWithGrant(boolean forNexus) {
|
||||||
|
DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).statuses(DmpStatus.Finalized).accessTypes(DmpAccessType.Public).isActive(IsActive.Active);
|
||||||
|
if (forNexus)
|
||||||
|
dmpQuery.after(_config.getNexusDate());
|
||||||
|
ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active);
|
||||||
|
DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active);
|
||||||
|
dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery);
|
||||||
|
return dmpQuery.count();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double calculateDoiedDmpsWithGrant(boolean forNexus) {
|
||||||
|
DmpQuery dmpQuery = this.queryFactory.query(DmpQuery.class).isActive(IsActive.Active);
|
||||||
|
if (forNexus)
|
||||||
|
dmpQuery.after(_config.getNexusDate());
|
||||||
|
ReferenceQuery referenceQuery = this.queryFactory.query(ReferenceQuery.class).typeIds(_config.getReferenceTypes().getGrantIds()).isActive(IsActive.Active);
|
||||||
|
DmpReferenceQuery dmpReferenceQuery = this.queryFactory.query(DmpReferenceQuery.class).referenceSubQuery(referenceQuery).isActives(IsActive.Active);
|
||||||
|
dmpQuery.dmpReferenceSubQuery(dmpReferenceQuery);
|
||||||
|
EntityDoiQuery entityDoiQuery = this.queryFactory.query(EntityDoiQuery.class).isActive(IsActive.Active);
|
||||||
|
dmpQuery.entityDoiSubQuery(entityDoiQuery);
|
||||||
|
return dmpQuery.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
private double calculateAllFunders(boolean forNexus) {
|
private double calculateAllFunders(boolean forNexus) {
|
||||||
|
@ -223,6 +303,19 @@ public class MetricsServiceImpl implements MetricsService {
|
||||||
return dmpDescriptionTemplateQuery.count();
|
return dmpDescriptionTemplateQuery.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private double calculateActiveUsers() {
|
||||||
|
return this.keycloakAdminRestApi.users().getUserSessionsCountByClientId(_keycloakConfig.getClientId());
|
||||||
|
}
|
||||||
|
|
||||||
|
private double calculateAllUsers() {
|
||||||
|
return this.keycloakAdminRestApi.users().getAllUsersCount();
|
||||||
|
}
|
||||||
|
|
||||||
|
private double calculateLanguages() {
|
||||||
|
LanguageQuery languageQuery = this.queryFactory.query(LanguageQuery.class).isActive(IsActive.Active);
|
||||||
|
return languageQuery.count();
|
||||||
|
}
|
||||||
|
|
||||||
private void setGaugeValue(Map<String, Gauge> gauges, String name, Double amount, String label) {
|
private void setGaugeValue(Map<String, Gauge> gauges, String name, Double amount, String label) {
|
||||||
if (label != null) {
|
if (label != null) {
|
||||||
gauges.get(name).labels(label).set(amount);
|
gauges.get(name).labels(label).set(amount);
|
||||||
|
|
Loading…
Reference in New Issue