diff options
author | Andreas Fankhauser hiddenalpha.ch | 2024-04-08 21:29:19 +0200 |
---|---|---|
committer | Andreas Fankhauser hiddenalpha.ch | 2024-04-08 21:29:19 +0200 |
commit | 6225d92d39976e6e4177526388a920f42dd07d76 (patch) | |
tree | 5e047b02f1c2e8abf5979596f68e6fdd2eecb417 | |
parent | b55041beb9c8d2fc60d8657f6d38f665b3418004 (diff) | |
parent | 193315d56302bac67b4a1688e892ac499d4052b4 (diff) | |
download | UnspecifiedGarbage-6225d92d39976e6e4177526388a920f42dd07d76.zip UnspecifiedGarbage-6225d92d39976e6e4177526388a920f42dd07d76.tar.gz |
Merge remote-tracking branch 'gh-hiddenalpha/master'
-rw-r--r-- | doc/note/links/links.txt | 14 | ||||
-rw-r--r-- | doc/note/openshift/dbg-mem-issues.txt | 31 | ||||
-rw-r--r-- | doc/note/redis/redis.txt | 32 | ||||
-rw-r--r-- | src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastMetricsOptions.java | 35 | ||||
-rw-r--r-- | src/main/java/ch/hiddenalpha/unspecifiedgarbage/gateleenKludge/FailFastVertxMetricsFactory.java | 27 | ||||
-rw-r--r-- | src/main/lua/paisa-logs/DigHoustonLogs.lua | 371 | ||||
-rw-r--r-- | src/main/nodejs/misc/ProduceLotsOfQueues.js | 119 | ||||
-rw-r--r-- | src/main/patch/houston/fixidiots.patch | 217 | ||||
-rw-r--r-- | src/main/patch/houston/future.patch | 47 |
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()); ++ } ++ } ++ ++} + + |