【问题标题】:write log to Application insights from local service fabric从本地服务结构将日志写入应用程序洞察
【发布时间】:2018-08-15 00:28:53
【问题描述】:

我正在尝试将 Azure 应用洞察服务集成到服务结构应用中以进行日志记录和检测。我在本地 VM 上运行结构代码。我完全按照文档here [场景2]。 docs.microsoft.com 上的其他资源似乎也表明了相同的步骤。 [例如:https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-diagnostics-event-aggregation-eventflow 出于某种原因,我在 App 洞察中看不到任何事件条目。当我这样做时,代码中没有错误:

ServiceEventSource.Current.ProcessedCountMetric("synced",sw.ElapsedMilliseconds, crc.DataTable.Rows.Count);

eventflowconfig.json 内容

{ “输入”:[ { “类型”:“事件源”, “来源”:[ { "providerName": "Microsoft-ServiceFabric-Services" }, { "providerName": "Microsoft-ServiceFabric-Actors" }, { "providerName": "mystatefulservice" } ] } ], “过滤器”:[ { “类型”:“下降”, “包括”:“级别 == 详细” } ], “输出”:[ { "type": "ApplicationInsights", //(将以下值替换为您的 AI 资源的检测键) "instrumentationKey": "XXXXXXXXXXXXXXXXXXXXXX", “过滤器”:[ { “类型”:“元数据”, “元数据”:“指标”, "include": "ProviderName == mystatefulservice && EventName == ProcessedCountMetric", "操作属性": "操作", "elapsedMilliSecondsProperty": "elapsedMilliSeconds", “记录计数属性”:“记录计数” } ] } ], “schemaVersion”:“2016-08-11” }

在 ServiceEventSource.cs 中

[Event(ProcessedCountMetricEventId, Level = EventLevel.Informational)]
    public void ProcessedCountMetric(string operation, long     elapsedMilliSeconds, int recordCount)
    {
        if (IsEnabled())
            WriteEvent(ProcessedCountMetricEventId, operation, elapsedMilliSeconds, recordCount);
    }

编辑 从“结构状态服务中的 Program.cs”中添加诊断管道代码

using (var diagnosticsPipeline =
                ServiceFabricDiagnosticPipelineFactory.CreatePipeline($"{ServiceFabricGlobalConstants.AppName}-mystatefulservice-DiagnosticsPipeline")
            )
            {
                ServiceRuntime.RegisterServiceAsync("mystatefulserviceType",
                    context => new mystatefulservice(context)).GetAwaiter().GetResult();

                ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id,
                    typeof(mystatefulservice).Name);

                // Prevents this host process from terminating so services keep running.
                Thread.Sleep(Timeout.Infinite);
            }

【问题讨论】:

  • 有什么日志或者什么可以帮助指导我们的吗?
  • 在 VS 中,在视图下 -> 其他窗口选择诊断事件。这是一个本地 ETW (EventSource) 侦听器。您可以检查事件是否正确发出。
  • 是的,马特。我确实在本地 ETW 查看器中看到了该事件。但是,我希望这些事件显示在 Azure 应用洞察中。不是本地的。 Jeff,我在本地没有看到任何日志表明传输到 azure 时出错。
  • 那个事件源和事件流配置在我看来都是正确的,但是事件源可能是有限的。我很幸运在单元测试中使用this package 来帮助发现事件源的问题。一旦您确认事件源已正确配置并被调用,我建议您在应用洞察输出中使用该过滤器,看看这是否可能是您的问题。我有过过滤器并不总是像预期的那样工作的经验。
  • @pdylanross:eventsourceconfig 看起来不错。您认为这可能是 Azure 上的某种防火墙问题吗?我是否必须为本地事件打开端口或其他东西才能显示在 Azure 应用洞察中?

标签: azure-service-fabric azure-application-insights etw event-flow


【解决方案1】:

事件源是一项棘手的技术,我已经使用它一段时间了,但总是遇到问题。配置看起来不错,不访问环境很难调查,所以我会提出我的建议。

您必须注意一些问题:

  • 如果您正在侦听来自不同进程的 etw 事件,则您的进程必须由具有“性能日志用户”权限的用户运行。检查您的服务在哪个身份上运行,如果它是性能日志用户的一部分,谁有权创建事件会话以侦听这些事件。

  • 确保事件被正确发出,您可以从诊断事件窗口收听它们,如果它没有显示在那里,则提供程序存在问题。

  • 出于测试目的,注释掉if (IsEnabled()) 行。这是一项内部检查,用于验证您的事件是否应该被发出。我遇到过它总是错误的情况并跳过事件的发出,可能它会缓存结果一段时间,文档不清楚它应该如何工作。

  • 尽可能使用来自nuget package 的 EventSource 而不是框架一,框架版本充满了错误,并且缺少 nuget 版本中的修复。

  • Application Insights 不是实时的,有时可能需要几分钟来处理您的事件,我建议将事件输出到控制台或文件并检查它是否正确侦听,然后启用 AppInsights。

【讨论】:

  • 抱歉,这个答案有一些很好的建议,但也有一些根本不正确的建议。仅当想要从不同进程捕获 ETW(Windows 事件跟踪)事件时,才需要“性能日志用户”中的成员身份。如果您只是使用 EventSource/EventListener 基础架构,则没有必要。
  • 此外,框架 EventSource "System.Diagnostic.Tracing.EventSource" 几乎总是正确使用的东西。这是所有 .NET 框架(包括 Service Fabric)都在使用的框架,因此如果您想结合来自框架和代码的跟踪,框架 EventSource/EventListener 可以实现。仅当您了解 EventSource 框架版本中缺少/存在的特定功能或错误并且 NuGet 版本解除对您的阻止时,才应使用 NuGet 版本。
  • 谢谢卡罗尔。我仔细检查了 all 建议。 “WriteEvent”中的“IsEnabled()”确实返回 true。我还可以在当地的 Visaul 工作室“诊断窗口”中看到该事件。只是该事件永远不会进入云中的 App Insights。抓着稻草..
  • @KarolZ,感谢您的 cmets,我已更新答案以明确用户成员身份。关于第二点,我在使用旧版本的 EventSource 时遇到了很多问题,并且一旦转移到包版本就不再使用框架版本,但我相信您的反馈。
  • 看起来这可能是由于 docs.microsoft.com/en-us/azure/application-insights/… 内部企业网络的防火墙阻止。在家尝试相同的代码有效!所以,将与公司合作,看看他们是否可以打开防火墙端口。
【解决方案2】:

您提供的链接已经过时,实际上有一种更好的方法可以将应用程序错误和异常信息记录到应用程序洞察中。例如,上述内容无法帮助跟踪多个服务之间传入请求的调用层次结构。

查看 Microsoft App Insights Service Fabric nuget 包。它适用于:

  • 发送错误和异常信息
  • 使用您的所有服务及其依赖项(包括数据库)填充应用程序映射
  • 报告应用性能指标,
  • 端到端跟踪服务调用依赖关系,
  • 与本机和非本机 SF 应用程序集成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2017-09-05
    • 2021-09-21
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多