mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-08-02 21:36:27 +00:00
enhance: OTel設定時、JSONログにtrace_id, span_id, trace_flagがつくように (#17748)
* enhance: OTel設定時、JSONログにtrace_id, span_id, trace_flagがつくように * fix
This commit is contained in:
@@ -11,6 +11,7 @@ import { installHttpClientInstrumentation } from '@/core/telemetry/http-client-i
|
||||
import { installDatabaseInstrumentation } from '@/core/telemetry/database-instrumentation.js';
|
||||
import { installRedisInstrumentation } from '@/core/telemetry/redis-instrumentation.js';
|
||||
import { executeSpan, getQueueTraceContextMode, injectActiveTraceContext, recordSpanError, startSpanWithQueueTraceContext } from '@/core/telemetry/queue-trace-context.js';
|
||||
import type { LogTraceContext } from '@/logging/types.js';
|
||||
import type { Span, SpanStatusCode, Tracer } from '@opentelemetry/api';
|
||||
import type { Resource, ResourceDetector } from '@opentelemetry/resources';
|
||||
import type { ParentBasedSampler, Sampler } from '@opentelemetry/sdk-trace-base';
|
||||
@@ -161,6 +162,15 @@ export class OpenTelemetryAdapter implements TelemetryAdapter {
|
||||
});
|
||||
}
|
||||
|
||||
/** activeなSpanの識別子を、Logging基盤で扱える形式へ変換します。 */
|
||||
public getActiveTraceContext(): LogTraceContext | undefined {
|
||||
const activeSpan = this.deps.getActiveSpan();
|
||||
if (activeSpan == null) return undefined;
|
||||
|
||||
const { traceId, spanId, traceFlags } = activeSpan.spanContext();
|
||||
return { traceId, spanId, traceFlags };
|
||||
}
|
||||
|
||||
public startSpan<T>(name: string, fn: () => T): T {
|
||||
// 既存のTelemetryAdapter契約に合わせ、同期/非同期どちらでも同じspan lifetimeを保証する。
|
||||
return this.deps.tracer.startActiveSpan(name, span => executeSpan(span, fn, this.deps.spanStatusCodeError));
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
import Logger from '@/logger.js';
|
||||
import { registerDiagLogger } from '@/core/telemetry/telemetry-diag.js';
|
||||
import { getQueueTraceContextMode, injectActiveTraceContext, startSpanWithQueueTraceContext } from '@/core/telemetry/queue-trace-context.js';
|
||||
import type { LogTraceContext } from '@/logging/types.js';
|
||||
import type * as SentryNode from '@sentry/node';
|
||||
import type { NodeOptions } from '@sentry/node';
|
||||
import type { OtelBackendRuntimeConfig, SentryBackendConfig, TelemetryAdapter, TelemetryCaptureMessageOptions } from './TelemetryAdapter.js';
|
||||
@@ -175,6 +176,15 @@ export class SentryTelemetryAdapter implements TelemetryAdapter {
|
||||
});
|
||||
}
|
||||
|
||||
/** activeなSpanの識別子を、Logging基盤で扱える形式へ変換します。 */
|
||||
public getActiveTraceContext(): LogTraceContext | undefined {
|
||||
const activeSpan = this.Sentry.getActiveSpan();
|
||||
if (activeSpan == null) return undefined;
|
||||
|
||||
const { traceId, spanId, traceFlags } = activeSpan.spanContext();
|
||||
return { traceId, spanId, traceFlags };
|
||||
}
|
||||
|
||||
public startSpan<T>(name: string, fn: () => T): T {
|
||||
return this.Sentry.startSpan({ name }, fn);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
import type { Config } from '@/config.js';
|
||||
import type { LogTraceContext } from '@/logging/types.js';
|
||||
import type { QueueTraceContextCarrier } from '../queue-trace-context.js';
|
||||
|
||||
export type SentryBackendConfig = NonNullable<Config['sentryForBackend']>;
|
||||
@@ -35,6 +36,9 @@ export interface TelemetryAdapter {
|
||||
*/
|
||||
captureMessage(message: string, opts: TelemetryCaptureMessageOptions): void;
|
||||
|
||||
/** 現在のactive Spanからログへ付加するTrace Contextを取得する。 */
|
||||
getActiveTraceContext?(): LogTraceContext | undefined;
|
||||
|
||||
/**
|
||||
* API endpointやqueue jobなど、呼び出し側の処理単位をspanで包む。
|
||||
* fnの戻り値・例外はそのまま呼び出し側へ返し、Promiseの場合はsettleまでspanを閉じない。
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
*/
|
||||
|
||||
import type { Config } from '@/config.js';
|
||||
import { setLogTraceContextProvider } from '@/logging/logging-runtime.js';
|
||||
import { OpenTelemetryAdapter } from './adapters/OpenTelemetryAdapter.js';
|
||||
import { SentryTelemetryAdapter } from './adapters/SentryTelemetryAdapter.js';
|
||||
import type { OtelBackendRuntimeConfig, TelemetryAdapter, TelemetryCaptureMessageOptions } from './adapters/TelemetryAdapter.js';
|
||||
@@ -23,14 +24,21 @@ export async function initTelemetry(config: Config): Promise<void> {
|
||||
};
|
||||
|
||||
// SentryとOTelを同時に使う場合はproviderを分けず、Sentry側へOTLP processorを追加する。
|
||||
let adapter: TelemetryAdapter | undefined;
|
||||
if (config.sentryForBackend && otelForBackend) {
|
||||
adapters.push(await SentryTelemetryAdapter.createWithOtlpExport(config.sentryForBackend, otelForBackend));
|
||||
adapter = await SentryTelemetryAdapter.createWithOtlpExport(config.sentryForBackend, otelForBackend);
|
||||
} else if (config.sentryForBackend) {
|
||||
// Sentry単体時は既存のSentry adapterだけを登録する。
|
||||
adapters.push(await SentryTelemetryAdapter.create(config.sentryForBackend));
|
||||
adapter = await SentryTelemetryAdapter.create(config.sentryForBackend);
|
||||
} else if (otelForBackend) {
|
||||
// OTel単体時だけMisskey自身でNodeTracerProviderを立てる。
|
||||
adapters.push(await OpenTelemetryAdapter.create(otelForBackend));
|
||||
adapter = await OpenTelemetryAdapter.create(otelForBackend);
|
||||
}
|
||||
|
||||
if (adapter != null) {
|
||||
adapters.push(adapter);
|
||||
// Telemetryの初期化後に登録し、初期化前のBootstrapログは従来どおり出力する。
|
||||
setLogTraceContextProvider(() => adapter.getActiveTraceContext?.());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user