Bi sunucu yazilimi gelistiriyoruz. Programin bana ulastiktan sonraki tum kisimlari bir thread poolda calisiyor. Bugun bazi worker threadlerimin executionlarini tamamlamadigini ya da cok cok uzun surelerde tamamladiklarini gordum. Bu da threadlerin yeterince erken salinmamasina ve diger tasklarin queueda takili kalmasina sebep olacakti.
Neyin onlari durdugunu anlamak istiyordum ama SSH uzerinden debugging yaptigim icin hem debug sirasinda gereginden fazla bekliyordum gecikme nedeniyle, hem de durdur ilerlet, durdur ilerlet seklinde bir seyleri tespit etmek cok zor olacakti. Bunu cozmek icin calisan tasklarin neler oldugunu ve mumkunse hangi asamada takili kaldigini anlamam gerektigine karar verdim. Bunun sonucunda da sunu urettim;
Gorsel ne kadar anlasiliyor bilmiyorum ama basitce aciklayacak olursam, async worker threadleri kullanan her bir task, bir listeye ekleniyor, isi bittigindeyse bu listeden cikiyor. Programin bana ulastiktan sonraki her kismi da bu worker threadlerde calistigi icin aslinda butun tasklarim buradaki listeye eklenip cikiyor. Ufak bir bottleneck ekleyecek cunku listeden cikartmak bir seyleri O( n ) surede gerceklesiyor ama debugging icin oldukca yararli oldugunu dusunuyorum. Sunucunun /health end pointine istek attigimda call listi goruntuluyebiliyorum. Eger bir task uzun sure calisiyorsa, onun ne oldugunu ve onu kimin cagirdigini da goruntuleyebilirim.
Daha once yapilmis bir seyse benim haberim yok. Ihtiyactan dogan guzel bir fikir oldugunu dusunuyorum. Uzaktan debugging isini kolaylastiriyor benim adima.
Fikri uygulanabilir kilan kod blogu da su;
Array list yerine baska bir sey kullanarak belki darbogazi da azaltabilirim ama su an icin onemi yok.
Neyin onlari durdugunu anlamak istiyordum ama SSH uzerinden debugging yaptigim icin hem debug sirasinda gereginden fazla bekliyordum gecikme nedeniyle, hem de durdur ilerlet, durdur ilerlet seklinde bir seyleri tespit etmek cok zor olacakti. Bunu cozmek icin calisan tasklarin neler oldugunu ve mumkunse hangi asamada takili kaldigini anlamam gerektigine karar verdim. Bunun sonucunda da sunu urettim;
Gorsel ne kadar anlasiliyor bilmiyorum ama basitce aciklayacak olursam, async worker threadleri kullanan her bir task, bir listeye ekleniyor, isi bittigindeyse bu listeden cikiyor. Programin bana ulastiktan sonraki her kismi da bu worker threadlerde calistigi icin aslinda butun tasklarim buradaki listeye eklenip cikiyor. Ufak bir bottleneck ekleyecek cunku listeden cikartmak bir seyleri O( n ) surede gerceklesiyor ama debugging icin oldukca yararli oldugunu dusunuyorum. Sunucunun /health end pointine istek attigimda call listi goruntuluyebiliyorum. Eger bir task uzun sure calisiyorsa, onun ne oldugunu ve onu kimin cagirdigini da goruntuleyebilirim.
Daha once yapilmis bir seyse benim haberim yok. Ihtiyactan dogan guzel bir fikir oldugunu dusunuyorum. Uzaktan debugging isini kolaylastiriyor benim adima.
Fikri uygulanabilir kilan kod blogu da su;
Java:
@AllArgsConstructor
public static class Caller {
@Getter private List<StackTraceElement> trace;
@Getter private String name;
private long startTime;
public long getRunTime() {
return System.currentTimeMillis() - startTime;
}
public Document toDocument() {
List<String> traceStrings = trace.stream()
.map(StackTraceElement::toString)
.toList();
return new Document("trace", traceStrings)
.append("name", name)
.append("run_time", getRunTime());
}
}
private static String callerName(StackTraceElement[] traceList) {
final var element = traceList[4];
try {
final var methodClass = Class.forName(element.getClassName());
if (Action.class.isAssignableFrom(methodClass)) {
return methodClass.getSimpleName();
}
} catch (Exception e) {
// pass
}
return String.format("%s.%s", element.getClassName(), element.getMethodName());
}
@Getter private static final List<Caller> callers = new ArrayList<>();
private static Caller addToCallersList() {
var traceList = Thread.currentThread().getStackTrace();
final var caller = new Caller(Arrays.asList(traceList).subList(2, Thread.currentThread().getStackTrace().length), callerName(traceList), System.currentTimeMillis());
callers.add(caller);
return caller;
}
Array list yerine baska bir sey kullanarak belki darbogazi da azaltabilirim ama su an icin onemi yok.