package org.stagemonitor.tracing.elasticsearch; import org.stagemonitor.configuration.ConfigurationOption; import org.stagemonitor.core.CorePlugin; import org.stagemonitor.core.StagemonitorPlugin; import org.stagemonitor.core.elasticsearch.ElasticsearchClient; public class ElasticsearchTracingPlugin extends StagemonitorPlugin { public static final String ELASTICSEARCH_TRACING_PLUGIN = "Elasticsearch trace storage plugin"; private final ConfigurationOption<Boolean> onlyLogElasticsearchSpanReports = ConfigurationOption.booleanOption() .key("stagemonitor.requestmonitor.elasticsearch.onlyLogElasticsearchRequestTraceReports") .dynamic(true) .label("Only log Elasticsearch request trace reports") .description(String.format("If set to true, the spans won't be reported to elasticsearch but instead logged in bulk format. " + "The name of the logger is %s. That way you can redirect the reporting to a separate log file and use logstash or a " + "different external process to send the spans to elasticsearch.", ElasticsearchSpanReporter.ES_SPAN_LOGGER)) .tags("reporting") .configurationCategory(ELASTICSEARCH_TRACING_PLUGIN) .buildWithDefault(false); /* Storage */ private final ConfigurationOption<String> spanIndexTemplate = ConfigurationOption.stringOption() .key("stagemonitor.requestmonitor.elasticsearch.spanIndexTemplate") .dynamic(false) .label("ES Request Span Template") .description("The classpath location of the index template that is used for the stagemonitor-spans-* indices. " + "By specifying the location to your own template, you can fully customize the index template.") .configurationCategory(ELASTICSEARCH_TRACING_PLUGIN) .tags("elasticsearch") .buildWithDefault("stagemonitor-elasticsearch-span-index-template.json"); private final ConfigurationOption<Integer> deleteSpansAfterDays = ConfigurationOption.integerOption() .key("stagemonitor.requestmonitor.deleteRequestTracesAfterDays") .dynamic(true) .label("Delete spans after (days)") .description("When set, spans will be deleted automatically after the specified days. " + "Set to a negative value to never delete spans.") .configurationCategory(ELASTICSEARCH_TRACING_PLUGIN) .buildWithDefault(7); @Override public void initializePlugin(InitArguments initArguments) throws Exception { final CorePlugin corePlugin = initArguments.getPlugin(CorePlugin.class); final ElasticsearchClient elasticsearchClient = corePlugin.getElasticsearchClient(); final String spanMappingJson = ElasticsearchClient.modifyIndexTemplate( spanIndexTemplate.getValue(), corePlugin.getMoveToColdNodesAfterDays(), corePlugin.getNumberOfReplicas(), corePlugin.getNumberOfShards()); elasticsearchClient.sendMappingTemplateAsync(spanMappingJson, "stagemonitor-spans"); if (!corePlugin.getElasticsearchUrls().isEmpty()) { elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/stagemonitor-spans-kibana-index-pattern.bulk"); elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/Request-Analysis.bulk"); elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/Web-Analytics.bulk"); elasticsearchClient.scheduleIndexManagement("stagemonitor-external-requests-", corePlugin.getMoveToColdNodesAfterDays(), deleteSpansAfterDays.getValue()); } } public boolean isOnlyLogElasticsearchSpanReports() { return onlyLogElasticsearchSpanReports.getValue(); } }