-
Notifications
You must be signed in to change notification settings - Fork 848
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add autoconfiguration wrapper artifact #2401
Changes from 1 commit
ba20433
78d46ea
3603143
0410fef
65c31d4
a72eee1
d696dac
c8c857c
e032f4c
7e0d223
8c670b4
c83836b
7d92ee2
955c59e
113951f
e27dc42
83a5bd8
a1eb942
31853bc
5c386a4
183cfdc
06048d4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
plugins { | ||
id "java-library" | ||
id "maven-publish" | ||
|
||
id "ru.vyarus.animalsniffer" | ||
} | ||
|
||
description = 'OpenTelemetry SDK Auto-configuration' | ||
ext.moduleName = "io.opentelemetry.sdk.autoconfigure" | ||
|
||
dependencies { | ||
api project(':sdk:all'), | ||
project(':sdk:metrics') | ||
|
||
implementation project(':extensions:trace-propagators') | ||
|
||
compileOnly project(':exporters:jaeger') | ||
compileOnly project(':exporters:jaeger-thrift') | ||
compileOnly project(':exporters:logging') | ||
compileOnly project(':exporters:otlp:all') | ||
compileOnly project(':exporters:otlp:metrics') | ||
|
||
compileOnly project(':exporters:prometheus') | ||
compileOnly libraries.prometheus_client_httpserver | ||
|
||
compileOnly project(':exporters:zipkin') | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
/* | ||
* Copyright The OpenTelemetry Authors | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
package io.opentelemetry.sdk.autoconfigure; | ||
|
||
import java.util.AbstractMap; | ||
import java.util.Arrays; | ||
import java.util.Collections; | ||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Locale; | ||
import java.util.Map; | ||
import java.util.Properties; | ||
import java.util.stream.Collectors; | ||
import javax.annotation.Nullable; | ||
|
||
class ConfigProperties { | ||
|
||
static ConfigProperties get() { | ||
return new ConfigProperties(System.getProperties(), System.getenv()); | ||
} | ||
|
||
private final Map<String, String> config; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this should be up above the static methods There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Heh - I'm going to have trouble getting used to fields being so far from the constructor :P There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. that's why static methods should go at the bottom of the class 😁 |
||
|
||
private ConfigProperties(Properties systemProperties, Map<String, String> environmentVariables) { | ||
Map<String, String> config = new HashMap<>(); | ||
environmentVariables.forEach( | ||
(name, value) -> { | ||
config.put(name.toLowerCase(Locale.ROOT).replace('_', '.'), value); | ||
}); | ||
systemProperties.forEach( | ||
(key, value) -> { | ||
config.put(((String) key).toLowerCase(Locale.ROOT), (String) value); | ||
}); | ||
|
||
this.config = config; | ||
} | ||
|
||
@Nullable | ||
String getString(String name) { | ||
return config.get(name); | ||
} | ||
|
||
@Nullable | ||
Integer getInt(String name) { | ||
try { | ||
// Null will throw NumberFormatException too. | ||
return Integer.parseInt(config.get(name)); | ||
} catch (NumberFormatException ex) { | ||
return null; | ||
} | ||
} | ||
|
||
@Nullable | ||
Long getLong(String name) { | ||
try { | ||
// Null will throw NumberFormatException too. | ||
return Long.parseLong(config.get(name)); | ||
} catch (NumberFormatException ex) { | ||
return null; | ||
} | ||
} | ||
|
||
/** | ||
* Get a double property from the config or {@code null} if it cannot be found or it has a wrong | ||
* type. | ||
*/ | ||
@Nullable | ||
Double getDouble(String name) { | ||
try { | ||
return Double.parseDouble(config.get(name)); | ||
} catch (NumberFormatException | NullPointerException ex) { | ||
return null; | ||
} | ||
} | ||
|
||
List<String> getCommaSeparatedValues(String name) { | ||
String value = config.get(name); | ||
if (value == null) { | ||
return Collections.emptyList(); | ||
} | ||
return Arrays.stream(value.split(",")) | ||
.map(String::trim) | ||
.filter(s -> !s.isEmpty()) | ||
.collect(Collectors.toList()); | ||
} | ||
|
||
Map<String, String> getCommaSeparatedMap(String name) { | ||
return getCommaSeparatedValues(name).stream() | ||
.map( | ||
keyValuePair -> | ||
Arrays.stream(keyValuePair.split("=", 2)) | ||
.map(String::trim) | ||
.filter(s -> !s.isEmpty()) | ||
.collect(Collectors.toList())) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. These 4 lines of code could be extracted to a method like "filterBlanksAndNulls" and re-used above at line 96-99 |
||
.map( | ||
splitKeyValuePairs -> | ||
new AbstractMap.SimpleImmutableEntry<>( | ||
splitKeyValuePairs.get(0), splitKeyValuePairs.get(1))) | ||
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); | ||
} | ||
|
||
boolean getBoolean(String name) { | ||
return Boolean.parseBoolean(config.get(name)); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this could also be due to a restrictive security manager
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For a public method, as far as I know there wouldn't be any situation that could be blocked by security manager, is there one?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I thought security managers could block all reflection, but I wouldn't swear to it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes, a security manager can block all reflection, even for public methods, and even just calls to "getMethod", although I would suspect that's extremely rare these days.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Had no idea - do you think I should change the message? Wondering how realistic it is to disable public reflection vs adding noise to this code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe just "This could be a bug in OpenTelemetry" ? Really, it doesn't matter all that much.