Skip to content

Commit 72e7853

Browse files
committed
WIP for #670
1 parent 0c9484f commit 72e7853

5 files changed

Lines changed: 68 additions & 58 deletions

File tree

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,39 @@
11
package myconext.api;
22

3+
import io.micrometer.core.instrument.Gauge;
4+
import io.micrometer.core.instrument.MeterRegistry;
35
import io.swagger.v3.oas.annotations.Hidden;
6+
import myconext.model.IdpScoping;
47
import myconext.repository.MetricsRepository;
58
import myconext.repository.UserRepository;
69
import org.springframework.web.bind.annotation.RestController;
710

11+
import java.util.stream.Stream;
12+
813
@RestController
914
@Hidden
1015
public class MetricsController {
1116

12-
private final UserRepository userRepository;
13-
private final MetricsRepository metricsRepository;
17+
public MetricsController(UserRepository userRepository,
18+
MetricsRepository metricsRepository,
19+
MeterRegistry meterRegistry) {
20+
Gauge.builder("user_count", () -> userRepository.count())
21+
.description("User count")
22+
.register(meterRegistry);
23+
24+
Gauge.builder("linked_account_count", () -> metricsRepository.countTotalLinkedAccounts())
25+
.description("Internal linked account count")
26+
.register(meterRegistry);
1427

15-
public MetricsController(UserRepository userRepository, MetricsRepository metricsRepository) {
16-
this.userRepository = userRepository;
17-
this.metricsRepository = metricsRepository;
28+
Gauge.builder("registered_apps_count", () -> metricsRepository.countTotalRegisteredApps())
29+
.description("Registered apps count")
30+
.register(meterRegistry);
31+
32+
Stream.of(IdpScoping.values())
33+
.forEach(idpScoping -> Gauge
34+
.builder("external_linked_account_" + idpScoping.name(), () -> metricsRepository.countTotalExternalLinkedAccountsByType(idpScoping))
35+
.description("External account " + idpScoping.name() + " count ")
36+
.register(meterRegistry));
1837
}
38+
1939
}
Lines changed: 34 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
11
package myconext.repository;
22

33
import com.mongodb.client.AggregateIterable;
4-
import myconext.model.User;
5-
import org.springframework.beans.factory.annotation.Autowired;
6-
import org.springframework.data.mongodb.core.MongoTemplate;
7-
import org.springframework.data.mongodb.core.aggregation.*;
4+
import myconext.model.IdpScoping;
85
import org.bson.Document;
6+
import org.springframework.data.mongodb.core.MongoTemplate;
97
import org.springframework.stereotype.Repository;
108

119
import java.util.Arrays;
1210
import java.util.List;
13-
import java.util.Map;
1411

1512
@Repository
1613
public class MetricsRepository {
@@ -21,44 +18,43 @@ public MetricsRepository(MongoTemplate mongoTemplate) {
2118
this.mongoTemplate = mongoTemplate;
2219
}
2320

24-
public Number getTotalLinkedAccountCount() {
25-
UnwindOperation unwindLinkedAccounts = Aggregation.unwind("linkedAccounts");
26-
CountOperation countTotal = Aggregation.count().as("totalLinkedAccounts");
27-
TypedAggregation<User> aggregation = Aggregation.newAggregation(
28-
User.class,
29-
unwindLinkedAccounts,
30-
countTotal
31-
);
32-
AggregationResults<Map> results = mongoTemplate.aggregate(
33-
aggregation,
34-
Map.class
35-
);
36-
return (Number) results.getUniqueMappedResult().get("totalLinkedAccounts");
21+
public Integer countTotalLinkedAccounts() {
22+
return doInCollection("users",
23+
List.of(
24+
"{ \"$unwind\": \"$linkedAccounts\" }",
25+
"{ \"$count\": \"totalLinkedAccounts\" }"
26+
), "totalLinkedAccounts");
3727
}
3828

39-
// Alternative approach: Using MongoTemplate's native execute method
40-
public Number countTotalLinkedAccountsNativeExecute() {
41-
/*
42-
users.aggregate([
43-
{
44-
"$unwind": "$linkedAccounts"
45-
},
46-
{
47-
"$count": "totalLinkedAccounts"
48-
}
49-
])
29+
public Integer countTotalExternalLinkedAccountsByType(IdpScoping idpScoping) {
30+
return doInCollection("users",
31+
List.of(
32+
"{ \"$unwind\": \"$externalLinkedAccounts\" }",
33+
"{ \"$match\": { \"externalLinkedAccounts.idpScoping\": \"" + idpScoping.name() + "\" } },",
34+
"{ \"$count\": \"countExternalLinkedAccounts\" }"
35+
), "countExternalLinkedAccounts");
36+
}
5037

51-
*/
52-
return mongoTemplate.execute("users", collection -> {
53-
List<Document> pipeline = Arrays.asList(
54-
Document.parse("{ \"$unwind\": \"$linkedAccounts\" }"),
55-
Document.parse("{ \"$count\": \"totalLinkedAccounts\" }")
56-
);
38+
public Integer countTotalRegisteredApps() {
39+
return doInCollection("users",
40+
List.of(
41+
"{ \"$unwind\": \"$eduIDS\" }",
42+
"{ \"$unwind\": \"$eduIDS.services\" }",
43+
"{ \"$group\": { \"_id\": \"$eduIDS.services.entityId\" } },",
44+
"{ \"$count\": \"countTotalRegisteredApps\" }"
45+
), "countTotalRegisteredApps");
46+
}
5747

58-
AggregateIterable<Document> result = collection.aggregate(pipeline);
48+
private Integer doInCollection(String collectionName, List<String> pipeLines, String resultKeyWord) {
49+
return mongoTemplate.execute(collectionName, collection -> {
50+
List<Document> documents = pipeLines
51+
.stream()
52+
.map(Document::parse)
53+
.toList();
54+
AggregateIterable<Document> result = collection.aggregate(documents);
5955
Document doc = result.first();
60-
61-
return doc != null ? doc.getInteger("totalLinkedAccounts") : 0;
56+
return doc != null ? doc.getInteger(resultKeyWord) : 0;
6257
});
58+
6359
}
6460
}

myconext-server/src/main/resources/application.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,8 +267,7 @@ management:
267267
endpoints:
268268
web:
269269
exposure:
270-
# include: "health,info,prometheus"
271-
include: "*"
270+
include: "health,info,prometheus"
272271
base-path: "/internal"
273272
endpoint:
274273
info:
Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package myconext.repository;
22

33
import myconext.AbstractIntegrationTest;
4+
import myconext.model.IdpScoping;
45
import org.junit.jupiter.api.Test;
56
import org.springframework.beans.factory.annotation.Autowired;
67

7-
import java.util.Map;
8-
9-
import static org.junit.jupiter.api.Assertions.*;
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
109

1110
class MetricsRepositoryTest extends AbstractIntegrationTest {
1211

@@ -15,11 +14,12 @@ class MetricsRepositoryTest extends AbstractIntegrationTest {
1514

1615
@Test
1716
void getTotalLinkedAccountCount() {
18-
Number totalLinkedAccountCount = metricsRepository.getTotalLinkedAccountCount();
19-
System.out.println(totalLinkedAccountCount);
20-
21-
Number l = metricsRepository.countTotalLinkedAccountsNativeExecute();
22-
System.out.println(l);
17+
Integer totalLinkedAccountCount = metricsRepository.countTotalLinkedAccounts();
18+
assertEquals(2, totalLinkedAccountCount);
19+
Integer idinExternalAccounts = metricsRepository.countTotalExternalLinkedAccountsByType(IdpScoping.idin);
20+
assertEquals(0, idinExternalAccounts);
21+
Integer countTotalRegisteredApps = metricsRepository.countTotalRegisteredApps();
22+
assertEquals(2, countTotalRegisteredApps);
2323
}
2424

2525
}

servicedesk-gui/src/tabs/Verification.jsx

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,6 @@ const Verification = ({proceed}) => {
6060
/>
6161
</div>
6262
{error && <ErrorIndicator message={I18n.t("verification.error", {code: code})}/>}
63-
<div className="disclaimer">
64-
<AlertIcon/>
65-
<p>{I18n.t("verification.info")}</p>
66-
</div>
67-
6863
</div>
6964
</>
7065
);

0 commit comments

Comments
 (0)