Skip to content

Commit 62fc1f2

Browse files
committed
SOLR-17638 Some CLI errors not logged when starting prometheus exporter
1 parent 94e77be commit 62fc1f2

File tree

4 files changed

+67
-20
lines changed

4 files changed

+67
-20
lines changed

solr/CHANGES.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,8 @@ Bug Fixes
269269

270270
* SOLR-17720: Fix rare deadlock in CollectionProperties internals. (Aparna Suresh, Houston Putman)
271271

272+
* SOLR-17638: Some CLI errors not logged when starting prometheus exporter (Alex Deparvu)
273+
272274
Dependency Upgrades
273275
---------------------
274276
* SOLR-17471: Upgrade Lucene to 9.12.1. (Pierre Salagnac, Christine Poerschke)

solr/packaging/test/bats_helper.bash

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ shutdown_all() {
6464

6565
shutdown_exporter(){
6666
EXPORTER_PID=$(ps auxww | grep org.apache.solr.prometheus.exporter.SolrExporter | awk "/-classpath/"' {print $2}' | sort -r)
67-
kill -9 $EXPORTER_PID
67+
if [[ -n $EXPORTER_PID ]]; then
68+
kill -9 $EXPORTER_PID
69+
fi
6870
}
6971

7072
delete_all_collections() {

solr/packaging/test/test_prometheus.bats

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,9 @@ teardown() {
4848
assert_output --partial 'core="COLL_NAME"'
4949
assert_output --partial 'bats-test'
5050
}
51+
52+
@test "unrecognized option logging" {
53+
run ! solr-exporter --unknown-option unknown-option
54+
55+
assert_output --partial 'Unrecognized option: --unknown-option'
56+
}

solr/prometheus-exporter/src/java/org/apache/solr/prometheus/exporter/SolrExporter.java

Lines changed: 56 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.lang.invoke.MethodHandles;
2323
import java.net.InetSocketAddress;
2424
import java.nio.file.Path;
25+
import java.util.Locale;
2526
import java.util.concurrent.ExecutorService;
2627
import org.apache.commons.cli.CommandLine;
2728
import org.apache.commons.cli.CommandLineParser;
@@ -31,9 +32,11 @@
3132
import org.apache.commons.cli.Options;
3233
import org.apache.commons.cli.ParseException;
3334
import org.apache.commons.codec.digest.DigestUtils;
35+
import org.apache.solr.common.util.EnvUtils;
3436
import org.apache.solr.common.util.ExecutorUtil;
3537
import org.apache.solr.common.util.IOUtils;
3638
import org.apache.solr.common.util.SolrNamedThreadFactory;
39+
import org.apache.solr.common.util.SuppressForbidden;
3740
import org.apache.solr.prometheus.collector.MetricsCollectorFactory;
3841
import org.apache.solr.prometheus.collector.SchedulerMetricsCollector;
3942
import org.apache.solr.prometheus.scraper.SolrCloudScraper;
@@ -47,8 +50,7 @@ public class SolrExporter {
4750
private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
4851

4952
private static final int DEFAULT_PORT = 8989;
50-
private static final String DEFAULT_BASE_URL = "http://localhost:8983/solr";
51-
private static final String DEFAULT_ZK_HOST = "";
53+
private static final String DEFAULT_BASE_URL = getDefaultSolrUrl();
5254
private static final String DEFAULT_CONFIG = "solr-exporter-config.xml";
5355
private static final int DEFAULT_SCRAPE_INTERVAL = 60;
5456
private static final Integer DEFAULT_NUM_THREADS = 1;
@@ -147,10 +149,12 @@ public static void main(String[] args) {
147149
Option.builder("s")
148150
.longOpt("solr-url")
149151
.hasArg()
150-
.argName("BASE_URL")
152+
.argName("HOST")
151153
.type(String.class)
152154
.desc(
153-
"Specify the Solr base URL when connecting to Solr in standalone mode. If omitted both the -b parameter and the -z parameter, connect to http://localhost:8983/solr. For example 'http://localhost:8983/solr'.")
155+
"Specify the Solr base URL when connecting to Solr in standalone mode. If omitted both the -s parameter and the -z parameter, connect to "
156+
+ DEFAULT_BASE_URL
157+
+ ".")
154158
.build();
155159
mainOptions.addOption(solrUrlOption);
156160

@@ -243,7 +247,9 @@ public static void main(String[] args) {
243247
.argName("ZK_HOST")
244248
.type(String.class)
245249
.desc(
246-
"Specify the ZooKeeper connection string when connecting to Solr in SolrCloud mode. If omitted both the -b parameter and the -z parameter, connect to http://localhost:8983/solr. For example 'localhost:2181/solr'.")
250+
"Specify the ZooKeeper connection string when connecting to Solr in SolrCloud mode. If omitted both the -s parameter and the -z parameter, connect to "
251+
+ DEFAULT_BASE_URL
252+
+ ".")
247253
.build();
248254
mainOptions.addOption(zkHostOption);
249255

@@ -261,24 +267,27 @@ public static void main(String[] args) {
261267
return;
262268
}
263269

264-
SolrScrapeConfiguration scrapeConfiguration = null;
265-
266-
String defaultClusterId = "";
267-
if (commandLine.hasOption(zkHostOption)) {
268-
String zkHost = commandLine.getOptionValue(zkHostOption, DEFAULT_ZK_HOST);
270+
final SolrScrapeConfiguration scrapeConfiguration;
271+
final String defaultClusterId;
272+
String zkHost = getZkHost(commandLine, zkHostOption);
273+
if (zkHost != null && !zkHost.isBlank()) {
269274
defaultClusterId = makeShortHash(zkHost);
270275
scrapeConfiguration = SolrScrapeConfiguration.solrCloud(zkHost);
271276
} else if (commandLine.hasOption(solrUrlOption)) {
272277
String baseUrl = commandLine.getOptionValue(solrUrlOption);
273278
defaultClusterId = makeShortHash(baseUrl);
274279
scrapeConfiguration = SolrScrapeConfiguration.standalone(baseUrl);
275-
}
276-
277-
if (scrapeConfiguration == null) {
278-
log.error(
279-
"Must provide either --{} or --{}",
280-
solrUrlOption.getLongOpt(),
281-
zkHostOption.getLongOpt());
280+
} else {
281+
String baseUrl = DEFAULT_BASE_URL;
282+
if (log.isInfoEnabled()) {
283+
log.info(
284+
"Neither --{} or --{} parameters provided so assuming solr url is {}",
285+
solrUrlOption.getLongOpt(),
286+
zkHostOption.getLongOpt(),
287+
baseUrl);
288+
}
289+
defaultClusterId = makeShortHash(baseUrl);
290+
scrapeConfiguration = SolrScrapeConfiguration.standalone(baseUrl);
282291
}
283292

284293
int port = commandLine.getParsedOptionValue(portOption, DEFAULT_PORT);
@@ -323,9 +332,9 @@ public static void main(String[] args) {
323332
clusterId,
324333
scrapeConfiguration);
325334
} catch (IOException e) {
326-
log.error("Failed to start Solr Prometheus Exporter: ", e);
335+
exit(1, "Failed to start Solr Prometheus Exporter: " + e.getMessage());
327336
} catch (ParseException e) {
328-
log.error("Failed to parse command line arguments: ", e);
337+
exit(1, "Failed to parse command line arguments: " + e.getMessage());
329338
}
330339
}
331340

@@ -351,4 +360,32 @@ private static MetricsConfiguration loadMetricsConfiguration(String configPath)
351360
private static String getSystemVariable(String name) {
352361
return System.getProperty(name, System.getenv(name));
353362
}
363+
364+
@SuppressForbidden(reason = "For use in command line tools only")
365+
public static void exit(int exitStatus, String message) {
366+
System.err.println(message);
367+
try {
368+
System.exit(exitStatus);
369+
} catch (java.lang.SecurityException secExc) {
370+
if (exitStatus != 0)
371+
throw new RuntimeException("SolrExporter failed to exit with status " + exitStatus);
372+
}
373+
}
374+
375+
// copied over from CLIUtils
376+
private static String getDefaultSolrUrl() {
377+
// note that ENV_VAR syntax (and the env vars too) are mapped to env.var sys props
378+
String scheme = EnvUtils.getProperty("solr.url.scheme", "http");
379+
String host = EnvUtils.getProperty("solr.host", "localhost");
380+
String port = EnvUtils.getProperty("jetty.port", "8983"); // from SOLR_PORT env
381+
return String.format(Locale.ROOT, "%s://%s:%s", scheme.toLowerCase(Locale.ROOT), host, port);
382+
}
383+
384+
public static String getZkHost(CommandLine cli, Option option) {
385+
String zkHost = cli.getOptionValue(option);
386+
if (zkHost != null && !zkHost.isBlank()) {
387+
return zkHost;
388+
}
389+
return EnvUtils.getProperty("zkHost");
390+
}
354391
}

0 commit comments

Comments
 (0)