Search in sources :

Example 1 with StackSamples

use of org.spf4j.base.StackSamples in project spf4j by zolyfarkas.

the class MonitorTest method main.

@SuppressFBWarnings("MDM_THREAD_YIELD")
public static void main(final String[] args) throws InterruptedException {
    LOG.debug("running test main");
    stopped = false;
    try (ExecutionContext ctx = ExecutionContexts.start("main", 10, TimeUnit.MINUTES)) {
        List<Thread> threads = new ArrayList<Thread>(20);
        for (int i = 0; i < 20; i++) {
            Thread t;
            t = new Thread(new AbstractRunnable() {

                @Override
                @SuppressFBWarnings("PREDICTABLE_RANDOM")
                public void doRun() throws InterruptedException {
                    try (ExecutionContext tctx = ExecutionContexts.start("testThread", ctx, 10, TimeUnit.MINUTES)) {
                        while (!stopped) {
                            double rnd = ThreadLocalRandom.current().nextDouble();
                            if (rnd < 0.33) {
                                doStuff1(rnd, 50);
                            } else if (rnd < 0.66) {
                                doStuff2(rnd);
                            } else {
                                doStuff3(rnd);
                            }
                        }
                        StackSamples stackSamples = tctx.getAndClearStackSamples();
                        if (stackSamples != null) {
                            LOG.debug("Stack samples", stackSamples);
                        }
                    }
                }

                @SuppressFBWarnings("MDM_THREAD_YIELD")
                private double doStuff3(final double rnd) throws InterruptedException {
                    Thread.sleep(1);
                    if (rnd > 0.8) {
                        doStuff2(rnd);
                    }
                    return rnd * Math.pow(2, 10000);
                }

                @SuppressFBWarnings("MDM_THREAD_YIELD")
                private double doStuff2(final double prnd) throws InterruptedException {
                    double rnd = prnd;
                    Thread.sleep(1);
                    for (int j = 0; j < 10000; j++) {
                        rnd = rnd + rnd;
                    }
                    return rnd;
                }

                @SuppressFBWarnings("MDM_THREAD_YIELD")
                private void doStuff1(final double rnd, final int depth) throws InterruptedException {
                    if (depth <= 0) {
                        Thread.sleep(10);
                    } else {
                        doStuff1(rnd, depth - 1);
                    }
                }
            }, "Thread" + i);
            t.start();
            threads.add(t);
        }
        Thread.sleep(5000);
        stopped = true;
        for (Thread t : threads) {
            t.join(3000);
        }
    }
    LOG.debug("finished test main");
}
Also used : AbstractRunnable(org.spf4j.base.AbstractRunnable) ExecutionContext(org.spf4j.base.ExecutionContext) StackSamples(org.spf4j.base.StackSamples) ArrayList(java.util.ArrayList) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Example 2 with StackSamples

use of org.spf4j.base.StackSamples in project spf4j by zolyfarkas.

the class Slf4jLogRecord method toLogRecord.

@SuppressFBWarnings("WOC_WRITE_ONLY_COLLECTION_LOCAL")
default LogRecord toLogRecord(final String origin, final String ptraceId) {
    java.lang.Throwable extraThrowable = this.getExtraThrowable();
    Marker marker = this.getMarker();
    Object[] extraArguments = this.getExtraArguments();
    Map<String, Object> attribs = null;
    List<Object> xArgs;
    String traceId = ptraceId;
    List<StackSampleElement> profiles = Collections.EMPTY_LIST;
    if (extraArguments.length == 0) {
        xArgs = Collections.emptyList();
    } else {
        int nrAttribs = 0;
        for (Object obj : extraArguments) {
            if (obj instanceof LogAttribute) {
                LogAttribute la = (LogAttribute) obj;
                String name = la.getName();
                switch(name) {
                    case LogAttribute.ID_ATTR_NAME:
                        traceId = la.getValue().toString();
                        break;
                    case LogAttribute.PROFILE_SAMPLES_ATTR_NAME:
                        profiles = Converters.convert((StackSamples) la.getValue());
                        break;
                    default:
                }
                nrAttribs++;
            }
        }
        if (nrAttribs == 0) {
            xArgs = Arrays.asList(extraArguments);
        } else {
            if (nrAttribs == extraArguments.length) {
                xArgs = Collections.EMPTY_LIST;
            } else {
                xArgs = new ArrayList<>(extraArguments.length - nrAttribs);
            }
            attribs = Maps.newHashMapWithExpectedSize(nrAttribs + (marker == null ? 0 : 1));
            for (Object obj : extraArguments) {
                if (obj instanceof LogAttribute) {
                    LogAttribute la = (LogAttribute) obj;
                    String aName = la.getName();
                    switch(aName) {
                        case LogAttribute.ID_ATTR_NAME:
                        case LogAttribute.PROFILE_SAMPLES_ATTR_NAME:
                            break;
                        default:
                            attribs.put(aName, la.getValue());
                    }
                } else {
                    xArgs.add(obj);
                }
            }
            if (marker != null) {
                attribs.put(marker.getName(), marker);
            }
        }
    }
    int nrMsgArgs = this.getNrMessageArguments();
    List<String> messageArgs;
    if (nrMsgArgs == 0) {
        messageArgs = Collections.emptyList();
    } else {
        Object[] args = this.getArguments();
        String[] ma = new String[nrMsgArgs];
        for (int i = 0; i < nrMsgArgs; i++) {
            Object arg = args[i];
            if (arg == null) {
                ma[i] = "null";
            } else {
                ma[i] = ObjectAppenderSupplier.getDefaultToStringAppenderSupplier().get(arg.getClass()).toString(arg);
            }
        }
        messageArgs = Arrays.asList(ma);
    }
    return new LogRecord(origin, traceId, this.getLevel().getAvroLevel(), Instant.ofEpochMilli(this.getTimeStamp()), this.getLoggerName(), this.getThreadName(), this.getMessageFormat(), messageArgs, xArgs, attribs == null ? Collections.emptyMap() : attribs, extraThrowable == null ? null : convert(extraThrowable), profiles);
}
Also used : StackSamples(org.spf4j.base.StackSamples) Marker(org.slf4j.Marker) LogRecord(org.spf4j.base.avro.LogRecord) StackSampleElement(org.spf4j.base.avro.StackSampleElement) SuppressFBWarnings(edu.umd.cs.findbugs.annotations.SuppressFBWarnings)

Aggregations

SuppressFBWarnings (edu.umd.cs.findbugs.annotations.SuppressFBWarnings)2 StackSamples (org.spf4j.base.StackSamples)2 ArrayList (java.util.ArrayList)1 Marker (org.slf4j.Marker)1 AbstractRunnable (org.spf4j.base.AbstractRunnable)1 ExecutionContext (org.spf4j.base.ExecutionContext)1 LogRecord (org.spf4j.base.avro.LogRecord)1 StackSampleElement (org.spf4j.base.avro.StackSampleElement)1