Skip to content

Commit bb3f911

Browse files
committed
feat: parse log severity number
1 parent 6472326 commit bb3f911

File tree

16 files changed

+118
-60
lines changed

16 files changed

+118
-60
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"eslint": "^8.42.0",
3232
"eslint-config-prettier": "^8.8.0",
3333
"eslint-plugin-jest": "^27.2.1",
34+
"eslint-plugin-simple-import-sort": "^12.1.1",
3435
"husky": "^8.0.3",
3536
"jest": "^29.5.0",
3637
"lint-staged": "^13.2.2",

packages/node-opentelemetry/.eslintrc.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"sourceType": "module",
1111
"ecmaVersion": 2020
1212
},
13-
"plugins": ["@typescript-eslint", "jest"],
13+
"plugins": ["@typescript-eslint", "jest", "simple-import-sort"],
1414
"extends": [
1515
"eslint:recommended",
1616
"plugin:@typescript-eslint/recommended",
@@ -24,6 +24,8 @@
2424
// https://typescript-eslint.io/rules/explicit-function-return-type/
2525
"@typescript-eslint/explicit-function-return-type": "warn",
2626
"@typescript-eslint/ban-ts-comment": "warn",
27-
"@typescript-eslint/no-this-alias": "warn"
27+
"@typescript-eslint/no-this-alias": "warn",
28+
"simple-import-sort/imports": "error",
29+
"simple-import-sort/exports": "error"
2830
}
2931
}

packages/node-opentelemetry/bin/opentelemetry-instrument.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/usr/bin/env node
22

3-
import process from 'process';
43
import fs from 'fs';
4+
import process from 'process';
55
import { promisify } from 'util';
66

77
const realpath = promisify(fs.realpath);

packages/node-opentelemetry/src/MutableAsyncLocalStorageContextManager.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
import { Context, ROOT_CONTEXT } from '@opentelemetry/api';
1818
import { AsyncLocalStorage } from 'async_hooks';
19+
1920
import { AbstractAsyncHooksContextManager } from './AbstractAsyncHooksContextManager';
2021

2122
type MutableContextStore = {

packages/node-opentelemetry/src/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
import { getEnv, getEnvWithoutDefaults } from '@opentelemetry/core';
12
import { defaultServiceName } from '@opentelemetry/resources';
2-
import { getEnvWithoutDefaults, getEnv } from '@opentelemetry/core';
33

44
import { stringToBoolean } from './utils';
55

packages/node-opentelemetry/src/gcp.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
import { context, SpanKind, trace } from '@opentelemetry/api';
12
import { SemanticAttributes } from '@opentelemetry/semantic-conventions';
2-
import { SpanKind, context, trace } from '@opentelemetry/api';
33

4-
import { SDKConfig, initSDK } from './otel';
54
import { name as PKG_NAME, version as PKG_VERSION } from '../package.json';
5+
import { initSDK, SDKConfig } from './otel';
66

77
export const registerGCPCloudFunctionEventHandler = (
88
handler: (event: any) => Promise<void>,

packages/node-opentelemetry/src/instrumentations/console.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import isObject from 'lodash.isobject';
2-
import isPlainObject from 'lodash.isplainobject';
31
import opentelemetry, { Attributes } from '@opentelemetry/api';
42
import {
53
InstrumentationBase,
64
InstrumentationConfig,
75
InstrumentationNodeModuleDefinition,
86
} from '@opentelemetry/instrumentation';
7+
import isObject from 'lodash.isobject';
8+
import isPlainObject from 'lodash.isplainobject';
99

10+
import { MutableAsyncLocalStorageContextManager } from '../MutableAsyncLocalStorageContextManager';
1011
import { Logger, LoggerOptions } from '../otel-logger';
1112
import { parseWinstonLog } from '../otel-logger/winston';
12-
import { MutableAsyncLocalStorageContextManager } from '../MutableAsyncLocalStorageContextManager';
1313

1414
const PACKAGE_NAME = '@hyperdx/instrumentation-console';
1515
const PACKAGE_VERSION = '0.1.0';

packages/node-opentelemetry/src/instrumentations/http.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1+
import { diag, Span } from '@opentelemetry/api';
2+
import { headerCapture } from '@opentelemetry/instrumentation-http';
13
import * as http from 'http';
2-
import zlib from 'zlib';
34
import { PassThrough, Readable } from 'stream';
4-
5-
import { Span, diag } from '@opentelemetry/api';
6-
import { headerCapture } from '@opentelemetry/instrumentation-http';
5+
import zlib from 'zlib';
76

87
const SENSITIVE_DATA_SUBSTITUTE = '[Filtered]';
98
// https://github.com/getsentry/sentry-python/blob/1.18.0/sentry_sdk/scrubber.py#L17

packages/node-opentelemetry/src/logger.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import {
55
DEFAULT_HDX_NODE_BETA_MODE,
66
DEFAULT_SERVICE_NAME,
77
} from './constants';
8-
import * as HyperDXPino from './otel-logger/pino';
9-
import HyperDXWinston from './otel-logger/winston';
10-
118
import type { HyperDXPinoOptions } from './otel-logger/pino';
9+
import * as HyperDXPino from './otel-logger/pino';
1210
import type { HyperDXWinstonOptions } from './otel-logger/winston';
11+
import HyperDXWinston from './otel-logger/winston';
1312

1413
type WinstonTransportOptions = Omit<
1514
HyperDXWinstonOptions,

packages/node-opentelemetry/src/otel-logger/index.ts

Lines changed: 65 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,28 @@
11
import { Attributes, diag } from '@opentelemetry/api';
2-
import { getEnvWithoutDefaults } from '@opentelemetry/core';
32
import {
4-
BatchLogRecordProcessor,
5-
LoggerProvider,
6-
NoopLogRecordProcessor,
7-
} from '@opentelemetry/sdk-logs';
8-
import { Logger as OtelLogger, logs } from '@opentelemetry/api-logs';
3+
LogAttributes,
4+
Logger as OtelLogger,
5+
logs,
6+
SeverityNumber,
7+
} from '@opentelemetry/api-logs';
8+
import { getEnvWithoutDefaults } from '@opentelemetry/core';
99
import { OTLPLogExporter } from '@opentelemetry/exporter-logs-otlp-http';
1010
import {
11-
Resource,
1211
detectResourcesSync,
1312
envDetectorSync,
1413
hostDetectorSync,
1514
osDetectorSync,
1615
processDetector,
16+
Resource,
1717
} from '@opentelemetry/resources';
18+
import {
19+
BatchLogRecordProcessor,
20+
LoggerProvider,
21+
NoopLogRecordProcessor,
22+
} from '@opentelemetry/sdk-logs';
1823
import { SEMRESATTRS_SERVICE_NAME } from '@opentelemetry/semantic-conventions';
1924

25+
import { version as PKG_VERSION } from '../../package.json';
2026
import {
2127
DEFAULT_EXPORTER_BATCH_SIZE,
2228
DEFAULT_EXPORTER_TIMEOUT_MS,
@@ -25,7 +31,6 @@ import {
2531
DEFAULT_SEND_INTERVAL_MS,
2632
DEFAULT_SERVICE_NAME,
2733
} from '../constants';
28-
import { version as PKG_VERSION } from '../../package.json';
2934

3035
const LOG_PREFIX = `⚠️ [LOGGER]`;
3136

@@ -41,6 +46,45 @@ export type LoggerOptions = {
4146
timeout?: number; // The read/write/connection timeout in milliseconds
4247
};
4348

49+
// https://github.com/open-telemetry/opentelemetry-js-contrib/blob/afccd0d62a0ea81afb8f5609f3ee802c038d11c6/packages/winston-transport/src/utils.ts
50+
const npmLevels: Record<string, number> = {
51+
error: SeverityNumber.ERROR,
52+
warn: SeverityNumber.WARN,
53+
info: SeverityNumber.INFO,
54+
http: SeverityNumber.DEBUG3,
55+
verbose: SeverityNumber.DEBUG2,
56+
debug: SeverityNumber.DEBUG,
57+
silly: SeverityNumber.TRACE,
58+
};
59+
60+
const sysLoglevels: Record<string, number> = {
61+
emerg: SeverityNumber.FATAL3,
62+
alert: SeverityNumber.FATAL2,
63+
crit: SeverityNumber.FATAL,
64+
error: SeverityNumber.ERROR,
65+
warning: SeverityNumber.WARN,
66+
notice: SeverityNumber.INFO2,
67+
info: SeverityNumber.INFO,
68+
debug: SeverityNumber.DEBUG,
69+
};
70+
71+
const cliLevels: Record<string, number> = {
72+
error: SeverityNumber.ERROR,
73+
warn: SeverityNumber.WARN,
74+
help: SeverityNumber.INFO3,
75+
data: SeverityNumber.INFO2,
76+
info: SeverityNumber.INFO,
77+
debug: SeverityNumber.DEBUG,
78+
prompt: SeverityNumber.TRACE4,
79+
verbose: SeverityNumber.TRACE3,
80+
input: SeverityNumber.TRACE2,
81+
silly: SeverityNumber.TRACE,
82+
};
83+
84+
function getSeverityNumber(level: string): SeverityNumber | undefined {
85+
return npmLevels[level] ?? sysLoglevels[level] ?? cliLevels[level];
86+
}
87+
4488
export class Logger {
4589
private readonly _url: string;
4690

@@ -155,15 +199,25 @@ export class Logger {
155199
return this.processor.forceFlush();
156200
}
157201

158-
postMessage(level: string, body: string, attributes: Attributes = {}): void {
202+
postMessage(
203+
level: string,
204+
body: string,
205+
meta: Record<string, any> = {},
206+
): void {
207+
const attributes: LogAttributes = {};
208+
for (const key in meta) {
209+
if (Object.prototype.hasOwnProperty.call(meta, key)) {
210+
attributes[key] = meta[key];
211+
}
212+
}
159213
this.logger.emit({
160214
// TODO: should map to otel severity number
161-
severityNumber: 0,
215+
severityNumber: getSeverityNumber(level),
162216
// TODO: set up the mapping between different downstream log levels
163217
severityText: level,
164218
body,
165219
attributes,
166-
timestamp: this.parseTimestamp(attributes),
220+
timestamp: this.parseTimestamp(meta),
167221
});
168222
}
169223
}

0 commit comments

Comments
 (0)