Skip to content
This repository was archived by the owner on Dec 19, 2023. It is now read-only.

Commit fe7bcf9

Browse files
committed
Added websocket subscription metrics
1 parent f65ec23 commit fe7bcf9

File tree

4 files changed

+45
-3
lines changed

4 files changed

+45
-3
lines changed

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,6 +290,17 @@ graphql:
290290
servlet:
291291
actuator-metrics: true
292292
```
293+
294+
## Usage
295+
See [Baeldung Spring Boot Actuators](https://www.baeldung.com/spring-boot-actuators) for the basics of using Actuator.
296+
Add `spring-boot-starter-actuator` to your project as dependency.
297+
298+
The following metrics are available for exposure:
299+
* `graphql.timer.query`
300+
* `graphql.websocket.sessions` - number of active websocket sessions for subscriptions
301+
* `graphql.websocket.subscriptions` - number of active subscriptions
302+
303+
293304
# Contributions
294305

295306
Contributions are welcome. Please respect the [Code of Conduct](http://contributor-covenant.org/version/1/3/0/).

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1818
#
1919

20-
version = 5.8.1
20+
version = 5.9.0-SNAPSHOT
2121
PROJECT_GROUP = com.graphql-java-kickstart
2222
PROJECT_NAME = graphql-spring-boot
2323
PROJECT_DESC = GraphQL Spring Framework Boot
@@ -40,7 +40,7 @@ LIB_GRAPHQL_JAVA_VER = 12.0
4040
LIB_JUNIT_VER = 4.12
4141
LIB_SPRING_CORE_VER = 5.0.4.RELEASE
4242
LIB_SPRING_BOOT_VER = 2.1.4.RELEASE
43-
LIB_GRAPHQL_SERVLET_VER = 7.4.1
43+
LIB_GRAPHQL_SERVLET_VER = 7.5.0-SNAPSHOT
4444
LIB_GRAPHQL_JAVA_TOOLS_VER = 5.6.0
4545
LIB_COMMONS_IO_VER = 2.6
4646
kotlin.version=1.3.10

graphql-spring-boot-autoconfigure/src/main/java/com/oembedler/moon/graphql/boot/GraphQLInstrumentationAutoConfiguration.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import com.oembedler.moon.graphql.boot.metrics.MetricsInstrumentation;
44
import com.oembedler.moon.graphql.boot.metrics.TracingNoResolversInstrumentation;
5+
import com.oembedler.moon.graphql.boot.metrics.WebsocketMetrics;
56
import graphql.analysis.MaxQueryComplexityInstrumentation;
67
import graphql.analysis.MaxQueryDepthInstrumentation;
78
import graphql.execution.instrumentation.tracing.TracingInstrumentation;
9+
import graphql.servlet.GraphQLWebsocketServlet;
810
import io.micrometer.core.instrument.MeterRegistry;
11+
import org.springframework.beans.factory.annotation.Autowired;
912
import org.springframework.beans.factory.annotation.Value;
1013
import org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration;
1114
import org.springframework.boot.actuate.autoconfigure.metrics.export.simple.SimpleMetricsExportAutoConfiguration;
@@ -18,11 +21,13 @@
1821
import org.springframework.context.annotation.Bean;
1922
import org.springframework.context.annotation.Configuration;
2023

24+
import javax.annotation.PostConstruct;
25+
2126
/**
2227
* @author Marcel Overdijk
2328
*/
2429
@Configuration
25-
@AutoConfigureAfter({MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class})
30+
@AutoConfigureAfter({MetricsAutoConfiguration.class, SimpleMetricsExportAutoConfiguration.class, GraphQLWebsocketAutoConfiguration.class})
2631
@ConditionalOnProperty(value = "graphql.servlet.enabled", havingValue = "true", matchIfMissing = true)
2732
@EnableConfigurationProperties({GraphQLServletProperties.class})
2833
public class GraphQLInstrumentationAutoConfiguration {
@@ -74,4 +79,12 @@ public MetricsInstrumentation metricsInstrumentation(MeterRegistry meterRegistry
7479
return new MetricsInstrumentation(meterRegistry, Boolean.TRUE.toString().equals(tracingEnabled));
7580
}
7681

82+
@Bean
83+
@ConditionalOnProperty(value = "graphql.servlet.actuator-metrics", havingValue = "true")
84+
@ConditionalOnBean({MeterRegistry.class, GraphQLWebsocketServlet.class})
85+
@ConditionalOnMissingBean
86+
public WebsocketMetrics websocketMetrics(MeterRegistry meterRegistry, GraphQLWebsocketServlet websocketServlet) {
87+
return new WebsocketMetrics(meterRegistry, websocketServlet);
88+
}
89+
7790
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.oembedler.moon.graphql.boot.metrics;
2+
3+
import graphql.servlet.GraphQLWebsocketServlet;
4+
import io.micrometer.core.instrument.Gauge;
5+
import io.micrometer.core.instrument.MeterRegistry;
6+
7+
public class WebsocketMetrics {
8+
9+
public WebsocketMetrics(MeterRegistry meterRegistry, GraphQLWebsocketServlet websocketServlet) {
10+
Gauge.builder("graphql.websocket.sessions", websocketServlet, GraphQLWebsocketServlet::getSessionCount)
11+
.description("Active websocket sessions available for subscriptions")
12+
.register(meterRegistry);
13+
Gauge.builder("graphql.websocket.subscriptions", websocketServlet, GraphQLWebsocketServlet::getSubscriptionCount)
14+
.description("Active websocket subscriptions")
15+
.register(meterRegistry);
16+
}
17+
18+
}

0 commit comments

Comments
 (0)