Observability and Instrumentation
This document describes the observability setup for the Dialogporten Frontend application, covering both the Backend-for-Frontend (BFF) and Frontend instrumentation.
Overviewβ
The application uses a hybrid approach to observability:
- BFF: OpenTelemetry (OTEL) with Azure Monitor exporter
- Frontend: Application Insights SDK directly
Both components are configured to work together, providing end-to-end tracing correlation through trace IDs.
Backend-for-Frontend (BFF) Instrumentationβ
Technology Stackβ
- OpenTelemetry SDK: Core instrumentation framework
- Azure Monitor Exporter: Sends telemetry data to Application Insights
- Custom Instrumentations: Additional OTEL instrumentations for specific libraries
Configurationβ
The BFF uses OpenTelemetry with the Azure Monitor exporter configured in packages/bff/src/instrumentation.ts
:
import { useAzureMonitor } from '@azure/monitor-opentelemetry';
import { registerInstrumentations } from '@opentelemetry/instrumentation';
Key Features:β
- Azure Monitor Integration: Direct export to Application Insights
- Resource Attribution: Custom service name and instance ID
- Multi-Library Support: HTTP, GraphQL, Redis, and Fastify instrumentation
- Trace ID Propagation: Adds
X-Trace-Id
header to all responses
Enabled Instrumentations:β
- HTTP Instrumentation: Tracks incoming/outgoing HTTP requests
- GraphQL Instrumentation: Monitors GraphQL operations with span merging
- IORedis Instrumentation: Tracks Redis operations
- Fastify OTEL Instrumentation: Framework-specific instrumentation
- PostgreSQL Instrumentation: Database query tracking (via Azure Monitor)
Filtering and Optimization:β
- Health Check Filtering: Excludes
/api/liveness
and/api/readiness
endpoints - OPTIONS Request Filtering: Ignores CORS preflight requests
- GraphQL Optimization: Ignores trivial resolver spans and merges related spans
Trace ID Propagationβ
The BFF automatically adds trace IDs to response headers:
// In fastifyHeaders.ts
const currentSpan = trace.getActiveSpan();
if (currentSpan?.spanContext().traceId) {
const traceId = currentSpan.spanContext().traceId;
reply.header('X-Trace-Id', traceId);
}
This enables correlation with frontend telemetry.
Frontend Instrumentationβ
Technology Stackβ
- Application Insights Web SDK: Direct integration with Azure Application Insights
- React Plugin: React-specific instrumentation
- Manual Dependency Tracking: Custom fetch/XHR tracking
Configurationβ
The frontend uses Application Insights SDK directly, configured in packages/frontend/src/analytics.ts
:
import { ApplicationInsights } from '@microsoft/applicationinsights-web';
import { ReactPlugin } from '@microsoft/applicationinsights-react-js';
Key Features:β
- React Integration: Automatic component lifecycle tracking
- Route Tracking: Automatic page view tracking
- Error Handling: Unhandled promise rejection tracking
- CORS Correlation: Cross-origin request correlation
- Manual Dependency Tracking: Custom fetch tracking with backend correlation
Configuration Highlights:β
- Disabled Automatic Tracking:
disableAjaxTracking: true, disableFetchTracking: true
- Enhanced Correlation:
enableCorsCorrelation: true
- Debug Mode:
enableDebug: true
for development - Custom Sampling: Configurable sampling percentage
Trace Correlationβ
The frontend correlates with backend traces through the trackFetchDependency
function:
export const trackFetchDependency = async (url: string, options: RequestInit = {}) => {
// ... request execution ...
// Extract backend trace ID from response
backendTraceId = response.headers.get('X-Trace-Id') || backendTraceId;
// Track dependency with correlation
Analytics.trackDependency({
id: backendTraceId || `${Date.now()}`, // Use backend trace ID when available
properties: {
'backend.traceId': backendTraceId,
'correlation.source': 'frontend',
'request.type': 'graphql',
'timing.correctionFlag': 'true'
}
});
};
Error Filteringβ
The frontend implements intelligent error filtering to reduce noise:
- Browser Extension Errors: Filters out errors from browser extensions
- Cross-Origin Errors: Excludes generic "Script error" messages
- Stack Trace Analysis: Examines parsed stack traces for extension URLs
End-to-End Correlation Flowβ
Environment Configurationβ
BFF Environment Variablesβ
# Application Insights connection string
APPLICATION_INSIGHTS_CONNECTION_STRING="InstrumentationKey=..."
# Enable/disable instrumentation
APPLICATION_INSIGHTS_ENABLED=true
Frontend Configurationβ
The frontend receives its instrumentation key through a global variable. For details on how to add new environment variables, see the Environment Variables documentation.
Monitoring and Debuggingβ
Key Metrics to Monitorβ
- Request Duration: End-to-end request timing
- Error Rates: Application and dependency errors
- Dependency Failures: Backend API failures
- GraphQL Operations: Query/mutation performance
- Database Performance: PostgreSQL query timing
- Redis Performance: Cache operation timing
Debugging Tipsβ
- Trace ID Correlation: Use
X-Trace-Id
header to correlate frontend and backend logs - Debug Mode: Enable debug mode in development for detailed telemetry logs
- Sampling: Adjust sampling percentage for development vs. production