将日志写入本地服务结构

时间:2018-03-07 01:47:55

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

我正在尝试将Azure App洞察服务集成到用于日志记录和检测的服务结构应用程序中。我在本地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内容


    {
      "inputs": [
        {
          "type": "EventSource",
          "sources": [
            { "providerName": "Microsoft-ServiceFabric-Services" },
            { "providerName": "Microsoft-ServiceFabric-Actors" },        
            { "providerName": "mystatefulservice" }
          ]
        }
      ],
      "filters": [
        {
          "type": "drop",
          "include": "Level == Verbose"
        }
      ],
      "outputs": [
        {
          "type": "ApplicationInsights",
          // (replace the following value with your AI resource's instrumentation key)
          "instrumentationKey": "XXXXXXXXXXXXXXXXXXXXXX",
          "filters": [
            {
              "type": "metadata",
              "metadata": "metric",
              "include": "ProviderName == mystatefulservice && EventName == ProcessedCountMetric",
              "operationProperty": "operation",
              "elapsedMilliSecondsProperty": "elapsedMilliSeconds",
              "recordCountProperty": "recordCount"
            }
          ]
        }
      ],
      "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);
    }

修改 从“Fabric.cs in fabric stateful service

中添加诊断管道代码
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);
            }

2 个答案:

答案 0 :(得分:0)

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

您必须注意一些捕获:

  • 如果您正在侦听来自其他进程的etw事件,则您的进程必须与具有“性能日志用户”权限的用户一起运行。检查您的服务正在运行的身份以及是否属于性能日志用户,他们有权创建事件会话以侦听这些事件。

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

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

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

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

答案 1 :(得分:0)

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

看看Microsoft App Insights Service Fabric nuget软件包。它非常适合:

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