Skip to content

Commit

Permalink
[backend] telemetry logger in MetricFileExporter (#6292)
Browse files Browse the repository at this point in the history
  • Loading branch information
Archidoit committed Apr 26, 2024
1 parent 3ec7502 commit 958c0bd
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 25 deletions.
31 changes: 8 additions & 23 deletions opencti-platform/opencti-graphql/src/config/MetricFileExporter.ts
Original file line number Diff line number Diff line change
@@ -1,30 +1,15 @@
import fs from 'node:fs';
import type { ExportResult } from '@opentelemetry/core/build/src/ExportResult';
import { InMemoryMetricExporter } from '@opentelemetry/sdk-metrics';
import type { ResourceMetrics } from '@opentelemetry/sdk-metrics';
import { AggregationTemporality } from '@opentelemetry/sdk-metrics/build/src/export/AggregationTemporality';

export const FILE_EXPORTER_PATH = '../../../../Documents/fileExporter.txt';
import { InMemoryMetricExporter } from '@opentelemetry/sdk-metrics';
import { logTelemetry } from './conf';

export class MetricFileExporter extends InMemoryMetricExporter {
constructor(aggregationTemporality: AggregationTemporality, filePath: string) {
super(aggregationTemporality);
this.filePath = filePath;
}

private filePath;

export(metrics: ResourceMetrics, resultCallback: (callback: ExportResult) => void) {
const formattedLogs = metrics;
fs.appendFile(
this.filePath,
`${JSON.stringify(formattedLogs)}\n`,
(err) => {
if (err) {
return resultCallback({ code: 1, error: err });
}
return resultCallback({ code: 0 });
}
);
try {
logTelemetry.info(metrics);
return resultCallback({ code: 0 });
} catch (err) {
return resultCallback({ code: 1, error: err as Error });
}
}
}
25 changes: 25 additions & 0 deletions opencti-platform/opencti-graphql/src/config/conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,22 @@ const auditLogger = winston.createLogger({
transports: auditLogTransports,
});

// Setup telemetry logs
export const TELEMETRY_LOG_RELATIVE_LOCAL_DIR = './telemetry';
export const TELEMETRY_LOG_FILE_SUFFIX = 'telemetry.log';
const telemetryLogTransports = [new DailyRotateFile({
dirname: TELEMETRY_LOG_RELATIVE_LOCAL_DIR,
filename: TELEMETRY_LOG_FILE_SUFFIX,
maxFiles: 7,
maxSize: '10m',
level: 'info',
})];
const telemetryLogger = winston.createLogger({
level: 'info',
format: format.combine(timestamp(), format.errors({ stack: true }), format.json()),
transports: telemetryLogTransports,
});

// Specific case to fail any test that produce an error log
const LOG_APP = 'APP';
const buildMetaErrors = (error) => {
Expand Down Expand Up @@ -354,6 +370,15 @@ export const logAudit = {
error: (user, operation, meta = {}) => logAudit._log('error', user, operation, meta),
};

const LOG_TELEMETRY = 'TELEMETRY';
export const logTelemetry = {
_log: (level, message, error, meta = {}) => {
telemetryLogger.log(level, message, addBasicMetaInformation(LOG_TELEMETRY, error, meta));
},
info: (message, meta = {}) => logTelemetry._log('info', message, null, meta),
warn: (message, meta = {}) => logTelemetry._log('warn', message, null, meta),
};

const BasePathConfig = nconf.get('app:base_path')?.trim() ?? '';
const AppBasePath = BasePathConfig.endsWith('/') ? BasePathConfig.slice(0, -1) : BasePathConfig;
export const basePath = isEmpty(AppBasePath) || AppBasePath.startsWith('/') ? AppBasePath : `/${AppBasePath}`;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import type { Settings } from '../generated/graphql';
import { getSettings } from '../domain/settings';
import { usersWithActiveSession } from '../database/session';
import { TELEMETRY_SERVICE_NAME, TelemetryMeterManager } from '../config/TelemetryMeterManager';
import { FILE_EXPORTER_PATH, MetricFileExporter } from '../config/MetricFileExporter';
import { MetricFileExporter } from '../config/MetricFileExporter';

const TELEMETRY_KEY = conf.get('telemetry_manager:lock_key');
const SCHEDULE_TIME = 10000; // record telemetry data period
Expand Down Expand Up @@ -58,7 +58,7 @@ const createFiligranTelemetryMeterManager = async () => {
}
// File exporter for air gap platforms
const fileExporterReader = new PeriodicExportingMetricReader({
exporter: new MetricFileExporter(0, FILE_EXPORTER_PATH),
exporter: new MetricFileExporter(0),
exportIntervalMillis: EXPORT_INTERVAL,
});
filigranMetricReaders.push(fileExporterReader);
Expand Down

0 comments on commit 958c0bd

Please sign in to comment.