代码之家  ›  专栏  ›  技术社区  ›  Pankaj Rawat

应用程序洞察关联的Azure函数中的方面

  •  0
  • Pankaj Rawat  · 技术社区  · 7 年前

    遥测客户端

    我可以在applicationinsight中看到我所有的跟踪、异常和异常日志,但是如果没有它们,我就无法进行关联 操作名称

    现在我手动调用遥测客户端 启动操作 停止操作 创建OperationId。

    蓝函数

    [FunctionName("AlertEventStoreFunction")]
        public static async Task Run([EventHubTrigger("%AlertEventHub%", Connection = "AlertEventHubConnection", ConsumerGroup = "cg1")]EventData eventMessage,
            [Inject]IEventService eventService, [Inject]ILog log)
        {
            log.StartOperation("AlertEventStoreFunction");
            try
            {                
                log.Info($"Event PartitionKey {eventMessage.PartitionKey}, Offset {eventMessage.Offset} and SequenceNumber {eventMessage.SequenceNumber}");
                string message = Encoding.UTF8.GetString(eventMessage.GetBytes());
                log.Verbose(message);
                await eventService.SaveAlertEventAsync(message);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
            }
            finally
            {
                log.StopOperation();
            }
        }
    

    记录器类

    public class Log : ILog
    {
        private static TelemetryClient telemetryClient = new TelemetryClient() { InstrumentationKey = ConfigurationManager.AppSettings["InstrumentationKey"] };
        private IOperationHolder<RequestTelemetry> operation;
        private bool status = true;
    
        public TelemetryClient TelemetryClient
        {
            get
            {
                return telemetryClient;
            }
        }
    
        /// <summary>
        /// This method will start new session for particular request, we can correlate each log by Operation_Id
        /// </summary>
        /// <param name="functionName">function name</param>
        public void StartOperation(string functionName)
        {
            RequestTelemetry requestTelemetry = new RequestTelemetry { Name = functionName };
            this.operation = telemetryClient.StartOperation(requestTelemetry);
            telemetryClient.TrackTrace($"{functionName} trigger");
        }
    
        /// <summary>
        /// this method will close session
        /// </summary>
        public void StopOperation()
        {
            telemetryClient.StopOperation(this.operation);
            this.operation.Telemetry.Success = status;
        }
    
        public void Error(string message, Exception ex = null)
        {
            telemetryClient.TrackTrace(message, SeverityLevel.Error);
            if (ex != null)
                telemetryClient.TrackException(ex);
            status = false;
        }
    
        public void Info(string message)
        {
            telemetryClient.TrackTrace(message, SeverityLevel.Information);
        }
    
        public void Verbose(string message)
        {
            telemetryClient.TrackTrace(message, SeverityLevel.Verbose);
        }
    
        public void Warning(string message)
        {
            telemetryClient.TrackTrace(message, SeverityLevel.Warning);
        }
    }
    

    我不想把try-catch块放在每个函数中,所以我用postsharp创建了Aspect(AOP),它按预期工作,但免费版本只允许10个函数。

    我没有看到任何其他好的postsharp替代品(sprint.net、Cauldron.Interception等)

    我能做些什么来创建关联(OperationId)而不是这段代码?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Pankaj Rawat    7 年前

    我得到了Postsharp替代“MrAdvice”,新版本没有任何依赖性

    public class LoggerAspect : Attribute, IMethodAdvice
    {
        private ILog log;
        private IOperationHolder<RequestTelemetry> operation;
    
        public void Advise(MethodAdviceContext context)
        {
            try
            {
                log = LogManager.GetLogger();
                RequestTelemetry requestTelemetry = new RequestTelemetry { Name = context.TargetType.Name };
                operation = log.TelemetryClient.StartOperation(requestTelemetry);
                operation.Telemetry.Success = true;
    
                context.Proceed(); // this calls the original method
            }
            catch (Exception ex)
            {
                operation.Telemetry.Success = false;
                log.Error(ex.Message, ex);
            }
            finally
            {
                log.TelemetryClient.StopOperation(operation);
            }
        }
    }
    

    推荐文章