我试图通过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"));