从NEST客户端向数据流发送消息时表示缺少时间戳



我试图通过NEST API的CreateAsync函数发送消息,但我得到了一个丢失的时间戳错误

我使用的代码是

var node = new Uri($"{_baseUrl}:{_elasticPort}");
var settings = new ConnectionSettings(node);
settings.BasicAuthentication("user", "pass");
var elasticClient = new ElasticClient(settings);
var elasticResponse = await elasticClient.IndexAsync<Message>(new(_message, DateTime.UtcNow), d =>
{
    d.OpType(OpType.Create);
    d.Index(_index);
    d.Id("id");
    return d;
});
Console.WriteLine(elasticResponse);

我得到的错误是

Invalid NEST response built from a unsuccessful (400) low level call on PUT: /index-2022.07.24/_doc/id?op_type=create
{
  "Error": {
    "Headers": {},
    "RootCause": [
      {
        "AdditionalProperties": {},
        "BytesLimit": null,
        "BytesWanted": null,
        "CausedBy": null,
        "Column": null,
        "FailedShards": [],
        "Grouped": null,
        "Index": null,
        "IndexUUID": null,
        "Language": null,
        "LicensedExpiredFeature": null,
        "Line": null,
        "Phase": null,
        "Reason": "failed to parse",
        "ResourceId": [],
        "ResourceType": null,
        "Script": null,
        "ScriptStack": [],
        "Shard": null,
        "StackTrace": null,
        "Type": "mapper_parsing_exception"
      }
    ],
    "AdditionalProperties": {},
    "BytesLimit": null,
    "BytesWanted": null,
    "CausedBy": {
      "AdditionalProperties": {},
      "BytesLimit": null,
      "BytesWanted": null,
      "CausedBy": null,
      "Column": null,
      "FailedShards": [],
      "Grouped": null,
      "Index": null,
      "IndexUUID": null,
      "Language": null,
      "LicensedExpiredFeature": null,
      "Line": null,
      "Phase": null,
      "Reason": "data stream timestamp field [@timestamp] is missing",
      "ResourceId": [],
      "ResourceType": null,
      "Script": null,
      "ScriptStack": [],
      "Shard": null,
      "StackTrace": null,
      "Type": "illegal_argument_exception"
    },
    "Column": null,
    "FailedShards": [],
    "Grouped": null,
    "Index": null,
    "IndexUUID": null,
    "Language": null,
    "LicensedExpiredFeature": null,
    "Line": null,
    "Phase": null,
    "Reason": "failed to parse",
    "ResourceId": [],
    "ResourceType": null,
    "Script": null,
    "ScriptStack": [],
    "Shard": null,
    "StackTrace": null,
    "Type": "mapper_parsing_exception"
  },
  "Status": 400
}
{
  "Message": "Request failed to execute. Call: Status code 400 from: PUT /index-2022.07.24/_doc/id?op_type=create. ServerError: Type: mapper_parsing_exception Reason: u0022failed to parseu0022 CausedBy: u0022Type: illegal_argument_exception Reason: u0022data stream timestamp field [@timestamp] is missingu0022u0022",
  "Data": {},
  "InnerException": null,
  "HelpLink": null,
  "Source": null,
  "HResult": -2146233088,
  "StackTrace": null
}

我试图找到这个API的详细描述或查找类似的问题,但数据流的概念似乎相当新,所有相关的帖子都太旧了。

编辑-我意识到我忘记添加我用来制作消息的记录,所以:

record Message(string Message, DateTime @timestamp);

编辑:我用wireshark评估了这个请求,它有一个时间戳,但项目的格式是timestamp,而不是@timestamp。我似乎找不到一个允许我正确格式化项目名称的api,因为它在记录上被命名为@timestamps。。。

谢谢!

由于某种原因,序列化程序删除了类型名称开头的@。。。将这一行添加到设置中解决了问题。

settings.DefaultMappingFor<Message>(m => m.PropertyName(p => p.timestamp, "@timestamp"));

最新更新