summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Fankhauser hiddenalpha.ch2024-04-08 21:29:19 +0200
committerAndreas Fankhauser hiddenalpha.ch2024-04-08 21:29:19 +0200
commit6225d92d39976e6e4177526388a920f42dd07d76 (patch)
tree5e047b02f1c2e8abf5979596f68e6fdd2eecb417
parentb55041beb9c8d2fc60d8657f6d38f665b3418004 (diff)
parent193315d56302bac67b4a1688e892ac499d4052b4 (diff)
downloadUnspecifiedGarbage-6225d92d39976e6e4177526388a920f42dd07d76.zip
UnspecifiedGarbage-6225d92d39976e6e4177526388a920f42dd07d76.tar.gz
Merge remote-tracking branch 'gh-hiddenalpha/master'
-rw-r--r--doc/note/links/links.txt14
-rw-r--r--doc/note/openshift/dbg-mem-issues.txt31
-rw-r--r--doc/note/redis/redis.txt32
-rw-r--r--src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastMetricsOptions.java35
-rw-r--r--src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastVertxMetricsFactory.java27
-rw-r--r--src/main/lua/paisa-logs/DigHoustonLogs.lua371
-rw-r--r--src/main/nodejs/misc/ProduceLotsOfQueues.js119
-rw-r--r--src/main/patch/houston/fixidiots.patch217
-rw-r--r--src/main/patch/houston/future.patch47
9 files changed, 712 insertions, 181 deletions
diff --git a/doc/note/links/links.txt b/doc/note/links/links.txt
index 2d918c2..f90be46 100644
--- a/doc/note/links/links.txt
+++ b/doc/note/links/links.txt
@@ -135,6 +135,9 @@ Links (Aka argument amplifiers)
- [case slf4j](http://www.slf4j.org/api/org/slf4j/Logger.html)
- [General rules](https://gualtierotesta.github.io/java/tutorial-correct-slf4j-logging-usage-and-how-to-check-it/)
- [logging guards](https://stackoverflow.com/a/12953090/4415884)
+- [impl VS facade in lib](https://jira.post.ch/browse/SDCISA-15223)
+- [drop logger impl from lib](https://github.com/swisspost/vertx-redisques/pull/153)
+- [Should my library attempt to configure logging?](https://www.slf4j.org/faq.html#configure_logging)
## Misleading log msg messages
- "https://gitit.post.ch/projects/ISA/repos/zarquon/pull-requests/2/overview?commentId=61283"
@@ -370,7 +373,7 @@ Links (Aka argument amplifiers)
- "https://pubs.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html"
## YAGNI (but also KISS and DRY)
-- [YAGNI, KISS and DRY](https://medium.com/swlh/yagni-and-dry-the-kiss-of-death-for-your-software-project-cfd44b0654b6#fc82)
+- [YAGNI, KISS and DRY](https://medium.com/swlh/yagni-and-dry-the-kiss-of-death-for-your-software-project-cfd44b0654b6)
- [eagle queue json only](https://gitit.post.ch/projects/ISA/repos/eagle/pull-requests/331/overview?commentId=236944)
- [How to repair KISS](https://gitit.post.ch/projects/ISA/repos/preflux/pull-requests/304/diff)
- [won't stream, bcause YAGNI](https://gitit.post.ch/projects/ISA/repos/bangbang/pull-requests/5/overview?commentId=316503)
@@ -578,3 +581,12 @@ Links (Aka argument amplifiers)
## Tools like tcpdump are incredibly important
- [tcpdump discovers the truth once more](https://jira.post.ch/browse/SDCISA-13746?focusedId=1939377&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-1939377)
+## MUST have an issue
+- [no-issue PR gets sued](https://gitit.post.ch/projects/ISA/repos/preflux/pull-requests/721/overview?commentId=349529)
+
+## STOP using stupid local times use UTC
+- [3 simple rules](https://dev.to/corykeane/3-simple-rules-for-effectively-handling-dates-and-timezones-1pe0)
+
+## WARN clustering is NOT the solution
+- [trin kill performance with shared counter](https://gitit.post.ch/projects/ISA/repos/trin/pull-requests/155/overview?commentId=352721)
+
diff --git a/doc/note/openshift/dbg-mem-issues.txt b/doc/note/openshift/dbg-mem-issues.txt
index 0435081..16e574d 100644
--- a/doc/note/openshift/dbg-mem-issues.txt
+++ b/doc/note/openshift/dbg-mem-issues.txt
@@ -136,3 +136,34 @@ true \
&& <"$F" ${MemLeakTry1:?} --date "${DATE:?}" > "${F%.*}.csv" \
;done)
+
+
+
+
+
+
+Zwischenfall auf INT 20231124
+
+
+
+`# Create heap dump`
+com.sun.management.dumpHeap("/usr/local/vertx/houston-storage-file/houston-___-heap-2023____-____Z.hprof", true)
+
+`# Inspect`
+${OC:?} exec -i "$(${OC:?} get pods|egrep ston-[1-9]|cut -f1 -d' ')" -- sh -c 'cd /usr/local/vertx/houston-storage-file && ls -Ahl'
+
+true `# Get made heap dump` \
+ && if test ! -d heapDump; then echo "Dir heapDump missing"; false ;fi \
+ && echo create checksum. \
+ && ${OC:?} exec -i "$(${OC:?} get pods|egrep ston-[1-9]|cut -f1 -d' ')" -- sh -c 'cd /usr/local/vertx/houston-storage-file && md5sum -b houston-*.hprof >> MD5SUM-$(date -u +%Y%m%d-%H%M%SZ)' \
+ && echo checksum done. Begin dload. \
+ && ${OC:?} exec -i "$(${OC:?} get pods|egrep ston-[1-9]|cut -f1 -d' ')" -- sh -c 'cd /usr/local/vertx/houston-storage-file && tar c houston-*.hprof MD5SUM*' | (cd heapDump && tar x) \
+ && echo dload done \
+ && true
+
+
+
+
+
+
+
diff --git a/doc/note/redis/redis.txt b/doc/note/redis/redis.txt
new file mode 100644
index 0000000..d64948a
--- /dev/null
+++ b/doc/note/redis/redis.txt
@@ -0,0 +1,32 @@
+
+Redis
+================
+
+
+## Run redis commands from cli
+
+redis-cli -a ***** SCAN 0
+
+
+## Example commands
+
+SCAN 0 COUNT 42
+TYPE key
+GET redisques:queues:vehicleoperation-events-for-vehicle-9942
+LRANGE key start stop
+LRANGE key 1 1 (get head)
+LRANGE key -1 -1 (get tail)
+
+
+## List all keys (WARN: do NOT in production!)
+
+SCAN 0 MATCH *part:of:key:* COUNT 42
+KEYS *:part:inside-the:key:*
+KEYS redisques:queues:vehicleoperation-events-for-vehicle-*
+
+
+## Delete by pattern
+
+redis-cli --scan --pattern schedulers:* | xargs redis-cli del
+
+
diff --git a/src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastMetricsOptions.java b/src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastMetricsOptions.java
new file mode 100644
index 0000000..c911061
--- /dev/null
+++ b/src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastMetricsOptions.java
@@ -0,0 +1,35 @@
+package ch.hiddenalpha.unspecifiedgarbage.gateleenKludge;
+
+import io.vertx.core.json.JsonObject;
+import io.vertx.core.metrics.MetricsOptions;
+import io.vertx.core.spi.VertxMetricsFactory;
+
+
+public class FailFastMetricsOptions extends io.vertx.core.metrics.MetricsOptions {
+
+ private final String dbgMsg;
+
+ public FailFastMetricsOptions( String dbgMsg ){ this.dbgMsg = dbgMsg; }
+
+ public FailFastMetricsOptions(){ this(failCtor()); }
+
+ private FailFastMetricsOptions( MetricsOptions o ){ this(failCtor()); }
+
+ private FailFastMetricsOptions( JsonObject json ){ this(failCtor()); }
+
+ private static String failCtor(){ throw new IllegalStateException("Do NOT use this ctor!"); }
+
+ @Override public boolean isEnabled(){ throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public MetricsOptions setEnabled(boolean en){ throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public VertxMetricsFactory getFactory(){ throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public MetricsOptions setFactory( VertxMetricsFactory f ){ throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public JsonObject toJson(){ throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public String toString(){ throw new UnsupportedOperationException(dbgMsg); }
+
+}
+
diff --git a/src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastVertxMetricsFactory.java b/src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastVertxMetricsFactory.java
new file mode 100644
index 0000000..fa0d7e1
--- /dev/null
+++ b/src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastVertxMetricsFactory.java
@@ -0,0 +1,27 @@
+package ch.hiddenalpha.unspecifiedgarbage.gateleenKludge;
+
+import io.vertx.core.VertxOptions;
+import io.vertx.core.impl.VertxBuilder;
+import io.vertx.core.json.JsonObject;
+import io.vertx.core.metrics.MetricsOptions;
+import io.vertx.core.spi.metrics.VertxMetrics;
+
+
+public class FailFastVertxMetricsFactory implements io.vertx.core.spi.VertxMetricsFactory {
+
+ private final String dbgMsg;
+
+ public FailFastVertxMetricsFactory(String dbgMsg ){ this.dbgMsg = dbgMsg; }
+
+ @Override public void init(VertxBuilder b) { throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public VertxMetrics metrics(VertxOptions o){ throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public MetricsOptions newOptions() { throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public MetricsOptions newOptions(MetricsOptions o) { throw new UnsupportedOperationException(dbgMsg); }
+
+ @Override public MetricsOptions newOptions(JsonObject j) { throw new UnsupportedOperationException(dbgMsg); }
+
+}
+
diff --git a/src/main/lua/paisa-logs/DigHoustonLogs.lua b/src/main/lua/paisa-logs/DigHoustonLogs.lua
index e217f82..45d4763 100644
--- a/src/main/lua/paisa-logs/DigHoustonLogs.lua
+++ b/src/main/lua/paisa-logs/DigHoustonLogs.lua
@@ -55,7 +55,7 @@ function loadFilters( that )
-- .."\tat org.swisspush.reststorage.FilePutter.FileCleanupManager.lambda.cleanupFile.0.FilePutter.java:192. ~.rest.storage.[0-9.]+.jar:..\n"
-- .."\tat io.vertx.core.impl.future.FutureImpl.3.onSuccess.FutureImpl.java:141. ~.vertx.core.[0-9.]+.jar:[0-9.]+.\n"
-- },
---
+
-- -- Seen: 2023-10-18 prod
-- -- TODO open PR to add some logging so we have a chance to find submarine.
-- { action = "drop", file = "ContextImpl", level = "ERROR",
@@ -102,30 +102,30 @@ function loadFilters( that )
msgPattern = "^%%%w+ %x+ http://eddie%d+:7012/from.houston/%d+/eagle/nsync/v1/push/trillian.phonebooks.affiliated.planning.area.%d+.vehicles"
.." The timeout period of 30000ms has been exceeded while executing POST /from.houston/%d+/eagle/nsync/v1/push/"
.."trillian.phonebooks.affiliated.planning.area.%d+.vehicles for server eddie%d+:7012", },
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
--- .." http://localhost:9089/houston/vehicles/%d+/vehicle/backup/v1/executions/%d+/backup.zip The timeout period of 30000ms has been exceeded"
--- .." while executing PUT /houston/vehicles/%d+/vehicle/backup/v1/executions/%d+/backup.zip for server localhost:9089", },
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
--- .." http://localhost:9089/houston/vehicles/%d+/vehicle/backup/v1/executions/%d+/backup.zip Timeout$" },
--- -- Seen: 2023-10-18 prod
--- -- I guess this happens if an eddie tries to put his "backup.zip" via shaky connection.
--- { action = "drop", file = "FilePutter", level = "ERROR",
--- msgEquals = "Put file failed:\nio.vertx.core.VertxException: Connection was closed", },
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
+ .." http://localhost:9089/houston/vehicles/%d+/vehicle/backup/v1/executions/%d+/backup.zip The timeout period of 30000ms has been exceeded"
+ .." while executing PUT /houston/vehicles/%d+/vehicle/backup/v1/executions/%d+/backup.zip for server localhost:9089", },
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
+ .." http://localhost:9089/houston/vehicles/%d+/vehicle/backup/v1/executions/%d+/backup.zip Timeout$" },
+ -- Seen: 2023-10-18 prod
+ -- I guess this happens if an eddie tries to put his "backup.zip" via shaky connection.
+ { action = "drop", file = "FilePutter", level = "ERROR",
+ msgEquals = "Put file failed:\nio.vertx.core.VertxException: Connection was closed", },
-- Seen: 2024-01-10 prod, 2023-10-18 prod
-- There are a whole bunch of related errors behind this filter which AFAICT all relate to shaky eddie connections.
{ action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+ http://eddie%d+:7012/from.houston/%d+/eagle/[^ ]+"
.." The timeout period of 30000ms has been exceeded while executing [DEGLOPSTU]+ /from.houston/%d+/eagle/[^ ]+ for server eddie%d+:7012$", },
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "Forwarder", level = "ERROR",
--- msgPattern = "^%%%w+ %x+ http://eddie%d+:7012/from.houston/%d+/eagle/[^ ]+ Connection was closed$", },
---
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "ConnectionBase", level = "ERROR", msgEquals = "Connection reset by peer", },
---
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "EventBusBridgeImpl", level = "ERROR", msgEquals = "SockJSSocket exception\nio.vertx.core.VertxException: Connection was closed", },
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "^%%%w+ %x+ http://eddie%d+:7012/from.houston/%d+/eagle/[^ ]+ Connection was closed$", },
+
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "ConnectionBase", level = "ERROR", msgEquals = "Connection reset by peer", },
+
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "EventBusBridgeImpl", level = "ERROR", msgEquals = "SockJSSocket exception\nio.vertx.core.VertxException: Connection was closed", },
-- Seen: 2024-01-05 prod, 2023-10-18 prod
-- Reported: TODO link existing issue here
@@ -168,64 +168,64 @@ function loadFilters( that )
{ action = "drop", file = "Utils", level = "ERROR", msgPattern = "^Exception occurred\n"
.."io.vertx.core.eventbus.ReplyException: Timed out after waiting 30000.ms. for a reply. address: __vertx.reply.[0-9]+, repliedAddress: nsync.register.sync" },
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "HttpClientRequestImpl", level = "ERROR",
--- msgEquals = "Connection was closed\nio.vertx.core.VertxException: Connection was closed", },
---
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "Forwarder", level = "ERROR",
--- msgPattern = "^..... ................................ http://bistr:8080/bistr/vending/accounting/v1/information/lastSessionEnd Connection was closed$", },
---
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "Forwarder", level = "ERROR",
--- msgPattern = "..... ................................ http://bob:8080/bob/vending/transaction/v1/systems/%d+/dates/[0-9-]+/transactions/%d+/start"
--- .." The timeout period of 30000ms has been exceeded while executing PUT /bob/vending/transaction/v1/systems/%d+/dates/[0-9-]+/transactions/%d+/start"
--- .." for server bob:8080", },
---
--- -- Seen: 2023-10-18 prod
--- { action = "drop", file = "ContextImpl", level = "ERROR", msgEquals = "Unhandled exception\njava.lang.IllegalStateException: null",
--- stackStartsWith = ""
--- .."\tat io.vertx.core.http.impl.HttpClientResponseImpl.checkEnded(HttpClientResponseImpl.java:150) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.http.impl.HttpClientResponseImpl.endHandler(HttpClientResponseImpl.java:172) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat org.swisspush.gateleen.routing.Forwarder.lambda$getAsyncHttpClientResponseHandler$7(Forwarder.java:476) ~[gateleen-routing-1.3.25.jar:?]\n"
--- .."\tat io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.impl.future.FutureImpl.addListener(FutureImpl.java:196) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.impl.future.PromiseImpl.addListener(PromiseImpl.java:23) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.impl.future.FutureImpl.onComplete(FutureImpl.java:164) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.impl.future.PromiseImpl.onComplete(PromiseImpl.java:23) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.http.impl.HttpClientRequestBase.response(HttpClientRequestBase.java:240) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat io.vertx.core.http.HttpClientRequest.send(HttpClientRequest.java:330) ~[vertx-core-4.2.1.jar:4.2.1]\n"
--- .."\tat org.swisspush.gateleen.routing.Forwarder$1.lambda$handle$1(Forwarder.java:377) ~[gateleen-routing-1.3.25.jar:?]\n"
--- .."\tat org.swisspush.gateleen.core.http.BufferBridge.lambda$pump$0(BufferBridge.java:43) ~[gateleen-core-1.3.25.jar:?]\n"
--- .."\tat io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:100) ~[vertx-core-4.2.1.jar:4.2.1]\n",
--- },
---
--- -- Seen: 2023-10-18 prod
--- -- TODO Push issue to my backlog to fix this.
--- { action = "drop", file = "ContextImpl", level = "ERROR",
--- msgEquals = "Unhandled exception\njava.lang.UnsupportedOperationException: Do override this method to mock expected behaviour.",
--- stackPattern = "^"
--- .."\tat org.swisspush.gateleen.core.http.FastFailHttpServerResponse.drainHandler.FastFailHttpServerResponse.java:41. ~.gateleen.core.[0-9.]+.jar:..\n"
--- .."\tat org.swisspush.gateleen.core.http.FastFailHttpServerResponse.drainHandler.FastFailHttpServerResponse.java:24. ~.gateleen.core.[0-9.]+.jar:..\n"
--- .."\tat org.swisspush.gateleen.logging.LoggingWriteStream.drainHandler.LoggingWriteStream.java:73. ~.gateleen.logging.[0-9.]+.jar:..\n"
--- .."\tat io.vertx.core.streams.impl.PumpImpl.stop.PumpImpl.java:95. ~.vertx.core.[0-9.]+.jar:[0-9.]+]\n"
--- .."\tat io.vertx.core.streams.impl.PumpImpl.stop.PumpImpl.java:39. ~.vertx.core.[0-9.]+.jar:[0-9.]+]\n"
--- .."\tat org.swisspush.gateleen.routing.Forwarder.lambda$getAsyncHttpClientResponseHandler.4.Forwarder.java:494. ~.gateleen.routing.[0-9.]+.jar:..\n"
--- .."\tat org.swisspush.gateleen.routing.Forwarder.lambda$getAsyncHttpClientResponseHandler.5.Forwarder.java:503. ~.gateleen.routing.[0-9.]+.jar:..\n"
--- .."\tat io.vertx.core.impl.AbstractContext.dispatch.AbstractContext.java:100. ~.vertx.core.[0-9.]+.jar:[0-9.]+.\n",
--- },
---
--- { action = "drop", file = "Forwarder", level = "ERROR",
--- msgPattern = "^..... ................................ http://thought:8080/thought/vehicleoperation/recording/v1/events The timeout period of 60000ms has been exceeded while executing PUT /thought/vehicleoperation/recording/v1/events for server thought:8080$",
--- },
---
--- -- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
--- { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
--- .." http://eddie%d+:7012/from.houston/%d+/eagle/vending/accounting/v1/users/%d+/years/%d+/months/%d%d/account Connection was closed$", },
--- -- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
--- { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
--- .." http://eddie%d+:7012/from.houston/%d+/eagle/nsync/v1/push/trillian.phonebooks.affiliated.planning.area.%d+.vehicles Connection was closed$", },
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "HttpClientRequestImpl", level = "ERROR",
+ msgEquals = "Connection was closed\nio.vertx.core.VertxException: Connection was closed", },
+
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "^..... ................................ http://bistr:8080/bistr/vending/accounting/v1/information/lastSessionEnd Connection was closed$", },
+
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "..... ................................ http://bob:8080/bob/vending/transaction/v1/systems/%d+/dates/[0-9-]+/transactions/%d+/start"
+ .." The timeout period of 30000ms has been exceeded while executing PUT /bob/vending/transaction/v1/systems/%d+/dates/[0-9-]+/transactions/%d+/start"
+ .." for server bob:8080", },
+
+ -- Seen: 2023-10-18 prod
+ { action = "drop", file = "ContextImpl", level = "ERROR", msgEquals = "Unhandled exception\njava.lang.IllegalStateException: null",
+ stackStartsWith = ""
+ .."\tat io.vertx.core.http.impl.HttpClientResponseImpl.checkEnded(HttpClientResponseImpl.java:150) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.http.impl.HttpClientResponseImpl.endHandler(HttpClientResponseImpl.java:172) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat org.swisspush.gateleen.routing.Forwarder.lambda$getAsyncHttpClientResponseHandler$7(Forwarder.java:476) ~[gateleen-routing-1.3.25.jar:?]\n"
+ .."\tat io.vertx.core.impl.future.FutureImpl$3.onSuccess(FutureImpl.java:141) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.impl.future.FutureImpl.addListener(FutureImpl.java:196) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.impl.future.PromiseImpl.addListener(PromiseImpl.java:23) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.impl.future.FutureImpl.onComplete(FutureImpl.java:164) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.impl.future.PromiseImpl.onComplete(PromiseImpl.java:23) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.http.impl.HttpClientRequestBase.response(HttpClientRequestBase.java:240) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat io.vertx.core.http.HttpClientRequest.send(HttpClientRequest.java:330) ~[vertx-core-4.2.1.jar:4.2.1]\n"
+ .."\tat org.swisspush.gateleen.routing.Forwarder$1.lambda$handle$1(Forwarder.java:377) ~[gateleen-routing-1.3.25.jar:?]\n"
+ .."\tat org.swisspush.gateleen.core.http.BufferBridge.lambda$pump$0(BufferBridge.java:43) ~[gateleen-core-1.3.25.jar:?]\n"
+ .."\tat io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:100) ~[vertx-core-4.2.1.jar:4.2.1]\n",
+ },
+
+ -- Seen: 2023-10-18 prod
+ -- TODO Push issue to my backlog to fix this.
+ { action = "drop", file = "ContextImpl", level = "ERROR",
+ msgEquals = "Unhandled exception\njava.lang.UnsupportedOperationException: Do override this method to mock expected behaviour.",
+ stackPattern = "^"
+ .."\tat org.swisspush.gateleen.core.http.FastFailHttpServerResponse.drainHandler.FastFailHttpServerResponse.java:41. ~.gateleen.core.[0-9.]+.jar:..\n"
+ .."\tat org.swisspush.gateleen.core.http.FastFailHttpServerResponse.drainHandler.FastFailHttpServerResponse.java:24. ~.gateleen.core.[0-9.]+.jar:..\n"
+ .."\tat org.swisspush.gateleen.logging.LoggingWriteStream.drainHandler.LoggingWriteStream.java:73. ~.gateleen.logging.[0-9.]+.jar:..\n"
+ .."\tat io.vertx.core.streams.impl.PumpImpl.stop.PumpImpl.java:95. ~.vertx.core.[0-9.]+.jar:[0-9.]+]\n"
+ .."\tat io.vertx.core.streams.impl.PumpImpl.stop.PumpImpl.java:39. ~.vertx.core.[0-9.]+.jar:[0-9.]+]\n"
+ .."\tat org.swisspush.gateleen.routing.Forwarder.lambda$getAsyncHttpClientResponseHandler.4.Forwarder.java:494. ~.gateleen.routing.[0-9.]+.jar:..\n"
+ .."\tat org.swisspush.gateleen.routing.Forwarder.lambda$getAsyncHttpClientResponseHandler.5.Forwarder.java:503. ~.gateleen.routing.[0-9.]+.jar:..\n"
+ .."\tat io.vertx.core.impl.AbstractContext.dispatch.AbstractContext.java:100. ~.vertx.core.[0-9.]+.jar:[0-9.]+.\n",
+ },
+
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "^..... ................................ http://thought:8080/thought/vehicleoperation/recording/v1/events The timeout period of 60000ms has been exceeded while executing PUT /thought/vehicleoperation/recording/v1/events for server thought:8080$",
+ },
+
+ -- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
+ { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
+ .." http://eddie%d+:7012/from.houston/%d+/eagle/vending/accounting/v1/users/%d+/years/%d+/months/%d%d/account Connection was closed$", },
+ -- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
+ { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
+ .." http://eddie%d+:7012/from.houston/%d+/eagle/nsync/v1/push/trillian.phonebooks.affiliated.planning.area.%d+.vehicles Connection was closed$", },
-- Seen 2024-01-10 prod
-- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
{ action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
@@ -234,112 +234,123 @@ function loadFilters( that )
-- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
{ action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+"
.." http://eddie%d+:7012/from.houston/%d+/eagle/timetable/notification/v1/planningareas/%d+/notifications/%x+ Connection was closed$", },
--- -- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
--- { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+ http://eddie%d+:7012/from.houston/%d+/eagle/nsync/v1/push/trillian.phonebooks.affiliated.planning.area.%d+.vehicles Connection reset by peer$", },
-
- ---- TODO Thought timeout? Can happen. But how often is ok?
- ---- HINT: Occurred 15 times in 6 hrs (avg 1x per 24min) (2021-09-17_12:00 to 2021-09-17_18:00)
- ---- Seen 2022-06-20, 2022-08-30 prod
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "http://[aghilmostuwy]+:8080/[aghilmostuwy]+/vehicleoperation/recording/v1/.+ Timeout", },
-
- ---- [SDCISA-9572] pag
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "http://[8acgilmnpsvwy]+:[78]080/[_aegilmopstwy]+/.+ Connection was closed", },
-
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "t.ch:7022/brox/from/vehicles/.+Connection refused: ", },
-
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = " http://%w+.pnet.ch:7022/brox/info Connection refused: %w+.pnet.ch/[%d.]+:7022" },
-
- ---- TODO Analyze
- ---- Observed 20014 times within 6 hrs (~1/sec) (2021-09-17_12:00 to 2021-09-17_18:00)
- ---- HINT: Eddie connections issues also have around 20000 occurrences. Maybe related?
- ---- Seen: 2021-09-17
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "http://eddie%d+:7012/from.houston/[^/]+/eagle/[^ ]+ Response already written. Not sure about the"
- -- .." state. Closing server connection for stability reason", },
-
- ---- TODO Analyze
- ---- HINT: Occurred 1538 times in 6 hrs (~ 1x per 15sec) (2021-09-17_12:00 to 2021-09-17_18:00)
- --{ action = "drop", file = "Forwarder", level = "WARN",
- -- msgPattern = "Failed to '[^ ]+ /from%-houston/%d+/eagle/.+'\n.+VertxException: Connection was closed", },
-
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "http://eddie%d+:7012/from%-houston/%d+/eagle/.+ Connection was closed", },
-
- ---- TODO Analyze
- ---- Seen: 2021-09-17, ..., 2022-06-20
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "http://pag:8080/pag/user/information/v1/directory/sync/request Timeout", },
-
- ---- Seen 2021-10-25, 2022-08-30 prod
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "http://[8acgilmnpsvwy]+:8080/[_aegilmopstwy]+/.+ Response already written. Not sure about the"
- -- .." state. Closing server connection for stability reason", },
-
- ---- TODO Analyze.
- ---- Seen 2021-09-17, 2022-06-20
- --{ action = "drop", file = "BisectClient", level = "WARN",
- -- msgPattern = "statusCode=503 received for POST /houston/routes/vehicles/%d+/eagle/nsync/v1/query%-index", },
- ---- Seen 2022-06-20 prod
- --{ action = "drop", file = "BisectClient", level = "WARN",
- -- msgPattern = "statusCode=504 received for POST /houston/routes/vehicles/%d+/eagle/nsync/v1/query%-index", },
- ---- TODO rm filter when fixed
- ---- Reported: SDCISA-9573
- ---- Seen: 2022-08-30 prod, 2022-06-20, 2021-09-17
- --{ action = "drop", file = "BisectClient", level = "WARN",
- -- msgPattern = "Index id=slarti%-vehicle%-setup%-sync%-%d+ rootPath=/houston/from/vehicles/%d+/vehicle/setup/v1 size=%d+ not %(nor no more%) ready. Aborting BisectClient", },
-
- ---- Reported: SDCISA-9574
- ---- TODO rm when resolved
- ---- Seen: 2021-09-17 2022-06-20, 2022-08-30 prod,
- --{ action = "drop", file = "Utils", level = "ERROR",
- -- msgPattern = "Exception occurred\n%(RECIPIENT_FAILURE,500%) Sync failed.\n{.+}", },
-
- ---- TODO Analyze
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "http://preflux:8080/preflux/data/preflux/rollout/hosts/eddie%d+/instances/default/situation Timeout", },
-
- ---- TODO Analyze.
- ---- Seen 2022-08-30 prod, 2022-06-20, 2021-09-17
- --{ action = "drop", file = "RedisQues", level = "WARN",
- -- msgPattern = "Registration for queue .+ has changed to null", },
-
--- -- Reported: SDCISA-10973
--- -- Seen: 2023-10-18 prod.
--- { action = "drop", file = "HttpClientRequestImpl", level = "ERROR",
--- msgPattern = "The timeout period of 30000ms has been exceeded while executing PUT /houston/vehicles/[0-9]+"
--- .."/vehicle/backup/v1/executions/[0-9]+/backup.zip for server localhost:9089", },
+ -- WELL_KNOWN: I guess happens when vehicle looses connection. Seen 2023-10-18 prod.
+ { action = "drop", file = "Forwarder", level = "ERROR", msgPattern = "^%%%w+ %x+ http://eddie%d+:7012/from.houston/%d+/eagle/nsync/v1/push/trillian.phonebooks.affiliated.planning.area.%d+.vehicles Connection reset by peer$", },
+
+ -- TODO Thought timeout? Can happen. But how often is ok?
+ -- HINT: Occurred 15 times in 6 hrs (avg 1x per 24min) (2021-09-17_12:00 to 2021-09-17_18:00)
+ -- Seen 2022-06-20, 2022-08-30 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "http://[aghilmostuwy]+:8080/[aghilmostuwy]+/vehicleoperation/recording/v1/.+ Timeout", },
+
+ -- [SDCISA-9572] pag
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "http://[8acgilmnpsvwy]+:[78]080/[_aegilmopstwy]+/.+ Connection was closed", },
+
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "t.ch:7022/brox/from/vehicles/.+Connection refused: ", },
+
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = " http://%w+.pnet.ch:7022/brox/info Connection refused: %w+.pnet.ch/[%d.]+:7022" },
+
+ -- TODO Analyze
+ -- Observed 20014 times within 6 hrs (~1/sec) (2021-09-17_12:00 to 2021-09-17_18:00)
+ -- HINT: Eddie connections issues also have around 20000 occurrences. Maybe related?
+ -- Seen: 2021-09-17
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "http://eddie%d+:7012/from.houston/[^/]+/eagle/[^ ]+ Response already written. Not sure about the"
+ .." state. Closing server connection for stability reason", },
+
+ -- TODO Analyze
+ -- HINT: Occurred 1538 times in 6 hrs (~ 1x per 15sec) (2021-09-17_12:00 to 2021-09-17_18:00)
+ { action = "drop", file = "Forwarder", level = "WARN",
+ msgPattern = "Failed to '[^ ]+ /from%-houston/%d+/eagle/.+'\n.+VertxException: Connection was closed", },
+
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "http://eddie%d+:7012/from%-houston/%d+/eagle/.+ Connection was closed", },
+
+ -- TODO Analyze
+ -- Seen: 2021-09-17, ..., 2022-06-20
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "http://pag:8080/pag/user/information/v1/directory/sync/request Timeout", },
+
+ -- Seen 2021-10-25, 2022-08-30 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "http://[8acgilmnpsvwy]+:8080/[_aegilmopstwy]+/.+ Response already written. Not sure about the"
+ .." state. Closing server connection for stability reason", },
+
+ -- TODO Analyze.
+ -- Seen 2021-09-17, 2022-06-20
+ { action = "drop", file = "BisectClient", level = "WARN",
+ msgPattern = "statusCode=503 received for POST /houston/routes/vehicles/%d+/eagle/nsync/v1/query%-index", },
+ -- Seen 2022-06-20 prod
+ { action = "drop", file = "BisectClient", level = "WARN",
+ msgPattern = "statusCode=504 received for POST /houston/routes/vehicles/%d+/eagle/nsync/v1/query%-index", },
+ -- TODO rm filter when fixed
+ -- Reported: SDCISA-9573
+ -- Seen: 2022-08-30 prod, 2022-06-20, 2021-09-17
+ { action = "drop", file = "BisectClient", level = "WARN",
+ msgPattern = "Index id=slarti%-vehicle%-setup%-sync%-%d+ rootPath=/houston/from/vehicles/%d+/vehicle/setup/v1 size=%d+ not %(nor no more%) ready. Aborting BisectClient", },
+
+ -- Reported: SDCISA-9574
+ -- TODO rm when resolved
+ -- Seen: 2021-09-17 2022-06-20, 2022-08-30 prod,
+ { action = "drop", file = "Utils", level = "ERROR",
+ msgPattern = "Exception occurred\n%(RECIPIENT_FAILURE,500%) Sync failed.\n{.+}", },
+
+ -- TODO Analyze
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "http://preflux:8080/preflux/data/preflux/rollout/hosts/eddie%d+/instances/default/situation Timeout", },
+
+ -- TODO Analyze.
+ -- Seen 2022-08-30 prod, 2022-06-20, 2021-09-17
+ { action = "drop", file = "RedisQues", level = "WARN",
+ msgPattern = "Registration for queue .+ has changed to null", },
+
+ -- Reported: SDCISA-10973
+ -- Seen: 2023-10-18 prod.
+ { action = "drop", file = "HttpClientRequestImpl", level = "ERROR",
+ msgPattern = "The timeout period of 30000ms has been exceeded while executing PUT /houston/vehicles/[0-9]+"
+ .."/vehicle/backup/v1/executions/[0-9]+/backup.zip for server localhost:9089", },
-- Seen 2024-01-10 prod
{ action = "drop", file = "HttpClientRequestImpl", level = "ERROR",
msgPattern = "The timeout period of 30000ms has been exceeded while executing POST /from.houston/%d+/eagle/nsync/v1/push/trillian.phonebooks.affiliated.planning.area.%d+.vehicles for server eddie%d+:7012" },
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = "[%a-z0-9]+ [a-z0-9]+ http://eddie.....:7012/from%-houston/[^/]+/eagle/nsync/v1/push/trillian"
- -- .."%-phonebooks%-affiliated%-planning%-area%-[^-]+%-vehicles The timeout period of 30000ms has been"
- -- .." exceeded while executing POST /from%-houston/[0-9]+/eagle/nsync/v1/push/trillian%-phonebooks"
- -- .."%-affiliated%-planning%-area%-[^%-]+-vehicles for server eddie.....:7012", },
-
- ---- Reported: SDCISA-9578
- ---- TODO rm when fixed
- ---- Seen 2022-08-30 prod, 2022-06-20 prod
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/navigation/location/v1/position/collected"
- -- .." Connection reset by peer", },
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/navigation/location/v1/position/collected"
- -- .." Connection was closed", },
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/navigation/location/v1/position/collected"
- -- .." Response already written. Not sure about the state. Closing server connection for stability reason", },
-
- ---- TODO analyze
- ---- Seen 2022-06-20 prod
- --{ action = "drop", file = "Forwarder", level = "ERROR",
- -- msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/timetable/private/v1/trip/state/%w+.xml Connection was closed", },
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "[%a-z0-9]+ [a-z0-9]+ http://eddie.....:7012/from%-houston/[^/]+/eagle/nsync/v1/push/trillian"
+ .."%-phonebooks%-affiliated%-planning%-area%-[^-]+%-vehicles The timeout period of 30000ms has been"
+ .." exceeded while executing POST /from%-houston/[0-9]+/eagle/nsync/v1/push/trillian%-phonebooks"
+ .."%-affiliated%-planning%-area%-[^%-]+-vehicles for server eddie.....:7012", },
+
+ -- Reported: SDCISA-9578
+ -- TODO rm when fixed
+ -- Seen 2022-08-30 prod, 2022-06-20 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/navigation/location/v1/position/collected"
+ .." Connection reset by peer", },
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/navigation/location/v1/position/collected"
+ .." Connection was closed", },
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/navigation/location/v1/position/collected"
+ .." Response already written. Not sure about the state. Closing server connection for stability reason", },
+
+ -- TODO analyze
+ -- Seen 2024-03-20 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = "^..... [a-z0-9]+ http://vhfspa1.pnet.ch:7096/timetable/information/v1/tripinfo%?id%=I%-" },
+
+ -- TODO analyze
+ -- Seen 2022-06-20 prod
+ { action = "drop", file = "Forwarder", level = "ERROR",
+ msgPattern = " http://vhfspa1.pnet.ch:7022/brox/from/vehicles/[^/]+/timetable/private/v1/trip/state/%w+.xml Connection was closed", },
+
+ -- TODO analyze
+ -- Seen 2024-03-20 prod
+ { action = "drop", file = "ContextImpl", level = "ERROR",
+ msgPattern = "^Unhandled exception\njava.lang.IllegalStateException: Response head already sent", },
+
}
end
diff --git a/src/main/nodejs/misc/ProduceLotsOfQueues.js b/src/main/nodejs/misc/ProduceLotsOfQueues.js
new file mode 100644
index 0000000..810ac63
--- /dev/null
+++ b/src/main/nodejs/misc/ProduceLotsOfQueues.js
@@ -0,0 +1,119 @@
+;(function(){
+
+ const http = require("http");
+ const log = process.stderr;
+ const out = process.stdout;
+ const NOOP = function(){};
+
+ setTimeout(main); return;
+
+
+ function main(){
+ const app = Object.seal({
+ isHelp: false,
+ host: "localhost",
+ port: 7013,
+ uri: "/houston/tmp/gugus/bar",
+ queueName: "my-gaga-queue",
+ });
+ if( parseArgs(app, process.argv) !== 0 ) process.exit(1);
+ if( app.isHelp ){ printHelp(); return; }
+ run(app);
+ }
+
+
+
+ function printHelp(){
+ out.write("\n"
+ +" Produce a bunch of gateleen queues\n"
+ +" \n"
+ +" Options:\n"
+ +" \n"
+ +" \n")
+ }
+
+
+ function parseArgs( app, argv ){
+ var isYolo = false;
+ for( var iA = 2 ; iA < argv.length ; ++iA ){
+ var arg = argv[iA];
+ if( arg == "--help" ){
+ app.isHelp = true; return 0;
+ }else if( arg == "--yolo" ){
+ isYolo = true;
+ }else{
+ log.write("EINVAL: "+ arg +"\n");
+ return -1;
+ }
+ }
+ if( !isYolo ){ log.write("EINVAL: wanna yolo?\n"); return; }
+ return 0;
+ }
+
+
+ function run( app ){
+ //placeHook(app);
+ putSomeNonsense(app);
+ }
+
+
+ function placeHook( app ){
+ const req = Object.seal({
+ base: null,
+ app: app,
+ });
+ req.base = http.request({
+ host: app.host, port: app.port,
+ method: "PUT", path: app.uri +"/_hooks/listeners/http",
+ //headers: {
+ // "X-Expire-After": "42",
+ //},
+ });
+ req.base.on("response", onResponse.bind(0, req));
+ req.base.end(JSON.stringify({
+ destination: "http://127.0.0.1:7099/guguseli",
+ queueExpireAfter/*seconds*/: 42,
+ }));
+ function onResponse( req, rsp ){
+ var app = req.app;
+ log.write("[DEBUG] < HTTP/"+ rsp.httpVersion +" "+ rsp.statusCode +" "+ rsp.statusMessage +"\n");
+ for( var k of Object.keys(rsp.headers) ) log.write("[DEBUG] < "+ k +": "+ rsp.headers[k] +"\n");
+ }
+ }
+
+
+ function putSomeNonsense( app ){
+ const nonsense = Object.seal({
+ app: app,
+ req: null,
+ i: 0,
+ limit: 42,
+ });
+ putNextRequest(nonsense);
+ function putNextRequest( nonsense ){
+ nonsense.req = http.request({
+ host: app.host, port: app.port,
+ method: "PUT", path: app.uri +"/foo/"+ nonsense.i,
+ headers: {
+ "X-Queue": app.queueName +"-"+ nonsense.i,
+ "X-Queue-Expire-After": 9999999,
+ },
+ });
+ nonsense.req.on("response", onResponse.bind(0, nonsense));
+ nonsense.req.end("{\"guguseli\":\""+ new Date().toISOString() +"\"}\n");
+ }
+ function onResponse( nonsense, rsp ){
+ var app = nonsense.app;
+ if( rsp.statusCode != 200 ){
+ log.write("[DEBUG] < HTTP/"+ rsp.httpVersion +" "+ rsp.statusCode +" "+ rsp.statusMessage +"\n");
+ for( var k of Object.keys(rsp.headers) ) log.write("[DEBUG] < "+ k +": "+ rsp.headers[k] +"\n");
+ }
+ rsp.on("data", NOOP);
+ if( nonsense.i++ < nonsense.limit ){
+ putNextRequest(nonsense);
+ }
+ }
+ }
+
+
+}());
diff --git a/src/main/patch/houston/fixidiots.patch b/src/main/patch/houston/fixidiots.patch
index 4050425..7af8f9d 100644
--- a/src/main/patch/houston/fixidiots.patch
+++ b/src/main/patch/houston/fixidiots.patch
@@ -146,3 +146,220 @@
+
+}
+
+--- /dev/null
++++ b/houston-process/src/main/java/org/slf4j/reload4j/Reload4jServiceProvider.java
+@@ -0,0 +1,64 @@
++package org.slf4j.reload4j;
++
++import org.slf4j.ILoggerFactory;
++import org.slf4j.IMarkerFactory;
++import org.slf4j.Logger;
++import org.slf4j.Marker;
++import org.slf4j.spi.MDCAdapter;
++import org.slf4j.spi.SLF4JServiceProvider;
++
++import java.lang.reflect.InvocationTargetException;
++import java.lang.reflect.Method;
++import java.util.Deque;
++import java.util.Map;
++
++
++/** <p>How many of those fu**ing damn stupid idiots are still out there
++ * continuing to stubbornly include those stupid logger impls with their
++ * libraries?!?</p> */
++public class Reload4jServiceProvider implements SLF4JServiceProvider, ILoggerFactory, IMarkerFactory, MDCAdapter {
++
++ private final Object slf4jSimpleLoggerFactory;
++ private final Method getLoggerFn;
++
++ public Reload4jServiceProvider() {
++ try {
++ Class<?> logrFactClz = Class.forName("org.slf4j.simple.SimpleLoggerFactory");
++ slf4jSimpleLoggerFactory = logrFactClz.getConstructor().newInstance();
++ getLoggerFn = logrFactClz.getMethod("getLogger", String.class);
++ } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
++ throw new UnsupportedOperationException(ex);
++ }
++ }
++
++ @Override public ILoggerFactory getLoggerFactory() { return this; }
++ @Override public IMarkerFactory getMarkerFactory() { return this; }
++ @Override public MDCAdapter getMDCAdapter() { return this; }
++ @Override public String getRequestedApiVersion() { return "2.0"; }
++ @Override public void initialize() {}
++
++ @Override
++ public Logger getLogger(String name) {
++ try {
++ return (Logger) getLoggerFn.invoke(slf4jSimpleLoggerFactory, name);
++ } catch (IllegalAccessException | InvocationTargetException ex) {
++ throw new RuntimeException(ex);
++ }
++ }
++
++ @Override public Marker getMarker(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public boolean exists(String s) { assert false : "TODO not impl yet"; return false; }
++ @Override public boolean detachMarker(String s) { assert false : "TODO not impl yet"; return false; }
++ @Override public Marker getDetachedMarker(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public void put(String s, String s1) { assert false : "TODO not impl yet"; }
++ @Override public String get(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public void remove(String s) { assert false : "TODO not impl yet"; }
++ @Override public void clear() { assert false : "TODO not impl yet"; }
++ @Override public Map<String, String> getCopyOfContextMap() { assert false : "TODO not impl yet"; return null; }
++ @Override public void setContextMap(Map<String, String> map) { assert false : "TODO not impl yet"; }
++ @Override public void pushByKey(String s, String s1) { assert false : "TODO not impl yet"; }
++ @Override public String popByKey(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public Deque<String> getCopyOfDequeByKey(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public void clearDequeByKey(String s) { assert false : "TODO not impl yet"; }
++
++}
+
+
+--- /dev/null
++++ b/houston-process/src/main/java/org/apache/logging/slf4j/SLF4JServiceProvider.java
+@@ -0,0 +1,62 @@
++package org.apache.logging.slf4j;
++
++import org.slf4j.ILoggerFactory;
++import org.slf4j.IMarkerFactory;
++import org.slf4j.Logger;
++import org.slf4j.Marker;
++import org.slf4j.spi.MDCAdapter;
++
++import java.lang.reflect.InvocationTargetException;
++import java.lang.reflect.Method;
++import java.util.Deque;
++import java.util.Map;
++
++
++/** <p>How many of those fu**ing damn stupid idiotic libs are still out there
++ * continuing to stubbornly include those stupid logger impls?!?</p> */
++public class SLF4JServiceProvider implements org.slf4j.spi.SLF4JServiceProvider, ILoggerFactory, IMarkerFactory, MDCAdapter {
++
++ private final Object slf4jSimpleLoggerFactory;
++ private final Method getLoggerFn;
++
++ public SLF4JServiceProvider() {
++ try {
++ Class<?> logrFactClz = Class.forName("org.slf4j.simple.SimpleLoggerFactory");
++ slf4jSimpleLoggerFactory = logrFactClz.getConstructor().newInstance();
++ getLoggerFn = logrFactClz.getMethod("getLogger", String.class);
++ } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
++ throw new UnsupportedOperationException(ex);
++ }
++ }
++
++ @Override public ILoggerFactory getLoggerFactory() { return this; }
++ @Override public IMarkerFactory getMarkerFactory() { return this; }
++ @Override public MDCAdapter getMDCAdapter() { return this; }
++ @Override public String getRequestedApiVersion() { return "2.0"; }
++ @Override public void initialize() {}
++
++ @Override
++ public Logger getLogger(String name) {
++ try {
++ return (Logger) getLoggerFn.invoke(slf4jSimpleLoggerFactory, name);
++ } catch (IllegalAccessException | InvocationTargetException ex) {
++ throw new RuntimeException(ex);
++ }
++ }
++
++ @Override public Marker getMarker(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public boolean exists(String s) { assert false : "TODO not impl yet"; return false; }
++ @Override public boolean detachMarker(String s) { assert false : "TODO not impl yet"; return false; }
++ @Override public Marker getDetachedMarker(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public void put(String s, String s1) { assert false : "TODO not impl yet"; }
++ @Override public String get(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public void remove(String s) { assert false : "TODO not impl yet"; }
++ @Override public void clear() { assert false : "TODO not impl yet"; }
++ @Override public Map<String, String> getCopyOfContextMap() { assert false : "TODO not impl yet"; return null; }
++ @Override public void setContextMap(Map<String, String> map) { assert false : "TODO not impl yet"; }
++ @Override public void pushByKey(String s, String s1) { assert false : "TODO not impl yet"; }
++ @Override public String popByKey(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public Deque<String> getCopyOfDequeByKey(String s) { assert false : "TODO not impl yet"; return null; }
++ @Override public void clearDequeByKey(String s) { assert false : "TODO not impl yet"; }
++
++}
+
+
+--- /dev/null
++++ b/houston-process/src/main/java/net/bull/javamelody/internal/common/Log4J2Logger.java
+@@ -0,0 +1,38 @@
++package net.bull.javamelody.internal.common;
++
++import org.slf4j.Logger;
++
++import javax.servlet.http.HttpServletRequest;
++import java.lang.reflect.InvocationTargetException;
++import java.lang.reflect.Method;
++
++
++/** <p>How many of those fu**ing damn stupid idiot libs are still out there
++ * continuing to stubbornly include those stupid logger impls?!?</p> */
++public class Log4J2Logger implements net.bull.javamelody.JavaMelodyLogger {
++
++ private final org.slf4j.Logger log;
++
++ public Log4J2Logger(){
++ try {
++ Class<?> logrFactClz = Class.forName("org.slf4j.simple.SimpleLoggerFactory");
++ Object slf4jSimpleLoggerFactory = logrFactClz.getConstructor().newInstance();
++ Method getLoggerFn = logrFactClz.getMethod("getLogger", String.class);
++ this.log = (Logger) getLoggerFn.invoke(slf4jSimpleLoggerFactory, "net.bull.javamelody");
++ } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException ex) {
++ throw new UnsupportedOperationException(ex);
++ }
++ }
++
++ @Override public void debug(String s) { log.debug(s); }
++ @Override public void debug(String s, Throwable ex) { log.debug(s, ex); }
++ @Override public void info(String s) { log.info(s); }
++ @Override public void info(String s, Throwable ex) { log.info(s, ex);}
++ @Override public void warn(String s, Throwable ex) { log.warn(s, ex);}
++ @Override public void logHttpRequest(
++ HttpServletRequest httpRequest, String requestName, long duration, boolean systemError, int responseStatus, long responseSize, String loggerName
++ ){
++ if (log.isInfoEnabled()) log.info("{}", LOG.buildLogMessage(httpRequest, duration, systemError, responseStatus, responseSize));
++ }
++
++}
+
+
+--- /dev/null
++++ b/houston-process/src/main/java/org/eclipse/jetty/util/log/Slf4jLog.java
+@@ -0,0 +1,32 @@
++package org.eclipse.jetty.util.log;
++
++import org.slf4j.LoggerFactory;
++
++
++/** Yet another fu**ing bastard lib having its own shiny stupid loggers. */
++public class Slf4jLog {
++
++ private final org.slf4j.Logger log;
++
++ public Slf4jLog() {
++ this.log = LoggerFactory.getLogger("org.eclipse.jetty.util.log");
++ }
++
++ public Slf4jLog(String name) {
++ this.log = LoggerFactory.getLogger(name);
++ }
++
++ public String getName() { return log.getName(); }
++ public void warn(String msg, Object... args) { log.warn(msg, args); }
++ public void warn(Throwable thrown) { log.warn("", thrown); }
++ public void warn(String msg, Throwable thrown) { log.warn(msg, thrown); }
++ public void info(String msg, Object... args) { log.info(msg, args); }
++ public void info(Throwable thrown) { log.info("", thrown); }
++ public void info(String msg, Throwable thrown) { log.info(msg, thrown); }
++ public void debug(String msg, Object... args) { log.debug(msg, args); }
++ public void debug(String msg, long arg) { if (log.isDebugEnabled()) log.debug(msg, arg); }
++ public void debug(Throwable thrown) { this.debug("", thrown); }
++ public void debug(String msg, Throwable thrown) { log.debug(msg, thrown); }
++ public boolean isDebugEnabled() { return log.isDebugEnabled(); }
++ public void setDebugEnabled(boolean enabled) { log.warn("setDebugEnabled not implemented"); }
++
++}
+
diff --git a/src/main/patch/houston/future.patch b/src/main/patch/houston/future.patch
new file mode 100644
index 0000000..2ac5922
--- /dev/null
+++ b/src/main/patch/houston/future.patch
@@ -0,0 +1,47 @@
+
+ Some patches that maybe will become relevant in future. For example bcause a
+ PR is no yet merged or similar.
+
+
+--- /dev/null
++++ b/houston-process/src/main/java/net/bull/javamelody/internal/common/Log4J2Logger.java
+@@ -22,1 +22,1 @@
+ if (!iLoaders.hasNext()) throw new IllegalStateException("Too few logger impls");
+ SLF4JServiceProvider loggerProvider = iLoaders.next();
+- if (iLoaders.hasNext()) throw new IllegalStateException("Too many logger impls");
++ if (!(loggerProvider instanceof org.slf4j.simple.SimpleServiceProvider) && iLoaders.hasNext()) throw new IllegalStateException("Too many logger impls");
+ loggerProvider.initialize();
+ ILoggerFactory loggerFactory = loggerProvider.getLoggerFactory();
+
+
+--- /dev/null
++++ b/houston-process/src/main/java/ch/post/it/paisa/houston/process/main/BadLoggerImplKiller.java
+@@ -0,0 +1,26 @@
++package ch.post.it.paisa.houston.process.main;
++
++import org.slf4j.spi.SLF4JServiceProvider;
++
++import java.util.ServiceLoader;
++
++
++public class BadLoggerImplKiller {
++
++ public static void assertExactlyOneLoggerImplPresent(){
++ Class<?> log4jProviderClz, simpleProviderClz;
++ try {
++ log4jProviderClz = Class.forName("org.apache.logging.slf4j.SLF4JServiceProvider");
++ simpleProviderClz = Class.forName("org.slf4j.simple.SimpleServiceProvider");
++ }catch( ClassNotFoundException ex ){
++ throw new RuntimeException(ex);
++ }
++ for( SLF4JServiceProvider provider : ServiceLoader.load(SLF4JServiceProvider.class) ){
++ Class<?> providerClass = provider.getClass();
++ if( log4jProviderClz.isAssignableFrom(providerClass) ) continue;
++ if( simpleProviderClz.isAssignableFrom(providerClass) ) continue;
++ throw new IllegalStateException("Go away with this ugly logger: "+ providerClass.getName());
++ }
++ }
++
++}
+
+