UNPKG

bc-code-intelligence-mcp

Version:

BC Code Intelligence MCP Server - Complete Specialist Bundle with AI-driven expert consultation, seamless handoffs, and context-preserving workflows

236 lines (211 loc) 8.98 kB
# Telemetry Verbosity Level Usage Examples - AL Code Samples ## Verbosity Strategy Implementation ```al codeunit 50120 "Verbosity Strategy Examples" { var CurrentVerbosityLevel: Verbosity; VerbosityConfig: Dictionary of [Text, Verbosity]; // Example 1: Context-aware verbosity selection procedure LogWithContextualVerbosity(EventCategory: Text; Message: Text; CustomDimensions: Dictionary of [Text, Text]) var SelectedVerbosity: Verbosity; begin SelectedVerbosity := DetermineVerbosityLevel(EventCategory); Session.LogMessage(GetNextEventId(), Message, SelectedVerbosity, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, CustomDimensions); end; local procedure DetermineVerbosityLevel(EventCategory: Text): Verbosity begin // Production verbosity rules case EventCategory of 'Error', 'Critical': exit(Verbosity::Error); 'Warning', 'Performance': exit(Verbosity::Warning); 'Info', 'Business': exit(Verbosity::Normal); 'Debug', 'Trace', 'Development': if IsDebugMode() then exit(Verbosity::Verbose) else exit(Verbosity::Normal); else exit(Verbosity::Normal); end; end; // Example 2: Environment-based verbosity control procedure InitializeVerbosityStrategy() begin if IsProductionEnvironment() then InitializeProductionVerbosity() else if IsStagingEnvironment() then InitializeStagingVerbosity() else InitializeDevelopmentVerbosity(); end; local procedure InitializeProductionVerbosity() begin // Production: Minimize noise, focus on actionable events VerbosityConfig.Add('UserActions', Verbosity::Normal); VerbosityConfig.Add('BusinessProcesses', Verbosity::Normal); VerbosityConfig.Add('Errors', Verbosity::Error); VerbosityConfig.Add('Performance', Verbosity::Warning); VerbosityConfig.Add('Debugging', Verbosity::Critical); // Only critical debug info VerbosityConfig.Add('Integration', Verbosity::Normal); end; local procedure InitializeDevelopmentVerbosity() begin // Development: Detailed logging for debugging VerbosityConfig.Add('UserActions', Verbosity::Verbose); VerbosityConfig.Add('BusinessProcesses', Verbosity::Verbose); VerbosityConfig.Add('Errors', Verbosity::Error); VerbosityConfig.Add('Performance', Verbosity::Verbose); VerbosityConfig.Add('Debugging', Verbosity::Verbose); VerbosityConfig.Add('Integration', Verbosity::Verbose); end; local procedure InitializeStagingVerbosity() begin // Staging: Balanced approach for pre-production testing VerbosityConfig.Add('UserActions', Verbosity::Normal); VerbosityConfig.Add('BusinessProcesses', Verbosity::Normal); VerbosityConfig.Add('Errors', Verbosity::Error); VerbosityConfig.Add('Performance', Verbosity::Normal); VerbosityConfig.Add('Debugging', Verbosity::Warning); VerbosityConfig.Add('Integration', Verbosity::Normal); end; // Helper methods local procedure IsDebugMode(): Boolean begin exit(false); // Implement actual debug mode detection end; local procedure IsProductionEnvironment(): Boolean begin exit(true); // Implement actual environment detection end; local procedure IsStagingEnvironment(): Boolean begin exit(false); // Implement actual staging detection end; local procedure GetNextEventId(): Text begin exit(Format(Random(9999), 4, '<Integer,4><Filler Character,0>')); end; } ``` ## Performance-Based Verbosity Control ```al codeunit 50121 "Performance Verbosity Control" { // Example 3: Performance threshold-based verbosity procedure LogPerformanceEvent(OperationName: Text; DurationMs: Integer; Context: Dictionary of [Text, Text]) var CustomDimensions: Dictionary of [Text, Text]; PerformanceVerbosity: Verbosity; Message: Text; begin CustomDimensions := Context; CustomDimensions.Add('OperationName', OperationName); CustomDimensions.Add('DurationMs', Format(DurationMs)); PerformanceVerbosity := GetPerformanceVerbosity(OperationName, DurationMs); Message := StrSubstNo('Performance: %1 completed in %2ms', OperationName, DurationMs); Session.LogMessage('PERF' + Format(Random(999), 3, '<Integer,3><Filler Character,0>'), Message, PerformanceVerbosity, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, CustomDimensions); end; local procedure GetPerformanceVerbosity(OperationName: Text; DurationMs: Integer): Verbosity var WarningThreshold: Integer; ErrorThreshold: Integer; begin GetPerformanceThresholds(OperationName, WarningThreshold, ErrorThreshold); case true of DurationMs >= ErrorThreshold: exit(Verbosity::Error); // Critical performance issue DurationMs >= WarningThreshold: exit(Verbosity::Warning); // Performance concern DurationMs >= (WarningThreshold div 2): exit(Verbosity::Normal); // Notable but acceptable else exit(Verbosity::Verbose); // Fast operations - detailed tracking only end; end; local procedure GetPerformanceThresholds(OperationName: Text; var WarningThreshold: Integer; var ErrorThreshold: Integer) begin // Operation-specific thresholds case OperationName of 'DatabaseQuery': begin WarningThreshold := 1000; // 1 second ErrorThreshold := 5000; // 5 seconds end; 'ReportGeneration': begin WarningThreshold := 10000; // 10 seconds ErrorThreshold := 30000; // 30 seconds end; 'APICall': begin WarningThreshold := 2000; // 2 seconds ErrorThreshold := 10000; // 10 seconds end; else begin WarningThreshold := 5000; // Default 5 seconds ErrorThreshold := 15000; // Default 15 seconds end; end; end; } ``` ## User Role-Based Verbosity ```al codeunit 50122 "Role Based Verbosity" { // Example 4: User role-based verbosity control procedure LogUserAction(ActionType: Text; UserID: Code[50]; Context: Text) var CustomDimensions: Dictionary of [Text, Text]; UserVerbosity: Verbosity; begin CustomDimensions.Add('UserID', UserID); CustomDimensions.Add('ActionType', ActionType); CustomDimensions.Add('Context', Context); UserVerbosity := GetUserActionVerbosity(UserID, ActionType); Session.LogMessage('USER' + Format(Random(999), 3, '<Integer,3><Filler Character,0>'), StrSubstNo('User action: %1', ActionType), UserVerbosity, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, CustomDimensions); end; local procedure GetUserActionVerbosity(UserID: Code[50]; ActionType: Text): Verbosity begin // Higher verbosity for administrative users in development if IsAdministrativeUser(UserID) and not IsProductionEnvironment() then exit(Verbosity::Verbose); case ActionType of 'Login', 'Logout': exit(Verbosity::Normal); 'DataExport', 'ReportGeneration': exit(Verbosity::Normal); 'ConfigurationChange': exit(Verbosity::Warning); // Important to track 'SecurityElevation': exit(Verbosity::Critical); // Always log security events else exit(Verbosity::Normal); end; end; local procedure IsAdministrativeUser(UserID: Code[50]): Boolean var AccessControl: Record "Access Control"; begin // Check if user has administrative permissions AccessControl.SetRange("User Security ID", UserID); AccessControl.SetRange("Role ID", 'SUPER'); exit(not AccessControl.IsEmpty); end; local procedure IsProductionEnvironment(): Boolean begin // Implement environment detection logic exit(true); end; } ```