Skip to content

Commit c899bb2

Browse files
committed
Use prometheus exporter instead of manual endpoint
1 parent 84b3994 commit c899bb2

File tree

10 files changed

+55
-203
lines changed

10 files changed

+55
-203
lines changed

packages/twenty-server/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"@opentelemetry/api": "^1.9.0",
6666
"@opentelemetry/auto-instrumentations-node": "^0.60.0",
6767
"@opentelemetry/exporter-metrics-otlp-http": "^0.200.0",
68+
"@opentelemetry/exporter-prometheus": "^0.211.0",
6869
"@opentelemetry/sdk-metrics": "^2.0.0",
6970
"@opentelemetry/sdk-node": "^0.202.0",
7071
"@ptc-org/nestjs-query-core": "4.4.0",
@@ -157,7 +158,6 @@
157158
"planer": "1.2.0",
158159
"pluralize": "8.0.0",
159160
"postal-mime": "^2.6.1",
160-
"prom-client": "^15.1.3",
161161
"psl": "^1.9.0",
162162
"react": "18.3.1",
163163
"react-dom": "18.3.1",

packages/twenty-server/src/engine/core-modules/metrics/metrics.module.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@ import { Module } from '@nestjs/common';
22

33
import { MetricsCacheService } from 'src/engine/core-modules/metrics/metrics-cache.service';
44
import { MetricsService } from 'src/engine/core-modules/metrics/metrics.service';
5-
import { PrometheusController } from 'src/engine/core-modules/metrics/prometheus.controller';
6-
import { PrometheusService } from 'src/engine/core-modules/metrics/prometheus.service';
75

86
@Module({
9-
controllers: [PrometheusController],
10-
providers: [MetricsService, MetricsCacheService, PrometheusService],
11-
exports: [MetricsService, MetricsCacheService, PrometheusService],
7+
providers: [MetricsService, MetricsCacheService],
8+
exports: [MetricsService, MetricsCacheService],
129
})
1310
export class MetricsModule {}

packages/twenty-server/src/engine/core-modules/metrics/prometheus.controller.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

packages/twenty-server/src/engine/core-modules/metrics/prometheus.service.spec.ts

Lines changed: 0 additions & 86 deletions
This file was deleted.

packages/twenty-server/src/engine/core-modules/metrics/prometheus.service.ts

Lines changed: 0 additions & 48 deletions
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
export enum MeterDriver {
22
OpenTelemetry = 'opentelemetry',
33
Console = 'console',
4+
Prometheus = 'prometheus',
45
}

packages/twenty-server/src/engine/subscriptions/event-stream.service.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
22

3+
import { metrics } from '@opentelemetry/api';
34
import { type RecordGqlOperationSignature } from 'twenty-shared/types';
45
import { isDefined } from 'twenty-shared/utils';
56

@@ -9,7 +10,6 @@ import { WithLock } from 'src/engine/core-modules/cache-lock/with-lock.decorator
910
import { InjectCacheStorage } from 'src/engine/core-modules/cache-storage/decorators/cache-storage.decorator';
1011
import { CacheStorageService } from 'src/engine/core-modules/cache-storage/services/cache-storage.service';
1112
import { CacheStorageNamespace } from 'src/engine/core-modules/cache-storage/types/cache-storage-namespace.enum';
12-
import { PrometheusService } from 'src/engine/core-modules/metrics/prometheus.service';
1313
import { EVENT_STREAM_TTL_MS } from 'src/engine/subscriptions/constants/event-stream-ttl.constant';
1414
import {
1515
EventStreamException,
@@ -25,22 +25,26 @@ export class EventStreamService implements OnModuleInit {
2525
@InjectCacheStorage(CacheStorageNamespace.EngineSubscriptions)
2626
private readonly cacheStorageService: CacheStorageService,
2727
private readonly cacheLockService: CacheLockService,
28-
private readonly prometheusService: PrometheusService,
2928
) {}
3029

3130
onModuleInit() {
32-
this.prometheusService.createGauge({
33-
name: 'twenty_event_streams_live_total',
34-
help: 'Current number of live event streams',
35-
collect: async (gauge) => {
36-
try {
37-
const count = await this.getTotalActiveStreamCount();
38-
39-
gauge.set(count);
40-
} catch (error) {
41-
this.logger.error('Failed to collect event streams metrics', error);
42-
}
31+
const meter = metrics.getMeter('twenty-server');
32+
33+
const gauge = meter.createObservableGauge(
34+
'twenty_event_streams_live_total',
35+
{
36+
description: 'Current number of live event streams',
4337
},
38+
);
39+
40+
gauge.addCallback(async (observableResult) => {
41+
try {
42+
const count = await this.getTotalActiveStreamCount();
43+
44+
observableResult.observe(count);
45+
} catch (error) {
46+
this.logger.error('Failed to collect event streams metrics', error);
47+
}
4448
});
4549
}
4650

packages/twenty-server/src/engine/subscriptions/subscriptions.module.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { TypeOrmModule } from '@nestjs/typeorm';
33

44
import { CacheLockModule } from 'src/engine/core-modules/cache-lock/cache-lock.module';
55
import { CacheStorageModule } from 'src/engine/core-modules/cache-storage/cache-storage.module';
6-
import { MetricsModule } from 'src/engine/core-modules/metrics/metrics.module';
76
import { RedisClientModule } from 'src/engine/core-modules/redis-client/redis-client.module';
87
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
98
import { EventStreamService } from 'src/engine/subscriptions/event-stream.service';
@@ -14,7 +13,6 @@ import { SubscriptionService } from 'src/engine/subscriptions/subscription.servi
1413
RedisClientModule,
1514
CacheStorageModule,
1615
CacheLockModule,
17-
MetricsModule,
1816
TypeOrmModule.forFeature([WorkspaceEntity]),
1917
],
2018
providers: [SubscriptionService, EventStreamService],

packages/twenty-server/src/instrument.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import process from 'process';
22

33
import opentelemetry from '@opentelemetry/api';
44
import { OTLPMetricExporter } from '@opentelemetry/exporter-metrics-otlp-http';
5+
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
56
import {
67
AggregationTemporality,
78
ConsoleMetricExporter,
@@ -49,6 +50,11 @@ if (process.env.EXCEPTION_HANDLER_DRIVER === ExceptionHandlerDriver.SENTRY) {
4950

5051
// Meter setup
5152

53+
// PrometheusExporter starts its own HTTP server on port 9464
54+
const prometheusExporter = meterDrivers.includes(MeterDriver.Prometheus)
55+
? new PrometheusExporter({ port: 9464 })
56+
: null;
57+
5258
const meterProvider = new MeterProvider({
5359
readers: [
5460
...(meterDrivers.includes(MeterDriver.Console)
@@ -70,6 +76,7 @@ const meterProvider = new MeterProvider({
7076
}),
7177
]
7278
: []),
79+
...(prometheusExporter ? [prometheusExporter] : []),
7380
],
7481
});
7582

0 commit comments

Comments
 (0)