Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion lib/config-validator.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
#!/usr/bin/env node
import { Command, CommanderError } from 'commander';
import 'source-map-support/register.js';
import './punycode.cjs';

import { Command, CommanderError } from 'commander';
import { dequal } from 'dequal';
import fs from 'fs-extra';
import { getConfigFileNames } from './config/app-strings.ts';
Expand Down
3 changes: 3 additions & 0 deletions lib/globals.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,6 @@ declare module '*.json' {
const value: Record<string, any>;
export = value;
}

// make typescript happy
declare module 'source-map-support/register.js';
10 changes: 8 additions & 2 deletions lib/instrumentation/index.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import * as api from '@opentelemetry/api';
import { ProxyTracerProvider } from '@opentelemetry/api';
import { NodeTracerProvider } from '@opentelemetry/sdk-trace-node';
import {
NodeTracerProvider,
SimpleSpanProcessor,
} from '@opentelemetry/sdk-trace-node';
import { GitOperationSpanProcessor } from '../util/git/span-processor.ts';
import {
disableInstrumentations,
Expand All @@ -17,6 +20,9 @@ describe('instrumentation/index', () => {
beforeEach(() => {
api.trace.disable(); // clear global components
process.env = { ...oldEnv };
delete process.env.OTEL_LOG_LEVEL;
delete process.env.OTEL_EXPORTER_OTLP_ENDPOINT;
delete process.env.RENOVATE_TRACING_CONSOLE_EXPORTER;
});

afterAll(() => {
Expand All @@ -43,7 +49,7 @@ describe('instrumentation/index', () => {
const nodeProvider = delegateProvider as NodeTracerProvider;
expect(nodeProvider).toMatchObject({
_activeSpanProcessor: {
_spanProcessors: [{ _exporter: {} }],
_spanProcessors: [expect.any(SimpleSpanProcessor)],
},
});
});
Expand Down
6 changes: 2 additions & 4 deletions lib/instrumentation/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ import {
} from '@opentelemetry/semantic-conventions';
import { isPromise } from '@sindresorhus/is';
import { pkg } from '../expose.ts';
import { getEnv } from '../util/env.ts';
import { GitOperationSpanProcessor } from '../util/git/span-processor.ts';
import type { RenovateSpanOptions } from './types.ts';
import {
Expand All @@ -53,8 +52,6 @@ import {

let instrumentations: Instrumentation[] = [];

init();

export function init(): void {
if (!isTracingEnabled()) {
return;
Expand All @@ -80,10 +77,11 @@ export function init(): void {
if (isTraceSendingEnabled()) {
const exporter = new OTLPTraceExporter();
spanProcessors.push(new BatchSpanProcessor(exporter));
// TODO: fix me, transitive initializes logger
spanProcessors.push(new GitOperationSpanProcessor());
}

const env = getEnv();
const env = process.env; // don't use getEnv() here to avoid circular dependency with env variables used in the resource detectors
const baseResource = resourceFromAttributes({
// https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#semantic-attributes-with-sdk-provided-default-value
[ATTR_SERVICE_NAME]: env.OTEL_SERVICE_NAME ?? 'renovate',
Expand Down
11 changes: 11 additions & 0 deletions lib/renovate.spec.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
import * as otel from './instrumentation/index.ts';
import * as renovateWorker from './workers/global/index.ts';

vi.mock('./instrumentation/index.ts');
vi.mock('./proxy.ts');
vi.mock('./workers/global/index.ts');

describe('renovate', () => {
it('starts', async () => {
vi.mocked(otel.instrument).mockImplementationOnce((_, cb) => cb());
const waiter = new Promise<void>((resolve) => {
vi.mocked(otel.shutdown).mockImplementationOnce(() => {
resolve();
return Promise.resolve();
});
});
await vi.importActual('./renovate.ts');
await waiter;
expect(renovateWorker.start).toHaveBeenCalledTimes(1);
});
});
28 changes: 12 additions & 16 deletions lib/renovate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,20 @@

import 'source-map-support/register.js';
import './punycode.cjs';
import {
instrument,
shutdown as telemetryShutdown,
} from './instrumentation/index.ts'; // has to be imported before logger and other libraries which are instrumentalised
import { logger } from './logger/index.ts';
import { bootstrap } from './proxy.ts';
import { start } from './workers/global/index.ts';

/* v8 ignore next 3 -- not easily testable */
process.on('unhandledRejection', (err) => {
logger.error({ err }, 'unhandledRejection');
});

bootstrap();

void (async (): Promise<void> => {
process.exitCode = await instrument('run', () => start());
await telemetryShutdown(); //gracefully shutdown OpenTelemetry
// has to be imported before logger and other libraries which are instrumentalised
const otel = await import('./instrumentation/index.ts');
otel.init();
(await import('./proxy.ts')).bootstrap();
const { logger } = await import('./logger/index.ts');
const { start } = await import('./workers/global/index.ts');
/* v8 ignore next 3 -- not easily testable */
process.on('unhandledRejection', (err) => {
logger.error({ err }, 'unhandledRejection');
});
process.exitCode = await otel.instrument('run', start);
await otel.shutdown(); //gracefully shutdown OpenTelemetry

/* v8 ignore next 3 -- no test required */
if (process.env.RENOVATE_X_HARD_EXIT) {
Expand Down