0

我正在尝试将 Azure App 洞察服务集成到服务结构应用程序中以进行日志记录和检测。我在本地 VM 上运行结构代码。我完全按照这里的文档[场景 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);
            }
4

2 回答 2

0

事件源是一项棘手的技术,我一直在使用它并且总是遇到问题。配置看起来不错,不访问环境很难调查,所以我会提出我的建议。

您必须注意一些问题:

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

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

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

  • 只要有可能,请使用nuget 包中的 EventSource而不是框架之一,框架版本充满了错误,并且缺少在 nuget 版本中找到的修复。

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

于 2018-03-08T10:41:57.813 回答
0

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

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

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