Skip to content

Commit 459e5a2

Browse files
committed
WIP for #670
1 parent 9e41592 commit 459e5a2

5 files changed

Lines changed: 120 additions & 3 deletions

File tree

myconext-server/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@
4242
<groupId>org.springframework.boot</groupId>
4343
<artifactId>spring-boot-starter-actuator</artifactId>
4444
</dependency>
45+
<dependency>
46+
<groupId>io.micrometer</groupId>
47+
<artifactId>micrometer-registry-prometheus</artifactId>
48+
<version>1.15.1</version>
49+
</dependency>
4550
<dependency>
4651
<groupId>org.springframework.boot</groupId>
4752
<artifactId>spring-boot-starter-web</artifactId>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package myconext.api;
2+
3+
import io.swagger.v3.oas.annotations.Hidden;
4+
import myconext.repository.MetricsRepository;
5+
import myconext.repository.UserRepository;
6+
import org.springframework.web.bind.annotation.RestController;
7+
8+
@RestController
9+
@Hidden
10+
public class MetricsController {
11+
12+
private final UserRepository userRepository;
13+
private final MetricsRepository metricsRepository;
14+
15+
public MetricsController(UserRepository userRepository, MetricsRepository metricsRepository) {
16+
this.userRepository = userRepository;
17+
this.metricsRepository = metricsRepository;
18+
}
19+
}
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package myconext.repository;
2+
3+
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.*;
8+
import org.bson.Document;
9+
import org.springframework.stereotype.Repository;
10+
11+
import java.util.Arrays;
12+
import java.util.List;
13+
import java.util.Map;
14+
15+
@Repository
16+
public class MetricsRepository {
17+
18+
private final MongoTemplate mongoTemplate;
19+
20+
public MetricsRepository(MongoTemplate mongoTemplate) {
21+
this.mongoTemplate = mongoTemplate;
22+
}
23+
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");
37+
}
38+
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+
])
50+
51+
*/
52+
return mongoTemplate.execute("users", collection -> {
53+
List<Document> pipeline = Arrays.asList(
54+
Document.parse("{ \"$unwind\": \"$linkedAccounts\" }"),
55+
Document.parse("{ \"$count\": \"totalLinkedAccounts\" }")
56+
);
57+
58+
AggregateIterable<Document> result = collection.aggregate(pipeline);
59+
Document doc = result.first();
60+
61+
return doc != null ? doc.getInteger("totalLinkedAccounts") : 0;
62+
});
63+
}
64+
}

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,18 +267,22 @@ management:
267267
endpoints:
268268
web:
269269
exposure:
270-
include: "health,info"
270+
# include: "health,info,prometheus"
271+
include: "*"
271272
base-path: "/internal"
272273
endpoint:
273274
info:
274275
access: unrestricted
275276
health:
276277
access: unrestricted
277-
show-details: never
278+
show-details: when_authorized
279+
prometheus:
280+
access: unrestricted
281+
show-details: always
278282
mappings:
279283
access: none
280284
metrics:
281-
access: none
285+
access: unrestricted
282286
info:
283287
git:
284288
mode: full
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package myconext.repository;
2+
3+
import myconext.AbstractIntegrationTest;
4+
import org.junit.jupiter.api.Test;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
7+
import java.util.Map;
8+
9+
import static org.junit.jupiter.api.Assertions.*;
10+
11+
class MetricsRepositoryTest extends AbstractIntegrationTest {
12+
13+
@Autowired
14+
private MetricsRepository metricsRepository;
15+
16+
@Test
17+
void getTotalLinkedAccountCount() {
18+
Number totalLinkedAccountCount = metricsRepository.getTotalLinkedAccountCount();
19+
System.out.println(totalLinkedAccountCount);
20+
21+
Number l = metricsRepository.countTotalLinkedAccountsNativeExecute();
22+
System.out.println(l);
23+
}
24+
25+
}

0 commit comments

Comments
 (0)