- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个队列触发的 azure 功能,用于发送电子邮件/文本。我使用应用程序洞察来跟踪自定义事件,以便我可以监控电子邮件、文本和错误的数量。创建 Telemetry Client 对象时有时会出现内存不足的异常。这是我的 TelemetryHandler.cs 类:
internal class TelemetryHandler : IDisposable
{
private const string EmailSentEvent = "Email Sent";
private const string EmailFailedEvent = "Email Failure";
private const string TextSentEvent = "Text Sent";
private const string ErrorEvent = "Error";
private readonly TelemetryClient telemetryClient;
private readonly TelemetryConfiguration telemetryConfiguration;
private readonly Dictionary<string, string> properties;
private readonly Dictionary<string, double> metrics;
public TelemetryHandler()
{
telemetryConfiguration = new(Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY"));
telemetryClient = new TelemetryClient(telemetryConfiguration);
metrics = new();
properties = new();
}
public void InitializeFromMessage(EmailTextMessage emailTextMessage)
{
properties.Add("Tenant ID", emailTextMessage.TenantID);
properties.Add("User", emailTextMessage.User);
properties.Add("Payload", emailTextMessage.Payload.ToString());
}
public void FinalizeSendEmailEvent(string messageID)
{
properties.Add("Postmark Message ID", messageID);
metrics.Add("Emails", 1);
telemetryClient.TrackEvent(EmailSentEvent, properties, metrics);
}
public void FinalizeSendTextEvent(string sid)
{
properties.Add("Twilio Message Sid", sid);
metrics.Add("Texts", 1);
telemetryClient.TrackEvent(TextSentEvent, properties, metrics);
}
public void FinalizeSendEmailFailure(string errorMessage)
{
properties.Add("Error Message", errorMessage);
metrics.Add("Failed", 1);
telemetryClient.TrackEvent(EmailFailedEvent, properties, metrics);
}
public void FinalizeErrorEvent(Exception ex)
{
StringBuilder message = new(ex.Message);
Exception exception = ex;
while(exception.InnerException != null)
{
message.Append($"{Environment.NewLine}{exception.InnerException.Message}");
exception = exception.InnerException;
}
properties.Add("Message", message.ToString());
properties.Add("Stack Trace", ex.StackTrace);
metrics.Add("Error", 1);
telemetryClient.TrackEvent(ErrorEvent, properties, metrics);
}
public void Dispose()
{
if(telemetryConfiguration != null)
telemetryConfiguration.Dispose();
}
}
知道什么可能导致内存不足异常以及如何修复吗?当队列中有大量消息等待(例如超过 15 条)时,会发生这种情况,但我已将批处理大小减少到 4。我无法从错误日志中获取堆栈跟踪,只能知道它发生在我的 TelemetryHandler 构造函数中。我也在函数末尾处理我的 TelemetryHandler 类(它处理 TelemtryConfiguration 对象)。如有任何帮助,我们将不胜感激。
最佳答案
我接受了使用 TelemetryHandler 类作为单例并使用 DI 将其作为参数传递的建议。这是该类的界面和更新版本:
internal interface ITelemetryHandler
{
void FinalizeSendEmailEvent(string tenantID, string user, EmailMessage emailMessage, string messageID);
void FinalizeSendEmailFailure(string tenantID, string user, EmailMessage emailMessage, string errorMessage);
void FinalizeSendTextEvent(string tenantID, string user, TextMessage textMessage, string sid);
void FinalizeErrorEvent(EmailTextMessage emailTextMessage, Exception ex);
}
internal class TelemetryHandler : ITelemetryHandler, IDisposable
{
private const string EmailSentEvent = "Email Sent";
private const string EmailFailedEvent = "Email Failure";
private const string TextSentEvent = "Text Sent";
private const string ErrorEvent = "Error";
private readonly TelemetryClient telemetryClient;
private readonly TelemetryConfiguration telemetryConfiguration;
public TelemetryHandler()
{
telemetryConfiguration = new(Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY"));
telemetryClient = new TelemetryClient(telemetryConfiguration);
}
public void FinalizeSendEmailEvent(string tenantID, string user, EmailMessage emailMessage, string messageID)
{
Dictionary<string, string> properties = new();
Dictionary<string, double> metrics = new();
properties.Add("Tenant ID", tenantID);
properties.Add("User", user);
properties.Add("Payload", JsonConvert.SerializeObject(emailMessage));
properties.Add("Postmark Message ID", messageID);
metrics.Add("Emails", 1);
telemetryClient.TrackEvent(EmailSentEvent, properties, metrics);
}
public void FinalizeSendTextEvent(string tenantID, string user, TextMessage textMessage, string sid)
{
Dictionary<string, string> properties = new();
Dictionary<string, double> metrics = new();
properties.Add("Tenant ID", tenantID);
properties.Add("User", user);
properties.Add("Payload", JsonConvert.SerializeObject(textMessage));
properties.Add("Twilio Message Sid", sid);
metrics.Add("Texts", 1);
telemetryClient.TrackEvent(TextSentEvent, properties, metrics);
}
public void FinalizeSendEmailFailure(string tenantID, string user, EmailMessage message, string errorMessage)
{
Dictionary<string, string> properties = new();
Dictionary<string, double> metrics = new();
properties.Add("Tenant ID", tenantID);
properties.Add("User", user);
properties.Add("Payload", message.ToString());
properties.Add("Error Message", errorMessage);
metrics.Add("Failed", 1);
telemetryClient.TrackEvent(EmailFailedEvent, properties, metrics);
}
public void FinalizeErrorEvent(EmailTextMessage emailTextMessage, Exception ex)
{
Dictionary<string, string> properties = new();
Dictionary<string, double> metrics = new();
if (emailTextMessage != null)
{
properties.Add("Tenant ID", emailTextMessage.TenantID);
properties.Add("User", emailTextMessage.User);
properties.Add("Payload", emailTextMessage.Payload.ToString());
}
StringBuilder message = new(ex.Message);
Exception exception = ex;
while (exception.InnerException != null)
{
message.Append($"{Environment.NewLine}{exception.InnerException.Message}");
exception = exception.InnerException;
}
properties.Add("Message", message.ToString());
properties.Add("Stack Trace", ex.StackTrace);
metrics.Add("Error", 1);
telemetryClient.TrackEvent(ErrorEvent, properties, metrics);
}
public void Dispose()
{
if (telemetryConfiguration != null)
telemetryConfiguration.Dispose();
}
}
以下是它如何用作单例:
[assembly: FunctionsStartup(typeof(FWT.EmailText.Startup))]
namespace FWT.EmailText;
class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddSingleton<ITelemetryHandler>((s) => {
return new TelemetryHandler();
});
}
}
class EmailTextHandler
{
private readonly ITelemetryHandler telemetryHandler;
public EmailTextHandler(ITelemetryHandler telemetryHandler)
{
this.telemetryHandler = telemetryHandler;
}
[FunctionName("EmailTextHandler")]
public async Task Run([QueueTrigger("%QueueName%", Connection = "QueueStorageAccount")] string queueMessage, ILogger log)
{
//Function code that accesses telemetryHandler
}
}
对于任何可能需要它的人,我使用本文在 azure 函数中设置了 singleton/DI:https://learn.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection
关于c# - 使用 Application Insights 的 Azure Function 中出现内存不足异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71875795/
我有多个应用程序使用 Application Insights for Production Data。我正在尝试使用 City 遥测字段来映射我们当前的用户。这些数据的跟踪似乎非常不一致,并且在大多
有没有办法在 ASP.NET Web 应用程序中禁用 Application Insights?假设我想关闭生产中运行的应用程序中的所有数据收集。 最佳答案 如果 ikey 在 Application
如何在 Azure Application Insights 中将时差转换为毫秒 let startTime = todatetime('2017-05-15T17:02:23.7148691Z');
我在 Application Insights Analytics 中有一些数据,它有一个动态对象作为自定义维度的属性。例如: | timestamp | name
我从 Chrome 开发工具和 Google Page Speed Insights 页面运行 Google Page Speed Insights(移动)得到了不同的结果。当我从 Chrome 开发
我在我的 ASP.NET MVC Angular 应用程序中使用 App insights。我在我的布局文件中插入了 JavaScript block (我得到了 from the Microsoft
在我们当前的本地设置中,我们有 20 多个 .net core 3.1 API 应用程序(单独的 ASP.NET Core API 应用程序)。我们已开始将 2 个 APi 应用程序迁移到使用单个 A
我有一个应用洞察查询。在此查询中,我想将多个列加入/合并为一个列以显示如何实现这一点。 我想结合 ip、城市、州、国家。 customEvents | where timestamp >= ago(7
我有一个托管在 Windows Server 2008 上的 ASP.Net MVC 4 应用程序。我使用的是 Microsoft Application Insights,它非常适用于客户端指标,例
我已经开始使用应用程序洞察来记录来自控制台应用程序的消息。 仅记录严重和错误。未记录信息或跟踪。关于为什么排除信息的任何想法? class Program { static void Mai
我将 App Service 捆绑的 App Insights 代理与 .Net 4.7 应用程序一起使用,并且没有使用 SDK。我配置代理的唯一选项是应用程序设置,如文档 https://docs.
我正在使用 Application insights 进行由外向内测试,但我的代码未使用它进行检测。我不想收到关于我的服务的每周电子邮件摘要,因为大多数栏目都是空白的。如何禁用正在发送的电子邮件? (
这不是一个特别技术性的问题,但是其他人的洞察数据有问题吗? http://www.facebook.com/insights/?sk=ao_119242438097337 自 18 日(6 天前)以来
我们的 ASP.NET MVC 应用程序包含一些 URI 路径参数,例如: https://example.com/api/query/14hes1017ceimgS2ESsIec 在 Applica
我想使用一个包含数组的变量,所以我可以将它与 in 过滤器一起使用。 这行得通: traces | where cloud_RoleName in ("A", "B") 这不起作用(语法错误): le
我的 Facebook Insights 帐户中添加了 Facebook“Insights For My Domain”。我有一个不再使用的旧域,想从我的 Facebook Insights 帐户中删
有人使用过Sonatype Insight-Application Health Checker吗?它要求您扫描应用程序(war、jar、zip 等),然后将其结果上传到Sonatype Insigh
我正在使用这个引用 documentation用于应用洞察。 如何使用不同查询的输出进行子选择? //Query 1 Events | where Timestamp >= ago(30min) a
我正在试用预览版,并尝试将见解添加到本地部署在我机器上的 IIS Web 应用程序。它是一个运行在普通应用程序池中的 .Net 4.5 应用程序。添加见解后启动应用程序时,出现此异常: 无法加载文件或
如何将 Application insights 最终用户用户分析添加到 DocFx 以跟踪每个文档页面的使用情况? Application Insights 文档指出您需要在结束标记之前立即插入下面
我是一名优秀的程序员,十分优秀!