package org.skywalking.apm.collector.worker.storage; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.elasticsearch.action.admin.indices.create.CreateIndexResponse; import org.elasticsearch.action.admin.indices.delete.DeleteIndexResponse; import org.elasticsearch.action.admin.indices.exists.indices.IndicesExistsResponse; import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse; import org.elasticsearch.client.IndicesAdminClient; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; import org.elasticsearch.index.IndexNotFoundException; import org.skywalking.apm.collector.worker.config.EsConfig; import java.io.IOException; /** * @author pengys5 */ public abstract class AbstractIndex { private static final Logger logger = LogManager.getFormatterLogger(AbstractIndex.class); public static final String TYPE_MINUTE = "minute"; public static final String TYPE_HOUR = "hour"; public static final String TYPE_DAY = "day"; public static final String TYPE_RECORD = "record"; public static final String AGG_COLUMN = "aggId"; public static final String TIME_SLICE = "timeSlice"; final XContentBuilder createSettingBuilder() throws IOException { return XContentFactory.jsonBuilder() .startObject() .field("index.number_of_shards", EsConfig.Es.Index.Shards.NUMBER) .field("index.number_of_replicas", EsConfig.Es.Index.Replicas.NUMBER) .field("index.refresh_interval", String.valueOf(refreshInterval()) + "s") .endObject(); } public abstract int refreshInterval(); public abstract boolean isRecord(); public abstract XContentBuilder createMappingBuilder() throws IOException; final void createIndex() { // settings String settingSource = ""; // mapping XContentBuilder mappingBuilder = null; try { XContentBuilder settingsBuilder = createSettingBuilder(); settingSource = settingsBuilder.string(); mappingBuilder = createMappingBuilder(); logger.info("mapping builder str: %s", mappingBuilder.string()); } catch (Exception e) { logger.error("create %s index mapping builder error", index()); } Settings settings = Settings.builder().loadFromSource(settingSource).build(); IndicesAdminClient client = EsClient.INSTANCE.getClient().admin().indices(); if (isRecord()) { CreateIndexResponse response = client.prepareCreate(index()).setSettings(settings).addMapping(TYPE_RECORD, mappingBuilder).get(); logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), TYPE_RECORD, response.isAcknowledged()); } else { CreateIndexResponse response = client.prepareCreate(index()).setSettings(settings).addMapping(TYPE_MINUTE, mappingBuilder).get(); logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), TYPE_MINUTE, response.isAcknowledged()); PutMappingResponse putMappingResponse = client.preparePutMapping(index()).setType(TYPE_HOUR).setSource(mappingBuilder).get(); logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), TYPE_HOUR, putMappingResponse.isAcknowledged()); putMappingResponse = client.preparePutMapping(index()).setType(TYPE_DAY).setSource(mappingBuilder).get(); logger.info("create %s index with type of %s finished, isAcknowledged: %s", index(), TYPE_DAY, putMappingResponse.isAcknowledged()); } } final boolean deleteIndex() { IndicesAdminClient client = EsClient.INSTANCE.getClient().admin().indices(); try { DeleteIndexResponse response = client.prepareDelete(index()).get(); logger.info("delete %s index finished, isAcknowledged: %s", index(), response.isAcknowledged()); return response.isAcknowledged(); } catch (IndexNotFoundException e) { logger.info("%s index not found", index()); } return false; } final boolean isExists() { IndicesAdminClient client = EsClient.INSTANCE.getClient().admin().indices(); IndicesExistsResponse response = client.prepareExists(index()).get(); return response.isExists(); } public abstract String index(); }