我们刚刚开始使用Service Fabric,到目前为止唯一的痛点是使用WAD的ETW,它似乎总是注销丢失的数据(消息,事件消息)。
到目前为止,我们的经验是它始终在visual studio中工作(有时您必须添加提供程序名称),并且在部署到Azure中的集群时很少有效。什么时候它在Azure中工作 - 版本控制&更新事件源上的函数或添加另一个函数然后使用空数据点注销。
这是我们在ETW / WAD的ARM脚本中使用Azure CLI部署的部分。
"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.EtwSelfDescribingEventFormat作为事件源的构造函数参数时,似乎缺少消息字段,如下所示。这似乎是VS&在WAD。
public sealed class ApiEventSource : EventSource
{
public ApiEventSource() : base(EventSourceSettings.EtwSelfDescribingEventFormat) {}
}
目前,我可以选择无事件消息(Self Describing)或无法对方法进行版本设置(即使增加属性,使用清单样式时空行仍然会被转储到WAD中。
答案 0 :(得分:0)
自描述ETW目前不支持EventAttribute.Message属性。消息是基于清单的概念(即它们不会记录在事件中,而是放在清单中。由于自描述ETW没有清单,因此Message属性会被忽略。
可以想象扩展与自描述ETW事件相关联的元数据,以便它可以保存消息字符串,但是当前不存在并且需要更改ETW。
简单地将消息嵌入到有效负载中是避免此问题的预期方法。