@Override public void init(ConfigurationRegistry configuration) { tracingPlugin = configuration.getConfig(TracingPlugin.class); metricRegistry = configuration.getConfig(CorePlugin.class).getMetricRegistry(); }
@Override protected void onElasticsearchFirstAvailable(ElasticsearchClient elasticsearchClient) { if (corePlugin.isInitializeElasticsearch()) { if (elasticsearchClient.isElasticsearch6Compatible()) { logger.debug("creating KibanaIndexAndMapping for ES 6..."); elasticsearchClient.createIndexAndSendMapping(".kibana", "doc", IOUtils.getResourceAsStream(elasticsearchClient.getElasticsearchResourcePath() + "kibana-index-doc.json")); logger.debug("created KibanaIndexAndMapping for ES 6"); } else { logger.debug("creating KibanaIndexAndMapping for ES 5..."); createKibana5IndexAndMappings(elasticsearchClient); sendConfigurationMapping(elasticsearchClient); logger.debug("created KibanaIndexAndMapping for ES 5"); } manageMetricsIndex(elasticsearchClient, corePlugin); } elasticsearchClient.scheduleIndexManagement(ElasticsearchReporter.STAGEMONITOR_METRICS_INDEX_PREFIX, corePlugin.getMoveToColdNodesAfterDays(), corePlugin.getDeleteElasticsearchMetricsAfterDays()); reportToElasticsearch(corePlugin.getMetricRegistry(), corePlugin.getElasticsearchReportingInterval(), corePlugin.getMeasurementSession()); }
@Before public void setUp() throws Exception { this.configuration = mock(ConfigurationRegistry.class); this.tracingPlugin = mock(TracingPlugin.class); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); when(configuration.getConfig(TracingPlugin.class)).thenReturn(tracingPlugin); when(configuration.getConfig(ElasticsearchTracingPlugin.class)).thenReturn(spy(new ElasticsearchTracingPlugin())); when(corePlugin.getElasticsearchClient()).thenReturn(elasticsearchClient); when(corePlugin.getMetricRegistry()).thenReturn(new Metric2Registry()); when(tracingPlugin.getDefaultRateLimitSpansPerMinute()).thenReturn(1000000d); reporter = new ElasticsearchSpanReporter(); reporter.init(configuration); final String mappingTemplate = IOUtils.getResourceAsString("stagemonitor-elasticsearch-span-index-template.json"); elasticsearchClient.sendMappingTemplate(mappingTemplate, "stagemonitor-spans"); elasticsearchClient.waitForCompletion(); when(tracingPlugin.getTracer()).thenReturn(mockTracer); }
@Override public void init(ConfigurationRegistry configuration) { final CorePlugin corePlugin = configuration.getConfig(CorePlugin.class); tracingPlugin = configuration.getConfig(TracingPlugin.class); elasticsearchTracingPlugin = configuration.getConfig(ElasticsearchTracingPlugin.class); elasticsearchClient = corePlugin.getElasticsearchClient(); metricRegistry = corePlugin.getMetricRegistry(); scheduler = ExecutorUtils.createSingleThreadSchedulingDeamonPool("elasticsearch-reporter", 10, corePlugin); spanFlushingRunnable = new SpanFlushingRunnable(new FlushCallable()); scheduler.scheduleWithFixedDelay(spanFlushingRunnable, elasticsearchTracingPlugin.getFlushDelayMs(), elasticsearchTracingPlugin.getFlushDelayMs(), TimeUnit.MILLISECONDS); bulkQueue = new ArrayBlockingQueue<OutputStreamHandler>(elasticsearchTracingPlugin.getMaxQueueSize()); this.updateReporter = new ElasticsearchUpdateSpanReporter(corePlugin, tracingPlugin, elasticsearchTracingPlugin, this); }
@Before public void clearState() { CorePlugin corePlugin = mock(CorePlugin.class); TracingPlugin tracingPlugin = mock(TracingPlugin.class); when(tracingPlugin.getDefaultRateLimitSpansPerMinuteOption()).thenReturn(mock(ConfigurationOption.class)); when(tracingPlugin.getDefaultRateLimitSpansPercentOption()).thenReturn(mock(ConfigurationOption.class)); when(tracingPlugin.getRateLimitSpansPerMinutePercentPerTypeOption()).thenReturn(mock(ConfigurationOption.class)); when(tracingPlugin.getDefaultRateLimitSpansPercent()).thenReturn(1.0); when(tracingPlugin.getRateLimitSpansPerMinutePercentPerType()).thenReturn(Collections.emptyMap()); when(tracingPlugin.getProfilerRateLimitPerMinuteOption()).thenReturn(mock(ConfigurationOption.class)); configuration = mock(ConfigurationRegistry.class); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); when(configuration.getConfig(TracingPlugin.class)).thenReturn(tracingPlugin); when(corePlugin.isStagemonitorActive()).thenReturn(true); when(corePlugin.getThreadPoolQueueCapacityLimit()).thenReturn(1000); when(corePlugin.getMetricRegistry()).thenReturn(registry); when(corePlugin.getElasticsearchClient()).thenReturn(mock(ElasticsearchClient.class)); final RequestMonitor requestMonitor = new RequestMonitor(configuration, registry); when(tracingPlugin.getRequestMonitor()).thenReturn(requestMonitor); tags = new HashMap<>(); mockTracer = new MockTracer(); tracer = TracingPlugin.createSpanWrappingTracer(mockTracer, configuration, registry, TagRecordingSpanEventListener.asList(tags), new SamplePriorityDeterminingSpanEventListener(configuration), new ReportingSpanEventListener(configuration)); when(tracingPlugin.getTracer()).thenReturn(tracer); testObject = new TestObject(requestMonitor); assertThat(tracer.scopeManager().active()).isNull(); }
@Before public void setUp() throws Exception { this.configuration = mock(ConfigurationRegistry.class); this.tracingPlugin = mock(TracingPlugin.class); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); when(configuration.getConfig(TracingPlugin.class)).thenReturn(tracingPlugin); when(configuration.getConfig(ElasticsearchTracingPlugin.class)).thenReturn(spy(new ElasticsearchTracingPlugin())); when(corePlugin.getElasticsearchClient()).thenReturn(elasticsearchClient); when(corePlugin.getMetricRegistry()).thenReturn(new Metric2Registry()); when(tracingPlugin.getDefaultRateLimitSpansPerMinute()).thenReturn(1000000d); when(tracingPlugin.getProfilerRateLimitPerMinuteOption()).thenReturn(mock(ConfigurationOption.class)); when(tracingPlugin.isPseudonymizeUserNames()).thenReturn(true); when(tracingPlugin.isSampled(any())).thenReturn(true); reporter = new ElasticsearchSpanReporter(); reporter.init(configuration); final ReportingSpanEventListener reportingSpanEventListener = new ReportingSpanEventListener(configuration); reportingSpanEventListener.addReporter(reporter); final SamplePriorityDeterminingSpanEventListener samplePriorityDeterminingSpanInterceptor = mock(SamplePriorityDeterminingSpanEventListener.class); when(samplePriorityDeterminingSpanInterceptor.onSetTag(ArgumentMatchers.anyString(), ArgumentMatchers.anyString())).then(invocation -> invocation.getArgument(1)); when(samplePriorityDeterminingSpanInterceptor.onSetTag(ArgumentMatchers.anyString(), ArgumentMatchers.anyBoolean())).then(invocation -> invocation.getArgument(1)); when(samplePriorityDeterminingSpanInterceptor.onSetTag(ArgumentMatchers.anyString(), ArgumentMatchers.any(Number.class))).then(invocation -> invocation.getArgument(1)); tracer = TracingPlugin.createSpanWrappingTracer(new MockTracer(new ThreadLocalScopeManager(), new B3Propagator()), configuration, new Metric2Registry(), Collections.emptyList(), samplePriorityDeterminingSpanInterceptor, reportingSpanEventListener); when(tracingPlugin.getTracer()).thenReturn(tracer); }
@Before public void setUp() throws Exception { configuration = mock(ConfigurationRegistry.class); CorePlugin corePlugin = mock(CorePlugin.class); TracingPlugin tracingPlugin = mock(TracingPlugin.class); this.servletPlugin = mock(ServletPlugin.class); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); when(configuration.getConfig(TracingPlugin.class)).thenReturn(tracingPlugin); when(configuration.getConfig(ServletPlugin.class)).thenReturn(servletPlugin); when(tracingPlugin.getDefaultRateLimitSpansPerMinute()).thenReturn(1000000d); when(tracingPlugin.getOnlyReportSpansWithName()).thenReturn(Collections.emptyList()); final URL url = new URL("http://localhost:9200"); when(corePlugin.getElasticsearchUrl()).thenReturn(url); when(corePlugin.getElasticsearchUrls()).thenReturn(Collections.singletonList(url)); ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class); when(elasticsearchClient.isElasticsearchAvailable()).thenReturn(true); when(corePlugin.getElasticsearchClient()).thenReturn(elasticsearchClient); when(corePlugin.getMetricRegistry()).thenReturn(new Metric2Registry()); when(servletPlugin.isHonorDoNotTrackHeader()).thenReturn(true); tracer = new SpanWrappingTracer(new MockTracer(), Arrays.asList( new SpanContextInformation.SpanContextSpanEventListener(), new SpanContextInformation.SpanFinalizer() ) ); GlobalTracerTestHelper.override(tracer); when(tracingPlugin.getTracer()).thenReturn(tracer); assertThat(tracer.scopeManager().active()).isNull(); }
doReturn(new Metric2Registry()).when(corePlugin).getMetricRegistry(); doReturn(Collections.singletonList("http://mockhost:9200")).when(corePlugin).getElasticsearchUrls(); ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class);
@Override public void onConnectionWrapped(ConnectionInformation connectionInformation) { final Metric2Registry metricRegistry = corePlugin.getMetricRegistry(); // at the moment stagemonitor only supports monitoring connections initiated via a DataSource if (connectionInformation.getDataSource() instanceof DataSource && corePlugin.isInitialized()) { DataSource dataSource = (DataSource) connectionInformation.getDataSource(); ensureUrlExistsForDataSource(dataSource, connectionInformation.getConnection()); MetaData metaData = dataSourceUrlMap.get(dataSource); metricRegistry.timer(getConnectionTemplate.build(metaData.serviceName)).update(connectionInformation.getTimeToGetConnectionNs(), TimeUnit.NANOSECONDS); final Span span = TracingPlugin.getCurrentSpan(); final Long connectionWrappedCountSum = incrementAndGetContextValue(span, CONNECTION_WRAPPED_COUNT_ATTRIBUTE, 1L); span.setTag("jdbc_get_connection_count", connectionWrappedCountSum); final double timeToGetConnectionMs = connectionInformation.getTimeToGetConnectionNs() / MILLISECOND_IN_NANOS; final Double connectionWaitTimeMsSum = incrementAndGetContextValue(span, TIME_TO_GET_CONNECTION_MS_ATTRIBUTE, timeToGetConnectionMs); span.setTag("jdbc_connection_wait_time_ms", connectionWaitTimeMsSum); } }
public static SpanWrappingTracer createSpanWrappingTracer(final Tracer delegate, ConfigurationRegistry configuration, final Metric2Registry metricRegistry, final Iterable<SpanEventListenerFactory> spanInterceptorFactories, final SamplePriorityDeterminingSpanEventListener samplePriorityDeterminingSpanInterceptor, final ReportingSpanEventListener reportingSpanEventListener) { final CorePlugin corePlugin = configuration.getConfig(CorePlugin.class); final TracingPlugin tracingPlugin = configuration.getConfig(TracingPlugin.class); final SpanWrappingTracer spanWrappingTracer = new SpanWrappingTracer(delegate); spanWrappingTracer.addEventListenerFactory(new SpanContextInformation.SpanContextSpanEventListener()); spanWrappingTracer.addEventListenerFactory(samplePriorityDeterminingSpanInterceptor); spanWrappingTracer.addEventListenerFactory(new MDCSpanEventListener(corePlugin, tracingPlugin)); spanWrappingTracer.addEventListenerFactory(new B3IdentifierTagger(tracingPlugin)); for (SpanEventListenerFactory spanEventListenerFactory : spanInterceptorFactories) { spanWrappingTracer.addEventListenerFactory(spanEventListenerFactory); } final ThreadPoolExecutor singleThreadDeamonPool = ExecutorUtils.createSingleThreadDeamonPool("metric-tracking", 1000, corePlugin); final MetricsSpanEventListener spanEventListener = new MetricsSpanEventListener(metricRegistry, singleThreadDeamonPool, tracingPlugin); spanWrappingTracer.addEventListenerFactory(spanEventListener); spanWrappingTracer.addEventListenerFactory(new CallTreeSpanEventListener(corePlugin.getMetricRegistry(), tracingPlugin)); spanWrappingTracer.addEventListenerFactory(new AnonymizingSpanEventListener(tracingPlugin)); spanWrappingTracer.addEventListenerFactory(reportingSpanEventListener); spanWrappingTracer.addEventListenerFactory(new SpanContextInformation.SpanFinalizer()); return spanWrappingTracer; }
@Override public boolean isActive(IsActiveArguments isActiveArguments) { PreExecutionInterceptorContext context = new PreExecutionInterceptorContext(configuration, isActiveArguments.getRequestTrace(), reportingRate, corePlugin.getMetricRegistry()); for (PreExecutionRequestTraceReporterInterceptor interceptor : preInterceptors) { try { interceptor.interceptReport(context); } catch (Exception e) { logger.warn(e.getMessage(), e); } } return context.isReport(); } }
@Override public void reportRequestTrace(ReportArguments reportArguments) { PostExecutionInterceptorContext context = new PostExecutionInterceptorContext(configuration, reportArguments.getRequestTrace(), reportingRate, corePlugin.getMetricRegistry()); for (PostExecutionRequestTraceReporterInterceptor interceptor : postInterceptors) { try { interceptor.interceptReport(context); } catch (Exception e) { logger.warn(e.getMessage(), e); } } if (context.isReport()) { reportingRate.mark(); doReport(reportArguments.getRequestTrace(), context); } }
private void trackExternalRequestMetrics(ExternalRequest externalRequest) { // 0 means the time could not be determined if (externalRequest.getExecutionTimeNanos() <= 0) { return; } final long duration = externalRequest.getExecutionTimeNanos(); corePlugin.getMetricRegistry() .timer(getExternalRequestTimerName(externalRequest, "All")) .update(duration, TimeUnit.NANOSECONDS); if (externalRequest.getExecutedBy() != null) { corePlugin.getMetricRegistry() .timer(getExternalRequestTimerName(externalRequest)) .update(duration, TimeUnit.NANOSECONDS); } }
@Override public void init(ConfigurationRegistry configuration) { final CorePlugin corePlugin = configuration.getConfig(CorePlugin.class); tracingPlugin = configuration.getConfig(TracingPlugin.class); elasticsearchTracingPlugin = configuration.getConfig(ElasticsearchTracingPlugin.class); elasticsearchClient = corePlugin.getElasticsearchClient(); metricRegistry = corePlugin.getMetricRegistry(); scheduler = ExecutorUtils.createSingleThreadSchedulingDeamonPool("elasticsearch-reporter", 10, corePlugin); spanFlushingRunnable = new SpanFlushingRunnable(new FlushCallable()); scheduler.scheduleWithFixedDelay(spanFlushingRunnable, elasticsearchTracingPlugin.getFlushDelayMs(), elasticsearchTracingPlugin.getFlushDelayMs(), TimeUnit.MILLISECONDS); bulkQueue = new ArrayBlockingQueue<OutputStreamHandler>(elasticsearchTracingPlugin.getMaxQueueSize()); this.updateReporter = new ElasticsearchUpdateSpanReporter(corePlugin, tracingPlugin, elasticsearchTracingPlugin, this); }
private boolean isReportExternalRequest(ExternalRequest externalRequest) { if (externalRequest.getExecutionTime() < requestMonitorPlugin.getExcludeExternalRequestsFasterThan()) { logger.debug("Exclude external request {} because it was faster than {}", externalRequest.getExecutedBy(), requestMonitorPlugin.getExcludeExternalRequestsFasterThan()); return false; } if (MetricUtils.isRateLimitExceeded(requestMonitorPlugin.getOnlyReportNExternalRequestsPerMinute(), reportingRate)) { logger.debug("Exclude external request {} because would exceed the reporting rate of {}", externalRequest.getExecutedBy(), requestMonitorPlugin.getOnlyReportNExternalRequestsPerMinute()); return false; } Timer timer = corePlugin.getMetricRegistry().timer(getExternalRequestTimerName(externalRequest)); final double percentageThreshold = requestMonitorPlugin.getExcludeExternalRequestsWhenFasterThanXPercent(); if (!MetricUtils.isFasterThanXPercentOfAllRequests(externalRequest.getExecutionTimeNanos(), percentageThreshold, timer)) { logger.debug("Exclude external request {} because was faster than {}% of all requests", externalRequest.getExecutedBy(), percentageThreshold * 100); return false; } return true; }
@Override public void onConnectionWrapped(ConnectionInformation connectionInformation) { final Metric2Registry metricRegistry = corePlugin.getMetricRegistry(); // at the moment stagemonitor only supports monitoring connections initiated via a DataSource if (connectionInformation.getDataSource() instanceof DataSource && corePlugin.isInitialized()) { DataSource dataSource = (DataSource) connectionInformation.getDataSource(); ensureUrlExistsForDataSource(dataSource, connectionInformation.getConnection()); MetaData metaData = dataSourceUrlMap.get(dataSource); metricRegistry.timer(getConnectionTemplate.build(metaData.serviceName)).update(connectionInformation.getTimeToGetConnectionNs(), TimeUnit.NANOSECONDS); final Span span = TracingPlugin.getCurrentSpan(); final Long connectionWrappedCountSum = incrementAndGetContextValue(span, CONNECTION_WRAPPED_COUNT_ATTRIBUTE, 1L); span.setTag("jdbc_get_connection_count", connectionWrappedCountSum); final double timeToGetConnectionMs = connectionInformation.getTimeToGetConnectionNs() / MILLISECOND_IN_NANOS; final Double connectionWaitTimeMsSum = incrementAndGetContextValue(span, TIME_TO_GET_CONNECTION_MS_ATTRIBUTE, timeToGetConnectionMs); span.setTag("jdbc_connection_wait_time_ms", connectionWaitTimeMsSum); } }