[Reporting] Use the logger from Core instead of a wrapper (#126740)

* [Reporting] Use the logger from Core instead of a wrapper

* fix redudant log context in execute fns

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
Tim Sullivan 2022-03-07 07:07:04 -07:00 committed by GitHub
parent d5a1cdc178
commit 90f0d8de01
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
63 changed files with 223 additions and 367 deletions

View file

@ -7,8 +7,7 @@
import { get } from 'lodash';
import { first } from 'rxjs/operators';
import { CoreSetup, PluginInitializerContext } from 'src/core/server';
import { LevelLogger } from '../lib';
import type { CoreSetup, Logger, PluginInitializerContext } from 'kibana/server';
import { createConfig$ } from './create_config';
import { ReportingConfigType } from './schema';
@ -63,13 +62,13 @@ export interface ReportingConfig extends Config<ReportingConfigType> {
* @internal
* @param {PluginInitializerContext<ReportingConfigType>} initContext
* @param {CoreSetup} core
* @param {LevelLogger} logger
* @param {Logger} logger
* @returns {Promise<ReportingConfig>}
*/
export const buildConfig = async (
initContext: PluginInitializerContext<ReportingConfigType>,
core: CoreSetup,
logger: LevelLogger
logger: Logger
): Promise<ReportingConfig> => {
const config$ = initContext.config.create<ReportingConfigType>();
const { http } = core;

View file

@ -6,11 +6,10 @@
*/
import * as Rx from 'rxjs';
import { CoreSetup, HttpServerInfo, PluginInitializerContext } from 'src/core/server';
import { coreMock } from 'src/core/server/mocks';
import { LevelLogger } from '../lib/level_logger';
import { createMockConfigSchema, createMockLevelLogger } from '../test_helpers';
import { ReportingConfigType } from './';
import type { CoreSetup, HttpServerInfo, Logger, PluginInitializerContext } from 'kibana/server';
import { coreMock, loggingSystemMock } from 'src/core/server/mocks';
import { createMockConfigSchema } from '../test_helpers';
import type { ReportingConfigType } from './';
import { createConfig$ } from './create_config';
const createMockConfig = (
@ -20,14 +19,14 @@ const createMockConfig = (
describe('Reporting server createConfig$', () => {
let mockCoreSetup: CoreSetup;
let mockInitContext: PluginInitializerContext;
let mockLogger: jest.Mocked<LevelLogger>;
let mockLogger: jest.Mocked<Logger>;
beforeEach(() => {
mockCoreSetup = coreMock.createSetup();
mockInitContext = coreMock.createPluginInitializerContext(
createMockConfigSchema({ kibanaServer: {} })
);
mockLogger = createMockLevelLogger();
mockLogger = loggingSystemMock.createLogger();
});
afterEach(() => {

View file

@ -7,11 +7,10 @@
import crypto from 'crypto';
import ipaddr from 'ipaddr.js';
import type { CoreSetup, Logger } from 'kibana/server';
import { sum } from 'lodash';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { CoreSetup } from 'src/core/server';
import { LevelLogger } from '../lib';
import { ReportingConfigType } from './schema';
/*
@ -22,9 +21,9 @@ import { ReportingConfigType } from './schema';
export function createConfig$(
core: CoreSetup,
config$: Observable<ReportingConfigType>,
parentLogger: LevelLogger
parentLogger: Logger
) {
const logger = parentLogger.clone(['config']);
const logger = parentLogger.get('config');
return config$.pipe(
map((config) => {
// encryption key

View file

@ -11,6 +11,7 @@ import { filter, first, map, switchMap, take } from 'rxjs/operators';
import type {
BasePath,
IClusterClient,
Logger,
PackageInfo,
PluginInitializerContext,
SavedObjectsClientContract,
@ -32,7 +33,7 @@ import { REPORTING_REDIRECT_LOCATOR_STORE_KEY } from '../common/constants';
import { durationToNumber } from '../common/schema_utils';
import type { ReportingConfig, ReportingSetup } from './';
import { ReportingConfigType } from './config';
import { checkLicense, getExportTypesRegistry, LevelLogger } from './lib';
import { checkLicense, getExportTypesRegistry } from './lib';
import { reportingEventLoggerFactory } from './lib/event_logger/logger';
import type { IReport, ReportingStore } from './lib/store';
import { ExecuteReportTask, MonitorReportsTask, ReportTaskParams } from './lib/tasks';
@ -45,7 +46,7 @@ export interface ReportingInternalSetup {
security?: SecurityPluginSetup;
spaces?: SpacesPluginSetup;
taskManager: TaskManagerSetupContract;
logger: LevelLogger;
logger: Logger;
status: StatusServiceSetup;
}
@ -57,7 +58,7 @@ export interface ReportingInternalStart {
data: DataPluginStart;
fieldFormats: FieldFormatsStart;
licensing: LicensingPluginStart;
logger: LevelLogger;
logger: Logger;
screenshotting: ScreenshottingStart;
security?: SecurityPluginStart;
taskManager: TaskManagerStartContract;
@ -81,7 +82,7 @@ export class ReportingCore {
public getContract: () => ReportingSetup;
constructor(private logger: LevelLogger, context: PluginInitializerContext<ReportingConfigType>) {
constructor(private logger: Logger, context: PluginInitializerContext<ReportingConfigType>) {
this.packageInfo = context.env.packageInfo;
const syncConfig = context.config.get<ReportingConfigType>();
this.deprecatedAllowedRoles = syncConfig.roles.enabled ? syncConfig.roles.allow : false;

View file

@ -5,11 +5,11 @@
* 2.0.
*/
import { loggingSystemMock } from 'src/core/server/mocks';
import { cryptoFactory } from '../../lib';
import { createMockLevelLogger } from '../../test_helpers';
import { decryptJobHeaders } from './';
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
const encryptHeaders = async (encryptionKey: string, headers: Record<string, string>) => {
const crypto = cryptoFactory(encryptionKey);

View file

@ -6,12 +6,13 @@
*/
import { i18n } from '@kbn/i18n';
import { cryptoFactory, LevelLogger } from '../../lib';
import type { Logger } from 'kibana/server';
import { cryptoFactory } from '../../lib';
export const decryptJobHeaders = async (
encryptionKey: string | undefined,
headers: string,
logger: LevelLogger
logger: Logger
): Promise<Record<string, string>> => {
try {
if (typeof headers !== 'string') {

View file

@ -6,14 +6,14 @@
*/
import apm from 'elastic-apm-node';
import type { Logger } from 'kibana/server';
import * as Rx from 'rxjs';
import { finalize, map, tap } from 'rxjs/operators';
import type { ReportingCore } from '../../';
import { LayoutTypes } from '../../../../screenshotting/common';
import { REPORTING_TRANSACTION_TYPE } from '../../../common/constants';
import type { PngMetrics } from '../../../common/types';
import { ReportingCore } from '../../';
import { ScreenshotOptions } from '../../types';
import { LevelLogger } from '../../lib';
import type { ScreenshotOptions } from '../../types';
interface PngResult {
buffer: Buffer;
@ -23,7 +23,7 @@ interface PngResult {
export function generatePngObservable(
reporting: ReportingCore,
logger: LevelLogger,
logger: Logger,
options: ScreenshotOptions
): Rx.Observable<PngResult> {
const apmTrans = apm.startTransaction('generate-png', REPORTING_TRANSACTION_TYPE);

View file

@ -5,17 +5,14 @@
* 2.0.
*/
import { ReportingCore } from '../..';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockReportingCore,
} from '../../test_helpers';
import { loggingSystemMock } from 'src/core/server/mocks';
import { ReportingCore } from '../../';
import { createMockConfigSchema, createMockReportingCore } from '../../test_helpers';
import { getCustomLogo } from './get_custom_logo';
let mockReportingPlugin: ReportingCore;
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
beforeEach(async () => {
mockReportingPlugin = await createMockReportingCore(createMockConfigSchema());

View file

@ -5,16 +5,15 @@
* 2.0.
*/
import type { Headers } from 'src/core/server';
import type { Headers, Logger } from 'kibana/server';
import { ReportingCore } from '../../';
import { UI_SETTINGS_CUSTOM_PDF_LOGO } from '../../../common/constants';
import { LevelLogger } from '../../lib';
export const getCustomLogo = async (
reporting: ReportingCore,
headers: Headers,
spaceId: string | undefined,
logger: LevelLogger
logger: Logger
) => {
const fakeRequest = reporting.getFakeRequest({ headers }, spaceId, logger);
const uiSettingsClient = await reporting.getUiSettingsClient(fakeRequest, logger);

View file

@ -16,18 +16,15 @@ jest.mock('./generate_csv/generate_csv', () => ({
},
}));
import { Writable } from 'stream';
import nodeCrypto from '@elastic/node-crypto';
import { loggingSystemMock } from 'src/core/server/mocks';
import { Writable } from 'stream';
import { ReportingCore } from '../../';
import { CancellationToken } from '../../../common/cancellation_token';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockReportingCore,
} from '../../test_helpers';
import { createMockConfigSchema, createMockReportingCore } from '../../test_helpers';
import { runTaskFnFactory } from './execute_job';
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
const encryptionKey = 'tetkey';
const headers = { sid: 'cooltestheaders' };
let encryptedHeaders: string;

View file

@ -5,7 +5,6 @@
* 2.0.
*/
import { CSV_JOB_TYPE } from '../../../common/constants';
import { getFieldFormats } from '../../services';
import { RunTaskFn, RunTaskFnFactory } from '../../types';
import { decryptJobHeaders } from '../common';
@ -19,7 +18,7 @@ export const runTaskFnFactory: RunTaskFnFactory<RunTaskFn<TaskPayloadCSV>> = (
const config = reporting.getConfig();
return async function runTask(jobId, job, cancellationToken, stream) {
const logger = parentLogger.clone([CSV_JOB_TYPE, 'execute-job', jobId]);
const logger = parentLogger.get(`execute-job:${jobId}`);
const encryptionKey = config.get('encryptionKey');
const headers = await decryptJobHeaders(encryptionKey, job.headers, logger);

View file

@ -5,21 +5,22 @@
* 2.0.
*/
import { Writable } from 'stream';
import * as Rx from 'rxjs';
import { errors as esErrors } from '@elastic/elasticsearch';
import type { IScopedClusterClient, IUiSettingsClient, SearchResponse } from 'kibana/server';
import { identity, range } from 'lodash';
import { IScopedClusterClient, IUiSettingsClient, SearchResponse } from 'src/core/server';
import * as Rx from 'rxjs';
import {
elasticsearchServiceMock,
loggingSystemMock,
savedObjectsClientMock,
uiSettingsServiceMock,
} from 'src/core/server/mocks';
import { ISearchStartSearchSource } from 'src/plugins/data/common';
import { FieldFormatsRegistry } from 'src/plugins/field_formats/common';
import { searchSourceInstanceMock } from 'src/plugins/data/common/search/search_source/mocks';
import { IScopedSearchClient } from 'src/plugins/data/server';
import { dataPluginMock } from 'src/plugins/data/server/mocks';
import { FieldFormatsRegistry } from 'src/plugins/field_formats/common';
import { Writable } from 'stream';
import { ReportingConfig } from '../../../';
import { CancellationToken } from '../../../../common/cancellation_token';
import {
@ -28,11 +29,7 @@ import {
UI_SETTINGS_DATEFORMAT_TZ,
} from '../../../../common/constants';
import { UnknownError } from '../../../../common/errors';
import {
createMockConfig,
createMockConfigSchema,
createMockLevelLogger,
} from '../../../test_helpers';
import { createMockConfig, createMockConfigSchema } from '../../../test_helpers';
import { JobParamsCSV } from '../types';
import { CsvGenerator } from './generate_csv';
@ -125,7 +122,7 @@ beforeEach(async () => {
});
});
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
it('formats an empty search result to CSV content', async () => {
const generateCsv = new CsvGenerator(

View file

@ -5,9 +5,9 @@
* 2.0.
*/
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { errors as esErrors } from '@elastic/elasticsearch';
import type { IScopedClusterClient, IUiSettingsClient } from 'src/core/server';
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { IScopedClusterClient, IUiSettingsClient, Logger } from 'kibana/server';
import type { IScopedSearchClient } from 'src/plugins/data/server';
import type { Datatable } from 'src/plugins/expressions/server';
import type { Writable } from 'stream';
@ -32,16 +32,15 @@ import type { CancellationToken } from '../../../../common/cancellation_token';
import { CONTENT_TYPE_CSV } from '../../../../common/constants';
import {
AuthenticationExpiredError,
UnknownError,
ReportingError,
UnknownError,
} from '../../../../common/errors';
import { byteSizeValueToNumber } from '../../../../common/schema_utils';
import type { LevelLogger } from '../../../lib';
import type { TaskRunResult } from '../../../lib/tasks';
import type { JobParamsCSV } from '../types';
import { CsvExportSettings, getExportSettings } from './get_export_settings';
import { MaxSizeStringBuilder } from './max_size_string_builder';
import { i18nTexts } from './i18n_texts';
import { MaxSizeStringBuilder } from './max_size_string_builder';
interface Clients {
es: IScopedClusterClient;
@ -65,7 +64,7 @@ export class CsvGenerator {
private clients: Clients,
private dependencies: Dependencies,
private cancellationToken: CancellationToken,
private logger: LevelLogger,
private logger: Logger,
private stream: Writable
) {}
@ -316,7 +315,7 @@ export class CsvGenerator {
}
if (!results) {
this.logger.warning(`Search results are undefined!`);
this.logger.warn(`Search results are undefined!`);
break;
}
@ -396,7 +395,7 @@ export class CsvGenerator {
this.logger.debug(`Finished generating. Row count: ${this.csvRowCount}.`);
if (!this.maxSizeReached && this.csvRowCount !== totalRecords) {
this.logger.warning(
this.logger.warn(
`ES scroll returned fewer total hits than expected! ` +
`Search result total hits: ${totalRecords}. Row count: ${this.csvRowCount}.`
);

View file

@ -12,18 +12,18 @@ import {
UI_SETTINGS_SEARCH_INCLUDE_FROZEN,
} from '../../../../common/constants';
import { IUiSettingsClient } from 'kibana/server';
import { savedObjectsClientMock, uiSettingsServiceMock } from 'src/core/server/mocks';
import {
createMockConfig,
createMockConfigSchema,
createMockLevelLogger,
} from '../../../test_helpers';
loggingSystemMock,
savedObjectsClientMock,
uiSettingsServiceMock,
} from 'src/core/server/mocks';
import { createMockConfig, createMockConfigSchema } from '../../../test_helpers';
import { getExportSettings } from './get_export_settings';
describe('getExportSettings', () => {
let uiSettingsClient: IUiSettingsClient;
const config = createMockConfig(createMockConfigSchema({}));
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
beforeEach(() => {
uiSettingsClient = uiSettingsServiceMock

View file

@ -6,7 +6,7 @@
*/
import { ByteSizeValue } from '@kbn/config-schema';
import { IUiSettingsClient } from 'kibana/server';
import type { IUiSettingsClient, Logger } from 'kibana/server';
import { createEscapeValue } from '../../../../../../../src/plugins/data/common';
import { ReportingConfig } from '../../../';
import {
@ -16,7 +16,6 @@ import {
UI_SETTINGS_DATEFORMAT_TZ,
UI_SETTINGS_SEARCH_INCLUDE_FROZEN,
} from '../../../../common/constants';
import { LevelLogger } from '../../../lib';
export interface CsvExportSettings {
timezone: string;
@ -37,7 +36,7 @@ export const getExportSettings = async (
client: IUiSettingsClient,
config: ReportingConfig,
timezone: string | undefined,
logger: LevelLogger
logger: Logger
): Promise<CsvExportSettings> => {
let setTimezone: string;
if (timezone) {

View file

@ -8,7 +8,6 @@
import { KibanaRequest } from 'src/core/server';
import { Writable } from 'stream';
import { CancellationToken } from '../../../common/cancellation_token';
import { CSV_SEARCHSOURCE_IMMEDIATE_TYPE } from '../../../common/constants';
import { TaskRunResult } from '../../lib/tasks';
import { getFieldFormats } from '../../services';
import { ReportingRequestHandlerContext, RunTaskFnFactory } from '../../types';
@ -32,7 +31,7 @@ export const runTaskFnFactory: RunTaskFnFactory<ImmediateExecuteFn> = function e
parentLogger
) {
const config = reporting.getConfig();
const logger = parentLogger.clone([CSV_SEARCHSOURCE_IMMEDIATE_TYPE, 'execute-job']);
const logger = parentLogger.get('execute-job');
return async function runTask(_jobId, immediateJobParams, context, stream, req) {
const job = {
@ -82,7 +81,7 @@ export const runTaskFnFactory: RunTaskFnFactory<ImmediateExecuteFn> = function e
const { warnings } = result;
if (warnings) {
warnings.forEach((warning) => {
logger.warning(warning);
logger.warn(warning);
});
}

View file

@ -5,11 +5,12 @@
* 2.0.
*/
import { Writable } from 'stream';
import * as Rx from 'rxjs';
import { loggingSystemMock } from 'src/core/server/mocks';
import { Writable } from 'stream';
import { ReportingCore } from '../../../';
import { CancellationToken } from '../../../../common/cancellation_token';
import { cryptoFactory, LevelLogger } from '../../../lib';
import { cryptoFactory } from '../../../lib';
import {
createMockConfig,
createMockConfigSchema,
@ -29,14 +30,7 @@ const cancellationToken = {
on: jest.fn(),
} as unknown as CancellationToken;
const mockLoggerFactory = {
get: jest.fn().mockImplementation(() => ({
error: jest.fn(),
debug: jest.fn(),
warn: jest.fn(),
})),
};
const getMockLogger = () => new LevelLogger(mockLoggerFactory);
const getMockLogger = () => loggingSystemMock.createLogger();
const mockEncryptionKey = 'abcabcsecuresecret';
const encryptHeaders = async (headers: Record<string, string>) => {

View file

@ -8,7 +8,7 @@
import apm from 'elastic-apm-node';
import * as Rx from 'rxjs';
import { finalize, map, mergeMap, takeUntil, tap } from 'rxjs/operators';
import { PNG_JOB_TYPE, REPORTING_TRANSACTION_TYPE } from '../../../../common/constants';
import { REPORTING_TRANSACTION_TYPE } from '../../../../common/constants';
import { TaskRunResult } from '../../../lib/tasks';
import { RunTaskFn, RunTaskFnFactory } from '../../../types';
import { decryptJobHeaders, getFullUrls, generatePngObservable } from '../../common';
@ -24,7 +24,7 @@ export const runTaskFnFactory: RunTaskFnFactory<RunTaskFn<TaskPayloadPNG>> =
const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup');
let apmGeneratePng: { end: () => void } | null | undefined;
const jobLogger = parentLogger.clone([PNG_JOB_TYPE, 'execute', jobId]);
const jobLogger = parentLogger.get(`execute:${jobId}`);
const process$: Rx.Observable<TaskRunResult> = Rx.of(1).pipe(
mergeMap(() => decryptJobHeaders(encryptionKey, job.headers, jobLogger)),
mergeMap((headers) => {

View file

@ -6,11 +6,12 @@
*/
import * as Rx from 'rxjs';
import { loggingSystemMock } from 'src/core/server/mocks';
import { Writable } from 'stream';
import { ReportingCore } from '../../';
import { CancellationToken } from '../../../common/cancellation_token';
import { LocatorParams } from '../../../common/types';
import { cryptoFactory, LevelLogger } from '../../lib';
import { cryptoFactory } from '../../lib';
import {
createMockConfig,
createMockConfigSchema,
@ -30,14 +31,7 @@ const cancellationToken = {
on: jest.fn(),
} as unknown as CancellationToken;
const mockLoggerFactory = {
get: jest.fn().mockImplementation(() => ({
error: jest.fn(),
debug: jest.fn(),
warn: jest.fn(),
})),
};
const getMockLogger = () => new LevelLogger(mockLoggerFactory);
const getMockLogger = () => loggingSystemMock.createLogger();
const mockEncryptionKey = 'abcabcsecuresecret';
const encryptHeaders = async (headers: Record<string, string>) => {

View file

@ -8,7 +8,7 @@
import apm from 'elastic-apm-node';
import * as Rx from 'rxjs';
import { finalize, map, mergeMap, takeUntil, tap } from 'rxjs/operators';
import { PNG_JOB_TYPE_V2, REPORTING_TRANSACTION_TYPE } from '../../../common/constants';
import { REPORTING_TRANSACTION_TYPE } from '../../../common/constants';
import { TaskRunResult } from '../../lib/tasks';
import { RunTaskFn, RunTaskFnFactory } from '../../types';
import { decryptJobHeaders, generatePngObservable } from '../common';
@ -25,7 +25,7 @@ export const runTaskFnFactory: RunTaskFnFactory<RunTaskFn<TaskPayloadPNGV2>> =
const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup');
let apmGeneratePng: { end: () => void } | null | undefined;
const jobLogger = parentLogger.clone([PNG_JOB_TYPE_V2, 'execute', jobId]);
const jobLogger = parentLogger.get(`execute:${jobId}`);
const process$: Rx.Observable<TaskRunResult> = Rx.of(1).pipe(
mergeMap(() => decryptJobHeaders(encryptionKey, job.headers, jobLogger)),
mergeMap((headers) => {

View file

@ -6,10 +6,11 @@
*/
import * as Rx from 'rxjs';
import { loggingSystemMock } from 'src/core/server/mocks';
import { Writable } from 'stream';
import { ReportingCore } from '../../../';
import { CancellationToken } from '../../../../common/cancellation_token';
import { cryptoFactory, LevelLogger } from '../../../lib';
import { cryptoFactory } from '../../../lib';
import { createMockConfigSchema, createMockReportingCore } from '../../../test_helpers';
import { generatePdfObservable } from '../lib/generate_pdf';
import { TaskPayloadPDF } from '../types';
@ -25,14 +26,7 @@ const cancellationToken = {
on: jest.fn(),
} as unknown as CancellationToken;
const mockLoggerFactory = {
get: jest.fn().mockImplementation(() => ({
error: jest.fn(),
debug: jest.fn(),
warn: jest.fn(),
})),
};
const getMockLogger = () => new LevelLogger(mockLoggerFactory);
const getMockLogger = () => loggingSystemMock.createLogger();
const mockEncryptionKey = 'testencryptionkey';
const encryptHeaders = async (headers: Record<string, string>) => {

View file

@ -8,7 +8,7 @@
import apm from 'elastic-apm-node';
import * as Rx from 'rxjs';
import { catchError, map, mergeMap, takeUntil, tap } from 'rxjs/operators';
import { PDF_JOB_TYPE, REPORTING_TRANSACTION_TYPE } from '../../../../common/constants';
import { REPORTING_TRANSACTION_TYPE } from '../../../../common/constants';
import { TaskRunResult } from '../../../lib/tasks';
import { RunTaskFn, RunTaskFnFactory } from '../../../types';
import { decryptJobHeaders, getFullUrls, getCustomLogo } from '../../common';
@ -21,7 +21,7 @@ export const runTaskFnFactory: RunTaskFnFactory<RunTaskFn<TaskPayloadPDF>> =
const encryptionKey = config.get('encryptionKey');
return async function runTask(jobId, job, cancellationToken, stream) {
const jobLogger = parentLogger.clone([PDF_JOB_TYPE, 'execute-job', jobId]);
const jobLogger = parentLogger.get(`execute-job:${jobId}`);
const apmTrans = apm.startTransaction('execute-job-pdf', REPORTING_TRANSACTION_TYPE);
const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup');
let apmGeneratePdf: { end: () => void } | null | undefined;

View file

@ -5,13 +5,13 @@
* 2.0.
*/
import type { Logger } from 'kibana/server';
import { groupBy } from 'lodash';
import * as Rx from 'rxjs';
import { mergeMap, tap } from 'rxjs/operators';
import { ReportingCore } from '../../../';
import { ScreenshotResult } from '../../../../../screenshotting/server';
import type { PdfMetrics } from '../../../../common/types';
import { ReportingCore } from '../../../';
import { LevelLogger } from '../../../lib';
import { ScreenshotOptions } from '../../../types';
import { PdfMaker } from '../../common/pdf';
import { getTracker } from './tracker';
@ -34,7 +34,7 @@ interface PdfResult {
export function generatePdfObservable(
reporting: ReportingCore,
logger: LevelLogger,
logger: Logger,
title: string,
options: ScreenshotOptions,
logo?: string

View file

@ -8,11 +8,12 @@
jest.mock('./lib/generate_pdf');
import * as Rx from 'rxjs';
import { loggingSystemMock } from 'src/core/server/mocks';
import { Writable } from 'stream';
import { ReportingCore } from '../../';
import { CancellationToken } from '../../../common/cancellation_token';
import { LocatorParams } from '../../../common/types';
import { cryptoFactory, LevelLogger } from '../../lib';
import { cryptoFactory } from '../../lib';
import { createMockConfigSchema, createMockReportingCore } from '../../test_helpers';
import { runTaskFnFactory } from './execute_job';
import { generatePdfObservable } from './lib/generate_pdf';
@ -26,14 +27,7 @@ const cancellationToken = {
on: jest.fn(),
} as unknown as CancellationToken;
const mockLoggerFactory = {
get: jest.fn().mockImplementation(() => ({
error: jest.fn(),
debug: jest.fn(),
warn: jest.fn(),
})),
};
const getMockLogger = () => new LevelLogger(mockLoggerFactory);
const getMockLogger = () => loggingSystemMock.createLogger();
const mockEncryptionKey = 'testencryptionkey';
const encryptHeaders = async (headers: Record<string, string>) => {

View file

@ -8,7 +8,7 @@
import apm from 'elastic-apm-node';
import * as Rx from 'rxjs';
import { catchError, map, mergeMap, takeUntil, tap } from 'rxjs/operators';
import { PDF_JOB_TYPE_V2, REPORTING_TRANSACTION_TYPE } from '../../../common/constants';
import { REPORTING_TRANSACTION_TYPE } from '../../../common/constants';
import { TaskRunResult } from '../../lib/tasks';
import { RunTaskFn, RunTaskFnFactory } from '../../types';
import { decryptJobHeaders, getCustomLogo } from '../common';
@ -21,7 +21,7 @@ export const runTaskFnFactory: RunTaskFnFactory<RunTaskFn<TaskPayloadPDFV2>> =
const encryptionKey = config.get('encryptionKey');
return async function runTask(jobId, job, cancellationToken, stream) {
const jobLogger = parentLogger.clone([PDF_JOB_TYPE_V2, 'execute-job', jobId]);
const jobLogger = parentLogger.get(`execute-job:${jobId}`);
const apmTrans = apm.startTransaction('execute-job-pdf-v2', REPORTING_TRANSACTION_TYPE);
const apmGetAssets = apmTrans?.startSpan('get-assets', 'setup');
let apmGeneratePdf: { end: () => void } | null | undefined;

View file

@ -5,14 +5,14 @@
* 2.0.
*/
import type { Logger } from 'kibana/server';
import { groupBy } from 'lodash';
import * as Rx from 'rxjs';
import { mergeMap, tap } from 'rxjs/operators';
import { ReportingCore } from '../../../';
import { ScreenshotResult } from '../../../../../screenshotting/server';
import { LocatorParams, PdfMetrics, UrlOrUrlLocatorTuple } from '../../../../common/types';
import { LevelLogger } from '../../../lib';
import { ScreenshotOptions } from '../../../types';
import type { ReportingCore } from '../../../';
import type { ScreenshotResult } from '../../../../../screenshotting/server';
import type { LocatorParams, PdfMetrics, UrlOrUrlLocatorTuple } from '../../../../common/types';
import type { ScreenshotOptions } from '../../../types';
import { PdfMaker } from '../../common/pdf';
import { getFullRedirectAppUrl } from '../../common/v2/get_full_redirect_app_url';
import type { TaskPayloadPDFV2 } from '../types';
@ -36,7 +36,7 @@ interface PdfResult {
export function generatePdfObservable(
reporting: ReportingCore,
logger: LevelLogger,
logger: Logger,
job: TaskPayloadPDFV2,
title: string,
locatorParams: LocatorParams[],

View file

@ -5,16 +5,16 @@
* 2.0.
*/
import type { Logger } from 'kibana/server';
import { UNVERSIONED_VERSION } from '../../common/constants';
import type { BaseParams } from '../../common/types';
import type { LevelLogger } from './';
export function checkParamsVersion(jobParams: BaseParams, logger: LevelLogger) {
export function checkParamsVersion(jobParams: BaseParams, logger: Logger) {
if (jobParams.version) {
logger.debug(`Using reporting job params v${jobParams.version}`);
return jobParams.version;
}
logger.warning(`No version provided in report job params. Assuming ${UNVERSIONED_VERSION}`);
logger.warn(`No version provided in report job params. Assuming ${UNVERSIONED_VERSION}`);
return UNVERSIONED_VERSION;
}

View file

@ -5,20 +5,20 @@
* 2.0.
*/
import type { Logger } from 'kibana/server';
import { set } from 'lodash';
import { elasticsearchServiceMock } from 'src/core/server/mocks';
import { createMockLevelLogger } from '../test_helpers';
import { elasticsearchServiceMock, loggingSystemMock } from 'src/core/server/mocks';
import { ContentStream } from './content_stream';
describe('ContentStream', () => {
let client: ReturnType<typeof elasticsearchServiceMock.createElasticsearchClient>;
let logger: ReturnType<typeof createMockLevelLogger>;
let logger: Logger;
let stream: ContentStream;
let base64Stream: ContentStream;
beforeEach(() => {
client = elasticsearchServiceMock.createClusterClient().asInternalUser;
logger = createMockLevelLogger();
logger = loggingSystemMock.createLogger();
stream = new ContentStream(
client,
logger,

View file

@ -5,14 +5,13 @@
* 2.0.
*/
import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { Duplex } from 'stream';
import { ByteSizeValue } from '@kbn/config-schema';
import type { ElasticsearchClient, Logger } from 'kibana/server';
import { defaults, get } from 'lodash';
import Puid from 'puid';
import { ByteSizeValue } from '@kbn/config-schema';
import type { ElasticsearchClient } from 'src/core/server';
import { ReportingCore } from '..';
import { ReportSource } from '../../common/types';
import { LevelLogger } from './level_logger';
import { Duplex } from 'stream';
import type { ReportingCore } from '../';
import type { ReportSource } from '../../common/types';
/**
* @note The Elasticsearch `http.max_content_length` is including the whole POST body.
@ -87,7 +86,7 @@ export class ContentStream extends Duplex {
constructor(
private client: ElasticsearchClient,
private logger: LevelLogger,
private logger: Logger,
private document: ContentStreamDocument,
{ encoding = 'base64' }: ContentStreamParameters = {}
) {
@ -348,7 +347,7 @@ export async function getContentStream(
return new ContentStream(
client,
logger.clone(['content_stream', document.id]),
logger.get('content_stream').get(document.id),
document,
parameters
);

View file

@ -6,11 +6,11 @@
*/
import { LogMeta } from 'kibana/server';
import { createMockLevelLogger } from '../../test_helpers';
import { loggingSystemMock } from 'src/core/server/mocks';
import { EcsLogAdapter } from './adapter';
describe('EcsLogAdapter', () => {
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
beforeAll(() => {
jest
.spyOn(global.Date, 'now')
@ -28,7 +28,7 @@ describe('EcsLogAdapter', () => {
const event = { kibana: { reporting: { wins: 5000 } } } as object & LogMeta; // an object that extends LogMeta
eventLogger.logEvent('hello world', event);
expect(logger.debug).toBeCalledWith('hello world', ['events'], {
expect(logger.debug).toBeCalledWith('hello world', {
event: {
duration: undefined,
end: undefined,
@ -50,7 +50,7 @@ describe('EcsLogAdapter', () => {
const event = { kibana: { reporting: { wins: 9000 } } } as object & LogMeta; // an object that extends LogMeta
eventLogger.logEvent('hello duration', event);
expect(logger.debug).toBeCalledWith('hello duration', ['events'], {
expect(logger.debug).toBeCalledWith('hello duration', {
event: {
duration: 120000000000,
end: '2021-04-12T16:02:00.000Z',

View file

@ -6,23 +6,26 @@
*/
import deepMerge from 'deepmerge';
import { LogMeta } from 'src/core/server';
import { LevelLogger } from '../level_logger';
import { IReportingEventLogger } from './logger';
import type { Logger, LogMeta } from 'kibana/server';
import type { IReportingEventLogger } from './logger';
/** @internal */
export class EcsLogAdapter implements IReportingEventLogger {
start?: Date;
end?: Date;
private logger: Logger;
/**
* This class provides a logging system to Reporting code, using a shape similar to the EventLog service.
* The logging action causes ECS data with Reporting metrics sent to DEBUG logs.
*
* @param {LevelLogger} logger - Reporting's wrapper of the core logger
* @param {Logger} logger - Reporting's wrapper of the core logger
* @param {Partial<LogMeta>} properties - initial ECS data with template for Reporting metrics
*/
constructor(private logger: LevelLogger, private properties: Partial<LogMeta>) {}
constructor(logger: Logger, private properties: Partial<LogMeta>) {
this.logger = logger.get('events');
}
logEvent(message: string, properties: LogMeta) {
if (this.start && !this.end) {
@ -44,7 +47,7 @@ export class EcsLogAdapter implements IReportingEventLogger {
});
// sends an ECS object with Reporting metrics to the DEBUG logs
this.logger.debug(message, ['events'], deepMerge(newProperties, properties));
this.logger.debug(message, deepMerge(newProperties, properties));
}
startTiming() {

View file

@ -5,8 +5,8 @@
* 2.0.
*/
import { loggingSystemMock } from 'src/core/server/mocks';
import { ConcreteTaskInstance } from '../../../../task_manager/server';
import { createMockLevelLogger } from '../../test_helpers';
import { BasePayload } from '../../types';
import { Report } from '../store';
import { ReportingEventLogger, reportingEventLoggerFactory } from './logger';
@ -21,7 +21,7 @@ describe('Event Logger', () => {
let factory: ReportingEventLogger;
beforeEach(() => {
factory = reportingEventLoggerFactory(createMockLevelLogger());
factory = reportingEventLoggerFactory(loggingSystemMock.createLogger());
});
it(`should construct with an internal seed object`, () => {

View file

@ -6,8 +6,7 @@
*/
import deepMerge from 'deepmerge';
import { LogMeta } from 'src/core/server';
import { LevelLogger } from '../';
import type { Logger, LogMeta } from 'kibana/server';
import { PLUGIN_ID } from '../../../common/constants';
import type { TaskRunMetrics } from '../../../common/types';
import { IReport } from '../store';
@ -46,7 +45,7 @@ export interface BaseEvent {
}
/** @internal */
export function reportingEventLoggerFactory(logger: LevelLogger) {
export function reportingEventLoggerFactory(logger: Logger) {
const genericLogger = new EcsLogAdapter(logger, { event: { provider: PLUGIN_ID } });
return class ReportingEventLogger {

View file

@ -10,7 +10,6 @@ export { checkParamsVersion } from './check_params_version';
export { ContentStream, getContentStream } from './content_stream';
export { cryptoFactory } from './crypto';
export { ExportTypesRegistry, getExportTypesRegistry } from './export_types_registry';
export { LevelLogger } from './level_logger';
export { PassThroughStream } from './passthrough_stream';
export { statuses } from './statuses';
export { ReportingStore, IlmPolicyManager } from './store';

View file

@ -1,65 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
import { LoggerFactory, LogMeta } from 'src/core/server';
const trimStr = (toTrim: string) => {
return typeof toTrim === 'string' ? toTrim.trim() : toTrim;
};
export interface GenericLevelLogger {
debug: <T extends LogMeta>(msg: string, tags: string[], meta: T) => void;
info: (msg: string) => void;
warning: (msg: string) => void;
error: (msg: Error) => void;
}
export class LevelLogger implements GenericLevelLogger {
private _logger: LoggerFactory;
private _tags: string[];
public warning: (msg: string, tags?: string[]) => void;
constructor(logger: LoggerFactory, tags?: string[]) {
this._logger = logger;
this._tags = tags || [];
/*
* This shortcut provides maintenance convenience: Reporting code has been
* using both .warn and .warning
*/
this.warning = this.warn.bind(this);
}
private getLogger(tags: string[]) {
return this._logger.get(...this._tags, ...tags);
}
public error(err: string | Error, tags: string[] = []) {
this.getLogger(tags).error(err);
}
public warn(msg: string, tags: string[] = []) {
this.getLogger(tags).warn(msg);
}
// only "debug" logging supports the LogMeta for now...
public debug<T extends LogMeta>(msg: string, tags: string[] = [], meta?: T) {
this.getLogger(tags).debug<T>(msg, meta);
}
public trace(msg: string, tags: string[] = []) {
this.getLogger(tags).trace(msg);
}
public info(msg: string, tags: string[] = []) {
this.getLogger(tags).info(trimStr(msg));
}
public clone(tags: string[]) {
return new LevelLogger(this._logger, [...this._tags, ...tags]);
}
}

View file

@ -5,17 +5,13 @@
* 2.0.
*/
import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { elasticsearchServiceMock } from 'src/core/server/mocks';
import { elasticsearchServiceMock, loggingSystemMock } from 'src/core/server/mocks';
import { ReportingCore } from '../../';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockReportingCore,
} from '../../test_helpers';
import { createMockConfigSchema, createMockReportingCore } from '../../test_helpers';
import { Report, ReportDocument, ReportingStore, SavedReport } from './';
describe('ReportingStore', () => {
const mockLogger = createMockLevelLogger();
const mockLogger = loggingSystemMock.createLogger();
let mockCore: ReportingCore;
let mockEsClient: ReturnType<typeof elasticsearchServiceMock.createElasticsearchClient>;

View file

@ -6,13 +6,14 @@
*/
import { IndexResponse, UpdateResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { ElasticsearchClient } from 'src/core/server';
import { LevelLogger, statuses } from '../';
import { ReportingCore } from '../../';
import type { ElasticsearchClient, Logger } from 'kibana/server';
import { statuses } from '../';
import type { ReportingCore } from '../../';
import { ILM_POLICY_NAME, REPORTING_SYSTEM_INDEX } from '../../../common/constants';
import { JobStatus, ReportOutput, ReportSource } from '../../../common/types';
import { ReportTaskParams } from '../tasks';
import { IReport, Report, ReportDocument, SavedReport } from './';
import type { JobStatus, ReportOutput, ReportSource } from '../../../common/types';
import type { ReportTaskParams } from '../tasks';
import type { IReport, Report, ReportDocument } from './';
import { SavedReport } from './';
import { IlmPolicyManager } from './ilm_policy_manager';
import { indexTimestamp } from './index_timestamp';
import { mapping } from './mapping';
@ -83,12 +84,12 @@ export class ReportingStore {
private client?: ElasticsearchClient;
private ilmPolicyManager?: IlmPolicyManager;
constructor(private reportingCore: ReportingCore, private logger: LevelLogger) {
constructor(private reportingCore: ReportingCore, private logger: Logger) {
const config = reportingCore.getConfig();
this.indexPrefix = REPORTING_SYSTEM_INDEX;
this.indexInterval = config.get('queue', 'indexInterval');
this.logger = logger.clone(['store']);
this.logger = logger.get('store');
}
private async getClient() {

View file

@ -5,10 +5,10 @@
* 2.0.
*/
import { createMockLevelLogger } from '../../test_helpers';
import { loggingSystemMock } from 'src/core/server/mocks';
import { errorLogger } from './error_logger';
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
describe('Execute Report Error Logger', () => {
const errorLogSpy = jest.spyOn(logger, 'error');

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import { LevelLogger } from '..';
import type { Logger } from 'kibana/server';
const MAX_PARTIAL_ERROR_LENGTH = 1000; // 1000 of beginning, 1000 of end
const ERROR_PARTIAL_SEPARATOR = '...';
@ -15,7 +15,7 @@ const MAX_ERROR_LENGTH = MAX_PARTIAL_ERROR_LENGTH * 2 + ERROR_PARTIAL_SEPARATOR.
* An error message string could be very long, as it sometimes includes huge
* amount of base64
*/
export const errorLogger = (logger: LevelLogger, message: string, err?: Error) => {
export const errorLogger = (logger: Logger, message: string, err?: Error) => {
if (err) {
const errString = `${message}: ${err}`;
const errLength = errString.length;

View file

@ -5,18 +5,15 @@
* 2.0.
*/
import { loggingSystemMock } from 'src/core/server/mocks';
import { ReportingCore } from '../..';
import { RunContext } from '../../../../task_manager/server';
import { taskManagerMock } from '../../../../task_manager/server/mocks';
import { ReportingConfigType } from '../../config';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockReportingCore,
} from '../../test_helpers';
import { createMockConfigSchema, createMockReportingCore } from '../../test_helpers';
import { ExecuteReportTask } from './';
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
describe('Execute Report Task', () => {
let mockReporting: ReportingCore;

View file

@ -6,20 +6,21 @@
*/
import { UpdateResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { Logger } from 'kibana/server';
import moment from 'moment';
import * as Rx from 'rxjs';
import { timeout } from 'rxjs/operators';
import { finished, Writable } from 'stream';
import { promisify } from 'util';
import { getContentStream, LevelLogger } from '../';
import { ReportingCore } from '../../';
import {
import { getContentStream } from '../';
import type { ReportingCore } from '../../';
import type {
RunContext,
TaskManagerStartContract,
TaskRunCreatorFunction,
} from '../../../../task_manager/server';
import { CancellationToken } from '../../../common/cancellation_token';
import { ReportingError, UnknownError, QueueTimeoutError } from '../../../common/errors';
import { QueueTimeoutError, ReportingError, UnknownError } from '../../../common/errors';
import { durationToNumber, numberToDuration } from '../../../common/schema_utils';
import type { ReportOutput } from '../../../common/types';
import type { ReportingConfigType } from '../../config';
@ -60,7 +61,7 @@ function reportFromTask(task: ReportTaskParams) {
export class ExecuteReportTask implements ReportingTask {
public TYPE = REPORTING_EXECUTE_TYPE;
private logger: LevelLogger;
private logger: Logger;
private taskManagerStart?: TaskManagerStartContract;
private taskExecutors?: Map<string, TaskExecutor>;
private kibanaId?: string;
@ -70,9 +71,9 @@ export class ExecuteReportTask implements ReportingTask {
constructor(
private reporting: ReportingCore,
private config: ReportingConfigType,
logger: LevelLogger
logger: Logger
) {
this.logger = logger.clone(['runTask']);
this.logger = logger.get('runTask');
}
/*
@ -86,7 +87,7 @@ export class ExecuteReportTask implements ReportingTask {
const exportTypesRegistry = reporting.getExportTypesRegistry();
const executors = new Map<string, TaskExecutor>();
for (const exportType of exportTypesRegistry.getAll()) {
const exportTypeLogger = this.logger.clone([exportType.id]);
const exportTypeLogger = this.logger.get(exportType.jobType);
const jobExecutor = exportType.runTaskFnFactory(reporting, exportTypeLogger);
// The task will run the function with the job type as a param.
// This allows us to retrieve the specific export type runFn when called to run an export
@ -476,7 +477,7 @@ export class ExecuteReportTask implements ReportingTask {
return await this.getTaskManagerStart().schedule(taskInstance);
}
private async rescheduleTask(task: ReportTaskParams, logger: LevelLogger) {
private async rescheduleTask(task: ReportTaskParams, logger: Logger) {
logger.info(`Rescheduling task:${task.id} to retry after error.`);
const oldTaskInstance: ReportingExecuteTaskInstance = {

View file

@ -5,18 +5,15 @@
* 2.0.
*/
import { loggingSystemMock } from 'src/core/server/mocks';
import { ReportingCore } from '../..';
import { RunContext } from '../../../../task_manager/server';
import { taskManagerMock } from '../../../../task_manager/server/mocks';
import { ReportingConfigType } from '../../config';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockReportingCore,
} from '../../test_helpers';
import { createMockConfigSchema, createMockReportingCore } from '../../test_helpers';
import { MonitorReportsTask } from './';
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
describe('Execute Report Task', () => {
let mockReporting: ReportingCore;

View file

@ -5,8 +5,9 @@
* 2.0.
*/
import type { Logger } from 'kibana/server';
import moment from 'moment';
import { LevelLogger, ReportingStore } from '../';
import { ReportingStore } from '../';
import { ReportingCore } from '../../';
import { TaskManagerStartContract, TaskRunCreatorFunction } from '../../../../task_manager/server';
import { numberToDuration } from '../../../common/schema_utils';
@ -38,7 +39,7 @@ import { ReportingTask, ReportingTaskStatus, REPORTING_MONITOR_TYPE, ReportTaskP
export class MonitorReportsTask implements ReportingTask {
public TYPE = REPORTING_MONITOR_TYPE;
private logger: LevelLogger;
private logger: Logger;
private taskManagerStart?: TaskManagerStartContract;
private store?: ReportingStore;
private timeout: moment.Duration;
@ -46,9 +47,9 @@ export class MonitorReportsTask implements ReportingTask {
constructor(
private reporting: ReportingCore,
private config: ReportingConfigType,
parentLogger: LevelLogger
parentLogger: Logger
) {
this.logger = parentLogger.clone([REPORTING_MONITOR_TYPE]);
this.logger = parentLogger.get(REPORTING_MONITOR_TYPE);
this.timeout = numberToDuration(config.queue.timeout);
}
@ -145,7 +146,7 @@ export class MonitorReportsTask implements ReportingTask {
}
// reschedule the task with TM
private async rescheduleTask(task: ReportTaskParams, logger: LevelLogger) {
private async rescheduleTask(task: ReportTaskParams, logger: Logger) {
if (!this.taskManagerStart) {
throw new Error('Reporting task runner has not been initialized!');
}

View file

@ -5,14 +5,12 @@
* 2.0.
*/
import type { CoreSetup, CoreStart } from 'kibana/server';
import { coreMock } from 'src/core/server/mocks';
import type { CoreSetup, CoreStart, Logger } from 'kibana/server';
import { coreMock, loggingSystemMock } from 'src/core/server/mocks';
import type { ReportingCore, ReportingInternalStart } from './core';
import { LevelLogger } from './lib';
import { ReportingPlugin } from './plugin';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockPluginSetup,
createMockPluginStart,
} from './test_helpers';
@ -27,7 +25,7 @@ describe('Reporting Plugin', () => {
let coreStart: CoreStart;
let pluginSetup: ReportingSetupDeps;
let pluginStart: ReportingInternalStart;
let logger: jest.Mocked<LevelLogger>;
let logger: jest.Mocked<Logger>;
let plugin: ReportingPlugin;
beforeEach(async () => {
@ -38,9 +36,9 @@ describe('Reporting Plugin', () => {
pluginSetup = createMockPluginSetup({}) as unknown as ReportingSetupDeps;
pluginStart = await createMockPluginStart(coreStart, configSchema);
logger = createMockLevelLogger();
logger = loggingSystemMock.createLogger();
plugin = new ReportingPlugin(initContext);
(plugin as unknown as { logger: LevelLogger }).logger = logger;
(plugin as unknown as { logger: Logger }).logger = logger;
});
it('has a sync setup process', () => {

View file

@ -5,12 +5,12 @@
* 2.0.
*/
import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/server';
import type { CoreSetup, CoreStart, Logger, Plugin, PluginInitializerContext } from 'kibana/server';
import { PLUGIN_ID } from '../common/constants';
import { ReportingCore } from './';
import { buildConfig, registerUiSettings, ReportingConfigType } from './config';
import { registerDeprecations } from './deprecations';
import { LevelLogger, ReportingStore } from './lib';
import { ReportingStore } from './lib';
import { registerRoutes } from './routes';
import { setFieldFormats } from './services';
import type {
@ -28,11 +28,11 @@ import { registerReportingUsageCollector } from './usage';
export class ReportingPlugin
implements Plugin<ReportingSetup, ReportingStart, ReportingSetupDeps, ReportingStartDeps>
{
private logger: LevelLogger;
private logger: Logger;
private reportingCore?: ReportingCore;
constructor(private initContext: PluginInitializerContext<ReportingConfigType>) {
this.logger = new LevelLogger(initContext.logger.get());
this.logger = initContext.logger.get();
}
public setup(core: CoreSetup, plugins: ReportingSetupDeps) {

View file

@ -5,16 +5,16 @@
* 2.0.
*/
import { errors } from '@elastic/elasticsearch';
import { SecurityHasPrivilegesIndexPrivilegesCheck } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { RequestHandler } from 'src/core/server';
import type { SecurityHasPrivilegesIndexPrivilegesCheck } from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import type { Logger, RequestHandler } from 'kibana/server';
import {
API_GET_ILM_POLICY_STATUS,
API_MIGRATE_ILM_POLICY_URL,
ILM_POLICY_NAME,
} from '../../../common/constants';
import { IlmPolicyStatusResponse } from '../../../common/types';
import { ReportingCore } from '../../core';
import { IlmPolicyManager, LevelLogger as Logger } from '../../lib';
import type { IlmPolicyStatusResponse } from '../../../common/types';
import type { ReportingCore } from '../../core';
import { IlmPolicyManager } from '../../lib';
import { deprecations } from '../../lib/deprecations';
export const registerDeprecationsRoutes = (reporting: ReportingCore, logger: Logger) => {

View file

@ -5,6 +5,7 @@
* 2.0.
*/
import { loggingSystemMock } from 'src/core/server/mocks';
import { setupServer } from 'src/core/server/test_utils';
import supertest from 'supertest';
import { licensingMock } from '../../../../../licensing/server/mocks';
@ -12,7 +13,6 @@ import { securityMock } from '../../../../../security/server/mocks';
import { API_GET_ILM_POLICY_STATUS } from '../../../../common/constants';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockPluginSetup,
createMockPluginStart,
createMockReportingCore,
@ -54,7 +54,7 @@ describe(`GET ${API_GET_ILM_POLICY_STATUS}`, () => {
it('correctly handles authz when security is unavailable', async () => {
const core = await createReportingCore({});
registerDeprecationsRoutes(core, createMockLevelLogger());
registerDeprecationsRoutes(core, loggingSystemMock.createLogger());
await server.start();
await supertest(httpSetup.server.listener)
@ -68,7 +68,7 @@ describe(`GET ${API_GET_ILM_POLICY_STATUS}`, () => {
security.license.isEnabled.mockReturnValue(false);
const core = await createReportingCore({ security });
registerDeprecationsRoutes(core, createMockLevelLogger());
registerDeprecationsRoutes(core, loggingSystemMock.createLogger());
await server.start();
await supertest(httpSetup.server.listener)

View file

@ -6,11 +6,11 @@
*/
import { i18n } from '@kbn/i18n';
import { ReportingCore } from '../..';
import type { Logger } from 'kibana/server';
import type { ReportingCore } from '../..';
import { API_DIAGNOSE_URL } from '../../../common/constants';
import { LevelLogger as Logger } from '../../lib';
import { authorizedUserPreRouting } from '../lib/authorized_user_pre_routing';
import { DiagnosticResponse } from './';
import type { DiagnosticResponse } from './';
const logsToHelpMap = {
'error while loading shared libraries': i18n.translate(

View file

@ -5,10 +5,10 @@
* 2.0.
*/
import type { Logger } from 'kibana/server';
import type { ReportingCore } from '../../core';
import { registerDiagnoseBrowser } from './browser';
import { registerDiagnoseScreenshot } from './screenshot';
import { LevelLogger as Logger } from '../../lib';
import { ReportingCore } from '../../core';
export const registerDiagnosticRoutes = (reporting: ReportingCore, logger: Logger) => {
registerDiagnoseBrowser(reporting, logger);

View file

@ -6,13 +6,13 @@
*/
import * as Rx from 'rxjs';
import { loggingSystemMock } from 'src/core/server/mocks';
import { setupServer } from 'src/core/server/test_utils';
import supertest from 'supertest';
import { ReportingCore } from '../../../';
import type { ScreenshottingStart } from '../../../../../screenshotting/server';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockPluginSetup,
createMockReportingCore,
} from '../../../test_helpers';
@ -27,7 +27,7 @@ const fontNotFoundMessage = 'Could not find the default font';
describe('POST /diagnose/browser', () => {
jest.setTimeout(6000);
const reportingSymbol = Symbol('reporting');
const mockLogger = createMockLevelLogger();
const mockLogger = loggingSystemMock.createLogger();
let server: SetupServerReturn['server'];
let httpSetup: SetupServerReturn['httpSetup'];

View file

@ -5,13 +5,13 @@
* 2.0.
*/
import { loggingSystemMock } from 'src/core/server/mocks';
import { setupServer } from 'src/core/server/test_utils';
import supertest from 'supertest';
import { ReportingCore } from '../../../';
import { generatePngObservable } from '../../../export_types/common';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockPluginSetup,
createMockReportingCore,
} from '../../../test_helpers';
@ -38,7 +38,7 @@ describe('POST /diagnose/screenshot', () => {
};
const config = createMockConfigSchema({ queue: { timeout: 120000 } });
const mockLogger = createMockLevelLogger();
const mockLogger = loggingSystemMock.createLogger();
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));

View file

@ -6,12 +6,12 @@
*/
import { i18n } from '@kbn/i18n';
import type { Logger } from 'kibana/server';
import { ReportingCore } from '../..';
import { APP_WRAPPER_CLASS } from '../../../../../../src/core/server';
import { API_DIAGNOSE_URL } from '../../../common/constants';
import { generatePngObservable } from '../../export_types/common';
import { getAbsoluteUrlFactory } from '../../export_types/common/get_absolute_url';
import { LevelLogger as Logger } from '../../lib';
import { authorizedUserPreRouting } from '../lib/authorized_user_pre_routing';
import { DiagnosticResponse } from './';

View file

@ -6,13 +6,13 @@
*/
import { schema } from '@kbn/config-schema';
import { KibanaRequest } from 'src/core/server';
import { ReportingCore } from '../../';
import type { KibanaRequest, Logger } from 'kibana/server';
import type { ReportingCore } from '../../';
import { CSV_SEARCHSOURCE_IMMEDIATE_TYPE } from '../../../common/constants';
import { runTaskFnFactory } from '../../export_types/csv_searchsource_immediate/execute_job';
import { JobParamsDownloadCSV } from '../../export_types/csv_searchsource_immediate/types';
import { LevelLogger as Logger, PassThroughStream } from '../../lib';
import { BaseParams } from '../../types';
import type { JobParamsDownloadCSV } from '../../export_types/csv_searchsource_immediate/types';
import { PassThroughStream } from '../../lib';
import type { BaseParams } from '../../types';
import { authorizedUserPreRouting } from '../lib/authorized_user_pre_routing';
import { RequestHandler } from '../lib/request_handler';
@ -64,7 +64,7 @@ export function registerGenerateCsvFromSavedObjectImmediate(
authorizedUserPreRouting(
reporting,
async (user, context, req: CsvFromSavedObjectRequest, res) => {
const logger = parentLogger.clone([CSV_SEARCHSOURCE_IMMEDIATE_TYPE]);
const logger = parentLogger.get(CSV_SEARCHSOURCE_IMMEDIATE_TYPE);
const runTaskFn = runTaskFnFactory(reporting, logger);
const requestHandler = new RequestHandler(reporting, user, context, req, res, logger);
const stream = new PassThroughStream();

View file

@ -7,16 +7,16 @@
import { schema } from '@kbn/config-schema';
import rison from 'rison-node';
import { ReportingCore } from '../..';
import type { Logger } from 'kibana/server';
import type { ReportingCore } from '../..';
import { API_BASE_URL } from '../../../common/constants';
import { LevelLogger } from '../../lib';
import { BaseParams } from '../../types';
import type { BaseParams } from '../../types';
import { authorizedUserPreRouting } from '../lib/authorized_user_pre_routing';
import { RequestHandler } from '../lib/request_handler';
const BASE_GENERATE = `${API_BASE_URL}/generate`;
export function registerJobGenerationRoutes(reporting: ReportingCore, logger: LevelLogger) {
export function registerJobGenerationRoutes(reporting: ReportingCore, logger: Logger) {
const setupDeps = reporting.getPluginSetupDeps();
const { router } = setupDeps;

View file

@ -7,6 +7,7 @@
import rison from 'rison-node';
import { BehaviorSubject } from 'rxjs';
import { loggingSystemMock } from 'src/core/server/mocks';
import { setupServer } from 'src/core/server/test_utils';
import supertest from 'supertest';
import { ReportingCore } from '../../../';
@ -16,7 +17,6 @@ import { ExportTypesRegistry } from '../../../lib/export_types_registry';
import { Report } from '../../../lib/store';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockPluginSetup,
createMockPluginStart,
createMockReportingCore,
@ -38,7 +38,7 @@ describe('POST /api/reporting/generate', () => {
queue: { indexInterval: 'year', timeout: 10000, pollEnabled: true },
});
const mockLogger = createMockLevelLogger();
const mockLogger = loggingSystemMock.createLogger();
beforeEach(async () => {
({ server, httpSetup } = await setupServer(reportingSymbol));

View file

@ -5,8 +5,8 @@
* 2.0.
*/
import type { Logger } from 'kibana/server';
import { ReportingCore } from '..';
import { LevelLogger } from '../lib';
import { registerDeprecationsRoutes } from './deprecations/deprecations';
import { registerDiagnosticRoutes } from './diagnostic';
import {
@ -15,7 +15,7 @@ import {
} from './generate';
import { registerJobInfoRoutes } from './management';
export function registerRoutes(reporting: ReportingCore, logger: LevelLogger) {
export function registerRoutes(reporting: ReportingCore, logger: Logger) {
registerDeprecationsRoutes(reporting, logger);
registerDiagnosticRoutes(reporting, logger);
registerGenerateCsvFromSavedObjectImmediate(reporting, logger);

View file

@ -138,7 +138,7 @@ export function jobsQueryFactory(reportingCore: ReportingCore): JobsQueryFactory
async get(user, id) {
const { logger } = reportingCore.getPluginSetupDeps();
if (!id) {
logger.warning(`No ID provided for GET`);
logger.warn(`No ID provided for GET`);
return;
}
@ -163,7 +163,7 @@ export function jobsQueryFactory(reportingCore: ReportingCore): JobsQueryFactory
const result = response?.hits?.hits?.[0];
if (!result?._source) {
logger.warning(`No hits resulted in search`);
logger.warn(`No hits resulted in search`);
return;
}

View file

@ -6,16 +6,12 @@
*/
import { KibanaRequest, KibanaResponseFactory } from 'kibana/server';
import { coreMock, httpServerMock } from 'src/core/server/mocks';
import { coreMock, httpServerMock, loggingSystemMock } from 'src/core/server/mocks';
import { ReportingCore } from '../..';
import { JobParamsPDFDeprecated, TaskPayloadPDF } from '../../export_types/printable_pdf/types';
import { Report, ReportingStore } from '../../lib/store';
import { ReportApiJSON } from '../../lib/store/report';
import {
createMockConfigSchema,
createMockLevelLogger,
createMockReportingCore,
} from '../../test_helpers';
import { createMockConfigSchema, createMockReportingCore } from '../../test_helpers';
import { ReportingRequestHandlerContext, ReportingSetup } from '../../types';
import { RequestHandler } from './request_handler';
@ -43,7 +39,7 @@ const getMockResponseFactory = () =>
unauthorized: (obj: unknown) => obj,
} as unknown as KibanaResponseFactory);
const mockLogger = createMockLevelLogger();
const mockLogger = loggingSystemMock.createLogger();
describe('Handle request to generate', () => {
let reportingCore: ReportingCore;

View file

@ -7,12 +7,12 @@
import Boom from '@hapi/boom';
import { i18n } from '@kbn/i18n';
import { KibanaRequest, KibanaResponseFactory } from 'kibana/server';
import { ReportingCore } from '../..';
import type { KibanaRequest, KibanaResponseFactory, Logger } from 'kibana/server';
import type { ReportingCore } from '../..';
import { API_BASE_URL } from '../../../common/constants';
import { checkParamsVersion, cryptoFactory, LevelLogger } from '../../lib';
import { checkParamsVersion, cryptoFactory } from '../../lib';
import { Report } from '../../lib/store';
import { BaseParams, ReportingRequestHandlerContext, ReportingUser } from '../../types';
import type { BaseParams, ReportingRequestHandlerContext, ReportingUser } from '../../types';
export const handleUnavailable = (res: KibanaResponseFactory) => {
return res.custom({ statusCode: 503, body: 'Not Available' });
@ -30,7 +30,7 @@ export class RequestHandler {
private context: ReportingRequestHandlerContext,
private req: KibanaRequest,
private res: KibanaResponseFactory,
private logger: LevelLogger
private logger: Logger
) {}
private async encryptHeaders() {
@ -53,7 +53,7 @@ export class RequestHandler {
}
const [createJob, store] = await Promise.all([
exportType.createJobFnFactory(reporting, logger.clone([exportType.id])),
exportType.createJobFnFactory(reporting, logger.get(exportType.id)),
reporting.getStore(),
]);

View file

@ -1,29 +0,0 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
jest.mock('../lib/level_logger');
import { loggingSystemMock } from 'src/core/server/mocks';
import { LevelLogger } from '../lib/level_logger';
export function createMockLevelLogger() {
// eslint-disable-next-line no-console
const consoleLogger = (tag: string) => (message: unknown) => console.log(tag, message);
const logger = new LevelLogger(loggingSystemMock.create()) as jest.Mocked<LevelLogger>;
// logger.debug.mockImplementation(consoleLogger('debug')); // uncomment this to see debug logs in jest tests
logger.info.mockImplementation(consoleLogger('info'));
logger.warn.mockImplementation(consoleLogger('warn'));
logger.warning = jest.fn().mockImplementation(consoleLogger('warn'));
logger.error.mockImplementation(consoleLogger('error'));
logger.trace.mockImplementation(consoleLogger('trace'));
logger.clone.mockImplementation(() => logger);
return logger;
}

View file

@ -10,7 +10,12 @@ jest.mock('../usage');
import _ from 'lodash';
import { BehaviorSubject } from 'rxjs';
import { coreMock, elasticsearchServiceMock, statusServiceMock } from 'src/core/server/mocks';
import {
coreMock,
elasticsearchServiceMock,
loggingSystemMock,
statusServiceMock,
} from 'src/core/server/mocks';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
import { dataPluginMock } from 'src/plugins/data/server/mocks';
import { FieldFormatsRegistry } from 'src/plugins/field_formats/common';
@ -27,7 +32,6 @@ import { buildConfig, ReportingConfigType } from '../config';
import { ReportingInternalSetup, ReportingInternalStart } from '../core';
import { ReportingStore } from '../lib';
import { setFieldFormats } from '../services';
import { createMockLevelLogger } from './create_mock_levellogger';
export const createMockPluginSetup = (
setupMock: Partial<Record<keyof ReportingInternalSetup, any>>
@ -38,13 +42,13 @@ export const createMockPluginSetup = (
router: { get: jest.fn(), post: jest.fn(), put: jest.fn(), delete: jest.fn() },
security: securityMock.createSetup(),
taskManager: taskManagerMock.createSetup(),
logger: createMockLevelLogger(),
logger: loggingSystemMock.createLogger(),
status: statusServiceMock.createSetupContract(),
...setupMock,
};
};
const logger = createMockLevelLogger();
const logger = loggingSystemMock.createLogger();
const createMockReportingStore = async (config: ReportingConfigType) => {
const mockConfigSchema = createMockConfigSchema(config);

View file

@ -5,7 +5,6 @@
* 2.0.
*/
export { createMockLevelLogger } from './create_mock_levellogger';
export {
createMockConfig,
createMockConfigSchema,

View file

@ -5,7 +5,7 @@
* 2.0.
*/
import type { IRouter, RequestHandlerContext } from 'src/core/server';
import type { IRouter, Logger, RequestHandlerContext } from 'kibana/server';
// eslint-disable-next-line @kbn/eslint/no-restricted-paths
import type { DataPluginStart } from 'src/plugins/data/server/plugin';
import { FieldFormatsStart } from 'src/plugins/field_formats/server';
@ -29,7 +29,6 @@ import type { CancellationToken } from '../common/cancellation_token';
import type { BaseParams, BasePayload, TaskRunResult, UrlOrUrlLocatorTuple } from '../common/types';
import type { ReportingConfigType } from './config';
import type { ReportingCore } from './core';
import type { LevelLogger } from './lib';
import type { ReportTaskParams } from './lib/tasks';
/**
@ -71,12 +70,12 @@ export type RunTaskFn<TaskPayloadType = BasePayload> = (
export type CreateJobFnFactory<CreateJobFnType> = (
reporting: ReportingCore,
logger: LevelLogger
logger: Logger
) => CreateJobFnType;
export type RunTaskFnFactory<RunTaskFnType> = (
reporting: ReportingCore,
logger: LevelLogger
logger: Logger
) => RunTaskFnType;
export interface ExportTypeDefinition<