【问题标题】:How to inject Application Insights code to monitor timing in all methods如何注入 Application Insights 代码以监控所有方法的计时
【发布时间】:2018-02-24 10:54:05
【问题描述】:

我有一个 WCF 服务,我以这种方式使用 Application Insights SDK 测量时间。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    [BasicHttpBindingServiceMetadataExchangeEndpoint]
    public class DMSWebService : IDMSWebService
    {
        public static readonly string LoggingPrefix = "DMSWebService";
        private TelemetryClient telemetry;

        //Defines if Application Insights must be enabled or not
        public Boolean EnableApplicationInsights { get; set; }

        //Application Insights Instrumentation Key
        public string ApplicationInsightsMonitoringKey { get; set; }

        //Constructor to get the property bag values only once.
        public DMSWebService()
        {
            InitializeApplicationInsights();
            telemetry= new TelemetryClient {InstrumentationKey = ApplicationInsightsMonitoringKey};
        }

        //Method to initialize ApplicationInsightSettings
        private void InitializeApplicationInsights()
        {
            bool enableApplicationInsights = false;
            using (var billingSite = BillingManagement.GetBillingSite())
            {
                enableApplicationInsights = Convert.ToBoolean(billingSite.WebApplication.GetProperty(Constants.WebApplicationSettings.EnableApplicationInsights));
                if(enableApplicationInsights) ApplicationInsightsMonitoringKey = billingSite.WebApplication.GetProperty(Constants.WebApplicationSettings.ApplicationInsightsKey);
            }

            EnableApplicationInsights = enableApplicationInsights;
        }
        #region Billing

        #region Archiving

        // GET
        public DMSServiceResult ArchiveBillCycle(string listItemId)
        {
            var stopwatch = System.Diagnostics.Stopwatch.StartNew();

            using (var withDMSServiceResult = new WithDMSServiceResult(LoggingPrefix, "ArchiveBillCycle"))
            {
                try
                {
                    withDMSServiceResult.InputParameters["listItemId"] = listItemId;

                    var listItemIdAsInt = Convert.ToInt32(listItemId);

                    using (var billingSite = BillingManagement.GetBillingSite())
                    {
                        // HACK: Necessary to disable form digest validation, which we don't need.
                        using (var continueWithoutSPContext = new ContinueWithoutSPContext())
                        {
                            withDMSServiceResult.RequestSucceeded = BillingRepository.ArchiveBillCycle(billingSite.RootWeb, listItemIdAsInt);
                        }
                    }
                }
                catch (Exception ex)
                {
                    telemetry.TrackException(ex);
                    withDMSServiceResult.HandleError(ex);
                }

                stopwatch.Stop();
                var metrics = new Dictionary <string, double>{{"processingTime", stopwatch.Elapsed.TotalMilliseconds}};
                // Set up some properties:
                var properties = new Dictionary <string, string>{{"listItemId", withDMSServiceResult.InputParameters["listItemId"]}};
                if(EnableApplicationInsights) telemetry.TrackEvent("ArchiveBillCycle", properties, metrics);

                return withDMSServiceResult.Result;
            }
        }

        #endregion

如您所见,我在方法开始时启动了一个 StopWatch,然后在方法结束时将事件发送到 Application Insights。

对 Web 服务上的所有 10 种方法都这样做没什么大不了的,我已经这样做了。

但是这些方法调用其他类中的实用程序方法,找到瓶颈的唯一方法是测量每个方法。

你有什么建议?

请注意,trackEvent 有一个属性字段,有时我使用它,有时我只是发送 null。

谢谢

【问题讨论】:

    标签: c# asp.net azure wcf azure-application-insights


    【解决方案1】:

    寻找像 PostSharp(付费)这样的 AOP (Aspect Oriented Programming) 框架或使用像 AspectizeCastle DynamicProxy 这样的框架。这些框架使您可以编写一些自定义逻辑,并在运行时或编译时将它们应用于所有指定的方法。示例见this post

    对于 WCF,您可以更轻松地做到这一点,因为它内置了对呼叫拦截的支持,例如使用 Message Inspectors

    【讨论】:

      猜你喜欢
      • 2021-07-10
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2023-03-19
      相关资源
      最近更新 更多