You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ko...@apache.org on 2018/02/20 15:30:54 UTC
[5/8] lucene-solr:branch_7x: Revert "SOLR-11795: Add Solr metrics
exporter for Prometheus"
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/conf/log4j.properties
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/conf/log4j.properties b/solr/contrib/prometheus-exporter/conf/log4j.properties
deleted file mode 100644
index 5dd6899..0000000
--- a/solr/contrib/prometheus-exporter/conf/log4j.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one or more
-# contributor license agreements. See the NOTICE file distributed with
-# this work for additional information regarding copyright ownership.
-# The ASF licenses this file to You under the Apache License, Version 2.0
-# (the "License"); you may not use this file except in compliance with
-# the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-
-log4j.rootLogger=INFO, stdout
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss.SSS} %-5p [%c] - %m%n
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/ivy.xml
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/ivy.xml b/solr/contrib/prometheus-exporter/ivy.xml
deleted file mode 100644
index a6d0705..0000000
--- a/solr/contrib/prometheus-exporter/ivy.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-<ivy-module version="2.0">
- <info organisation="org.apache.solr" module="prometheus"/>
- <configurations defaultconfmapping="compile->master;test->master">
- <conf name="compile" transitive="false"/>
- <conf name="test" transitive="false"/>
- </configurations>
- <dependencies>
- <dependency org="io.prometheus" name="simpleclient" rev="0.0.26" conf="compile"/>
- <dependency org="io.prometheus" name="simpleclient_common" rev="0.0.26" conf="compile"/>
- <dependency org="io.prometheus" name="simpleclient_httpserver" rev="0.0.26" conf="compile"/>
- <dependency org="org.yaml" name="snakeyaml" rev="1.16" conf="compile"/>
- <dependency org="com.fasterxml.jackson.core" name="jackson-core" rev="2.9.1" conf="compile"/>
- <dependency org="com.fasterxml.jackson.core" name="jackson-databind" rev="2.9.1" conf="compile"/>
- <dependency org="com.fasterxml.jackson.core" name="jackson-annotations" rev="2.9.1" conf="compile"/>
- <dependency org="net.thisptr" name="jackson-jq" rev="0.0.8" conf="compile"/>
- <dependency org="net.sourceforge.argparse4j" name="argparse4j" rev="0.7.0" conf="compile"/>
- <dependency org="org.slf4j" name="slf4j-api" rev="1.7.25" conf="compile"/>
- <dependency org="org.slf4j" name="slf4j-log4j12" rev="1.7.25" conf="compile"/>
- <dependency org="log4j" name="log4j" rev="1.2.17" conf="compile"/>
-
- <exclude org="*" ext="*" matcher="regexp" type="${ivy.exclude.types}"/>
- </dependencies>
-</ivy-module>
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/SolrCollector.java
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/SolrCollector.java b/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/SolrCollector.java
deleted file mode 100644
index 9341fa2..0000000
--- a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/SolrCollector.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.prometheus.collector;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.solr.prometheus.collector.config.SolrCollectorConfig;
-import org.apache.solr.prometheus.scraper.SolrScraper;
-import org.apache.solr.prometheus.scraper.config.SolrScraperConfig;
-import io.prometheus.client.Collector;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.impl.NoOpResponseParser;
-import org.apache.solr.client.solrj.request.CollectionAdminRequest;
-import org.apache.solr.client.solrj.request.CoreAdminRequest;
-import org.apache.solr.common.params.CoreAdminParams;
-import org.apache.solr.common.util.NamedList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.TimeUnit;
-
-/**
- * SolrCollector
- */
-public class SolrCollector extends Collector implements Collector.Describable {
- private static final Logger logger = LoggerFactory.getLogger(SolrCollector.class);
-
- private SolrClient solrClient;
- private SolrCollectorConfig config = new SolrCollectorConfig();
- private int numThreads;
-
- private static ObjectMapper om = new ObjectMapper();
-
- /**
- * Constructor.
- */
- public SolrCollector(SolrClient solrClient, SolrCollectorConfig config, int numThreads) {
- this.solrClient = solrClient;
- this.config = config;
- this.numThreads = numThreads;
- }
-
- /**
- * Describe scrape status.
- */
- public List<Collector.MetricFamilySamples> describe() {
- List<MetricFamilySamples> metricFamilies = new ArrayList<>();
- metricFamilies.add(new MetricFamilySamples("solr_exporter_duration_seconds", Type.GAUGE, "Time this Solr scrape took, in seconds.", new ArrayList<>()));
- return metricFamilies;
- }
-
- /**
- * Collect samples.
- */
- public List<MetricFamilySamples> collect() {
- // start time of scraping.
- long startTime = System.nanoTime();
-
- Map<String, MetricFamilySamples> metricFamilySamplesMap = new LinkedHashMap<>();
-
- ExecutorService executorService = Executors.newFixedThreadPool(numThreads);
- List<Future<Map<String, MetricFamilySamples>>> futureList = new ArrayList<>();
-
- try {
- // Ping
- if (config.getPing() != null) {
- if (solrClient instanceof CloudSolrClient) {
- List<HttpSolrClient> httpSolrClients = new ArrayList<>();
- try {
- httpSolrClients = getHttpSolrClients((CloudSolrClient) solrClient);
- for (HttpSolrClient httpSolrClient : httpSolrClients) {
- try {
- List<String> cores = getCores(httpSolrClient);
- for (String core : cores) {
- SolrScraperConfig pingConfig;
- try {
- pingConfig = config.getPing().clone();
- } catch (CloneNotSupportedException e) {
- logger.error(e.getMessage());
- continue;
- }
-
- pingConfig.getQuery().setCore(core);
-
- SolrScraper scraper = new SolrScraper(httpSolrClient, pingConfig, Arrays.asList("zk_host"), Arrays.asList(((CloudSolrClient) solrClient).getZkHost()));
- Future<Map<String, MetricFamilySamples>> future = executorService.submit(scraper);
- futureList.add(future);
- }
- } catch (SolrServerException | IOException e) {
- logger.error(e.getMessage());
- }
- }
-
- // get future
- for (Future<Map<String, MetricFamilySamples>> future : futureList) {
- try {
- Map<String, MetricFamilySamples> m = future.get(60, TimeUnit.SECONDS);
- mergeMetrics(metricFamilySamplesMap, m);
- } catch (InterruptedException | ExecutionException | TimeoutException e) {
- logger.error(e.getMessage());
- }
- }
- } catch (SolrServerException | IOException e) {
- logger.error(e.getMessage());
- } finally {
- for (HttpSolrClient httpSolrClient : httpSolrClients) {
- try {
- httpSolrClient.close();
- } catch (IOException e) {
- logger.error(e.getMessage());
- }
- }
- }
-
- try {
- List<String> collections = getCollections((CloudSolrClient) solrClient);
- for (String collection : collections) {
- SolrScraperConfig pingConfig;
- try {
- pingConfig = config.getPing().clone();
- } catch (CloneNotSupportedException e) {
- logger.error(e.getMessage());
- continue;
- }
-
- pingConfig.getQuery().setCollection(collection);
- LinkedHashMap<String, String> distrib = new LinkedHashMap<>();
- distrib.put("distrib", "true");
- pingConfig.getQuery().setParams(Collections.singletonList(distrib));
-
- SolrScraper scraper = new SolrScraper(solrClient, pingConfig);
- Future<Map<String, MetricFamilySamples>> future = executorService.submit(scraper);
- futureList.add(future);
- }
- } catch (SolrServerException | IOException e) {
- logger.error(e.getMessage());
- }
- } else {
- try {
- List<String> cores = getCores((HttpSolrClient) solrClient);
- for (String core : cores) {
- SolrScraperConfig pingConfig = new SolrScraperConfig();
- pingConfig.setQuery(config.getPing().getQuery());
- pingConfig.getQuery().setCore(core);
-
- pingConfig.setJsonQueries(config.getPing().getJsonQueries());
-
- SolrScraper scraper = new SolrScraper(solrClient, pingConfig);
- Future<Map<String, MetricFamilySamples>> future = executorService.submit(scraper);
- futureList.add(future);
- }
- } catch (SolrServerException | IOException e) {
- logger.error(e.getMessage());
- }
- }
- }
-
- // Metrics
- if (config.getMetrics() != null) {
- if (solrClient instanceof CloudSolrClient) {
- List<HttpSolrClient> httpSolrClients = new ArrayList<>();
- try {
- httpSolrClients = getHttpSolrClients((CloudSolrClient) solrClient);
- for (HttpSolrClient httpSolrClient : httpSolrClients) {
- SolrScraper scraper = new SolrScraper(httpSolrClient, config.getMetrics(), Arrays.asList("zk_host"), Arrays.asList(((CloudSolrClient) solrClient).getZkHost()));
- Future<Map<String, MetricFamilySamples>> future = executorService.submit(scraper);
- futureList.add(future);
- }
-
- // get future
- for (Future<Map<String, MetricFamilySamples>> future : futureList) {
- try {
- Map<String, MetricFamilySamples> m = future.get(60, TimeUnit.SECONDS);
- mergeMetrics(metricFamilySamplesMap, m);
- } catch (InterruptedException | ExecutionException | TimeoutException e) {
- logger.error(e.getMessage());
- }
- }
- } catch (SolrServerException | IOException e) {
- logger.error(e.getMessage());
- } finally {
- for (HttpSolrClient httpSolrClient : httpSolrClients) {
- try {
- httpSolrClient.close();
- } catch (IOException e) {
- logger.error(e.getMessage());
- }
- }
- }
- } else {
- SolrScraper scraper = new SolrScraper(solrClient, config.getMetrics());
- Future<Map<String, MetricFamilySamples>> future = executorService.submit(scraper);
- futureList.add(future);
- }
- }
-
- // Collections
- if (config.getCollections() != null) {
- if (solrClient instanceof CloudSolrClient) {
- SolrScraper scraper = new SolrScraper(solrClient, config.getCollections());
- Future<Map<String, MetricFamilySamples>> future = executorService.submit(scraper);
- futureList.add(future);
- }
- }
-
- // Query
- if (config.getQueries() != null) {
- for (SolrScraperConfig c : config.getQueries()) {
- SolrScraper scraper = new SolrScraper(solrClient, c);
- Future<Map<String, MetricFamilySamples>> future = executorService.submit(scraper);
- futureList.add(future);
- }
- }
-
- // get future
- for (Future<Map<String, MetricFamilySamples>> future : futureList) {
- try {
- Map<String, MetricFamilySamples> m = future.get(60, TimeUnit.SECONDS);
- mergeMetrics(metricFamilySamplesMap, m);
- } catch (InterruptedException | ExecutionException | TimeoutException e) {
- logger.error(e.getMessage());
- }
- }
- } finally {
- executorService.shutdown();
- }
-
- // return value
- List<MetricFamilySamples> metricFamiliesSamplesList = new ArrayList<>();
-
- // add solr metrics
- for (String gaugeMetricName : metricFamilySamplesMap.keySet()) {
- MetricFamilySamples metricFamilySamples = metricFamilySamplesMap.get(gaugeMetricName);
- if (metricFamilySamples.samples.size() > 0) {
- metricFamiliesSamplesList.add(metricFamilySamples);
- }
- }
-
- // add scrape duration metric
- List<MetricFamilySamples.Sample> durationSample = new ArrayList<>();
- durationSample.add(new MetricFamilySamples.Sample("solr_exporter_duration_seconds", new ArrayList<>(), new ArrayList<>(), (System.nanoTime() - startTime) / 1.0E9));
- metricFamiliesSamplesList.add(new MetricFamilySamples("solr_exporter_duration_seconds", Type.GAUGE, "Time this Solr exporter took, in seconds.", durationSample));
-
- return metricFamiliesSamplesList;
- }
-
- /**
- * Merge metrics.
- */
- private Map<String, MetricFamilySamples> mergeMetrics(Map<String, MetricFamilySamples> metrics1, Map<String, MetricFamilySamples> metrics2) {
- // marge MetricFamilySamples
- for (String k : metrics2.keySet()) {
- if (metrics1.containsKey(k)) {
- for (MetricFamilySamples.Sample sample : metrics2.get(k).samples) {
- if (!metrics1.get(k).samples.contains(sample)) {
- metrics1.get(k).samples.add(sample);
- }
- }
- } else {
- metrics1.put(k, metrics2.get(k));
- }
- }
-
- return metrics1;
- }
-
-
- /**
- * Get target cores via CoreAdminAPI.
- */
- public static List<String> getCores(HttpSolrClient httpSolrClient) throws SolrServerException, IOException {
- List<String> cores = new ArrayList<>();
-
- NoOpResponseParser responseParser = new NoOpResponseParser();
- responseParser.setWriterType("json");
-
- httpSolrClient.setParser(responseParser);
-
- CoreAdminRequest coreAdminRequest = new CoreAdminRequest();
- coreAdminRequest.setAction(CoreAdminParams.CoreAdminAction.STATUS);
- coreAdminRequest.setIndexInfoNeeded(false);
-
- NamedList<Object> coreAdminResponse = httpSolrClient.request(coreAdminRequest);
-
- JsonNode statusJsonNode = om.readTree((String) coreAdminResponse.get("response")).get("status");
-
- for (Iterator<JsonNode> i = statusJsonNode.iterator(); i.hasNext(); ) {
- String core = i.next().get("name").textValue();
- if (!cores.contains(core)) {
- cores.add(core);
- }
- }
-
- return cores;
- }
-
- /**
- * Get target cores via CollectionsAPI.
- */
- public static List<String> getCollections(CloudSolrClient cloudSolrClient) throws SolrServerException, IOException {
- List<String> collections = new ArrayList<>();
-
- NoOpResponseParser responseParser = new NoOpResponseParser();
- responseParser.setWriterType("json");
-
- cloudSolrClient.setParser(responseParser);
-
- CollectionAdminRequest collectionAdminRequest = new CollectionAdminRequest.List();
-
- NamedList<Object> collectionAdminResponse = cloudSolrClient.request(collectionAdminRequest);
-
- JsonNode collectionsJsonNode = om.readTree((String) collectionAdminResponse.get("response")).get("collections");
-
- for (Iterator<JsonNode> i = collectionsJsonNode.iterator(); i.hasNext(); ) {
- String collection = i.next().textValue();
- if (!collections.contains(collection)) {
- collections.add(collection);
- }
- }
-
- return collections;
- }
-
- /**
- * Get base urls via CollectionsAPI.
- */
- private List<String> getBaseUrls(CloudSolrClient cloudSolrClient) throws SolrServerException, IOException {
- List<String> baseUrls = new ArrayList<>();
-
- NoOpResponseParser responseParser = new NoOpResponseParser();
- responseParser.setWriterType("json");
-
- cloudSolrClient.setParser(responseParser);
-
- CollectionAdminRequest collectionAdminRequest = new CollectionAdminRequest.ClusterStatus();
-
- NamedList<Object> collectionAdminResponse = cloudSolrClient.request(collectionAdminRequest);
-
- List<JsonNode> baseUrlJsonNode = om.readTree((String) collectionAdminResponse.get("response")).findValues("base_url");
-
- for (Iterator<JsonNode> i = baseUrlJsonNode.iterator(); i.hasNext(); ) {
- String baseUrl = i.next().textValue();
- if (!baseUrls.contains(baseUrl)) {
- baseUrls.add(baseUrl);
- }
- }
-
- return baseUrls;
- }
-
- /**
- * Get HTTP Solr Clients
- */
- private List<HttpSolrClient> getHttpSolrClients(CloudSolrClient cloudSolrClient) throws SolrServerException, IOException {
- List<HttpSolrClient> solrClients = new ArrayList<>();
-
- for (String baseUrl : getBaseUrls(cloudSolrClient)) {
- NoOpResponseParser responseParser = new NoOpResponseParser();
- responseParser.setWriterType("json");
-
- HttpSolrClient.Builder builder = new HttpSolrClient.Builder();
- builder.withBaseSolrUrl(baseUrl);
-
- HttpSolrClient httpSolrClient = builder.build();
- httpSolrClient.setParser(responseParser);
-
- solrClients.add(httpSolrClient);
- }
-
- return solrClients;
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/config/SolrCollectorConfig.java
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/config/SolrCollectorConfig.java b/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/config/SolrCollectorConfig.java
deleted file mode 100644
index 8344802..0000000
--- a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/collector/config/SolrCollectorConfig.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.prometheus.collector.config;
-
-import org.apache.solr.prometheus.scraper.config.SolrScraperConfig;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * SolrCollectorConfig
- */
-public class SolrCollectorConfig {
- private SolrScraperConfig ping = new SolrScraperConfig();
- private SolrScraperConfig metrics = new SolrScraperConfig();
- private SolrScraperConfig collections = new SolrScraperConfig();
- private List<SolrScraperConfig> queries = new ArrayList<>();
-
- public SolrScraperConfig getPing() {
- return ping;
- }
-
- public void setPing(SolrScraperConfig ping) {
- this.ping = ping;
- }
-
- public SolrScraperConfig getMetrics() {
- return metrics;
- }
-
- public void setMetrics(SolrScraperConfig metrics) {
- this.metrics = metrics;
- }
-
- public SolrScraperConfig getCollections() {
- return collections;
- }
-
- public void setCollections(SolrScraperConfig collections) {
- this.collections = collections;
- }
-
- public List<SolrScraperConfig> getQueries() {
- return queries;
- }
-
- public void setQueries(List<SolrScraperConfig> queries) {
- this.queries = queries;
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/exporter/SolrExporter.java
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/exporter/SolrExporter.java b/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/exporter/SolrExporter.java
deleted file mode 100644
index a51207d..0000000
--- a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/exporter/SolrExporter.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.prometheus.exporter;
-
-import org.apache.solr.prometheus.collector.SolrCollector;
-import org.apache.solr.prometheus.collector.config.SolrCollectorConfig;
-import io.prometheus.client.CollectorRegistry;
-import io.prometheus.client.Counter;
-import io.prometheus.client.exporter.HTTPServer;
-import net.sourceforge.argparse4j.ArgumentParsers;
-import net.sourceforge.argparse4j.impl.Arguments;
-import net.sourceforge.argparse4j.inf.ArgumentParser;
-import net.sourceforge.argparse4j.inf.ArgumentParserException;
-import net.sourceforge.argparse4j.inf.Namespace;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.impl.NoOpResponseParser;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.yaml.snakeyaml.Yaml;
-
-import javax.management.MalformedObjectNameException;
-import java.io.File;
-import java.io.FileReader;
-import java.io.IOException;
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * SolrExporter
- */
-public class SolrExporter {
- private static final Logger logger = LoggerFactory.getLogger(SolrExporter.class);
-
- private static final String[] ARG_PORT_FLAGS = { "-p", "--port" };
- private static final String ARG_PORT_METAVAR = "PORT";
- private static final String ARG_PORT_DEST = "port";
- private static final Integer ARG_PORT_DEFAULT = 9983;
- private static final String ARG_PORT_HELP = "solr-exporter listen port";
-
- private static final String[] ARG_BASE_URL_FLAGS = { "-b", "--baseurl" };
- private static final String ARG_BASE_URL_METAVAR = "BASE_URL";
- private static final String ARG_BASE_URL_DEST = "baseUrl";
- private static final String ARG_BASE_URL_DEFAULT = "";
- private static final String ARG_BASE_URL_HELP = "specify Solr base URL when connecting to Solr in standalone mode (for example 'http://localhost:8983/solr')";
-
- private static final String[] ARG_ZK_HOST_FLAGS = { "-z", "--zkhost" };
- private static final String ARG_ZK_HOST_METAVAR = "ZK_HOST";
- private static final String ARG_ZK_HOST_DEST = "zkHost";
- private static final String ARG_ZK_HOST_DEFAULT = "";
- private static final String ARG_ZK_HOST_HELP = "specify ZooKeeper connection string when connecting to Solr in SolrCloud mode (for example 'localhost:2181/solr')";
-
- private static final String[] ARG_CONFIG_FLAGS = { "-f", "--config-file" };
- private static final String ARG_CONFIG_METAVAR = "CONFIG";
- private static final String ARG_CONFIG_DEST = "configFile";
- private static final String ARG_CONFIG_DEFAULT = "./conf/config.yml";
- private static final String ARG_CONFIG_HELP = "specify configuration file";
-
- private static final String[] ARG_NUM_THREADS_FLAGS = { "-n", "--num-thread" };
- private static final String ARG_NUM_THREADS_METAVAR = "NUM_THREADS";
- private static final String ARG_NUM_THREADS_DEST = "numThreads";
- private static final Integer ARG_NUM_THREADS_DEFAULT = 1;
- private static final String ARG_NUM_THREADS_HELP = "specify number of threads";
-
- private int port;
- private SolrClient solrClient;
- private SolrCollectorConfig config;
- private int numThreads;
-
- CollectorRegistry registry = new CollectorRegistry();
-
- private HTTPServer httpServer;
- private SolrCollector collector;
-
- public static final Counter scrapeErrorTotal = Counter.build()
- .name("solr_exporter_scrape_error_total")
- .help("Number of scrape error.").register();
-
- /**
- * Constructor.
- */
- public SolrExporter(int port, SolrClient solrClient, File configFile, int numThreads) throws IOException {
- this(port, solrClient, new Yaml().loadAs(new FileReader(configFile), SolrCollectorConfig.class), numThreads);
- }
-
- /**
- * Constructor.
- */
- public SolrExporter(int port, SolrClient solrClient, SolrCollectorConfig config, int numThreads) {
- super();
-
- this.port = port;
- this.solrClient = solrClient;
- this.config = config;
- this.numThreads = numThreads;
- }
-
- /**
- * Start HTTP server for exporting Solr metrics.
- */
- public void start() throws MalformedObjectNameException, IOException {
- InetSocketAddress socket = new InetSocketAddress(port);
-
- this.collector = new SolrCollector(solrClient, config, numThreads);
-
- this.registry.register(this.collector);
- this.registry.register(scrapeErrorTotal);
-
- this.httpServer = new HTTPServer(socket, this.registry);
- }
-
- /**
- * Stop HTTP server for exporting Solr metrics.
- */
- public void stop() throws IOException {
- this.httpServer.stop();
- this.registry.unregister(this.collector);
- }
-
- /**
- * Create Solr client
- */
- private static SolrClient createClient(String connStr) {
- SolrClient solrClient;
-
- Pattern baseUrlPattern = Pattern.compile("^https?:\\/\\/[\\w\\/:%#\\$&\\?\\(\\)~\\.=\\+\\-]+$");
- Pattern zkHostPattern = Pattern.compile("^(?<host>[^\\/]+)(?<chroot>|(?:\\/.*))$");
- Matcher matcher;
-
- matcher = baseUrlPattern.matcher(connStr);
- if (matcher.matches()) {
- NoOpResponseParser responseParser = new NoOpResponseParser();
- responseParser.setWriterType("json");
-
- HttpSolrClient.Builder builder = new HttpSolrClient.Builder();
- builder.withBaseSolrUrl(connStr);
-
- HttpSolrClient httpSolrClient = builder.build();
- httpSolrClient.setParser(responseParser);
-
- solrClient = httpSolrClient;
- } else {
- String host = "";
- String chroot = "";
-
- matcher = zkHostPattern.matcher(connStr);
- if (matcher.matches()) {
- host = matcher.group("host") != null ? matcher.group("host") : "";
- chroot = matcher.group("chroot") != null ? matcher.group("chroot") : "";
- }
-
- NoOpResponseParser responseParser = new NoOpResponseParser();
- responseParser.setWriterType("json");
-
- CloudSolrClient.Builder builder = new CloudSolrClient.Builder();
- if (host.contains(",")) {
- List<String> hosts = new ArrayList<>();
- for (String h : host.split(",")) {
- if (h != null && !h.equals("")) {
- hosts.add(h.trim());
- }
- }
- builder.withZkHost(hosts);
- } else {
- builder.withZkHost(host);
- }
- if (chroot.equals("")) {
- builder.withZkChroot("/");
- } else {
- builder.withZkChroot(chroot);
- }
-
- CloudSolrClient cloudSolrClient = builder.build();
- cloudSolrClient.setParser(responseParser);
-
- solrClient = cloudSolrClient;
- }
-
- return solrClient;
- }
-
- /**
- * Entry point of SolrExporter.
- */
- public static void main( String[] args ) {
- ArgumentParser parser = ArgumentParsers.newArgumentParser(SolrCollector.class.getSimpleName())
- .description("Prometheus exporter for Apache Solr.");
-
- parser.addArgument(ARG_PORT_FLAGS)
- .metavar(ARG_PORT_METAVAR).dest(ARG_PORT_DEST).type(Integer.class)
- .setDefault(ARG_PORT_DEFAULT).help(ARG_PORT_HELP);
-
- parser.addArgument(ARG_BASE_URL_FLAGS)
- .metavar(ARG_BASE_URL_METAVAR).dest(ARG_BASE_URL_DEST).type(String.class)
- .setDefault(ARG_BASE_URL_DEFAULT).help(ARG_BASE_URL_HELP);
-
- parser.addArgument(ARG_ZK_HOST_FLAGS)
- .metavar(ARG_ZK_HOST_METAVAR).dest(ARG_ZK_HOST_DEST).type(String.class)
- .setDefault(ARG_ZK_HOST_DEFAULT).help(ARG_ZK_HOST_HELP);
-
- parser.addArgument(ARG_CONFIG_FLAGS)
- .metavar(ARG_CONFIG_METAVAR).dest(ARG_CONFIG_DEST).type(String.class)
- .setDefault(ARG_CONFIG_DEFAULT).help(ARG_CONFIG_HELP);
-
- parser.addArgument(ARG_NUM_THREADS_FLAGS)
- .metavar(ARG_NUM_THREADS_METAVAR).dest(ARG_NUM_THREADS_DEST).type(Integer.class)
- .setDefault(ARG_NUM_THREADS_DEFAULT).help(ARG_NUM_THREADS_HELP);
-
- try {
- Namespace res = parser.parseArgs(args);
-
- int port = res.getInt(ARG_PORT_DEST);
-
- String connStr = "http://localhost:8983/solr";
- if (!res.getString(ARG_BASE_URL_DEST).equals("")) {
- connStr = res.getString(ARG_BASE_URL_DEST);
- } else if (!res.getString(ARG_ZK_HOST_DEST).equals("")) {
- connStr = res.getString(ARG_ZK_HOST_DEST);
- }
-
- File configFile = new File(res.getString(ARG_CONFIG_DEST));
- int numThreads = res.getInt(ARG_NUM_THREADS_DEST);
-
- SolrClient solrClient = createClient(connStr);
-
- SolrExporter solrExporter = new SolrExporter(port, solrClient, configFile, numThreads);
- solrExporter.start();
- logger.info("Start server");
- } catch (MalformedObjectNameException | IOException e) {
- logger.error("Start server failed: " + e.toString());
- } catch (ArgumentParserException e) {
- parser.handleError(e);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/SolrScraper.java
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/SolrScraper.java b/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/SolrScraper.java
deleted file mode 100644
index 56929fc..0000000
--- a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/SolrScraper.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.prometheus.scraper;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.solr.prometheus.exporter.SolrExporter;
-import org.apache.solr.prometheus.scraper.config.SolrQueryConfig;
-import org.apache.solr.prometheus.scraper.config.SolrScraperConfig;
-import io.prometheus.client.Collector;
-import net.thisptr.jackson.jq.JsonQuery;
-import net.thisptr.jackson.jq.exception.JsonQueryException;
-import org.apache.solr.client.solrj.SolrClient;
-import org.apache.solr.client.solrj.SolrServerException;
-import org.apache.solr.client.solrj.impl.CloudSolrClient;
-import org.apache.solr.client.solrj.impl.HttpSolrClient;
-import org.apache.solr.client.solrj.request.QueryRequest;
-import org.apache.solr.common.params.ModifiableSolrParams;
-import org.apache.solr.common.util.NamedList;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-/**
- * SolrScraper
- */
-public class SolrScraper implements Callable<Map<String, Collector.MetricFamilySamples>> {
- private static final Logger logger = LoggerFactory.getLogger(SolrScraper.class);
-
- private SolrClient solrClient;
- private SolrScraperConfig scraperConfig;
-
- private List<String> labelNames;
- private List<String> labelValues;
-
- /**
- * Constructor.
- */
- public SolrScraper(SolrClient solrClient, SolrScraperConfig scraperConfig) {
- this(solrClient, scraperConfig, new ArrayList<>(), new ArrayList<>());
- }
-
- /**
- * Constructor.
- */
- public SolrScraper(SolrClient solrClient, SolrScraperConfig scraperConfig, List<String> labelNames, List<String> labelValues) {
- super();
-
- this.solrClient = solrClient;
- this.scraperConfig = scraperConfig;
-
- this.labelNames = labelNames;
- this.labelValues = labelValues;
- }
-
- /**
- * Execute collectResponse
- */
- @Override
- public Map<String, Collector.MetricFamilySamples> call() throws Exception {
- return collectResponse(this.solrClient, this.scraperConfig);
- }
-
- /**
- * Collect facet count.
- */
- public Map<String, Collector.MetricFamilySamples> collectResponse(SolrClient solrClient, SolrScraperConfig scraperConfig) {
- Map<String, Collector.MetricFamilySamples> metricFamilySamplesMap = new LinkedHashMap<>();
-
- try {
- SolrQueryConfig queryConfig = scraperConfig.getQuery();
-
- // create Solr request parameters
- ModifiableSolrParams params = new ModifiableSolrParams();
- for (Map<String, String> param : queryConfig.getParams()) {
- for (String name : param.keySet()) {
- Object obj = param.get(name);
- if (obj instanceof Number) {
- params.add(name, obj.toString());
- } else {
- params.add(name, param.get(name));
- }
- }
- }
-
- // create Solr queryConfig request
- QueryRequest queryRequest = new QueryRequest(params);
- queryRequest.setPath(queryConfig.getPath());
-
- // invoke Solr
- NamedList<Object> queryResponse = null;
- if (queryConfig.getCore().equals("") && queryConfig.getCollection().equals("")) {
- queryResponse = solrClient.request(queryRequest);
- } else if (!queryConfig.getCore().equals("")) {
- queryResponse = solrClient.request(queryRequest, queryConfig.getCore());
- } else if (!queryConfig.getCollection().equals("")) {
- queryResponse = solrClient.request(queryRequest, queryConfig.getCollection());
- }
-
- ObjectMapper om = new ObjectMapper();
-
- JsonNode metricsJson = om.readTree((String) queryResponse.get("response"));
-
- List<JsonQuery> jqs = new ArrayList<>();
- for (String jsonQuery : scraperConfig.getJsonQueries()) {
- JsonQuery compiledJsonQuery = JsonQuery.compile(jsonQuery);
- jqs.add(compiledJsonQuery);
- }
-
- for (int i = 0; i < jqs.size(); i++) {
- JsonQuery q = jqs.get(i);
- try {
- List<JsonNode> results = q.apply(metricsJson);
- for (JsonNode result : results) {
- String type = result.get("type").textValue();
- String name = result.get("name").textValue();
- String help = result.get("help").textValue();
- Double value = result.get("value").doubleValue();
- ArrayList<String> labelNames = new ArrayList<>(this.labelNames);
- ArrayList<String> labelValues = new ArrayList<>(this.labelValues);
-
- if (solrClient instanceof CloudSolrClient) {
- labelNames.add("zk_host");
- labelValues.add(((CloudSolrClient) solrClient).getZkHost());
- }
-
- if (!scraperConfig.getQuery().getCollection().equals("")) {
- labelNames.add("collection");
- labelValues.add(scraperConfig.getQuery().getCollection());
- }
-
- if (solrClient instanceof HttpSolrClient) {
- labelNames.add("base_url");
- labelValues.add(((HttpSolrClient) solrClient).getBaseURL());
- }
-
- if (!scraperConfig.getQuery().getCore().equals("")) {
- labelNames.add("core");
- labelValues.add(scraperConfig.getQuery().getCore());
- }
-
- for(Iterator<JsonNode> ite = result.get("label_names").iterator();ite.hasNext();){
- JsonNode item = ite.next();
- labelNames.add(item.textValue());
- }
- for(Iterator<JsonNode> ite = result.get("label_values").iterator();ite.hasNext();){
- JsonNode item = ite.next();
- labelValues.add(item.textValue());
- }
-
- if (labelNames.indexOf("core") < 0 && labelNames.indexOf("collection") >= 0 && labelNames.indexOf("shard") >= 0 && labelNames.indexOf("replica") >= 0) {
- if (labelValues.get(labelNames.indexOf("collection")).equals("-") && labelValues.get(labelNames.indexOf("shard")).equals("-") && labelValues.get(labelNames.indexOf("replica")).equals("-")) {
- labelNames.add("core");
- labelValues.add("-");
- } else {
- StringBuffer sb = new StringBuffer();
- sb.append(labelValues.get(labelNames.indexOf("collection")))
- .append("_")
- .append(labelValues.get(labelNames.indexOf("shard")))
- .append("_")
- .append(labelValues.get(labelNames.indexOf("replica")));
-
- labelNames.add("core");
- labelValues.add(sb.toString());
- }
- }
-
- if (!metricFamilySamplesMap.containsKey(name)) {
- Collector.MetricFamilySamples metricFamilySamples = new Collector.MetricFamilySamples(
- name,
- Collector.Type.valueOf(type),
- help,
- new ArrayList<>()
- );
- metricFamilySamplesMap.put(name, metricFamilySamples);
- }
-
- Collector.MetricFamilySamples.Sample sample = new Collector.MetricFamilySamples.Sample(name, labelNames, labelValues, value);
-
- if (!metricFamilySamplesMap.get(name).samples.contains(sample)) {
- metricFamilySamplesMap.get(name).samples.add(sample);
- }
- }
- } catch (JsonQueryException e) {
- logger.error(e.toString() + " " + q.toString());
- SolrExporter.scrapeErrorTotal.inc();
- }
- }
- } catch (HttpSolrClient.RemoteSolrException | SolrServerException | IOException e) {
- logger.error(e.toString());
- } catch (Exception e) {
- logger.error(e.toString());
- }
-
- return metricFamilySamplesMap;
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrQueryConfig.java
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrQueryConfig.java b/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrQueryConfig.java
deleted file mode 100644
index 500bb03..0000000
--- a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrQueryConfig.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.prometheus.scraper.config;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-/**
- * SolrQueryConfig
- */
-public class SolrQueryConfig implements Cloneable {
- private String core = "";
- private String collection = "";
- private String path = "";
- private List<LinkedHashMap<String, String>> params = new ArrayList<>();
-
- public String getCore() {
- return core;
- }
-
- public void setCore(String core) {
- this.core = core;
- }
-
- public String getCollection() {
- return collection;
- }
-
- public void setCollection(String collection) {
- this.collection = collection;
- }
-
- public String getPath() {
- return path;
- }
-
- public void setPath(String path) {
- this.path = path;
- }
-
- public List<LinkedHashMap<String, String>> getParams() {
- return params;
- }
-
- public void setParams(List<LinkedHashMap<String, String>> params) {
- this.params = params;
- }
-
- public String getParamsString() {
- StringBuffer buffer = new StringBuffer();
-
- for(Iterator<LinkedHashMap<String, String>> i = getParams().iterator(); i.hasNext(); ) {
- LinkedHashMap<String, String> param = i.next();
- for(Iterator<String> j = param.keySet().iterator(); j.hasNext(); ) {
- String name = j.next();
- buffer.append(name).append("=").append(param.get(name));
- if (j.hasNext()) {
- buffer.append("&");
- }
- }
- if (i.hasNext()) {
- buffer.append("&");
- }
- }
-
- return buffer.toString();
- }
-
- public SolrQueryConfig clone() throws CloneNotSupportedException {
- SolrQueryConfig queryConfig = null;
-
- try {
- queryConfig = (SolrQueryConfig) super.clone();
- queryConfig.setCore(new String(this.core));
- queryConfig.setCollection(new String(this.collection));
- queryConfig.setParams(new ArrayList<>(this.params));
- }catch (Exception e){
- e.printStackTrace();
- }
-
- return queryConfig;
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrScraperConfig.java
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrScraperConfig.java b/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrScraperConfig.java
deleted file mode 100644
index 3e3a36f..0000000
--- a/solr/contrib/prometheus-exporter/src/java/org/apache/solr/prometheus/scraper/config/SolrScraperConfig.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.solr.prometheus.scraper.config;
-
-import net.thisptr.jackson.jq.exception.JsonQueryException;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * SolrScraperConfig
- */
-public class SolrScraperConfig implements Cloneable {
- private SolrQueryConfig query = new SolrQueryConfig();
- private List<String> jsonQueries = new ArrayList<>();
-
- public SolrQueryConfig getQuery() {
- return this.query;
- }
-
- public void setQuery(SolrQueryConfig query) {
- this.query = query;
- }
-
- public List<String> getJsonQueries() {
- return jsonQueries;
- }
-
- public void setJsonQueries(List<String> jsonQueries) throws JsonQueryException {
- this.jsonQueries = jsonQueries;
- }
-
- public SolrScraperConfig clone() throws CloneNotSupportedException {
- SolrScraperConfig scraperConfig = null;
-
- try {
- scraperConfig = (SolrScraperConfig) super.clone();
- scraperConfig.setQuery(this.query.clone());
- scraperConfig.setJsonQueries(new ArrayList<>(this.jsonQueries));
- }catch (Exception e){
- e.printStackTrace();
- }
-
- return scraperConfig;
- }
-}
http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/f496fd08/solr/contrib/prometheus-exporter/src/java/overview.html
----------------------------------------------------------------------
diff --git a/solr/contrib/prometheus-exporter/src/java/overview.html b/solr/contrib/prometheus-exporter/src/java/overview.html
deleted file mode 100644
index 6c7dfce..0000000
--- a/solr/contrib/prometheus-exporter/src/java/overview.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You under the Apache License, Version 2.0
- (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<html>
-<body>
-Apache Solr Search Server: Solr Prometheus Exporter contrib
-</body>
-</html>