Skip to content

Commit 1bb6c34

Browse files
committed
specific metrics for unknown messages
Signed-off-by: Bob Claerhout <claerhout.bob@gmail.com>
1 parent 4a8911a commit 1bb6c34

26 files changed

Lines changed: 502 additions & 8 deletions

adapters/http-base/src/main/java/org/eclipse/hono/adapter/http/AbstractVertxBasedHttpProtocolAdapter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public abstract class AbstractVertxBasedHttpProtocolAdapter<T extends HttpProtoc
8585

8686
private static final String KEY_MATCH_ALL_ROUTE_APPLIED = "matchAllRouteApplied";
8787

88-
private HttpAdapterMetrics metrics = HttpAdapterMetrics.NOOP;
88+
protected HttpAdapterMetrics metrics = HttpAdapterMetrics.NOOP;
8989
private HttpServer server;
9090
private HttpServer insecureServer;
9191

adapters/lora/src/main/java/org/eclipse/hono/adapter/lora/LoraProtocolAdapter.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,17 @@ void handleProviderRoute(final HttpContext ctx, final LoraProvider provider) {
269269
currentSpan.finish();
270270
// discard the message but return 202 to not cause errors on the LoRa provider side
271271
handle202(ctx.getRoutingContext());
272+
273+
//TODO: add metrics
274+
metrics.reportTelemetry(
275+
endpoint,
276+
tenant,
277+
tenantTracker.result(),
278+
MetricsTags.ProcessingOutcome.FORWARDED,
279+
qos,
280+
payloadSize,
281+
ctx.getTtdStatus(),
282+
getMicrometerSample(ctx.getRoutingContext()));
272283
}
273284
} catch (final LoraProviderMalformedPayloadException e) {
274285
LOG.debug("error processing request from provider [name: {}]", provider.getProviderName(), e);
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Copyright (c) 2023 Contributors to the Eclipse Foundation
3+
*
4+
* See the NOTICE file(s) distributed with this work for additional
5+
* information regarding copyright ownership.
6+
*
7+
* This program and the accompanying materials are made available under the
8+
* terms of the Eclipse Public License 2.0 which is available at
9+
* http://www.eclipse.org/legal/epl-2.0
10+
*
11+
* SPDX-License-Identifier: EPL-2.0
12+
*/
13+
14+
15+
package org.eclipse.hono.adapter.lora;
16+
17+
import com.google.common.io.BaseEncoding;
18+
import io.vertx.core.buffer.Buffer;
19+
import io.vertx.core.json.JsonObject;
20+
import java.util.Objects;
21+
22+
23+
/**
24+
* A Lora message that contains unknown data sent from an end-device to a Network Server.
25+
*
26+
*/
27+
public class UnknownLoraMessage implements LoraMessage {
28+
29+
/**
30+
* {@inheritDoc}
31+
*/
32+
@Override
33+
public final byte[] getDevEUI() {
34+
return new byte[0];
35+
}
36+
37+
/**
38+
* {@inheritDoc}
39+
*/
40+
@Override
41+
public final String getDevEUIAsString() {
42+
return "";
43+
}
44+
45+
/**
46+
* {@inheritDoc}
47+
*/
48+
@Override
49+
public final LoraMessageType getType() {
50+
return LoraMessageType.UNKNOWN;
51+
}
52+
53+
/**
54+
* {@inheritDoc}
55+
*/
56+
@Override
57+
public final Buffer getPayload() {
58+
return Buffer.buffer();
59+
}
60+
}

adapters/lora/src/main/java/org/eclipse/hono/adapter/lora/providers/JsonBasedLoraProvider.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.eclipse.hono.adapter.lora.LoraMessage;
2121
import org.eclipse.hono.adapter.lora.LoraMessageType;
2222
import org.eclipse.hono.adapter.lora.LoraMetaData;
23+
import org.eclipse.hono.adapter.lora.UnknownLoraMessage;
2324
import org.eclipse.hono.adapter.lora.UplinkLoraMessage;
2425
import org.eclipse.hono.util.CommandEndpoint;
2526
import org.eclipse.hono.util.Strings;
@@ -51,7 +52,7 @@ public LoraMessage getMessage(final RoutingContext ctx) {
5152
case UPLINK:
5253
return createUplinkMessage(ctx.request(), message);
5354
default:
54-
throw new LoraProviderMalformedPayloadException(String.format("unsupported message type [%s]", type));
55+
return createUnknownMessage(ctx.request(), message);
5556
}
5657
} catch (final RuntimeException e) {
5758
// catch generic exception in order to also cover any (runtime) exceptions
@@ -184,4 +185,26 @@ protected UplinkLoraMessage createUplinkMessage(final HttpServerRequest request,
184185
message.setAdditionalData(getAdditionalData(requestBody));
185186
return message;
186187
}
188+
189+
/**
190+
* Creates an object representation of a Lora unknown message.
191+
* <p>
192+
* This method uses the {@link #getDevEui(JsonObject)}
193+
* method to extract relevant information from the request body to add
194+
* to the returned message.
195+
*
196+
* @param request The request sent by the provider's Network Server.
197+
* @param requestBody The JSON object contained in the request's body.
198+
* @return The message.
199+
* @throws RuntimeException if the message cannot be parsed.
200+
*/
201+
protected UnknownLoraMessage createUnknownMessage(final HttpServerRequest request, final JsonObject requestBody) {
202+
203+
Objects.requireNonNull(requestBody);
204+
205+
final UnknownLoraMessage message = new UnknownLoraMessage();
206+
return message;
207+
}
208+
209+
187210
}

adapters/lora/src/main/java/org/eclipse/hono/adapter/lora/providers/KerlinkProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,10 @@ public Set<String> pathPrefixes() {
7979
*/
8080
@Override
8181
public LoraMessageType getMessageType(final JsonObject loraMessage) {
82-
return LoraMessageType.UPLINK;
82+
if (loraMessage.containsKey(FIELD_KERLINK_PAYLOAD)){
83+
return LoraMessageType.UPLINK;
84+
}
85+
return LoraMessageType.UNKNOWN;
8386
}
8487

8588
@Override

adapters/lora/src/main/java/org/eclipse/hono/adapter/lora/providers/KerlinkProviderCustomContentType.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ public Set<String> pathPrefixes() {
5757
*/
5858
@Override
5959
public LoraMessageType getMessageType(final JsonObject loraMessage) {
60-
return LoraMessageType.UPLINK;
60+
if (loraMessage.containsKey(FIELD_UPLINK_PAYLOAD))
61+
{
62+
return LoraMessageType.UPLINK;
63+
}
64+
return LoraMessageType.UNKNOWN;
6165
}
6266

6367
/**

adapters/lora/src/main/java/org/eclipse/hono/adapter/lora/providers/OrbiwiseProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ protected Buffer getPayload(final JsonObject loraMessage) {
8282
protected LoraMessageType getMessageType(final JsonObject loraMessage) {
8383

8484
Objects.requireNonNull(loraMessage);
85-
return LoraMessageType.UPLINK;
85+
if (loraMessage.containsKey(FIELD_ORBIWISE_PAYLOAD)){
86+
return LoraMessageType.UPLINK;
87+
}
88+
return LoraMessageType.UNKNOWN;
8689
}
8790

8891
@Override

adapters/lora/src/main/java/org/eclipse/hono/adapter/lora/providers/ProximusProvider.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@ public Set<String> pathPrefixes() {
6666
*/
6767
@Override
6868
protected LoraMessageType getMessageType(final JsonObject loraMessage) {
69-
return LoraMessageType.UPLINK;
69+
70+
if (loraMessage.containsKey(FIELD_PROXIMUS_PAYLOAD)){
71+
return LoraMessageType.UPLINK;
72+
}
73+
return LoraMessageType.UNKNOWN;
7074
}
7175

7276
@Override

adapters/lora/src/main/java/org/eclipse/hono/adapter/lora/providers/ThingsNetworkProvider.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,10 @@ public Set<String> pathPrefixes() {
7676
*/
7777
@Override
7878
protected LoraMessageType getMessageType(final JsonObject loraMessage) {
79-
return LoraMessageType.UPLINK;
79+
if (loraMessage.containsKey(FIELD_TTN_PAYLOAD_RAW)){
80+
return LoraMessageType.UPLINK;
81+
}
82+
return LoraMessageType.UNKNOWN;
8083
}
8184

8285
@Override

adapters/lora/src/test/java/org/eclipse/hono/adapter/lora/providers/LoraProviderTestBase.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
import org.eclipse.hono.adapter.lora.LoraCommand;
2626
import org.eclipse.hono.adapter.lora.LoraMessageType;
27+
import org.eclipse.hono.adapter.lora.UnknownLoraMessage;
2728
import org.eclipse.hono.adapter.lora.UplinkLoraMessage;
2829
import org.eclipse.hono.util.CommandEndpoint;
2930
import org.junit.jupiter.api.BeforeEach;
@@ -65,7 +66,7 @@ public abstract class LoraProviderTestBase<T extends LoraProvider> {
6566
*/
6667
protected final RoutingContext getRequestContext(final LoraMessageType type, final String... classifiers) throws IOException {
6768

68-
final Buffer message = LoraTestUtil.loadTestFile(provider.getProviderName(), LoraMessageType.UPLINK, classifiers);
69+
final Buffer message = LoraTestUtil.loadTestFile(provider.getProviderName(), type, classifiers);
6970
final HttpServerRequest request = mock(HttpServerRequest.class);
7071
final RoutingContext routingContext = mock(RoutingContext.class);
7172
when(routingContext.request()).thenReturn(request);
@@ -99,6 +100,19 @@ public void testGetMessageSucceedsForUplinkMessage() throws IOException {
99100
assertMetaDataForUplinkMessage(loraMessage);
100101
}
101102

103+
/**
104+
* Verifies that uplink messages are parsed correctly.
105+
*
106+
* @throws IOException If the file containing the example message could not be loaded.
107+
*/
108+
@Test
109+
public void testGetMessageSucceedsForUnknownMessage() throws IOException {
110+
111+
final RoutingContext request = getRequestContext(LoraMessageType.UNKNOWN);
112+
final UnknownLoraMessage loraMessage = (UnknownLoraMessage) provider.getMessage(request);
113+
assertThat(loraMessage.getType()).isEqualTo(LoraMessageType.UNKNOWN);
114+
}
115+
102116
/**
103117
* Asserts presence of common properties in an uplink message.
104118
*

0 commit comments

Comments
 (0)