Skip to content
Snippets Groups Projects
Unverified Commit 86713bbf authored by Diego Sampaio's avatar Diego Sampaio Committed by GitHub
Browse files

regression: init db tracing within tracing package (#33712)

parent 696df97b
No related branches found
No related tags found
No related merge requests found
Showing with 46 additions and 45 deletions
...@@ -3,6 +3,7 @@ to: ee/apps/<%= name %>/src/service.ts ...@@ -3,6 +3,7 @@ to: ee/apps/<%= name %>/src/service.ts
--- ---
import { api, getConnection, getTrashCollection } from '@rocket.chat/core-services'; import { api, getConnection, getTrashCollection } from '@rocket.chat/core-services';
import { broker } from '@rocket.chat/network-broker'; import { broker } from '@rocket.chat/network-broker';
import { startTracing } from '@rocket.chat/tracing';
import polka from 'polka'; import polka from 'polka';
import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels'; import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels';
...@@ -10,7 +11,9 @@ import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/reg ...@@ -10,7 +11,9 @@ import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/reg
const PORT = process.env.PORT || <%= h.random() %>; const PORT = process.env.PORT || <%= h.random() %>;
(async () => { (async () => {
const db = await getConnection(); const { db } = await getConnection();
startTracing({ service: '<%= name %>', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
import { initDatabaseTracing } from '@rocket.chat/tracing';
import { MongoInternals } from 'meteor/mongo'; import { MongoInternals } from 'meteor/mongo';
export const { db, client } = MongoInternals.defaultRemoteCollectionDriver().mongo; export const { db, client } = MongoInternals.defaultRemoteCollectionDriver().mongo;
initDatabaseTracing(client);
import { startTracing } from '@rocket.chat/tracing'; import { startTracing } from '@rocket.chat/tracing';
startTracing({ service: 'core' }); import { client } from './database/utils';
startTracing({ service: 'core', db: client });
...@@ -5,12 +5,12 @@ import polka from 'polka'; ...@@ -5,12 +5,12 @@ import polka from 'polka';
import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels'; import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels';
startTracing({ service: 'account-service' });
const PORT = process.env.PORT || 3033; const PORT = process.env.PORT || 3033;
(async () => { (async () => {
const db = await getConnection(); const { db, client } = await getConnection();
startTracing({ service: 'account-service', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
...@@ -7,10 +7,10 @@ import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/reg ...@@ -7,10 +7,10 @@ import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/reg
const PORT = process.env.PORT || 3034; const PORT = process.env.PORT || 3034;
startTracing({ service: 'authorization-service' });
(async () => { (async () => {
const db = await getConnection(); const { db, client } = await getConnection();
startTracing({ service: 'authorization-service', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
...@@ -4,10 +4,10 @@ import { startTracing } from '@rocket.chat/tracing'; ...@@ -4,10 +4,10 @@ import { startTracing } from '@rocket.chat/tracing';
import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels'; import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels';
startTracing({ service: 'ddp-streamer' });
(async () => { (async () => {
const db = await getConnection(); const { db, client } = await getConnection();
startTracing({ service: 'ddp-streamer', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
...@@ -6,12 +6,12 @@ import polka from 'polka'; ...@@ -6,12 +6,12 @@ import polka from 'polka';
import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels'; import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels';
startTracing({ service: 'omnichannel-transcript' });
const PORT = process.env.PORT || 3036; const PORT = process.env.PORT || 3036;
(async () => { (async () => {
const db = await getConnection(); const { db, client } = await getConnection();
startTracing({ service: 'omnichannel-transcript', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
...@@ -5,12 +5,12 @@ import polka from 'polka'; ...@@ -5,12 +5,12 @@ import polka from 'polka';
import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels'; import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels';
startTracing({ service: 'presence-service' });
const PORT = process.env.PORT || 3031; const PORT = process.env.PORT || 3031;
(async () => { (async () => {
const db = await getConnection(); const { db, client } = await getConnection();
startTracing({ service: 'presence-service', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
...@@ -6,12 +6,12 @@ import polka from 'polka'; ...@@ -6,12 +6,12 @@ import polka from 'polka';
import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels'; import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/registerServiceModels';
startTracing({ service: 'queue-worker' });
const PORT = process.env.PORT || 3038; const PORT = process.env.PORT || 3038;
(async () => { (async () => {
const db = await getConnection(); const { db, client } = await getConnection();
startTracing({ service: 'queue-worker', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
...@@ -8,12 +8,12 @@ import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/reg ...@@ -8,12 +8,12 @@ import { registerServiceModels } from '../../../../apps/meteor/ee/server/lib/reg
import { DatabaseWatcher } from '../../../../apps/meteor/server/database/DatabaseWatcher'; import { DatabaseWatcher } from '../../../../apps/meteor/server/database/DatabaseWatcher';
import { StreamHub } from './StreamHub'; import { StreamHub } from './StreamHub';
startTracing({ service: 'stream-hub-service' });
const PORT = process.env.PORT || 3035; const PORT = process.env.PORT || 3035;
(async () => { (async () => {
const db = await getConnection(); const { db, client } = await getConnection();
startTracing({ service: 'stream-hub-service', db: client });
registerServiceModels(db, await getTrashCollection()); registerServiceModels(db, await getTrashCollection());
......
import { initDatabaseTracing, isTracingEnabled } from '@rocket.chat/tracing'; import { isTracingEnabled } from '@rocket.chat/tracing';
import { MongoClient } from 'mongodb'; import { MongoClient } from 'mongodb';
import type { Db, Collection, MongoClientOptions, Document } from 'mongodb'; import type { Db, Collection, MongoClientOptions, Document } from 'mongodb';
...@@ -21,28 +21,27 @@ function connectDb(options?: MongoClientOptions): Promise<MongoClient> { ...@@ -21,28 +21,27 @@ function connectDb(options?: MongoClientOptions): Promise<MongoClient> {
let db: Db; let db: Db;
export const getConnection = ((): ((options?: MongoClientOptions) => Promise<Db>) => { export const getConnection = ((): ((options?: MongoClientOptions) => Promise<{ db: Db; client: MongoClient }>) => {
let client: MongoClient; let client: MongoClient;
return async (options): Promise<Db> => { return async (options): Promise<{ db: Db; client: MongoClient }> => {
if (db) { if (db) {
return db; return { db, client };
} }
if (client == null) { if (client == null) {
client = await connectDb(options); client = await connectDb(options);
db = client.db(name); db = client.db(name);
} }
initDatabaseTracing(client);
// if getConnection was called multiple times before it was connected, wait for the connection // if getConnection was called multiple times before it was connected, wait for the connection
return client.db(name); return { client, db: client.db(name) };
}; };
})(); })();
export async function getTrashCollection<T extends Document>(): Promise<Collection<T>> { export async function getTrashCollection<T extends Document>(): Promise<Collection<T>> {
if (!db) { if (!db) {
db = await getConnection(); const { db: clientDb } = await getConnection();
db = clientDb;
} }
return db.collection<T>('rocketchat__trash'); return db.collection<T>('rocketchat__trash');
} }
...@@ -2,8 +2,9 @@ import { context, propagation, SpanStatusCode, trace } from '@opentelemetry/api' ...@@ -2,8 +2,9 @@ import { context, propagation, SpanStatusCode, trace } from '@opentelemetry/api'
import type { Span, SpanOptions, Tracer } from '@opentelemetry/api'; import type { Span, SpanOptions, Tracer } from '@opentelemetry/api';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc'; import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-grpc';
import { NodeSDK } from '@opentelemetry/sdk-node'; import { NodeSDK } from '@opentelemetry/sdk-node';
import type { MongoClient } from 'mongodb';
export { initDatabaseTracing } from './traceDatabaseCalls'; import { initDatabaseTracing } from './traceDatabaseCalls';
let tracer: Tracer | undefined; let tracer: Tracer | undefined;
...@@ -11,7 +12,11 @@ export function isTracingEnabled() { ...@@ -11,7 +12,11 @@ export function isTracingEnabled() {
return ['yes', 'true'].includes(String(process.env.TRACING_ENABLED).toLowerCase()); return ['yes', 'true'].includes(String(process.env.TRACING_ENABLED).toLowerCase());
} }
export const startTracing = ({ service }: { service: string }) => { export const startTracing = ({ service, db }: { service: string; db: MongoClient }) => {
if (!isTracingEnabled()) {
return;
}
const exporter = new OTLPTraceExporter(); const exporter = new OTLPTraceExporter();
const sdk = new NodeSDK({ const sdk = new NodeSDK({
...@@ -22,6 +27,8 @@ export const startTracing = ({ service }: { service: string }) => { ...@@ -22,6 +27,8 @@ export const startTracing = ({ service }: { service: string }) => {
sdk.start(); sdk.start();
tracer = trace.getTracer(service); tracer = trace.getTracer(service);
initDatabaseTracing(tracer, db);
}; };
export function tracerSpan<F extends (span?: Span) => ReturnType<F>>( export function tracerSpan<F extends (span?: Span) => ReturnType<F>>(
......
import type { Tracer } from '@opentelemetry/api';
import { trace, context, SpanStatusCode } from '@opentelemetry/api'; import { trace, context, SpanStatusCode } from '@opentelemetry/api';
import type { MongoClient } from 'mongodb'; import type { MongoClient } from 'mongodb';
import { isTracingEnabled } from '.'; export const initDatabaseTracing = (tracer: Tracer, client: MongoClient) => {
const tracer = trace.getTracer('core');
export const initDatabaseTracing = (client: MongoClient) => {
if (!isTracingEnabled()) {
return;
}
const DurationStart = new Map(); const DurationStart = new Map();
client.on('commandStarted', (event) => { client.on('commandStarted', (event) => {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment