Skip to content

Commit c844dba

Browse files
committed
Merge remote-tracking branch 'eclipse/master' into release-2.0
Signed-off-by: Thomas Jaeckle <[email protected]>
2 parents 786a591 + 9e8bd52 commit c844dba

File tree

94 files changed

+1618
-729
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

94 files changed

+1618
-729
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
[![Join the chat at https://gitter.im/eclipse/ditto](https://badges.gitter.im/eclipse/ditto.svg)](https://gitter.im/eclipse/ditto?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
88
[![Build Status](https://github.com/eclipse/ditto/workflows/build/badge.svg)](https://github.com/eclipse/ditto/actions?query=workflow%3Abuild)
99
[![Maven Central](https://img.shields.io/maven-central/v/org.eclipse.ditto/ditto?label=maven)](https://search.maven.org/search?q=g:org.eclipse.ditto)
10+
[![Docker pulls](https://img.shields.io/docker/pulls/eclipse/ditto-concierge.svg)](https://hub.docker.com/search?q=eclipse%2Fditto&type=image)
1011
[![License](https://img.shields.io/badge/License-EPL%202.0-green.svg)](https://opensource.org/licenses/EPL-2.0)
1112
[![Lines of code](https://img.shields.io/badge/dynamic/xml.svg?label=Lines%20of%20code&url=https%3A%2F%2Fwww.openhub.net%2Fprojects%2Feclipse-ditto.xml%3Fapi_key%3D11ac3aa12a364fd87b461559a7eedcc53e18fb5a4cf1e43e02cb7a615f1f3d4f&query=%2Fresponse%2Fresult%2Fproject%2Fanalysis%2Ftotal_code_lines&colorB=lightgrey)](https://www.openhub.net/p/eclipse-ditto)
1213

SECURITY.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ These versions of Eclipse Ditto are currently being supported with security upda
66

77
| Version | Supported |
88
| ------- | ------------------ |
9+
| 2.0.x | :white_check_mark: |
910
| 1.5.x | :white_check_mark: |
1011
| < 1.5.0 | :x: |
1112

bom/pom.xml

+17
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@
6060

6161
<slf4j.version>1.7.30</slf4j.version>
6262
<logback.version>1.2.3</logback.version>
63+
<logstash-logback-encoder.version>6.4</logstash-logback-encoder.version>
64+
<janino.version>2.7.8</janino.version>
6365

6466
<!-- ### Metrics and Tracing -->
6567
<kamon-core.version>2.1.4</kamon-core.version>
@@ -362,11 +364,26 @@
362364
<version>${slf4j.version}</version>
363365
</dependency>
364366

367+
<dependency>
368+
<groupId>ch.qos.logback</groupId>
369+
<artifactId>logback-core</artifactId>
370+
<version>${logback.version}</version>
371+
</dependency>
365372
<dependency>
366373
<groupId>ch.qos.logback</groupId>
367374
<artifactId>logback-classic</artifactId>
368375
<version>${logback.version}</version>
369376
</dependency>
377+
<dependency>
378+
<groupId>net.logstash.logback</groupId>
379+
<artifactId>logstash-logback-encoder</artifactId>
380+
<version>${logstash-logback-encoder.version}</version>
381+
</dependency>
382+
<dependency>
383+
<groupId>org.codehaus.janino</groupId>
384+
<artifactId>janino</artifactId>
385+
<version>${janino.version}</version>
386+
</dependency>
370387

371388
<dependency>
372389
<groupId>io.kamon</groupId>

concierge/service/pom.xml

+17
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,20 @@
8585
<artifactId>logback-classic</artifactId>
8686
</dependency>
8787

88+
<!-- logstash appender logging -->
89+
<dependency>
90+
<groupId>org.codehaus.janino</groupId>
91+
<artifactId>janino</artifactId>
92+
</dependency>
93+
<dependency>
94+
<groupId>net.logstash.logback</groupId>
95+
<artifactId>logstash-logback-encoder</artifactId>
96+
</dependency>
97+
<dependency>
98+
<groupId>com.fasterxml.jackson.core</groupId>
99+
<artifactId>jackson-annotations</artifactId>
100+
</dependency>
101+
88102
<!-- ### Testing ### -->
89103
<dependency>
90104
<groupId>org.awaitility</groupId>
@@ -205,6 +219,9 @@
205219
<exclude>META-INF/lmdbjava-LICENSE.txt</exclude>
206220
<exclude>META-INF/lmdbjava-THIRD-PARTY.txt</exclude>
207221
<exclude>META-INF/NOTICE</exclude>
222+
<exclude>META-INF/*.SF</exclude>
223+
<exclude>META-INF/*.DSA</exclude>
224+
<exclude>META-INF/*.RSA</exclude>
208225
</excludes>
209226
</filter>
210227
</filters>

concierge/service/src/main/java/org/eclipse/ditto/concierge/service/enforcement/AbstractEnforcement.java

+19-10
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@
2424
import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException;
2525
import org.eclipse.ditto.base.model.headers.DittoHeaders;
2626
import org.eclipse.ditto.base.model.headers.WithDittoHeaders;
27-
import org.eclipse.ditto.policies.model.enforcers.EffectedSubjects;
28-
import org.eclipse.ditto.policies.model.enforcers.Enforcer;
29-
import org.eclipse.ditto.policies.model.ResourceKey;
30-
import org.eclipse.ditto.things.model.ThingConstants;
31-
import org.eclipse.ditto.policies.api.Permission;
27+
import org.eclipse.ditto.base.model.signals.Signal;
28+
import org.eclipse.ditto.base.model.signals.WithType;
29+
import org.eclipse.ditto.base.model.signals.commands.exceptions.GatewayInternalErrorException;
3230
import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter;
3331
import org.eclipse.ditto.internal.utils.cache.CacheKey;
3432
import org.eclipse.ditto.internal.utils.metrics.instruments.timer.StartedTimer;
35-
import org.eclipse.ditto.base.model.signals.Signal;
36-
import org.eclipse.ditto.base.model.signals.commands.exceptions.GatewayInternalErrorException;
33+
import org.eclipse.ditto.policies.api.Permission;
34+
import org.eclipse.ditto.policies.model.ResourceKey;
35+
import org.eclipse.ditto.policies.model.enforcers.EffectedSubjects;
36+
import org.eclipse.ditto.policies.model.enforcers.Enforcer;
37+
import org.eclipse.ditto.things.model.ThingConstants;
3738

3839
import akka.actor.ActorRef;
3940
import akka.pattern.AskTimeoutException;
@@ -88,10 +89,18 @@ private BiFunction<Contextual<WithDittoHeaders>, Throwable, Contextual<WithDitto
8889
.map(startedTimer -> startedTimer.tag("outcome", throwable != null ? "fail" : "success"))
8990
.ifPresent(StartedTimer::stop);
9091
if (null != result) {
91-
result.getLog().withCorrelationId(result)
92-
.info("Completed enforcement with outcome 'success' and headers: <{}>", result.getDittoHeaders());
92+
final ThreadSafeDittoLoggingAdapter l = result.getLog().withCorrelationId(result);
93+
final String typeHint = result.getMessageOptional()
94+
.filter(WithType.class::isInstance)
95+
.map(msg -> ((WithType) msg).getType())
96+
.orElse("?");
97+
l.info("Completed enforcement of contextual message type <{}> with outcome 'success'",
98+
typeHint);
99+
l.debug("Completed enforcement of contextual message type <{}> with outcome 'success' " +
100+
"and headers: <{}>", typeHint, result.getDittoHeaders());
93101
} else {
94-
log().info("Completed enforcement with outcome 'failed' and headers: <{}>", dittoHeaders());
102+
log().info("Completed enforcement of contextual message with outcome 'failed' and headers: " +
103+
"<{}>", dittoHeaders());
95104
}
96105
return Objects.requireNonNullElseGet(result,
97106
() -> withMessageToReceiver(reportError("Error thrown during enforcement", throwable), sender()));

concierge/service/src/main/java/org/eclipse/ditto/concierge/service/enforcement/Contextual.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ <S extends WithDittoHeaders> Optional<Contextual<S>> tryToMapMessage(final Funct
216216
<S extends WithDittoHeaders> Contextual<S> withReceivedMessage(@Nullable final S message,
217217
@Nullable final ActorRef sender) {
218218
return new Contextual<>(message, self, sender, pubSubMediator, conciergeForwarder, askTimeout,
219-
log, entityIdFor(message), startedTimer, receiver, receiverWrapperFunction, responseReceivers,
219+
log, cacheKeyFor(message), startedTimer, receiver, receiverWrapperFunction, responseReceivers,
220220
askFuture);
221221
}
222222

@@ -239,7 +239,7 @@ Contextual<T> withReceiverWrapperFunction(final Function<Object, Object> receive
239239
}
240240

241241
@Nullable
242-
private static CacheKey entityIdFor(@Nullable final WithDittoHeaders signal) {
242+
private static CacheKey cacheKeyFor(@Nullable final WithDittoHeaders signal) {
243243

244244
if (signal == null) {
245245
return null;
@@ -259,7 +259,7 @@ public String toString() {
259259
"message=" + message +
260260
", self=" + self +
261261
", sender=" + sender +
262-
", entityId=" + cacheKey +
262+
", cacheKey=" + cacheKey +
263263
", receiver=" + receiver +
264264
", receiverWrapperFunction=" + receiverWrapperFunction +
265265
", responseReceivers=" + responseReceivers +

concierge/service/src/main/resources/logback.xml

+53-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,39 @@
3030
</filter>
3131
</appender>
3232

33-
<!--<logger name="akka.actor" level="DEBUG"/>-->
33+
<if condition='isDefined("DITTO_LOGGING_LOGSTASH_SERVER")'>
34+
<then>
35+
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
36+
<destination>${DITTO_LOGGING_LOGSTASH_SERVER}</destination>
37+
38+
<!-- Encoder is required -->
39+
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
40+
<customFields>{"appname":"concierge","instance_index":"${INSTANCE_INDEX}"}</customFields>
41+
</encoder>
42+
</appender>
43+
</then>
44+
</if>
45+
46+
<if condition='isDefined("DITTO_LOGGING_FILE_APPENDER")'>
47+
<then>
48+
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
49+
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
50+
<level>info</level>
51+
</filter>
52+
<file>concierge.log</file>
53+
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
54+
<fileNamePattern>concierge.log.%d{yyyy-MM-dd}.gz</fileNamePattern>
55+
<!-- Keep 30 days' worth of history capped at 1GB total size -->
56+
<maxHistory>${DITTO_LOGGING_MAX_LOG_FILE_HISTORY_IN_DAYS:-10}</maxHistory>
57+
<totalSizeCap>${DITTO_LOGGING_TOTAL_LOG_FILE_SIZE:-1GB}</totalSizeCap>
58+
</rollingPolicy>
59+
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
60+
<customFields>{"appname":"concierge","instance_index":"${INSTANCE_INDEX}"}</customFields>
61+
</encoder>
62+
</appender>
63+
</then>
64+
</if>
65+
3466
<logger name="akka.management.cluster.bootstrap.contactpoint.HttpClusterBootstrapRoutes" level="WARN"/>
3567
<logger name="akka.management.cluster.bootstrap.internal.BootstrapCoordinator" level="WARN"/>
3668

@@ -39,9 +71,27 @@
3971

4072

4173
<root level="${LOG_LEVEL:-INFO}">
42-
<appender-ref ref="STDOUT"/>
43-
<!-- always log ERRORs to syserr -->
74+
<!-- Logging INFO messages can be disabled by setting environment variable -->
75+
<if condition='isNull("DITTO_LOGGING_DISABLE_SYSOUT_LOG")'>
76+
<then>
77+
<appender-ref ref="STDOUT"/>
78+
</then>
79+
</if>
80+
81+
<!-- Always log ERRORs to syserr -->
4482
<appender-ref ref="STDERR"/>
83+
84+
<if condition='isDefined("DITTO_LOGGING_LOGSTASH_SERVER")'>
85+
<then>
86+
<appender-ref ref="stash"/>
87+
</then>
88+
</if>
89+
90+
<if condition='isDefined("DITTO_LOGGING_FILE_APPENDER")'>
91+
<then>
92+
<appender-ref ref="file"/>
93+
</then>
94+
</if>
4595
</root>
4696

4797
</configuration>

connectivity/service/pom.xml

+18
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,21 @@ jmh-generator-annprocess). jmh-generator-annprocess overwrites the whole META-IN
122122
<groupId>org.atteo.classindex</groupId>
123123
<artifactId>classindex</artifactId>
124124
</dependency>
125+
126+
<!-- logstash appender logging -->
127+
<dependency>
128+
<groupId>org.codehaus.janino</groupId>
129+
<artifactId>janino</artifactId>
130+
</dependency>
131+
<dependency>
132+
<groupId>net.logstash.logback</groupId>
133+
<artifactId>logstash-logback-encoder</artifactId>
134+
</dependency>
135+
<dependency>
136+
<groupId>com.fasterxml.jackson.core</groupId>
137+
<artifactId>jackson-annotations</artifactId>
138+
</dependency>
139+
125140
<!-- ### Testing ### -->
126141
<dependency>
127142
<groupId>org.openjdk.jmh</groupId>
@@ -226,6 +241,9 @@ jmh-generator-annprocess). jmh-generator-annprocess overwrites the whole META-IN
226241
<exclude>META-INF/lmdbjava-LICENSE.txt</exclude>
227242
<exclude>META-INF/lmdbjava-THIRD-PARTY.txt</exclude>
228243
<exclude>META-INF/NOTICE</exclude>
244+
<exclude>META-INF/*.SF</exclude>
245+
<exclude>META-INF/*.DSA</exclude>
246+
<exclude>META-INF/*.RSA</exclude>
229247
</excludes>
230248
</filter>
231249
</filters>

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/config/DefaultMqttConfig.java

+34-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.eclipse.ditto.internal.utils.config.ScopedConfig;
2323

2424
import com.typesafe.config.Config;
25+
import com.typesafe.config.ConfigFactory;
2526

2627
/**
2728
* This class is the default implementation of {@link MqttConfig}.
@@ -30,18 +31,27 @@
3031
public final class DefaultMqttConfig implements MqttConfig {
3132

3233
private static final String CONFIG_PATH = "mqtt";
34+
private static final String RECONNECT_BACKOFF_PATH = "reconnect";
3335

3436
private final int sourceBufferSize;
37+
private final int eventLoopThreads;
38+
private final boolean cleanSession;
3539
private final boolean reconnectForRedelivery;
3640
private final boolean useSeparateClientForPublisher;
3741
private final Duration reconnectForRedeliveryDelay;
42+
private final BackOffConfig reconnectBackOffConfig;
3843

3944
private DefaultMqttConfig(final ScopedConfig config) {
4045
sourceBufferSize = config.getInt(MqttConfigValue.SOURCE_BUFFER_SIZE.getConfigPath());
46+
eventLoopThreads = config.getInt(MqttConfigValue.EVENT_LOOP_THREADS.getConfigPath());
47+
cleanSession = config.getBoolean(MqttConfigValue.CLEAN_SESSION.getConfigPath());
4148
reconnectForRedelivery = config.getBoolean(MqttConfigValue.RECONNECT_FOR_REDELIVERY.getConfigPath());
4249
reconnectForRedeliveryDelay =
4350
config.getDuration(MqttConfigValue.RECONNECT_FOR_REDELIVERY_DELAY.getConfigPath());
4451
useSeparateClientForPublisher = config.getBoolean(MqttConfigValue.SEPARATE_PUBLISHER_CLIENT.getConfigPath());
52+
reconnectBackOffConfig = DefaultBackOffConfig.of(config.hasPath(RECONNECT_BACKOFF_PATH)
53+
? config.getConfig(RECONNECT_BACKOFF_PATH)
54+
: ConfigFactory.parseString("backoff" + "={}"));
4555
}
4656

4757
/**
@@ -60,6 +70,16 @@ public int getSourceBufferSize() {
6070
return sourceBufferSize;
6171
}
6272

73+
@Override
74+
public int getEventLoopThreads() {
75+
return eventLoopThreads;
76+
}
77+
78+
@Override
79+
public boolean isCleanSession() {
80+
return cleanSession;
81+
}
82+
6383
@Override
6484
public boolean shouldReconnectForRedelivery() {
6585
return reconnectForRedelivery;
@@ -75,6 +95,11 @@ public boolean shouldUseSeparatePublisherClient() {
7595
return useSeparateClientForPublisher;
7696
}
7797

98+
@Override
99+
public BackOffConfig getReconnectBackOffConfig() {
100+
return reconnectBackOffConfig;
101+
}
102+
78103
@Override
79104
public boolean equals(@Nullable final Object o) {
80105
if (this == o) {
@@ -85,24 +110,30 @@ public boolean equals(@Nullable final Object o) {
85110
}
86111
final DefaultMqttConfig that = (DefaultMqttConfig) o;
87112
return Objects.equals(sourceBufferSize, that.sourceBufferSize) &&
113+
Objects.equals(eventLoopThreads, that.eventLoopThreads) &&
114+
Objects.equals(cleanSession, that.cleanSession) &&
88115
Objects.equals(reconnectForRedelivery, that.reconnectForRedelivery) &&
89116
Objects.equals(reconnectForRedeliveryDelay, that.reconnectForRedeliveryDelay) &&
90-
Objects.equals(useSeparateClientForPublisher, that.useSeparateClientForPublisher);
117+
Objects.equals(useSeparateClientForPublisher, that.useSeparateClientForPublisher) &&
118+
Objects.equals(reconnectBackOffConfig, that.reconnectBackOffConfig);
91119
}
92120

93121
@Override
94122
public int hashCode() {
95-
return Objects.hash(sourceBufferSize, reconnectForRedelivery, reconnectForRedeliveryDelay,
96-
useSeparateClientForPublisher);
123+
return Objects.hash(sourceBufferSize, eventLoopThreads, cleanSession, reconnectForRedelivery,
124+
reconnectForRedeliveryDelay, useSeparateClientForPublisher, reconnectBackOffConfig);
97125
}
98126

99127
@Override
100128
public String toString() {
101129
return getClass().getSimpleName() + " [" +
102130
"sourceBufferSize=" + sourceBufferSize +
131+
", eventLoopThreads=" + eventLoopThreads +
132+
", cleanSession=" + cleanSession +
103133
", reconnectForRedelivery=" + reconnectForRedelivery +
104134
", reconnectForRedeliveryDelay=" + reconnectForRedeliveryDelay +
105135
", useSeparateClientForPublisher=" + useSeparateClientForPublisher +
136+
", reconnectBackOffConfig=" + reconnectBackOffConfig +
106137
"]";
107138
}
108139

0 commit comments

Comments
 (0)