Skip to content

Commit

Permalink
Switched to simplified version of OTel setup
Browse files Browse the repository at this point in the history
ref https://linear.app/ghost/issue/AP-603/logging-and-debugging-improvements

- changes from previous approaches include using the minimum setup
  needed to make things work, and disabling as much as I can in Sentry
- this seems to work locally using Jaeger, so we'll have to see if it
  works in GCP
  • Loading branch information
daniellockyer committed Nov 21, 2024
1 parent 410cd0f commit 3a96ab1
Show file tree
Hide file tree
Showing 4 changed files with 656 additions and 71 deletions.
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,9 @@
"@js-temporal/polyfill": "0.4.4",
"@logtape/logtape": "0.7.1",
"@opentelemetry/api": "1.9.0",
"@opentelemetry/auto-instrumentations-node": "0.53.0",
"@opentelemetry/exporter-trace-otlp-proto": "0.55.0",
"@opentelemetry/sdk-trace-base": "1.28.0",
"@opentelemetry/sdk-node": "0.55.0",
"@sentry/node": "8.38.0",
"hono": "4.6.10",
"jsonwebtoken": "9.0.2",
Expand Down
32 changes: 2 additions & 30 deletions src/app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@ import {
unlikeAction,
} from './handlers';
import { getTraceContext } from './helpers/context-header';
import { getRequestData } from './helpers/request-data';
import { spanWrapper } from './instrumentation';
import { KnexKvStore } from './knex.kvstore';
import { scopeKvStore } from './kv-helpers';
Expand Down Expand Up @@ -375,35 +374,8 @@ app.use(async (ctx, next) => {

ctx.set('logger', logging.with(extra));

return Sentry.withIsolationScope((scope) => {
scope.addEventProcessor((event) => {
Sentry.addRequestDataToEvent(event, getRequestData(ctx.req.raw));
return event;
});

return Sentry.continueTrace(
{
sentryTrace: ctx.req.header('sentry-trace'),
baggage: ctx.req.header('baggage'),
},
() => {
return Sentry.startSpan(
{
op: 'http.server',
name: `${ctx.req.method} ${ctx.req.path}`,
attributes: {
...extra,
'service.name': 'activitypub',
},
},
() => {
return withContext(extra, () => {
return next();
});
},
);
},
);
return withContext(extra, () => {
return next();
});
});

Expand Down
78 changes: 42 additions & 36 deletions src/instrumentation.ts
Original file line number Diff line number Diff line change
@@ -1,59 +1,65 @@
import { DiagConsoleLogger, DiagLogLevel, diag } from '@opentelemetry/api';
import { TraceExporter } from '@google-cloud/opentelemetry-cloud-trace-exporter';
import {
BatchSpanProcessor,
SimpleSpanProcessor,
} from '@opentelemetry/sdk-trace-base';
DiagConsoleLogger,
DiagLogLevel,
diag,
trace,
} from '@opentelemetry/api';
import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-proto';
import { NodeSDK } from '@opentelemetry/sdk-node';
import * as Sentry from '@sentry/node';

if (process.env.NODE_ENV === 'production') {
if (process.env.OTEL_DEBUG_LOGGING) {
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG);
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.ALL);
} else {
diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.INFO);
}
}

const sdk = new NodeSDK({
instrumentations: getNodeAutoInstrumentations(),
serviceName: 'activitypub',
traceExporter: process.env.K_SERVICE
? new TraceExporter()
: new OTLPTraceExporter({
url: 'http://jaeger:4318/v1/traces',
}),
});

try {
sdk.start();
} catch (error) {
console.error('Failed to start OpenTelemetry SDK:', error);
}

const tracer = trace.getTracer('activitypub');

if (process.env.SENTRY_DSN) {
const sentryClient = Sentry.init({
Sentry.init({
dsn: process.env.SENTRY_DSN,
environment: process.env.NODE_ENV || 'unknown',
release: process.env.K_REVISION,
tracesSampleRate: 1.0,
tracesSampleRate: 0,
skipOpenTelemetrySetup: true,
defaultIntegrations: false,
});

if (process.env.K_SERVICE) {
const { TraceExporter } = await import(
'@google-cloud/opentelemetry-cloud-trace-exporter'
);
sentryClient?.traceProvider?.addSpanProcessor(
new BatchSpanProcessor(new TraceExporter({})),
);
}

if (process.env.NODE_ENV === 'development') {
const { OTLPTraceExporter } = await import(
'@opentelemetry/exporter-trace-otlp-proto'
);
sentryClient?.traceProvider?.addSpanProcessor(
new SimpleSpanProcessor(
new OTLPTraceExporter({
url: 'http://jaeger:4318/v1/traces',
}),
),
);
}
}

export function spanWrapper<TArgs extends unknown[], TReturn>(
fn: (...args: TArgs) => TReturn,
) {
return (...args: TArgs) => {
return Sentry.startSpan(
{
op: 'fn',
name: fn.name || 'anonymous',
},
() => fn(...args),
);
return tracer.startActiveSpan(fn.name || 'anonymous', (span) => {
try {
return fn(...args);
} catch (error) {
span.recordException(error as Error);
throw error;
} finally {
span.end();
}
});
};
}
Loading

0 comments on commit 3a96ab1

Please sign in to comment.