【问题标题】:Service Fabric ETW Logs are always incompleteService Fabric ETW 日志始终不完整
【发布时间】:2016-12-31 13:09:15
【问题描述】:

我们刚刚开始使用 Service Fabric,到目前为止唯一的痛点是带有 WAD 的 ETW,它似乎总是在丢失数据(消息、事件消息)的情况下注销。

到目前为止,我们的经验是它始终在 Visual Studio 中工作(有时您必须添加提供程序名称),并且在部署到 Azure 中的集群时很少工作。当它在 Azure 中工作时 - 版本控制和更新事件源上的函数或添加另一个函数将使用空数据点注销。

这是我们使用 Azure CLI 部署的 ETW/WAD 的 ARM 脚本中的部分。

"name": "[concat('VMDiagnosticsVmExt','_vmNodeType0Name')]",
"properties": {
    "type": "IaaSDiagnostics",
    "autoUpgradeMinorVersion": true,
    "protectedSettings": {
        "storageAccountName": "[parameters('applicationDiagnosticsStorageAccountName')]",
        "storageAccountKey": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('applicationDiagnosticsStorageAccountName')),'2015-05-01-preview').key1]",
        "storageAccountEndPoint": "https://core.windows.net/"
    },
    "publisher": "Microsoft.Azure.Diagnostics",
    "settings": {
        "WadCfg": {
            "DiagnosticMonitorConfiguration": {
                "overallQuotaInMB": "50000",
                "EtwProviders": {
                    "EtwEventSourceProviderConfiguration": [
                        {
                            "provider": "Microsoft-ServiceFabric-Actors",
                            "scheduledTransferKeywordFilter": "1",
                            "scheduledTransferPeriod": "PT5M",
                            "DefaultEvents": {
                                "eventDestination": "ServiceFabricReliableActorEventTable"
                            }
                        },
                        {
                            "provider": "Microsoft-ServiceFabric-Services",
                            "scheduledTransferPeriod": "PT5M",
                            "DefaultEvents": {
                                "eventDestination": "ServiceFabricReliableServiceEventTable"
                            }
                        },
                        {
                            "provider": "Company-Project-API",
                            "scheduledTransferPeriod": "PT1M",
                            "DefaultEvents": {
                                "eventDestination": "ApiEventTable"
                            }
                        }
                    ],
                    "EtwManifestProviderConfiguration": [
                        {
                            "provider": "cbd93bc2-71e5-4566-b3a7-595d8eeca6e8",
                            "scheduledTransferLogLevelFilter": "Information",
                            "scheduledTransferKeywordFilter": "4611686018427387904",
                            "scheduledTransferPeriod": "PT5M",
                            "DefaultEvents": {
                                "eventDestination": "ServiceFabricSystemEventTable"
                            }
                        }
                    ]
                }
            }
        },
        "StorageAccount": "[parameters('applicationDiagnosticsStorageAccountName')]"
    },
    "typeHandlerVersion": "1.5"
}

这是我们的 EventSource,尽管我们尝试了很多变化。

using Microsoft.Diagnostics.Tracing;

namespace Project.API

[EventSource(Name = "Company-Project-API")]
public sealed class ApiEventSource : EventSource
{
    public static ApiEventSource Current = new ApiEventSource();

    [Event(1, Level = EventLevel.Informational, Message = "{0}", Version = 1)]
    public void Log(string message)
    {
        this.WriteEvent(1, message);
    }
}

这是我们每次在 WAD 中得到的。

运行 .NET 4.5.2 / .net 核心。

请帮忙。

编辑 - 好的,我们已经成功升级到 .NET 4.6 - 看起来消息负载正在被注销。我们现在缺少的只是 eventmessage 字段。现在看来,“消息”字段在 VS 中始终为空。

EDIT2 - 使用 EventSourceSettings.EtwSelfDescriptingEventFormat 作为事件源的构造函数参数时,似乎缺少消息字段,如下所示。在 VS 和 WAD 中似乎就是这种情况。

public sealed class ApiEventSource : EventSource 
{
    public ApiEventSource() : base(EventSourceSettings.EtwSelfDescribingEventFormat) {}
}

目前,我可以选择没有事件消息(自我描述)或无法对方法进行版本控制(即使增加属性,使用清单样式时空行仍会转储到 WAD 中。

【问题讨论】:

  • 您能否分享一个 WAD 未接收到的消息示例?里面有什么特殊字符吗?
  • @KarolZ 在我们的例子中,它是所有消息 - 有些只是“用 Y 执行 X”,其中 Y 将是一个简单类型的值。有些是完全合格的 url,我读到的 url 会更好地进行 html 编码。我们已经切换到 4.6,现在正在使用自我描述事件源,这似乎好多了 - 现在我们只是缺少 eventmessage 和 activityId - 我们尝试使用这里提到的 Start/Stop blogs.msdn.microsoft.com/vancem/2015/09/14/… 但似乎什么都没有自动生成。
  • 任务活动 ID 需要在消费者端正确启用和解码。 VS 诊断数据查看器目前不这样做,但我们正在发布 Fabric 工具来修复它。我将在 WAD 中询问对此的支持并在此处的 cmets 中发布
  • 更新:WAD 目前不支持此功能。我要求 WAD 团队考虑将其用于他们即将发布的版本之一。目前没有预计到达时间
  • @NickDarvey 切换到 4.6 并使用自我描述事件格式解决了这两件事,但您丢失了 eventmessage 字段中的任何数据。

标签: azure azure-service-fabric etw azure-diagnostics


【解决方案1】:

自描述 ETW 当前不支持 EventAttribute.Message 属性。 Message 是基于清单的概念(即它们没有记录在事件中,而是放置在清单中。由于自描述 ETW 没有清单,因此 Message 属性实际上被忽略了。

可以想象扩展与自描述 ETW 事件关联的元数据,以便它可以保存消息字符串,但目前不存在,需要更改 ETW。

只需将消息嵌入负载中即可避免该问题。

【讨论】:

    猜你喜欢
    • 2019-03-03
    • 2016-06-13
    • 2023-04-06
    • 2019-09-27
    • 1970-01-01
    • 2016-10-13
    • 2023-03-02
    • 2017-01-04
    • 2019-12-05
    相关资源
    最近更新 更多