![](/img/trans.png)
[英]Configuring Microsoft Application Insights to monitor a windows service
[英]How to inject Application Insights code to monitor timing in all methods
我有一个 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 有一个属性字段,有时我使用它,有时我只发送空值。
谢谢
寻找 AOP(面向方面的编程)框架,如PostSharp (付费)或使用类似Aspectize或Castle DynamicProxy 的框架。 这些框架使您可以一次编写一些自定义逻辑,并在运行时或编译时将它们应用于所有指定的方法。 有关示例,请参阅此帖子。
对于 WCF,您可以更轻松地做到这一点,因为它内置了对使用例如Message Inspectors 的调用拦截的支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.