public void emit() { if (emitter == null) { throw new UnsupportedOperationException("Emitter is null, cannot emit."); } emitter.emit(this); } }
@Provides @ManageLifecycle public ServiceEmitter getServiceEmitter(Supplier<LoggingEmitterConfig> config, ObjectMapper jsonMapper) { return new ServiceEmitter("", "", new LoggingEmitter(config.get(), jsonMapper)); } }
public void emit(ServiceEventBuilder builder) { emit(builder.build(serviceDimensions)); }
@Provides @ManageLifecycle public ServiceEmitter getServiceEmitter( @Self Supplier<DruidNode> configSupplier, Emitter emitter, @ExtraServiceDimensions Map<String, String> extraServiceDimensions ) { final DruidNode config = configSupplier.get(); log.info("Underlying emitter for ServiceEmitter: %s", emitter); log.info("Extra service dimensions: %s", extraServiceDimensions); final ServiceEmitter retVal = new ServiceEmitter( config.getServiceName(), config.getHostAndPortToUse(), emitter, ImmutableMap.copyOf(extraServiceDimensions) ); EmittingLogger.registerEmitter(retVal); return retVal; }
@Override public void log(final RequestLogLine requestLogLine) throws IOException { emitter.emit(new RequestLogEventBuilder(feed, requestLogLine)); }
@Override public void emit(ServiceEmitter emitter) { checkModifiedFromOwnerThread(); for (Map.Entry<String, Number> metric : metrics.entrySet()) { emitter.emit(builder.build(metric.getKey(), metric.getValue())); } metrics.clear(); } }
@Override public void emitMetrics(ServiceEmitter emitter, ServiceMetricEvent.Builder metricBuilder) { if (delegate instanceof PrioritizedExecutorService) { emitter.emit(metricBuilder.build("segment/scan/pending", ((PrioritizedExecutorService) delegate).getQueueSize())); } }
private void emitTimeCounterMetrics(ServiceEmitter emitter, ConcurrentTimeCounter timeCounter, String metricNameBase) { long timeSumAndCount = timeCounter.getTimeSumAndCountAndReset(); emitter.emit(builder.build(metricNameBase + "timeMsSum", ConcurrentTimeCounter.timeSum(timeSumAndCount))); emitter.emit(builder.build(metricNameBase + "count", ConcurrentTimeCounter.count(timeSumAndCount))); emitter.emit(builder.build(metricNameBase + "maxTimeMs", timeCounter.getAndResetMaxTime())); emitter.emit(builder.build(metricNameBase + "minTimeMs", timeCounter.getAndResetMinTime())); }
@Override public void run() { try { final long tasks = updatesStarted.get(); serviceEmitter.emit( ServiceMetricEvent.builder() .build("namespace/deltaTasksStarted", tasks - priorUpdatesStarted) ); priorUpdatesStarted = tasks; } catch (Exception e) { log.error(e, "Error emitting namespace stats"); if (Thread.currentThread().isInterrupted()) { throw Throwables.propagate(e); } } } },
@Override public boolean doMonitor(ServiceEmitter emitter) { final ServiceMetricEvent.Builder builder = new ServiceMetricEvent.Builder(); MonitorUtils.addDimensionsToBuilder( builder, dimensions ); emitter.emit(builder.build("jetty/numOpenConnections", activeConnections.get())); return true; } }
void emit(ServiceEmitter emitter, Map<String, String[]> dimensions) { final ServiceMetricEvent.Builder builder = builder(); MonitorUtils.addDimensionsToBuilder(builder, dimensions); builder.setDimension("gcGenSpaceName", name); emitter.emit(builder.build("jvm/gc/mem/max", maxCounter.getLong())); emitter.emit(builder.build("jvm/gc/mem/capacity", capacityCounter.getLong())); emitter.emit(builder.build("jvm/gc/mem/used", usedCounter.getLong())); emitter.emit(builder.build("jvm/gc/mem/init", initCounter.getLong())); } }
@Override public boolean doMonitor(ServiceEmitter emitter) { final Map<String, Long> priorValues = this.priorValues.get(); final Map<String, Long> currentValues = getCurrentValues(); final ServiceMetricEvent.Builder builder = ServiceMetricEvent.builder(); for (Map.Entry<String, Long> entry : currentValues.entrySet()) { emitter.emit( builder.setDimension("memcached metric", entry.getKey()) .build("query/cache/memcached/total", entry.getValue()) ); final Long prior = priorValues.get(entry.getKey()); if (prior != null) { emitter.emit( builder.setDimension("memcached metric", entry.getKey()).build( "query/cache/memcached/delta", entry.getValue() - prior ) ); } } if (!this.priorValues.compareAndSet(priorValues, currentValues)) { log.error("Prior value changed while I was reporting! updating anyways"); this.priorValues.set(currentValues); } return true; }
@Override void monitor(ServiceEmitter serviceEmitter) { long numEntries = 0; long size = 0; expungeCollectedCaches(); for (WeakReference<ConcurrentMap<String, String>> cacheRef : caches) { final Map<String, String> cache = cacheRef.get(); if (cache == null) { continue; } numEntries += cache.size(); for (Map.Entry<String, String> sEntry : cache.entrySet()) { final String key = sEntry.getKey(); final String value = sEntry.getValue(); if (key == null || value == null) { LOG.debug("Missing entries for cache key"); continue; } size += key.length() + value.length(); } } serviceEmitter.emit(ServiceMetricEvent.builder().build("namespace/cache/numEntries", numEntries)); serviceEmitter.emit(ServiceMetricEvent.builder().build("namespace/cache/heapSizeInBytes", size * Chars.BYTES)); } }
@Override public boolean doMonitor(ServiceEmitter emitter) { ThreadMXBean threadBean = ManagementFactory.getThreadMXBean(); final ServiceMetricEvent.Builder builder = builder(); MonitorUtils.addDimensionsToBuilder(builder, dimensions); // Because between next two calls on ThreadMXBean new threads can be started we can observe some inconsistency // in counters values and finished counter could be even negative int newLiveThreads = threadBean.getThreadCount(); long newStartedThreads = threadBean.getTotalStartedThreadCount(); long startedThreadsDiff = newStartedThreads - lastStartedThreads; emitter.emit(builder.build("jvm/threads/started", startedThreadsDiff)); emitter.emit(builder.build("jvm/threads/finished", lastLiveThreads + startedThreadsDiff - newLiveThreads)); emitter.emit(builder.build("jvm/threads/live", newLiveThreads)); emitter.emit(builder.build("jvm/threads/liveDaemon", threadBean.getDaemonThreadCount())); emitter.emit(builder.build("jvm/threads/livePeak", threadBean.getPeakThreadCount())); threadBean.resetPeakThreadCount(); lastStartedThreads = newStartedThreads; lastLiveThreads = newLiveThreads; return true; } }
void emit(ServiceEmitter emitter, Map<String, String[]> dimensions) { final ServiceMetricEvent.Builder builder = builder(); MonitorUtils.addDimensionsToBuilder(builder, dimensions); long newInvocations = invocationsCounter.getLong(); emitter.emit(builder.build("jvm/gc/count", newInvocations - lastInvocations)); lastInvocations = newInvocations; long newCpuNanos = cpuCounter.getNanos(); emitter.emit(builder.build("jvm/gc/cpu", newCpuNanos - lastCpuNanos)); lastCpuNanos = newCpuNanos; }
MonitorUtils.addDimensionsToBuilder(builder, dimensions); emitter.emit(builder.build("jvm/mem/max", usage.getMax())); emitter.emit(builder.build("jvm/mem/committed", usage.getCommitted())); emitter.emit(builder.build("jvm/mem/used", usage.getUsed())); emitter.emit(builder.build("jvm/mem/init", usage.getInit())); MonitorUtils.addDimensionsToBuilder(builder, dimensions); emitter.emit(builder.build("jvm/pool/max", usage.getMax())); emitter.emit(builder.build("jvm/pool/committed", usage.getCommitted())); emitter.emit(builder.build("jvm/pool/used", usage.getUsed())); emitter.emit(builder.build("jvm/pool/init", usage.getInit()));
@Override public void doMonitor(ServiceEmitter emitter) { final CacheStats oldStats = priorStats.get(); final CacheStats newStats = cache.stats(); final CacheStats deltaStats = newStats.minus(oldStats); final ServiceMetricEvent.Builder builder = ServiceMetricEvent.builder(); emitter.emit(builder.build("query/cache/caffeine/delta/requests", deltaStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/total/requests", newStats.requestCount())); emitter.emit(builder.build("query/cache/caffeine/delta/loadTime", deltaStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/total/loadTime", newStats.totalLoadTime())); emitter.emit(builder.build("query/cache/caffeine/delta/evictionBytes", deltaStats.evictionWeight())); emitter.emit(builder.build("query/cache/caffeine/total/evictionBytes", newStats.evictionWeight())); if (!priorStats.compareAndSet(oldStats, newStats)) { // ISE for stack trace log.warn( new IllegalStateException("Multiple monitors"), "Multiple monitors on the same cache causing race conditions and unreliable stats reporting" ); } }
@Override public boolean doMonitor(ServiceEmitter emitter) { final ServiceMetricEvent.Builder builder = new ServiceMetricEvent.Builder(); Map<String, Long> diff = keyedDiff.to( "queryCountStats", ImmutableMap.of("query/success/count", statsProvider.getSuccessfulQueryCount(), "query/failed/count", statsProvider.getFailedQueryCount(), "query/interrupted/count", statsProvider.getInterruptedQueryCount() ) ); if (diff != null) { for (Map.Entry<String, Long> diffEntry : diff.entrySet()) { emitter.emit(builder.build(diffEntry.getKey(), diffEntry.getValue())); } } return true; }
private void emitTieredStat( final ServiceEmitter emitter, final String metricName, final String tier, final double value ) { emitter.emit( new ServiceMetricEvent.Builder() .setDimension(DruidMetrics.TIER, tier) .build(metricName, value) ); }