This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new b295b5134ee Add endpoint service location to backlog tracing (#14447)
b295b5134ee is described below
commit b295b5134eea65995dffb4f7ddc9c905c06d0ac1
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jun 10 16:20:16 2024 +0200
Add endpoint service location to backlog tracing (#14447)
CAMEL-20842: Add endpoint service location to backlog tracing
---
.../camel/spi/BacklogTracerEventMessage.java | 26 ++++++++++
.../apache/camel/spi/EndpointServiceLocation.java | 2 +-
.../debugger/DefaultBacklogTracerEventMessage.java | 57 ++++++++++++++++++++++
.../camel/impl/engine/CamelInternalProcessor.java | 11 +++++
.../camel/dsl/jbang/core/commands/Debug.java | 8 ++-
.../core/commands/action/CamelSendAction.java | 2 +-
.../core/commands/action/CamelStubAction.java | 2 +-
.../core/commands/action/CamelTraceAction.java | 8 ++-
.../core/commands/action/MessageTableHelper.java | 32 +++++++++++-
.../commands/action/TransformMessageAction.java | 2 +-
10 files changed, 143 insertions(+), 7 deletions(-)
diff --git
a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java
b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java
index d8ef6204bee..bf2e88adee9 100644
---
a/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java
+++
b/core/camel-api/src/main/java/org/apache/camel/spi/BacklogTracerEventMessage.java
@@ -137,6 +137,32 @@ public interface BacklogTracerEventMessage {
*/
String getEndpointUri();
+ /**
+ * Gets the endpoint remote address such as URL, hostname,
connection-string, or cloud region, that are component
+ * specific.
+ *
+ * @return the address or null if no address can be determined.
+ * @see EndpointServiceLocation
+ */
+ String getEndpointServiceUrl();
+
+ /**
+ * Get the endpoint protocol the service is using such as http, amqp, tcp.
+ *
+ * @see EndpointServiceLocation
+ */
+ String getEndpointServiceProtocol();
+
+ /**
+ * Optional endpoint metadata that is relevant to the service as key value
pairs. Notice that the metadata is not
+ * supposed to contain sensitive security details such as access token,
api keys, or passwords. Only share
+ * information that can be safely accessed and written to logs.
+ *
+ * @return optional metadata or null if no data
+ * @see EndpointServiceLocation
+ */
+ Map<String, String> getEndpointServiceMetadata();
+
/**
* Dumps the event message as XML using the {@link #ROOT_TAG} as root tag.
* <p/>
diff --git
a/core/camel-api/src/main/java/org/apache/camel/spi/EndpointServiceLocation.java
b/core/camel-api/src/main/java/org/apache/camel/spi/EndpointServiceLocation.java
index 403d652c95c..1a32da721f9 100644
---
a/core/camel-api/src/main/java/org/apache/camel/spi/EndpointServiceLocation.java
+++
b/core/camel-api/src/main/java/org/apache/camel/spi/EndpointServiceLocation.java
@@ -32,7 +32,7 @@ import java.util.Map;
public interface EndpointServiceLocation {
/**
- * Gets the remote address such as URL, hostname, or connection-string
that are component specific
+ * Gets the remote address such as URL, hostname, connection-string, or
cloud region, that are component specific.
*
* @return the address or null if no address can be determined.
*/
diff --git
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java
index 9fec3c74143..5db7cc4a226 100644
---
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java
+++
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/debugger/DefaultBacklogTracerEventMessage.java
@@ -41,6 +41,9 @@ public final class DefaultBacklogTracerEventMessage
implements BacklogTracerEven
private final String exchangeId;
private final String threadName;
private String endpointUri;
+ private String endpointServiceUrl;
+ private String endpointServiceProtocol;
+ private Map<String, String> endpointServiceMetadata;
private final boolean rest;
private final boolean template;
private final String messageAsXml;
@@ -194,6 +197,30 @@ public final class DefaultBacklogTracerEventMessage
implements BacklogTracerEven
this.endpointUri = endpointUri;
}
+ public String getEndpointServiceUrl() {
+ return endpointServiceUrl;
+ }
+
+ public void setEndpointServiceUrl(String endpointServiceUrl) {
+ this.endpointServiceUrl = endpointServiceUrl;
+ }
+
+ public String getEndpointServiceProtocol() {
+ return endpointServiceProtocol;
+ }
+
+ public void setEndpointServiceProtocol(String endpointServiceProtocol) {
+ this.endpointServiceProtocol = endpointServiceProtocol;
+ }
+
+ public Map<String, String> getEndpointServiceMetadata() {
+ return endpointServiceMetadata;
+ }
+
+ public void setEndpointServiceMetadata(Map<String, String>
endpointServiceMetadata) {
+ this.endpointServiceMetadata = endpointServiceMetadata;
+ }
+
@Override
public String toString() {
return "DefaultBacklogTracerEventMessage[" + exchangeId + " at " +
toNode + "]";
@@ -239,6 +266,22 @@ public final class DefaultBacklogTracerEventMessage
implements BacklogTracerEven
sb.append(prefix).append("
<toNode>").append(routeId).append("</toNode>\n");
}
sb.append(prefix).append("
<exchangeId>").append(exchangeId).append("</exchangeId>\n");
+ if (endpointServiceUrl != null) {
+ sb.append(prefix).append(" <endpointService>\n");
+ sb.append(prefix).append("
<serviceUrl>").append(endpointServiceUrl).append("</serviceUrl>\n");
+ if (endpointServiceProtocol != null) {
+ sb.append(prefix).append("
<serviceProtocol>").append(endpointServiceProtocol)
+ .append("</serviceProtocol>\n");
+ }
+ if (endpointServiceMetadata != null) {
+ sb.append(prefix).append(" <serviceMetadata>\n");
+ endpointServiceMetadata.forEach((k, v) -> {
+ sb.append(prefix).append("
<").append(k).append(">").append(v).append("</").append(k).append(">\n");
+ });
+ sb.append(prefix).append(" </serviceMetadata>\n");
+ }
+ sb.append(prefix).append(" </endpointService>\n");
+ }
sb.append(prefix).append(messageAsXml).append("\n");
if (exceptionAsXml != null) {
sb.append(prefix).append(exceptionAsXml).append("\n");
@@ -277,6 +320,9 @@ public final class DefaultBacklogTracerEventMessage
implements BacklogTracerEven
if (toNode != null) {
jo.put("nodeId", toNode);
}
+ if (exchangeId != null) {
+ jo.put("exchangeId", exchangeId);
+ }
if (timestamp > 0) {
jo.put("timestamp", timestamp);
}
@@ -284,6 +330,17 @@ public final class DefaultBacklogTracerEventMessage
implements BacklogTracerEven
jo.put("threadName", getProcessingThreadName());
jo.put("done", isDone());
jo.put("failed", isFailed());
+ if (endpointServiceUrl != null) {
+ JsonObject es = new JsonObject();
+ es.put("serviceUrl", endpointServiceUrl);
+ if (endpointServiceProtocol != null) {
+ es.put("serviceProtocol", endpointServiceProtocol);
+ }
+ if (endpointServiceMetadata != null) {
+ es.put("serviceMetadata", endpointServiceMetadata);
+ }
+ jo.put("endpointService", es);
+ }
try {
// parse back to json object and avoid double message root
JsonObject msg = (JsonObject) Jsoner.deserialize(messageAsJSon);
diff --git
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
index 56a061be2e8..235fd733b83 100644
---
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
+++
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
@@ -45,6 +45,7 @@ import org.apache.camel.spi.BacklogDebugger;
import org.apache.camel.spi.CamelEvent;
import org.apache.camel.spi.CamelInternalProcessorAdvice;
import org.apache.camel.spi.Debugger;
+import org.apache.camel.spi.EndpointServiceLocation;
import org.apache.camel.spi.EventNotifier;
import org.apache.camel.spi.InflightRepository;
import org.apache.camel.spi.InternalProcessor;
@@ -646,6 +647,11 @@ public class CamelInternalProcessor extends
DelegateAsyncProcessor implements In
DefaultBacklogTracerEventMessage pseudoFirst = new
DefaultBacklogTracerEventMessage(
true, false,
backlogTracer.incrementTraceCounter(), created, source, routeId, null,
exchangeId,
rest, template, messageAsXml, messageAsJSon);
+ if (exchange.getFromEndpoint() instanceof
EndpointServiceLocation esl) {
+ pseudoFirst.setEndpointServiceUrl(esl.getServiceUrl());
+
pseudoFirst.setEndpointServiceProtocol(esl.getServiceProtocol());
+
pseudoFirst.setEndpointServiceMetadata(esl.getServiceMetadata());
+ }
backlogTracer.traceEvent(pseudoFirst);
exchange.getExchangeExtension().addOnCompletion(createOnCompletion(source,
pseudoFirst));
}
@@ -720,6 +726,11 @@ public class CamelInternalProcessor extends
DelegateAsyncProcessor implements In
if (uri != null) {
data.setEndpointUri(uri);
}
+ if (endpoint instanceof EndpointServiceLocation esl) {
+ data.setEndpointServiceUrl(esl.getServiceUrl());
+ data.setEndpointServiceProtocol(esl.getServiceProtocol());
+ data.setEndpointServiceMetadata(esl.getServiceMetadata());
+ }
if (!data.isFirst() && backlogTracer.isIncludeException()) {
// we want to capture if there was an exception
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
index 49367ed2fd2..f20d7c80735 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Debug.java
@@ -369,6 +369,10 @@ public class Debug extends Run {
}
row.endpoint.put("endpoint", uri);
}
+ JsonObject es = jo.getMap("endpointService");
+ if (es != null) {
+ row.endpointService = es;
+ }
Long ts = jo.getLong("timestamp");
if (ts != null) {
row.timestamp = ts;
@@ -740,7 +744,8 @@ public class Debug extends Run {
}
private String getDataAsTable(SuspendedRow r) {
- return tableHelper.getDataAsTable(r.exchangeId, r.exchangePattern,
r.endpoint, r.message, r.exception);
+ return tableHelper.getDataAsTable(r.exchangeId, r.exchangePattern,
r.endpoint, r.endpointService, r.message,
+ r.exception);
}
private String getStatus(SuspendedRow r) {
@@ -815,6 +820,7 @@ public class Debug extends Run {
boolean done;
boolean failed;
JsonObject endpoint;
+ JsonObject endpointService;
JsonObject message;
JsonObject exception;
List<Code> code = new ArrayList<>();
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
index c5f786e4d52..266b576a11c 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelSendAction.java
@@ -173,7 +173,7 @@ public class CamelSendAction extends ActionBaseCommand {
tableHelper.setPretty(pretty);
tableHelper.setLoggingColor(loggingColor);
tableHelper.setShowExchangeProperties(showExchangeProperties);
- String table = tableHelper.getDataAsTable(exchangeId, mep,
jo, message, cause);
+ String table = tableHelper.getDataAsTable(exchangeId, mep,
jo, null, message, cause);
printer().println(table);
}
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
index 1375fb53343..32880c2d5d3 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelStubAction.java
@@ -294,7 +294,7 @@ public class CamelStubAction extends ActionWatchCommand {
}
String data
=
tableHelper.getDataAsTable(root.getString("exchangeId"),
root.getString("exchangePattern"),
- row.endpoint, root, null);
+ row.endpoint, null, root, null);
if (data != null) {
String[] lines =
data.split(System.lineSeparator());
if (lines.length > 0) {
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
index 36d32527b4a..e15cba05773 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/CamelTraceAction.java
@@ -440,6 +440,10 @@ public class CamelTraceAction extends ActionBaseCommand {
}
row.endpoint.put("endpoint", uri);
}
+ JsonObject es = jo.getMap("endpointService");
+ if (es != null) {
+ row.endpointService = es;
+ }
Long ts = jo.getLong("timestamp");
if (ts != null) {
row.timestamp = ts;
@@ -720,7 +724,8 @@ public class CamelTraceAction extends ActionBaseCommand {
}
private String getDataAsTable(Row r) {
- return tableHelper.getDataAsTable(r.exchangeId, r.exchangePattern,
r.endpoint, r.message, r.exception);
+ return tableHelper.getDataAsTable(r.exchangeId, r.exchangePattern,
r.endpoint, r.endpointService, r.message,
+ r.exception);
}
private String getElapsed(Row r) {
@@ -805,6 +810,7 @@ public class CamelTraceAction extends ActionBaseCommand {
boolean done;
boolean failed;
JsonObject endpoint;
+ JsonObject endpointService;
JsonObject message;
JsonObject exception;
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
index 96731766e93..b7fdc7cadeb 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/MessageTableHelper.java
@@ -19,6 +19,8 @@ package org.apache.camel.dsl.jbang.core.commands.action;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
import com.github.freva.asciitable.AsciiTable;
import com.github.freva.asciitable.Column;
@@ -88,11 +90,13 @@ public class MessageTableHelper {
public String getDataAsTable(
String exchangeId, String exchangePattern,
- JsonObject endpoint, JsonObject root, JsonObject cause) {
+ JsonObject endpoint, JsonObject endpointService,
+ JsonObject root, JsonObject cause) {
List<TableRow> rows = new ArrayList<>();
TableRow eRow;
String tab0 = null;
+ String tab0b = null;
String tab1 = null;
String tab1b = null;
String tab2 = null;
@@ -108,6 +112,29 @@ public class MessageTableHelper {
.minWidth(showExchangeProperties ||
showExchangeVariables ? 12 : 10).with(TableRow::kindAsString),
new
Column().dataAlign(HorizontalAlign.LEFT).with(TableRow::valueAsString)));
}
+ if (endpointService != null) {
+ eRow = new TableRow("Service", null, null,
endpointService.getString("serviceUrl"));
+ TableRow eRow2 = null;
+ StringJoiner sj = new StringJoiner(", ");
+ String protocol = endpointService.getString("serviceProtocol");
+ if (protocol != null) {
+ sj.add("protocol=" + protocol);
+ }
+ Map arr = endpointService.getMap("serviceMetadata");
+ if (arr != null) {
+ arr.forEach((k, v) -> sj.add(k + "=" + v));
+ }
+ if (sj.length() > 0) {
+ String data = "(" + sj + ")";
+ eRow2 = new TableRow(null, null, null, data);
+ }
+ tab0b = AsciiTable.getTable(AsciiTable.NO_BORDERS, eRow2 != null ?
List.of(eRow, eRow2) : List.of(eRow),
+ Arrays.asList(
+ new Column().dataAlign(HorizontalAlign.LEFT)
+ .minWidth(showExchangeProperties ||
showExchangeVariables ? 12 : 10)
+ .with(TableRow::kindAsString),
+ new
Column().dataAlign(HorizontalAlign.LEFT).with(TableRow::valueAsString)));
+ }
if (root != null) {
eRow = new TableRow("Exchange", root.getString("exchangeType"),
exchangePattern, exchangeId);
@@ -224,6 +251,9 @@ public class MessageTableHelper {
if (tab0 != null && !tab0.isEmpty()) {
answer = answer + tab0 + System.lineSeparator();
}
+ if (tab0b != null && !tab0b.isEmpty()) {
+ answer = answer + tab0b + System.lineSeparator();
+ }
if (tab1 != null && tab1b != null && !tab1.isEmpty()) {
answer = answer + tab1 + tab1b + System.lineSeparator();
}
diff --git
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
index a4c0b4d0784..a0c74bb1d33 100644
---
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
+++
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/action/TransformMessageAction.java
@@ -280,7 +280,7 @@ public class TransformMessageAction extends
ActionWatchCommand {
tableHelper.setPretty(pretty);
tableHelper.setLoggingColor(loggingColor);
tableHelper.setShowExchangeProperties(showExchangeProperties);
- String table = tableHelper.getDataAsTable(exchangeId,
"InOut", null, message, cause);
+ String table = tableHelper.getDataAsTable(exchangeId,
"InOut", null, null, message, cause);
printer().println(table);
}
}