@rsdk/db.mikro-orm 5.11.5 → 5.11.6-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/metrics/entity-operations.subscriber.d.ts +15 -0
- package/dist/metrics/entity-operations.subscriber.js +47 -0
- package/dist/metrics/entity-operations.subscriber.js.map +1 -0
- package/dist/metrics/flush-metrics.subscriber.d.ts +18 -0
- package/dist/metrics/flush-metrics.subscriber.js +37 -0
- package/dist/metrics/flush-metrics.subscriber.js.map +1 -0
- package/dist/metrics/identity-map.registry.d.ts +23 -0
- package/dist/metrics/identity-map.registry.js +41 -0
- package/dist/metrics/identity-map.registry.js.map +1 -0
- package/dist/metrics/knex-pool.d.ts +18 -0
- package/dist/metrics/knex-pool.js +28 -0
- package/dist/metrics/knex-pool.js.map +1 -0
- package/dist/metrics/mikro-orm.metrics.d.ts +7 -0
- package/dist/metrics/mikro-orm.metrics.js +51 -0
- package/dist/metrics/mikro-orm.metrics.js.map +1 -0
- package/dist/metrics/subscribers.d.ts +25 -0
- package/dist/metrics/subscribers.js +36 -0
- package/dist/metrics/subscribers.js.map +1 -0
- package/dist/mikro-orm.plugin.js +2 -0
- package/dist/mikro-orm.plugin.js.map +1 -1
- package/dist/modules/metrics.module.d.ts +32 -0
- package/dist/modules/metrics.module.js +101 -0
- package/dist/modules/metrics.module.js.map +1 -0
- package/package.json +2 -2
- package/src/metrics/entity-operations.subscriber.ts +60 -0
- package/src/metrics/flush-metrics.subscriber.ts +48 -0
- package/src/metrics/identity-map.registry.spec.ts +121 -0
- package/src/metrics/identity-map.registry.ts +48 -0
- package/src/metrics/knex-pool.spec.ts +38 -0
- package/src/metrics/knex-pool.ts +37 -0
- package/src/metrics/mikro-orm.metrics.ts +35 -0
- package/src/metrics/subscribers.spec.ts +164 -0
- package/src/metrics/subscribers.ts +40 -0
- package/src/mikro-orm.plugin.ts +2 -0
- package/src/modules/metrics.module.spec.ts +267 -0
- package/src/modules/metrics.module.ts +128 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { EventArgs, EventSubscriber, FlushEventArgs } from '@mikro-orm/core';
|
|
2
|
+
import type { EntityOperationsRecorder } from '@rsdk/db/dist/metrics/plugin-kit';
|
|
3
|
+
import { DetachableSubscriber } from './subscribers';
|
|
4
|
+
/**
|
|
5
|
+
* Пишет `orm_entity_operations_total`: загрузки по onLoad, изменения
|
|
6
|
+
* по changesets после flush. Подписка на onLoad заставляет MikroORM
|
|
7
|
+
* отправлять событие для каждой загруженной сущности, поэтому subscriber
|
|
8
|
+
* регистрируется только при включённой метрике
|
|
9
|
+
*/
|
|
10
|
+
export declare class EntityOperationsSubscriber extends DetachableSubscriber implements EventSubscriber {
|
|
11
|
+
private readonly recorder;
|
|
12
|
+
constructor(recorder: EntityOperationsRecorder);
|
|
13
|
+
onLoad({ meta }: EventArgs<object>): void;
|
|
14
|
+
afterFlush({ uow }: FlushEventArgs): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntityOperationsSubscriber = void 0;
|
|
4
|
+
const subscribers_1 = require("./subscribers");
|
|
5
|
+
/**
|
|
6
|
+
* Ключи — значения `ChangeSetType`. Строками, а не через enum: в MikroORM 5
|
|
7
|
+
* нет части значений (`update_early`, `delete_early`)
|
|
8
|
+
*/
|
|
9
|
+
const CHANGESET_OPERATIONS = {
|
|
10
|
+
create: 'insert',
|
|
11
|
+
update: 'update',
|
|
12
|
+
update_early: 'update',
|
|
13
|
+
delete: 'delete',
|
|
14
|
+
delete_early: 'delete',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Пишет `orm_entity_operations_total`: загрузки по onLoad, изменения
|
|
18
|
+
* по changesets после flush. Подписка на onLoad заставляет MikroORM
|
|
19
|
+
* отправлять событие для каждой загруженной сущности, поэтому subscriber
|
|
20
|
+
* регистрируется только при включённой метрике
|
|
21
|
+
*/
|
|
22
|
+
class EntityOperationsSubscriber extends subscribers_1.DetachableSubscriber {
|
|
23
|
+
recorder;
|
|
24
|
+
constructor(recorder) {
|
|
25
|
+
super();
|
|
26
|
+
this.recorder = recorder;
|
|
27
|
+
}
|
|
28
|
+
onLoad({ meta }) {
|
|
29
|
+
if (!this.attached) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
this.recorder.record(meta.className, 'load');
|
|
33
|
+
}
|
|
34
|
+
afterFlush({ uow }) {
|
|
35
|
+
if (!this.attached) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
for (const changeSet of uow.getChangeSets()) {
|
|
39
|
+
const op = CHANGESET_OPERATIONS[changeSet.type];
|
|
40
|
+
if (op) {
|
|
41
|
+
this.recorder.record(changeSet.meta.className, op);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
exports.EntityOperationsSubscriber = EntityOperationsSubscriber;
|
|
47
|
+
//# sourceMappingURL=entity-operations.subscriber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-operations.subscriber.js","sourceRoot":"","sources":["../../src/metrics/entity-operations.subscriber.ts"],"names":[],"mappings":";;;AAWA,+CAAqD;AAErD;;;GAGG;AACH,MAAM,oBAAoB,GAAgD;IACxE,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,QAAQ;IACtB,MAAM,EAAE,QAAQ;IAChB,YAAY,EAAE,QAAQ;CACvB,CAAC;AAEF;;;;;GAKG;AACH,MAAa,0BACX,SAAQ,kCAAoB;IAGC;IAA7B,YAA6B,QAAkC;QAC7D,KAAK,EAAE,CAAC;QADmB,aAAQ,GAAR,QAAQ,CAA0B;IAE/D,CAAC;IAED,MAAM,CAAC,EAAE,IAAI,EAAqB;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,UAAU,CAAC,EAAE,GAAG,EAAkB;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,GAAG,CAAC,aAAa,EAAyB,EAAE,CAAC;YACnE,MAAM,EAAE,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;IACH,CAAC;CACF;AA5BD,gEA4BC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { EventSubscriber, FlushEventArgs } from '@mikro-orm/core';
|
|
2
|
+
import type { HistogramLike } from '@rsdk/db/dist/metrics/plugin-kit';
|
|
3
|
+
import { DetachableSubscriber } from './subscribers';
|
|
4
|
+
export interface FlushMetrics {
|
|
5
|
+
duration: HistogramLike;
|
|
6
|
+
changesets: HistogramLike;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Меряет длительность flush и число changesets в нём.
|
|
10
|
+
* Упавший flush не доходит до afterFlush и не учитывается
|
|
11
|
+
*/
|
|
12
|
+
export declare class FlushMetricsSubscriber extends DetachableSubscriber implements EventSubscriber {
|
|
13
|
+
private readonly metrics;
|
|
14
|
+
private readonly startedAt;
|
|
15
|
+
constructor(metrics: FlushMetrics);
|
|
16
|
+
beforeFlush({ uow }: FlushEventArgs): void;
|
|
17
|
+
afterFlush({ uow }: FlushEventArgs): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlushMetricsSubscriber = void 0;
|
|
4
|
+
const plugin_kit_1 = require("@rsdk/db/dist/metrics/plugin-kit");
|
|
5
|
+
const subscribers_1 = require("./subscribers");
|
|
6
|
+
/**
|
|
7
|
+
* Меряет длительность flush и число changesets в нём.
|
|
8
|
+
* Упавший flush не доходит до afterFlush и не учитывается
|
|
9
|
+
*/
|
|
10
|
+
class FlushMetricsSubscriber extends subscribers_1.DetachableSubscriber {
|
|
11
|
+
metrics;
|
|
12
|
+
startedAt = new WeakMap();
|
|
13
|
+
constructor(metrics) {
|
|
14
|
+
super();
|
|
15
|
+
this.metrics = metrics;
|
|
16
|
+
}
|
|
17
|
+
beforeFlush({ uow }) {
|
|
18
|
+
if (!this.attached) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
this.startedAt.set(uow, (0, plugin_kit_1.now)());
|
|
22
|
+
}
|
|
23
|
+
afterFlush({ uow }) {
|
|
24
|
+
if (!this.attached) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const startedAt = this.startedAt.get(uow);
|
|
28
|
+
if (startedAt === undefined) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.startedAt.delete(uow);
|
|
32
|
+
this.metrics.duration.observe((0, plugin_kit_1.secondsSince)(startedAt));
|
|
33
|
+
this.metrics.changesets.observe(uow.getChangeSets().length);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
exports.FlushMetricsSubscriber = FlushMetricsSubscriber;
|
|
37
|
+
//# sourceMappingURL=flush-metrics.subscriber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flush-metrics.subscriber.js","sourceRoot":"","sources":["../../src/metrics/flush-metrics.subscriber.ts"],"names":[],"mappings":";;;AAEA,iEAAqE;AAErE,+CAAqD;AAOrD;;;GAGG;AACH,MAAa,sBACX,SAAQ,kCAAoB;IAKC;IAFZ,SAAS,GAAG,IAAI,OAAO,EAAkB,CAAC;IAE3D,YAA6B,OAAqB;QAChD,KAAK,EAAE,CAAC;QADmB,YAAO,GAAP,OAAO,CAAc;IAElD,CAAC;IAED,WAAW,CAAC,EAAE,GAAG,EAAkB;QACjC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAA,gBAAG,GAAE,CAAC,CAAC;IACjC,CAAC;IAED,UAAU,CAAC,EAAE,GAAG,EAAkB;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAA,yBAAY,EAAC,SAAS,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;IAC9D,CAAC;CACF;AAhCD,wDAgCC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MikroORM } from '@mikro-orm/core';
|
|
2
|
+
import type { Detach } from '@rsdk/db/dist/metrics/plugin-kit';
|
|
3
|
+
export type IdentityMapSize = () => number;
|
|
4
|
+
/**
|
|
5
|
+
* Число сущностей в identity map. Считается обходом, а не через `keys()`:
|
|
6
|
+
* `keys()` собирает массив через `push(...spread)` и на сотнях тысяч
|
|
7
|
+
* сущностей одного класса падает с `RangeError` (переполнение стека)
|
|
8
|
+
*/
|
|
9
|
+
export declare const countIdentityMap: (map: Iterable<unknown>) => number;
|
|
10
|
+
/**
|
|
11
|
+
* Размер identity map глобального EntityManager
|
|
12
|
+
*/
|
|
13
|
+
export declare const identityMapSize: (orm: MikroORM) => number;
|
|
14
|
+
/**
|
|
15
|
+
* EntityManager-ы, размер identity map которых gauge читает при scrape.
|
|
16
|
+
* Метрика живёт на весь процесс, а MikroORM — вместе с приложением.
|
|
17
|
+
* Источник, который бросил исключение или вернул не размер (не конечное
|
|
18
|
+
* число ≥ 0), в сумму не попадает: см. `ScrapeSourceRegistry`
|
|
19
|
+
*/
|
|
20
|
+
export declare class IdentityMapRegistry {
|
|
21
|
+
static add(source: IdentityMapSize): Detach;
|
|
22
|
+
static total(): number;
|
|
23
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IdentityMapRegistry = exports.identityMapSize = exports.countIdentityMap = void 0;
|
|
4
|
+
const plugin_kit_1 = require("@rsdk/db/dist/metrics/plugin-kit");
|
|
5
|
+
/**
|
|
6
|
+
* Число сущностей в identity map. Считается обходом, а не через `keys()`:
|
|
7
|
+
* `keys()` собирает массив через `push(...spread)` и на сотнях тысяч
|
|
8
|
+
* сущностей одного класса падает с `RangeError` (переполнение стека)
|
|
9
|
+
*/
|
|
10
|
+
const countIdentityMap = (map) => {
|
|
11
|
+
let size = 0;
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
13
|
+
for (const _ of map) {
|
|
14
|
+
size++;
|
|
15
|
+
}
|
|
16
|
+
return size;
|
|
17
|
+
};
|
|
18
|
+
exports.countIdentityMap = countIdentityMap;
|
|
19
|
+
/**
|
|
20
|
+
* Размер identity map глобального EntityManager
|
|
21
|
+
*/
|
|
22
|
+
const identityMapSize = (orm) => (0, exports.countIdentityMap)(orm.em.getUnitOfWork(false).getIdentityMap());
|
|
23
|
+
exports.identityMapSize = identityMapSize;
|
|
24
|
+
const isSize = (value) => typeof value === 'number' && Number.isFinite(value) && value >= 0;
|
|
25
|
+
const registry = new plugin_kit_1.ScrapeSourceRegistry(isSize);
|
|
26
|
+
/**
|
|
27
|
+
* EntityManager-ы, размер identity map которых gauge читает при scrape.
|
|
28
|
+
* Метрика живёт на весь процесс, а MikroORM — вместе с приложением.
|
|
29
|
+
* Источник, который бросил исключение или вернул не размер (не конечное
|
|
30
|
+
* число ≥ 0), в сумму не попадает: см. `ScrapeSourceRegistry`
|
|
31
|
+
*/
|
|
32
|
+
class IdentityMapRegistry {
|
|
33
|
+
static add(source) {
|
|
34
|
+
return registry.add(source);
|
|
35
|
+
}
|
|
36
|
+
static total() {
|
|
37
|
+
return registry.snapshots().reduce((total, size) => total + size, 0);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.IdentityMapRegistry = IdentityMapRegistry;
|
|
41
|
+
//# sourceMappingURL=identity-map.registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-map.registry.js","sourceRoot":"","sources":["../../src/metrics/identity-map.registry.ts"],"names":[],"mappings":";;;AAEA,iEAAwE;AAIxE;;;;GAIG;AACI,MAAM,gBAAgB,GAAG,CAAC,GAAsB,EAAU,EAAE;IACjE,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,6DAA6D;IAC7D,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE,CAAC;QACpB,IAAI,EAAE,CAAC;IACT,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AATW,QAAA,gBAAgB,oBAS3B;AAEF;;GAEG;AACI,MAAM,eAAe,GAAG,CAAC,GAAa,EAAU,EAAE,CACvD,IAAA,wBAAgB,EAAC,GAAG,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;AADpD,QAAA,eAAe,mBACqC;AAEjE,MAAM,MAAM,GAAG,CAAC,KAAc,EAAmB,EAAE,CACjD,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAEpE,MAAM,QAAQ,GAAG,IAAI,iCAAoB,CAAC,MAAM,CAAC,CAAC;AAElD;;;;;GAKG;AACH,MAAa,mBAAmB;IAC9B,MAAM,CAAC,GAAG,CAAC,MAAuB;QAChC,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,KAAK;QACV,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;CACF;AARD,kDAQC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { MikroORM } from '@mikro-orm/core';
|
|
2
|
+
export interface KnexPool {
|
|
3
|
+
resource: string;
|
|
4
|
+
pool: unknown;
|
|
5
|
+
isPostgres: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Пул knex основного соединения. Knex есть только у SQL-драйверов, и пул
|
|
9
|
+
* у него — tarn при любом диалекте. Без knex или без пула результат
|
|
10
|
+
* `undefined`.
|
|
11
|
+
*
|
|
12
|
+
* Здесь пул только находится: что это действительно пул tarn, проверяет
|
|
13
|
+
* `DbClientMetrics.instrumentPool`.
|
|
14
|
+
*
|
|
15
|
+
* `resource` — вторая часть значения метки `pool`, всегда `mikro-orm`. Имя
|
|
16
|
+
* приложения из `APP_NAME` к нему добавляет `DbClientMetrics`
|
|
17
|
+
*/
|
|
18
|
+
export declare const findKnexPool: (orm: MikroORM) => KnexPool | undefined;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findKnexPool = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Пул knex основного соединения. Knex есть только у SQL-драйверов, и пул
|
|
6
|
+
* у него — tarn при любом диалекте. Без knex или без пула результат
|
|
7
|
+
* `undefined`.
|
|
8
|
+
*
|
|
9
|
+
* Здесь пул только находится: что это действительно пул tarn, проверяет
|
|
10
|
+
* `DbClientMetrics.instrumentPool`.
|
|
11
|
+
*
|
|
12
|
+
* `resource` — вторая часть значения метки `pool`, всегда `mikro-orm`. Имя
|
|
13
|
+
* приложения из `APP_NAME` к нему добавляет `DbClientMetrics`
|
|
14
|
+
*/
|
|
15
|
+
const findKnexPool = (orm) => {
|
|
16
|
+
const connection = orm.em.getConnection();
|
|
17
|
+
const client = connection.getKnex?.().client;
|
|
18
|
+
if (!client?.pool) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
resource: 'mikro-orm',
|
|
23
|
+
pool: client.pool,
|
|
24
|
+
isPostgres: client.dialect === 'postgresql',
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
exports.findKnexPool = findKnexPool;
|
|
28
|
+
//# sourceMappingURL=knex-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex-pool.js","sourceRoot":"","sources":["../../src/metrics/knex-pool.ts"],"names":[],"mappings":";;;AAYA;;;;;;;;;;GAUG;AACI,MAAM,YAAY,GAAG,CAAC,GAAa,EAAwB,EAAE;IAClE,MAAM,UAAU,GAAG,GAAG,CAAC,EAAE,CAAC,aAAa,EAAkC,CAAC;IAC1E,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC;IAE7C,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,WAAW;QACrB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,UAAU,EAAE,MAAM,CAAC,OAAO,KAAK,YAAY;KAC5C,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,YAAY,gBAavB"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.MikroOrmIdentityMapSize = exports.MikroOrmFlushChangesets = exports.MikroOrmFlushDuration = void 0;
|
|
10
|
+
const core_1 = require("@rsdk/core");
|
|
11
|
+
const plugin_kit_1 = require("@rsdk/db/dist/metrics/plugin-kit");
|
|
12
|
+
const identity_map_registry_1 = require("./identity-map.registry");
|
|
13
|
+
const CHANGESET_BUCKETS = [
|
|
14
|
+
1, 5, 10, 25, 50, 100, 250, 500, 1000,
|
|
15
|
+
];
|
|
16
|
+
let MikroOrmFlushDuration = class MikroOrmFlushDuration extends core_1.Histogram {
|
|
17
|
+
};
|
|
18
|
+
exports.MikroOrmFlushDuration = MikroOrmFlushDuration;
|
|
19
|
+
exports.MikroOrmFlushDuration = MikroOrmFlushDuration = __decorate([
|
|
20
|
+
(0, plugin_kit_1.DbMetric)('histogram', {
|
|
21
|
+
name: 'mikro_orm_flush_duration_seconds',
|
|
22
|
+
help: 'Duration of EntityManager flush',
|
|
23
|
+
description: 'Длительность em.flush()',
|
|
24
|
+
buckets: plugin_kit_1.QUERY_BUCKETS,
|
|
25
|
+
})
|
|
26
|
+
], MikroOrmFlushDuration);
|
|
27
|
+
let MikroOrmFlushChangesets = class MikroOrmFlushChangesets extends core_1.Histogram {
|
|
28
|
+
};
|
|
29
|
+
exports.MikroOrmFlushChangesets = MikroOrmFlushChangesets;
|
|
30
|
+
exports.MikroOrmFlushChangesets = MikroOrmFlushChangesets = __decorate([
|
|
31
|
+
(0, plugin_kit_1.DbMetric)('histogram', {
|
|
32
|
+
name: 'mikro_orm_flush_changesets',
|
|
33
|
+
help: 'Number of changesets per flush',
|
|
34
|
+
description: 'Число changesets за один flush',
|
|
35
|
+
buckets: CHANGESET_BUCKETS,
|
|
36
|
+
})
|
|
37
|
+
], MikroOrmFlushChangesets);
|
|
38
|
+
let MikroOrmIdentityMapSize = class MikroOrmIdentityMapSize extends core_1.Gauge {
|
|
39
|
+
};
|
|
40
|
+
exports.MikroOrmIdentityMapSize = MikroOrmIdentityMapSize;
|
|
41
|
+
exports.MikroOrmIdentityMapSize = MikroOrmIdentityMapSize = __decorate([
|
|
42
|
+
(0, plugin_kit_1.DbMetric)('gauge', {
|
|
43
|
+
name: 'mikro_orm_identity_map_size',
|
|
44
|
+
help: 'Number of entities in the global EntityManager identity map',
|
|
45
|
+
description: 'Размер identity map глобального EntityManager. Рост означает, что забыли fork или clear',
|
|
46
|
+
collect() {
|
|
47
|
+
this.set(identity_map_registry_1.IdentityMapRegistry.total());
|
|
48
|
+
},
|
|
49
|
+
})
|
|
50
|
+
], MikroOrmIdentityMapSize);
|
|
51
|
+
//# sourceMappingURL=mikro-orm.metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mikro-orm.metrics.js","sourceRoot":"","sources":["../../src/metrics/mikro-orm.metrics.ts"],"names":[],"mappings":";;;;;;;;;AAAA,qCAA8C;AAC9C,iEAA2E;AAE3E,mEAA8D;AAE9D,MAAM,iBAAiB,GAAsB;IAC3C,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI;CACtC,CAAC;AAQK,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,gBAAS;CAAG,CAAA;AAA1C,sDAAqB;gCAArB,qBAAqB;IANjC,IAAA,qBAAQ,EAAC,WAAW,EAAE;QACrB,IAAI,EAAE,kCAAkC;QACxC,IAAI,EAAE,iCAAiC;QACvC,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,0BAAa;KACvB,CAAC;GACW,qBAAqB,CAAqB;AAQhD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,gBAAS;CAAG,CAAA;AAA5C,0DAAuB;kCAAvB,uBAAuB;IANnC,IAAA,qBAAQ,EAAC,WAAW,EAAE;QACrB,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,gCAAgC;QACtC,WAAW,EAAE,gCAAgC;QAC7C,OAAO,EAAE,iBAAiB;KAC3B,CAAC;GACW,uBAAuB,CAAqB;AAWlD,IAAM,uBAAuB,GAA7B,MAAM,uBAAwB,SAAQ,YAAK;CAAG,CAAA;AAAxC,0DAAuB;kCAAvB,uBAAuB;IATnC,IAAA,qBAAQ,EAAC,OAAO,EAAE;QACjB,IAAI,EAAE,6BAA6B;QACnC,IAAI,EAAE,6DAA6D;QACnE,WAAW,EACT,yFAAyF;QAC3F,OAAO;YACL,IAAI,CAAC,GAAG,CAAC,2CAAmB,CAAC,KAAK,EAAE,CAAC,CAAC;QACxC,CAAC;KACF,CAAC;GACW,uBAAuB,CAAiB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { EventManager, EventSubscriber } from '@mikro-orm/core';
|
|
2
|
+
import type { Detach } from '@rsdk/db/dist/metrics/plugin-kit';
|
|
3
|
+
/**
|
|
4
|
+
* Subscriber метрик, которого можно выключить: у EventManager нет способа
|
|
5
|
+
* удалить подписчика. Каждый хук наследника первым делом проверяет `attached`.
|
|
6
|
+
* Выключить можно только через {@link DetachableSubscriber.detach}, включить
|
|
7
|
+
* обратно нельзя.
|
|
8
|
+
*
|
|
9
|
+
* `detach`, `detached` и `attached` не совпадают ни с одним ключом
|
|
10
|
+
* `EventType`, поэтому MikroORM не принимает их за хуки. `EventSubscriber`
|
|
11
|
+
* реализуют наследники: у него все поля необязательные, и класс без хуков
|
|
12
|
+
* TypeScript не примет
|
|
13
|
+
*/
|
|
14
|
+
export declare abstract class DetachableSubscriber {
|
|
15
|
+
private detached;
|
|
16
|
+
protected get attached(): boolean;
|
|
17
|
+
detach(): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Регистрирует subscriber в EventManager. Detach не удаляет subscriber из
|
|
21
|
+
* EventManager, а выключает его: subscriber остаётся зарегистрированным,
|
|
22
|
+
* но больше ничего не пишет. Повторный вызов ничего не меняет:
|
|
23
|
+
* {@link DetachableSubscriber.detach} только ставит флаг
|
|
24
|
+
*/
|
|
25
|
+
export declare const registerSubscriber: (events: EventManager, subscriber: DetachableSubscriber & EventSubscriber) => Detach;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSubscriber = exports.DetachableSubscriber = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Subscriber метрик, которого можно выключить: у EventManager нет способа
|
|
6
|
+
* удалить подписчика. Каждый хук наследника первым делом проверяет `attached`.
|
|
7
|
+
* Выключить можно только через {@link DetachableSubscriber.detach}, включить
|
|
8
|
+
* обратно нельзя.
|
|
9
|
+
*
|
|
10
|
+
* `detach`, `detached` и `attached` не совпадают ни с одним ключом
|
|
11
|
+
* `EventType`, поэтому MikroORM не принимает их за хуки. `EventSubscriber`
|
|
12
|
+
* реализуют наследники: у него все поля необязательные, и класс без хуков
|
|
13
|
+
* TypeScript не примет
|
|
14
|
+
*/
|
|
15
|
+
class DetachableSubscriber {
|
|
16
|
+
detached = false;
|
|
17
|
+
get attached() {
|
|
18
|
+
return !this.detached;
|
|
19
|
+
}
|
|
20
|
+
detach() {
|
|
21
|
+
this.detached = true;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.DetachableSubscriber = DetachableSubscriber;
|
|
25
|
+
/**
|
|
26
|
+
* Регистрирует subscriber в EventManager. Detach не удаляет subscriber из
|
|
27
|
+
* EventManager, а выключает его: subscriber остаётся зарегистрированным,
|
|
28
|
+
* но больше ничего не пишет. Повторный вызов ничего не меняет:
|
|
29
|
+
* {@link DetachableSubscriber.detach} только ставит флаг
|
|
30
|
+
*/
|
|
31
|
+
const registerSubscriber = (events, subscriber) => {
|
|
32
|
+
events.registerSubscriber(subscriber);
|
|
33
|
+
return () => subscriber.detach();
|
|
34
|
+
};
|
|
35
|
+
exports.registerSubscriber = registerSubscriber;
|
|
36
|
+
//# sourceMappingURL=subscribers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subscribers.js","sourceRoot":"","sources":["../../src/metrics/subscribers.ts"],"names":[],"mappings":";;;AAGA;;;;;;;;;;GAUG;AACH,MAAsB,oBAAoB;IAChC,QAAQ,GAAG,KAAK,CAAC;IAEzB,IAAc,QAAQ;QACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;CACF;AAVD,oDAUC;AAED;;;;;GAKG;AACI,MAAM,kBAAkB,GAAG,CAChC,MAAoB,EACpB,UAAkD,EAC1C,EAAE;IACV,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;IAEtC,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;AACnC,CAAC,CAAC;AAPW,QAAA,kBAAkB,sBAO7B"}
|
package/dist/mikro-orm.plugin.js
CHANGED
|
@@ -13,6 +13,7 @@ const db_1 = require("@rsdk/db");
|
|
|
13
13
|
const logging_1 = require("@rsdk/logging");
|
|
14
14
|
const lodash_1 = __importDefault(require("lodash"));
|
|
15
15
|
const node_path_1 = __importDefault(require("node:path"));
|
|
16
|
+
const metrics_module_1 = require("./modules/metrics.module");
|
|
16
17
|
const mikro_orm_config_1 = require("./providers/mikro-orm.config");
|
|
17
18
|
const mikro_orm_logger_adapter_1 = require("./providers/mikro-orm-logger.adapter");
|
|
18
19
|
const mikro_orm_errors_transformer_1 = require("./mikro-orm.errors-transformer");
|
|
@@ -82,6 +83,7 @@ class MikroOrmPlugin {
|
|
|
82
83
|
.value();
|
|
83
84
|
},
|
|
84
85
|
}),
|
|
86
|
+
metrics_module_1.MikroOrmMetricsModule,
|
|
85
87
|
];
|
|
86
88
|
}
|
|
87
89
|
errorTransformers() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mikro-orm.plugin.js","sourceRoot":"","sources":["../src/mikro-orm.plugin.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,uDAAuD;AACvD,iDAAiD;;;;;;AAGjD,8CAAmD;AAQnD,qCAAuD;AACvD,iCAAmD;AACnD,2CAA8C;AAC9C,oDAAuB;AACvB,0DAA6B;AAE7B,mEAAoE;AACpE,mFAAuE;AACvE,iFAA0E;AAC1E,2CAAsD;AAGtD,MAAa,cAAc;IAMI;IALrB,MAAM,CAAU,MAAM,GAAG,uBAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAEtE;;OAEG;IACH,YAA6B,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;IAAG,CAAC;IAE/D,IAAI,QAAQ;QACV,OAAO,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC;IACnC,CAAC;IAED,aAAa;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC9C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrD,CAAC;QAED,OAAO;YACL,uBAAc,CAAC,YAAY,CAAC;gBAC1B,OAAO,EAAE;oBACP;wBACE,MAAM,EAAE,uBAAc;wBACtB,SAAS,EAAE,CAAC,mCAAuB,EAAE,0CAAe,CAAC;wBACrD,OAAO,EAAE,CAAC,0CAAe,CAAC;qBAC3B;iBACF;gBACD,MAAM,EAAE,CAAC,uCAAoB,EAAE,0CAAe,EAAE,eAAQ,CAAC;gBACzD,UAAU,EAAE,CACV,MAA4B,EAC5B,MAAuB,EACvB,OAAe,EACY,EAAE;oBAC7B,OAAO,IAAA,gBAAC,EAA4B;wBAClC,MAAM,EACJ,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;wBAChE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;wBAChC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI;4BACnB,MAAM,EAAE,MAAM,CAAC,MAAM;yBACtB,CAAC;wBACF,aAAa,EAAE,GAAG,EAAE,CAAC,MAAM;wBAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,gBAAgB,EAAE,CAAC,IAAI,CAAC,QAAQ;wBAChC,IAAI,EAAE,OAAO,GAAG,YAAY;wBAC5B,IAAI,EAAE;4BACJ,GAAG,EAAE,MAAM,CAAC,OAAO;4BACnB,GAAG,EAAE,MAAM,CAAC,OAAO;yBACpB;wBACD,UAAU,EAAE;4BACV,SAAS,EAAE,sBAAsB;4BACjC,IAAI,EAAE,cAAc;4BACpB,IAAI,EAAE,gBAAgB;yBACvB;wBACD,kBAAkB,EAAE,IAAI;wBACxB,aAAa,EAAE;4BACb,UAAU,EAAE;gCACV,SAAS,EAAE,MAAM,CAAC,SAAS;gCAC3B,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;gCACnD,GAAG,EAAE,IAAA,4BAAuB,EAAC,MAAM,CAAC;6BACrC;yBACF;wBACD,GAAI,IAAI,CAAC,OAAO,CAAC,cAAsB;qBACxC,CAAC;yBACC,MAAM,CAAC,gBAAC,CAAC,WAAW,CAAC;yBACrB,MAAM,CAAC,gBAAC,CAAC,MAAM,CAAC;yBAChB,KAAK,EAAE,CAAC;gBACb,CAAC;aACF,CAAC;
|
|
1
|
+
{"version":3,"file":"mikro-orm.plugin.js","sourceRoot":"","sources":["../src/mikro-orm.plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { MikroORM } from '@mikro-orm/core';
|
|
2
|
+
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
|
3
|
+
import type { DbClientMetrics, Detach, EntityOperationsRecorder } from '@rsdk/db/dist/metrics/plugin-kit';
|
|
4
|
+
import { DbMetricsModuleBase } from '@rsdk/db/dist/metrics/plugin-kit';
|
|
5
|
+
import { ILogger } from '@rsdk/logging';
|
|
6
|
+
import { MikroOrmFlushChangesets, MikroOrmFlushDuration } from '../metrics/mikro-orm.metrics';
|
|
7
|
+
/**
|
|
8
|
+
* Подключает метрики БД к MikroORM: пул knex, flush, identity map и
|
|
9
|
+
* операции над сущностями. Выключатель `DB_METRICS_ENABLED`, внедрение
|
|
10
|
+
* метрик через DI (`DbClientMetrics` и `EntityOperationsRecorder` — по
|
|
11
|
+
* токенам из `plugin-kit`) и итог при остановке приложения описаны в
|
|
12
|
+
* {@link DbMetricsModuleBase}. Значение метки `pool` собирает ядро из
|
|
13
|
+
* `APP_NAME` и ресурса из {@link findKnexPool}.
|
|
14
|
+
*
|
|
15
|
+
* При остановке subscriber-ы выключаются. Удалить их из EventManager нельзя:
|
|
16
|
+
* публичного способа нет, поэтому они остаются зарегистрированными
|
|
17
|
+
* у закрытого ORM, но ничего не пишут
|
|
18
|
+
*/
|
|
19
|
+
export declare class MikroOrmMetricsModule extends DbMetricsModuleBase implements OnModuleInit, OnApplicationShutdown {
|
|
20
|
+
private readonly orm;
|
|
21
|
+
private readonly flushDuration;
|
|
22
|
+
private readonly flushChangesets;
|
|
23
|
+
private readonly logger;
|
|
24
|
+
/**
|
|
25
|
+
* @param flushDuration `null`, только когда метрики выключены, а тогда
|
|
26
|
+
* `attach` не вызывается; то же для `flushChangesets`
|
|
27
|
+
*/
|
|
28
|
+
constructor(orm: MikroORM, client: DbClientMetrics | null, entityOperations: EntityOperationsRecorder | null, flushDuration: MikroOrmFlushDuration | null, flushChangesets: MikroOrmFlushChangesets | null, logger: ILogger);
|
|
29
|
+
protected attach(add: (detach?: Detach) => void, client: DbClientMetrics): void;
|
|
30
|
+
private instrumentPool;
|
|
31
|
+
private subscribe;
|
|
32
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MikroOrmMetricsModule = void 0;
|
|
16
|
+
const core_1 = require("@mikro-orm/core");
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const core_2 = require("@rsdk/core");
|
|
19
|
+
const plugin_kit_1 = require("@rsdk/db/dist/metrics/plugin-kit");
|
|
20
|
+
const entity_operations_subscriber_1 = require("../metrics/entity-operations.subscriber");
|
|
21
|
+
const flush_metrics_subscriber_1 = require("../metrics/flush-metrics.subscriber");
|
|
22
|
+
const identity_map_registry_1 = require("../metrics/identity-map.registry");
|
|
23
|
+
const knex_pool_1 = require("../metrics/knex-pool");
|
|
24
|
+
const mikro_orm_metrics_1 = require("../metrics/mikro-orm.metrics");
|
|
25
|
+
const subscribers_1 = require("../metrics/subscribers");
|
|
26
|
+
/**
|
|
27
|
+
* Подключает метрики БД к MikroORM: пул knex, flush, identity map и
|
|
28
|
+
* операции над сущностями. Выключатель `DB_METRICS_ENABLED`, внедрение
|
|
29
|
+
* метрик через DI (`DbClientMetrics` и `EntityOperationsRecorder` — по
|
|
30
|
+
* токенам из `plugin-kit`) и итог при остановке приложения описаны в
|
|
31
|
+
* {@link DbMetricsModuleBase}. Значение метки `pool` собирает ядро из
|
|
32
|
+
* `APP_NAME` и ресурса из {@link findKnexPool}.
|
|
33
|
+
*
|
|
34
|
+
* При остановке subscriber-ы выключаются. Удалить их из EventManager нельзя:
|
|
35
|
+
* публичного способа нет, поэтому они остаются зарегистрированными
|
|
36
|
+
* у закрытого ORM, но ничего не пишут
|
|
37
|
+
*/
|
|
38
|
+
let MikroOrmMetricsModule = class MikroOrmMetricsModule extends plugin_kit_1.DbMetricsModuleBase {
|
|
39
|
+
orm;
|
|
40
|
+
flushDuration;
|
|
41
|
+
flushChangesets;
|
|
42
|
+
logger;
|
|
43
|
+
/**
|
|
44
|
+
* @param flushDuration `null`, только когда метрики выключены, а тогда
|
|
45
|
+
* `attach` не вызывается; то же для `flushChangesets`
|
|
46
|
+
*/
|
|
47
|
+
constructor(orm, client, entityOperations, flushDuration, flushChangesets, logger) {
|
|
48
|
+
super(client, entityOperations);
|
|
49
|
+
this.orm = orm;
|
|
50
|
+
this.flushDuration = flushDuration;
|
|
51
|
+
this.flushChangesets = flushChangesets;
|
|
52
|
+
this.logger = logger;
|
|
53
|
+
}
|
|
54
|
+
attach(add, client) {
|
|
55
|
+
this.instrumentPool(add, client);
|
|
56
|
+
this.subscribe(add);
|
|
57
|
+
add(identity_map_registry_1.IdentityMapRegistry.add(() => (0, identity_map_registry_1.identityMapSize)(this.orm)));
|
|
58
|
+
}
|
|
59
|
+
instrumentPool(add, client) {
|
|
60
|
+
const knexPool = (0, knex_pool_1.findKnexPool)(this.orm);
|
|
61
|
+
if (!knexPool) {
|
|
62
|
+
this.logger.info('Pool metrics are not supported for this driver');
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const { resource, pool, isPostgres } = knexPool;
|
|
66
|
+
// Обёртка `query` рассчитана на соединения `pg`, а они в пуле knex
|
|
67
|
+
// только у диалекта postgresql
|
|
68
|
+
add(client.instrumentPool('tarn', pool, resource, this.logger, {
|
|
69
|
+
instrumentQueries: isPostgres,
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
subscribe(add) {
|
|
73
|
+
const events = this.orm.em.getEventManager();
|
|
74
|
+
if (this.flushDuration && this.flushChangesets) {
|
|
75
|
+
add((0, subscribers_1.registerSubscriber)(events, new flush_metrics_subscriber_1.FlushMetricsSubscriber({
|
|
76
|
+
duration: this.flushDuration,
|
|
77
|
+
changesets: this.flushChangesets,
|
|
78
|
+
})));
|
|
79
|
+
}
|
|
80
|
+
if (this.entityOperations) {
|
|
81
|
+
add((0, subscribers_1.registerSubscriber)(events, new entity_operations_subscriber_1.EntityOperationsSubscriber(this.entityOperations)));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.MikroOrmMetricsModule = MikroOrmMetricsModule;
|
|
86
|
+
exports.MikroOrmMetricsModule = MikroOrmMetricsModule = __decorate([
|
|
87
|
+
(0, common_1.Module)({
|
|
88
|
+
providers: (0, plugin_kit_1.dbMetricsModuleProviders)([
|
|
89
|
+
mikro_orm_metrics_1.MikroOrmFlushDuration,
|
|
90
|
+
mikro_orm_metrics_1.MikroOrmFlushChangesets,
|
|
91
|
+
mikro_orm_metrics_1.MikroOrmIdentityMapSize,
|
|
92
|
+
]),
|
|
93
|
+
}),
|
|
94
|
+
__param(1, (0, common_1.Inject)(plugin_kit_1.DB_CLIENT_METRICS_TOKEN)),
|
|
95
|
+
__param(2, (0, common_1.Inject)(plugin_kit_1.ENTITY_OPERATIONS_RECORDER_TOKEN)),
|
|
96
|
+
__param(3, (0, common_1.Inject)(mikro_orm_metrics_1.MikroOrmFlushDuration)),
|
|
97
|
+
__param(4, (0, common_1.Inject)(mikro_orm_metrics_1.MikroOrmFlushChangesets)),
|
|
98
|
+
__param(5, (0, core_2.InjectLogger)(MikroOrmMetricsModule)),
|
|
99
|
+
__metadata("design:paramtypes", [core_1.MikroORM, Object, Object, Object, Object, Object])
|
|
100
|
+
], MikroOrmMetricsModule);
|
|
101
|
+
//# sourceMappingURL=metrics.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.module.js","sourceRoot":"","sources":["../../src/modules/metrics.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,0CAA2C;AAE3C,2CAAgD;AAChD,qCAA0C;AAM1C,iEAK0C;AAG1C,0FAAqF;AACrF,kFAA6E;AAC7E,4EAG0C;AAC1C,oDAAoD;AACpD,oEAIsC;AACtC,wDAA4D;AAE5D;;;;;;;;;;;GAWG;AAQI,IAAM,qBAAqB,GAA3B,MAAM,qBACX,SAAQ,gCAAmB;IAQR;IAKA;IAEA;IACqC;IAbxD;;;OAGG;IACH,YACmB,GAAa,EACG,MAA8B,EAE/D,gBAAiD,EAEhC,aAA2C,EAE3C,eAA+C,EACV,MAAe;QAErE,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;QAVf,QAAG,GAAH,GAAG,CAAU;QAKb,kBAAa,GAAb,aAAa,CAA8B;QAE3C,oBAAe,GAAf,eAAe,CAAgC;QACV,WAAM,GAAN,MAAM,CAAS;IAGvE,CAAC;IAES,MAAM,CACd,GAA8B,EAC9B,MAAuB;QAEvB,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACpB,GAAG,CAAC,2CAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAA,uCAAe,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAEO,cAAc,CACpB,GAA8B,EAC9B,MAAuB;QAEvB,MAAM,QAAQ,GAAG,IAAA,wBAAY,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,QAAQ,CAAC;QAEhD,mEAAmE;QACnE,+BAA+B;QAE/B,GAAG,CACD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE;YACzD,iBAAiB,EAAE,UAAU;SAC9B,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,SAAS,CAAC,GAA8B;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,EAAE,CAAC;QAE7C,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/C,GAAG,CACD,IAAA,gCAAkB,EAChB,MAAM,EACN,IAAI,iDAAsB,CAAC;gBACzB,QAAQ,EAAE,IAAI,CAAC,aAAa;gBAC5B,UAAU,EAAE,IAAI,CAAC,eAAe;aACjC,CAAC,CACH,CACF,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,GAAG,CACD,IAAA,gCAAkB,EAChB,MAAM,EACN,IAAI,yDAA0B,CAAC,IAAI,CAAC,gBAAgB,CAAC,CACtD,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AA7EY,sDAAqB;gCAArB,qBAAqB;IAPjC,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,IAAA,qCAAwB,EAAC;YAClC,yCAAqB;YACrB,2CAAuB;YACvB,2CAAuB;SACxB,CAAC;KACH,CAAC;IAWG,WAAA,IAAA,eAAM,EAAC,oCAAuB,CAAC,CAAA;IAC/B,WAAA,IAAA,eAAM,EAAC,6CAAgC,CAAC,CAAA;IAExC,WAAA,IAAA,eAAM,EAAC,yCAAqB,CAAC,CAAA;IAE7B,WAAA,IAAA,eAAM,EAAC,2CAAuB,CAAC,CAAA;IAE/B,WAAA,IAAA,mBAAY,EAAC,qBAAqB,CAAC,CAAA;qCARd,eAAQ;GATrB,qBAAqB,CA6EjC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsdk/db.mikro-orm",
|
|
3
|
-
"version": "5.11.
|
|
3
|
+
"version": "5.11.6-next.0",
|
|
4
4
|
"description": "Mikro-orm module for platform",
|
|
5
5
|
"license": "Apache License 2.0",
|
|
6
6
|
"publishConfig": {
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"optional": true
|
|
57
57
|
}
|
|
58
58
|
},
|
|
59
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "36ecf2006c7e322bc53eb12b81de37ac3719180c"
|
|
60
60
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
ChangeSet,
|
|
3
|
+
EventArgs,
|
|
4
|
+
EventSubscriber,
|
|
5
|
+
FlushEventArgs,
|
|
6
|
+
} from '@mikro-orm/core';
|
|
7
|
+
import type {
|
|
8
|
+
EntityOperation,
|
|
9
|
+
EntityOperationsRecorder,
|
|
10
|
+
} from '@rsdk/db/dist/metrics/plugin-kit';
|
|
11
|
+
|
|
12
|
+
import { DetachableSubscriber } from './subscribers';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Ключи — значения `ChangeSetType`. Строками, а не через enum: в MikroORM 5
|
|
16
|
+
* нет части значений (`update_early`, `delete_early`)
|
|
17
|
+
*/
|
|
18
|
+
const CHANGESET_OPERATIONS: Record<string, EntityOperation | undefined> = {
|
|
19
|
+
create: 'insert',
|
|
20
|
+
update: 'update',
|
|
21
|
+
update_early: 'update',
|
|
22
|
+
delete: 'delete',
|
|
23
|
+
delete_early: 'delete',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Пишет `orm_entity_operations_total`: загрузки по onLoad, изменения
|
|
28
|
+
* по changesets после flush. Подписка на onLoad заставляет MikroORM
|
|
29
|
+
* отправлять событие для каждой загруженной сущности, поэтому subscriber
|
|
30
|
+
* регистрируется только при включённой метрике
|
|
31
|
+
*/
|
|
32
|
+
export class EntityOperationsSubscriber
|
|
33
|
+
extends DetachableSubscriber
|
|
34
|
+
implements EventSubscriber
|
|
35
|
+
{
|
|
36
|
+
constructor(private readonly recorder: EntityOperationsRecorder) {
|
|
37
|
+
super();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
onLoad({ meta }: EventArgs<object>): void {
|
|
41
|
+
if (!this.attached) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
this.recorder.record(meta.className, 'load');
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
afterFlush({ uow }: FlushEventArgs): void {
|
|
49
|
+
if (!this.attached) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
for (const changeSet of uow.getChangeSets() as ChangeSet<object>[]) {
|
|
54
|
+
const op = CHANGESET_OPERATIONS[changeSet.type];
|
|
55
|
+
if (op) {
|
|
56
|
+
this.recorder.record(changeSet.meta.className, op);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|