Skip to content

Commit

Permalink
enrich all traces with user id
Browse files Browse the repository at this point in the history
  • Loading branch information
hahn-kev committed Nov 29, 2023
1 parent f0ea5ee commit c3beb61
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 5 deletions.
13 changes: 12 additions & 1 deletion backend/LexBoxApi/Otel/OtelKernel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using LexBoxApi.Services;
using LexCore.Auth;
using Npgsql;
using OpenTelemetry;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
Expand All @@ -28,6 +29,7 @@ public static void AddOpenTelemetryInstrumentation(this IServiceCollection servi
configuration.Bind("Otel", options);
})
.AddSource(ServiceName)
.AddProcessor<UserEnricher>()
.SetResourceBuilder(appResourceBuilder)
// could potentially add baggage to the trace as done in
// https://github.com/honeycombio/honeycomb-opentelemetry-dotnet/blob/main/src/Honeycomb.OpenTelemetry.Instrumentation.AspNetCore/TracerProviderBuilderExtensions.cs
Expand Down Expand Up @@ -109,6 +111,15 @@ private static void EnrichWithUser(this Activity activity, HttpContext httpConte
{
activity.SetTag("app.user.role", userRole);
}
activity.SetTag("http.abort", httpContext.RequestAborted.IsCancellationRequested);
if (httpContext.RequestAborted.IsCancellationRequested)
activity.SetTag("http.abort", true);
}

private class UserEnricher(IHttpContextAccessor contextAccessor) : BaseProcessor<Activity>
{
public override void OnStart(Activity data)
{
if (contextAccessor.HttpContext is {} context) data.EnrichWithUser(context);
}
}
}
19 changes: 16 additions & 3 deletions frontend/src/lib/otel/otel.client.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
import { BatchSpanProcessor, WebTracerProvider } from '@opentelemetry/sdk-trace-web'
import {
BatchSpanProcessor,
ConsoleSpanExporter,
SimpleSpanProcessor,
WebTracerProvider
} from '@opentelemetry/sdk-trace-web';

import { APP_VERSION } from '$lib/util/version';
import { OTLPTraceExporterBrowserWithXhrRetry } from './trace-exporter-browser-with-xhr-retry';
import { Resource } from '@opentelemetry/resources'
import { SERVICE_NAME } from '.'
import {SERVICE_NAME, traceUserAttributes} from '.';
import { SemanticResourceAttributes } from '@opentelemetry/semantic-conventions'
import { ZoneContextManager } from '@opentelemetry/context-zone'
import { getWebAutoInstrumentations } from '@opentelemetry/auto-instrumentations-web'
Expand All @@ -27,6 +32,14 @@ const resource = Resource.default().merge(
const provider = new WebTracerProvider({
resource: resource,
});
provider.addSpanProcessor({
forceFlush: () => Promise.resolve(),
onStart: (span) => {
traceUserAttributes(span);
},
onEnd: () => {},
shutdown: () => Promise.resolve(),
});
const exporter = new OTLPTraceExporterBrowserWithXhrRetry({
url: '/v1/traces'
});
Expand All @@ -44,7 +57,7 @@ provider.addSpanProcessor(
// Debugging:
// diag.setLogger(new DiagConsoleLogger(), DiagLogLevel.DEBUG)
// provider.addSpanProcessor(new SimpleSpanProcessor(exporter))
// provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()))
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));

provider.register({
// https://opentelemetry.io/docs/instrumentation/js/getting-started/browser/#creating-a-tracer-provider
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/otel/otel.shared.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ function getUser(event?: RequestEvent | NavigationEvent | Event): LexAuthUser |
}
}
}
function traceUserAttributes(span: Span, event?: RequestEvent | NavigationEvent | Event): void {
export function traceUserAttributes(span: Span, event?: RequestEvent | NavigationEvent | Event): void {
const user = getUser(event);
if (user) {
span.setAttribute('app.user.id', user.id);
Expand Down

0 comments on commit c3beb61

Please sign in to comment.