@Override public Tracker getInstance(TrackerConfig tconfig) { return new TrackerImpl(tconfig, defaultKeepContext); }
@Override protected void onStart(long start) { tracker.push(this); if (reportStarts) { tracker.tnt(this); } long delta = (System.nanoTime() - start); super.onStart(start); tracker.countOverheadNanos(delta); }
@Override public synchronized void open() { if (!isOpen()) { openIOHandle(selector); openEventSink(); logger.log(OpLevel.DEBUG, "Tracker opened vm.name={0}, tid={1}, event.sink={2}, source={3}", Utils.getVMName(), Thread.currentThread().getId(), eventSink, getSource()); } }
@Override public TrackingEvent newEvent(OpLevel severity, String opName, Collection<String> correlators, byte[] msg, Object... args) { long start = System.nanoTime(); try { if (!isTrackingEnabled(severity, opName, correlators, msg, args)) { return NULL_EVENT; } TrackingEvent event = new TrackingEvent(this, getSource(), severity, opName, correlators, msg, args); event.getOperation().setUser(tConfig.getSource().getUser()); return event; } finally { countOverheadNanos(System.nanoTime() - start); } }
@Override public synchronized void close() { if (!isOpen()) { return; } try { closeEventSink(); Utils.close(selector); logger.log(OpLevel.DEBUG, "Tracker closed vm.name={0}, tid={1}, event.sink={2}, source={3}", Utils.getVMName(), Thread.currentThread().getId(), eventSink, getSource()); } catch (Throwable e) { errorCount.incrementAndGet(); logger.log(OpLevel.ERROR, "Failed to close tracker vm.name={0}, tid={1}, event.sink={2}, source={3}", Utils.getVMName(), Thread.currentThread().getId(), eventSink, getSource(), e); } }
@Override public void tnt(TrackingEvent event) { long start = System.nanoTime(); try { if (!event.isNoop()) { reportEvent(event); } else { noopCount.incrementAndGet(); } } catch (Throwable ex) { dropCount.incrementAndGet(); if (logger.isSet(OpLevel.DEBUG)) { logger.log(OpLevel.ERROR, "Failed to track event: signature={0}, tid={1}, event.sink={2}, source={3}", event.getTrackingId(), Thread.currentThread().getId(), eventSink, getSource(), ex); } } finally { countOverheadNanos(System.nanoTime() - start); } }
@Override public void tnt(TrackingActivity activity) { long start = System.nanoTime(); try { if (!activity.isNoop()) { reportActivity(activity); } else { noopCount.incrementAndGet(); } } catch (Throwable ex) { dropCount.incrementAndGet(); if (logger.isSet(OpLevel.DEBUG)) { logger.log(OpLevel.ERROR, "Failed to track activity: signature={0}, tid={1}, event.sink={2}, source={3}", activity.getTrackingId(), Thread.currentThread().getId(), eventSink, getSource(), ex); } } finally { countOverheadNanos(System.nanoTime() - start); } }
@Override public TrackingActivity newActivity(OpLevel level, String name, String signature) { long start = System.nanoTime(); try { if (!isTrackingEnabled(level, name, signature)) { return NULL_ACTIVITY; } signature = (signature == null) ? newUUID() : signature; TrackingActivity activity = new TrackingActivity(level, name, signature, this); activity.setPID(Utils.getVMPID()); if (tConfig.getActivityListener() != null) { activity.addActivityListener(tConfig.getActivityListener()); } return activity; } finally { countOverheadNanos(System.nanoTime() - start); } }
@Override public String toString() { return getClass().getSimpleName() + "{jid=" + Integer.toHexString(System.identityHashCode(this)) + ", name=" + getSource().getName() + ", keep.context=" + keepContext + ", sink=" + eventSink + "}"; }
@Override protected void onStop(long start) { tracker.pop(this); super.onStop(start); long delta = (System.nanoTime() - start); tracker.countOverheadNanos(delta); }
/** * Creates a logical application activity object with the specified signature. * * @param level * activity severity level * @param name * activity name * @param trk * {@link Tracker} instance associated with this activity * @throws NullPointerException * if the signature is {@code null} * @throws IllegalArgumentException * if the signature is empty or is too long * @see #setTrackingId(String) */ protected TrackingActivity(OpLevel level, String name, TrackerImpl trk) { super(trk.newUUID(), name, trk.getSource()); tracker = trk; setSeverity(level); setLocation(trk.getSource()); }
@Override public void sinkError(SinkError ev) { errorCount.incrementAndGet(); if (logger.isSet(OpLevel.DEBUG)) { logger.log(OpLevel.ERROR, "Sink write error: count={4}, vm.name={0}, tid={1}, event.sink={2}, source={3}", Utils.getVMName(), Thread.currentThread().getId(), eventSink, getSource(), errorCount.get(), ev.getCause()); } resetEventSink(); }
@Override public void log(OpLevel sev, String msg, Object... args) { long start = System.nanoTime(); try { eventSink.log(eventSink.getTTL(), getSource(), sev, msg, args); msgCount.incrementAndGet(); } catch (Throwable ex) { dropCount.incrementAndGet(); if (logger.isSet(OpLevel.DEBUG)) { logger.log(OpLevel.ERROR, "Failed to log message: severity={0}, msg={1}", sev, msg, ex); } } finally { countOverheadNanos(System.nanoTime() - start); } }
@Override protected void finalize() throws Throwable { try { close(); } finally { super.finalize(); } }
@Override public Map<String, Object> getStats() { Map<String, Object> stats = new LinkedHashMap<>(); getStats(stats); return stats; }
@Override public void tnt(Snapshot snapshot) { long start = System.nanoTime(); try { eventSink.log(snapshot); snapCount.incrementAndGet(); } catch (Throwable ex) { dropCount.incrementAndGet(); if (logger.isSet(OpLevel.DEBUG)) { logger.log(OpLevel.ERROR, "Failed to track snapshot: signature={0}, tid={1}, event.sink={2}, snapshot={3}", snapshot.getTrackingId(), Thread.currentThread().getId(), eventSink, snapshot, ex); } } finally { countOverheadNanos(System.nanoTime() - start); } }
@Override public KeyValueStats getStats(Map<String, Object> stats) { stats.put(Utils.qualify(this, KEY_ACTIVITY_COUNT), activityCount.get()); stats.put(Utils.qualify(this, KEY_EVENT_COUNT), eventCount.get()); stats.put(Utils.qualify(this, KEY_MSG_COUNT), msgCount.get()); stats.put(Utils.qualify(this, KEY_SNAPSHOT_COUNT), snapCount.get()); stats.put(Utils.qualify(this, KEY_ERROR_COUNT), errorCount.get()); stats.put(Utils.qualify(this, KEY_NOOP_COUNT), noopCount.get()); stats.put(Utils.qualify(this, KEY_DROP_COUNT), dropCount.get()); stats.put(Utils.qualify(this, KEY_ACTIVITIES_STARTED), pushCount.get()); stats.put(Utils.qualify(this, KEY_ACTIVITIES_STOPPED), popCount.get()); stats.put(Utils.qualify(this, KEY_STACK_DEPTH), getStackSize()); stats.put(Utils.qualify(this, KEY_OVERHEAD_USEC), overheadNanos.get() / 1000); if (eventSink != null) { eventSink.getStats(stats); } return this; }
/** * Sign current event with hash/signature based on trackers configured signature factory. * * @return signed self * @throws NoSuchAlgorithmException * if signature calculation algorithm is not provided by environment */ public TrackingEvent sign() throws NoSuchAlgorithmException { if (tracker != null) { setSignature(tracker.getConfiguration().getSignFactory().sign(this)); } return this; }
@Override public TrackingEvent newEvent(String opName, String msg, Object... args) { long start = System.nanoTime(); try { if (!isTrackingEnabled(OpLevel.NONE, opName, msg, args)) { return NULL_EVENT; } TrackingEvent event = new TrackingEvent(this, getSource(), OpLevel.NONE, opName, (String) null, msg, args); event.getOperation().setUser(tConfig.getSource().getUser()); return event; } finally { countOverheadNanos(System.nanoTime() - start); } }