public async Task <IElasticLowLevelClient> BuildAsync(ElasticClientConfiguration config, IEnumerable <string> indices) { var settings = new ConnectionConfiguration(new Uri(config.Address)); var client = new ElasticLowLevelClient(settings); var errors = new List <Exception>(); foreach (var index in indices) { var indexExists = await client.IndicesExistsAsync <string>(index).ConfigureAwait(false); if (indexExists.HttpStatusCode == null || indexExists.HttpStatusCode.Value == 404) { var postData = new { mappings = new { _default_ = new { properties = new { Timestamp = new { type = "date" } } } } }; var response = await client.IndicesCreateAsync <VoidResponse>(index, postData).ConfigureAwait(false); if (!response.Success) { errors.Add(new ElasticException(response)); } } } if (errors.Count > 0) { throw new AggregateException(errors); } return(client); }
private async Task CreateIndex(string correlationId, bool force) { var newIndex = GetCurrentIndex(); if (!force && _currentIndexName == newIndex) { return; } _currentIndexName = newIndex; var response = await _client.IndicesExistsAsync <StringResponse>(_currentIndexName); if (response.HttpStatusCode == 404) { var request = new { settings = new { number_of_shards = 1 }, mappings = new { log_message = new { properties = new { time = new { type = "date", index = true }, source = new { type = "keyword", index = true }, level = new { type = "keyword", index = true }, correlation_id = new { type = "text", index = true }, error = new { type = "object", properties = new { type = new { type = "keyword", index = true }, category = new { type = "keyword", index = true }, status = new { type = "integer", index = false }, code = new { type = "keyword", index = true }, message = new { type = "text", index = false }, details = new { type = "object" }, correlation_id = new { type = "text", index = false }, cause = new { type = "text", index = false }, stack_trace = new { type = "text", index = false } } }, message = new { type = "text", index = _indexMessage } } } } }; var json = JsonConverter.ToJson(request); try { response = await _client.IndicesCreateAsync <StringResponse>(_currentIndexName, PostData.String(json)); if (!response.Success) { throw new ConnectionException(correlationId, "CANNOT_CREATE_INDEX", response.Body); } } catch (Exception ex) { if (!ex.Message.Contains("resource_already_exists")) { throw; } } } else if (!response.Success) { throw new ConnectionException(correlationId, "CONNECTION_FAILED", response.Body); } }