@Override public void initializePlugin(InitArguments initArguments) { this.metricRegistry = initArguments.getMetricRegistry(); this.healthCheckRegistry = initArguments.getHealthCheckRegistry(); final Integer reloadInterval = getReloadConfigurationInterval(); if (reloadInterval > 0) { initArguments.getConfiguration().scheduleReloadAtRate(reloadInterval, TimeUnit.SECONDS); } initArguments.getMetricRegistry().register(MetricName.name("online").build(), new Gauge<Integer>() { @Override public Integer getValue() { return 1; } }); // it's important to initialize the ElasticsearchClient via getElasticsearchClient() // otherwise the periodic availability check might not get started getElasticsearchClient(); if (isReportToElasticsearch()) { final GrafanaClient grafanaClient = getGrafanaClient(); grafanaClient.createElasticsearchDatasource(getElasticsearchUrl()); grafanaClient.sendGrafanaDashboardAsync("grafana/ElasticsearchCustomMetricsDashboard.json"); } registerReporters(initArguments.getMetricRegistry(), initArguments.getConfiguration(), initArguments.getMeasurementSession()); }
@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); }
/** * This is an internal method, use {@link GlobalTracer#get()} * <p> * However, if you are a stagemonitor plugin developer, you should use this method * as the tracer can be mocked more easily. */ public Tracer getTracer() { if (spanWrappingTracer != null && corePlugin.isStagemonitorActive()) { return spanWrappingTracer; } else { return NoopTracerFactory.create(); } }
public static boolean isActive(CorePlugin corePlugin) { return !corePlugin.getDisabledPlugins().contains(JdbcPlugin.class.getSimpleName()) && corePlugin.isStagemonitorActive(); } }
@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()); }
public ElasticsearchClient(final CorePlugin corePlugin, final HttpClient httpClient, int esAvailabilityCheckIntervalSec, List<ElasticsearchAvailabilityObserver> elasticsearchAvailabilityObservers) { this.corePlugin = corePlugin; asyncESPool = ExecutorUtils .createSingleThreadDeamonPool("async-elasticsearch", corePlugin.getThreadPoolQueueCapacityLimit(), corePlugin); timer = new Timer("elasticsearch-tasks", true); if (corePlugin.isInternalMonitoringActive()) { JavaThreadPoolMetricsCollectorImpl pooledResource = new JavaThreadPoolMetricsCollectorImpl(asyncESPool, "internal.asyncESPool"); PooledResourceMetricsRegisterer.registerPooledResource(pooledResource, Stagemonitor.getMetric2Registry()); } this.httpClient = httpClient; checkEsAvailability = new CheckEsAvailability(httpClient, corePlugin, elasticsearchAvailabilityObservers); if (esAvailabilityCheckIntervalSec > 0) { final long period = TimeUnit.SECONDS.toMillis(esAvailabilityCheckIntervalSec); timer.scheduleAtFixedRate(checkEsAvailability, 0, period); } }
doReturn(tracingPlugin).when(configuration).getConfig(TracingPlugin.class); doReturn(true).when(corePlugin).isStagemonitorActive(); doReturn(1000).when(corePlugin).getThreadPoolQueueCapacityLimit(); doReturn(new Metric2Registry()).when(corePlugin).getMetricRegistry(); doReturn(Collections.singletonList("http://mockhost:9200")).when(corePlugin).getElasticsearchUrls(); ElasticsearchClient elasticsearchClient = mock(ElasticsearchClient.class); doReturn(true).when(elasticsearchClient).isElasticsearchAvailable(); doReturn(elasticsearchClient).when(corePlugin).getElasticsearchClient(); doReturn(false).when(corePlugin).isOnlyLogElasticsearchMetricReports(); TagRecordingSpanEventListener.asList(tags), samplePriorityDeterminingSpanInterceptor, reportingSpanEventListener); when(corePlugin.getMeasurementSession()).thenReturn(new MeasurementSession(getClass().getSimpleName(), "test", "test")); when(tracingPlugin.getTracer()).then((invocation) -> { if (corePlugin.isStagemonitorActive()) { return tracer; } else {
@Override public void initializePlugin(StagemonitorPlugin.InitArguments initArguments) { final CorePlugin corePlugin = initArguments.getPlugin(CorePlugin.class); final ElasticsearchClient elasticsearchClient = corePlugin.getElasticsearchClient(); final GrafanaClient grafanaClient = corePlugin.getGrafanaClient(); final String requestsMappingJson = ElasticsearchClient.modifyIndexTemplate( requestIndexTemplate.getValue(), corePlugin.getMoveToColdNodesAfterDays(), corePlugin.getNumberOfReplicas(), corePlugin.getNumberOfShards()); elasticsearchClient.sendMappingTemplateAsync(requestsMappingJson, "stagemonitor-requests"); final String mappingJson = ElasticsearchClient.modifyIndexTemplate( externalRequestsIndexTemplate.getValue(), corePlugin.getMoveToColdNodesAfterDays(), corePlugin.getNumberOfReplicas(), corePlugin.getNumberOfShards()); elasticsearchClient.sendMappingTemplateAsync(mappingJson, "stagemonitor-external-requests"); if (corePlugin.isReportToGraphite()) { elasticsearchClient.sendGrafana1DashboardAsync("grafana/Grafana1GraphiteRequestDashboard.json"); } if (corePlugin.isReportToElasticsearch()) { elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/RequestDashboard.bulk"); grafanaClient.sendGrafanaDashboardAsync("grafana/ElasticsearchRequestDashboard.json"); grafanaClient.sendGrafanaDashboardAsync("grafana/ElasticsearchExternalRequestsDashboard.json"); } if (!corePlugin.getElasticsearchUrls().isEmpty()) { elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/StagemonitorRequestsIndexPattern.bulk"); elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/RequestAnalysis.bulk"); elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/WebAnalytics.bulk"); elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/ExternalRequests.bulk"); elasticsearchClient.scheduleIndexManagement("stagemonitor-requests-", corePlugin.getMoveToColdNodesAfterDays(), deleteRequestTracesAfterDays.getValue()); elasticsearchClient.scheduleIndexManagement("stagemonitor-external-requests-", corePlugin.getMoveToColdNodesAfterDays(), deleteRequestTracesAfterDays.getValue()); } }
@Before public void setUp() throws Exception { final CorePlugin corePlugin = mock(CorePlugin.class); final URL url = new URL("http://localhost:41234"); when(corePlugin.getElasticsearchUrl()).thenReturn(url); when(corePlugin.getElasticsearchUrls()).thenReturn(Collections.singletonList(url)); when(corePlugin.getThreadPoolQueueCapacityLimit()).thenReturn(10000); when(corePlugin.isInitialized()).thenReturn(TRUE); elasticsearchClient = new ElasticsearchClient(corePlugin, new HttpClient(), -1, Collections.emptyList()); }
@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 { 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(); }
@Override public void initializePlugin(StagemonitorPlugin.InitArguments initArguments) { final CorePlugin corePlugin = initArguments.getPlugin(CorePlugin.class); corePlugin.getGrafanaClient().sendGrafanaDashboardAsync("grafana/ElasticsearchLogging.json"); }
doReturn(true).when(servletPlugin).isClientSpanCollectionEnabled(); doReturn(true).when(servletPlugin).isClientSpanCollectionInjectionEnabled(); doReturn(true).when(corePlugin).isStagemonitorActive(); doReturn(mock(GrafanaClient.class)).when(corePlugin).getGrafanaClient(); doReturn(1000000d).when(tracingPlugin).getProfilerRateLimitPerMinute(); when(tracingPlugin.isSampled(any())).thenReturn(true); }).when(tracingPlugin).addSpanEventListenerFactory(any()); doReturn(spanWrappingTracer).when(tracingPlugin).getTracer(); doReturn("testApplication").when(corePlugin).getApplicationName(); doReturn("testInstance").when(corePlugin).getInstanceName(); servletPlugin.initializePlugin(new StagemonitorPlugin.InitArguments(mock(Metric2Registry.class), configuration, mock(MeasurementSession.class), mock(HealthCheckRegistry.class)));
@Before public void setUp() throws Exception { metricRegistry = new Metric2Registry(); final ConfigurationRegistry configuration = mock(ConfigurationRegistry.class); final CorePlugin corePlugin = mock(CorePlugin.class); when(corePlugin.getElasticsearchClient()).thenReturn(mock(ElasticsearchClient.class)); when(corePlugin.getGrafanaClient()).thenReturn(mock(GrafanaClient.class)); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); osPlugin.initializePlugin(new StagemonitorPlugin.InitArguments(metricRegistry, configuration, mock(MeasurementSession.class), mock(HealthCheckRegistry.class))); this.sigar = osPlugin.getSigar(); }
@Override public void initializePlugin(StagemonitorPlugin.InitArguments initArguments) { registerPooledResources(initArguments.getMetricRegistry(), tomcatThreadPools()); final CorePlugin corePlugin = initArguments.getPlugin(CorePlugin.class); ElasticsearchClient elasticsearchClient = corePlugin.getElasticsearchClient(); if (corePlugin.isReportToGraphite()) { elasticsearchClient.sendGrafana1DashboardAsync("grafana/Grafana1GraphiteServer.json"); elasticsearchClient.sendGrafana1DashboardAsync("grafana/Grafana1GraphiteKPIsOverTime.json"); } if (corePlugin.isReportToElasticsearch()) { final GrafanaClient grafanaClient = corePlugin.getGrafanaClient(); elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/ApplicationServer.bulk"); grafanaClient.sendGrafanaDashboardAsync("grafana/ElasticsearchApplicationServer.json"); } }
when(configuration.getConfig(ServletPlugin.class)).thenReturn(servletPlugin); when(configuration.getConfig(CorePlugin.class)).thenReturn(corePlugin); when(corePlugin.isStagemonitorActive()).thenReturn(true); when(corePlugin.getThreadPoolQueueCapacityLimit()).thenReturn(1000); when(corePlugin.getApplicationName()).thenReturn("JaxRsRequestNameDeterminerTransformerTest"); when(corePlugin.getInstanceName()).thenReturn("test"); when(tracingPlugin.getDefaultRateLimitSpansPerMinute()).thenReturn(1000000d); when(tracingPlugin.getDefaultRateLimitSpansPerMinuteOption()).thenReturn(mock(ConfigurationOption.class));
@Override public void reportMetrics(final Map<MetricName, Gauge> gauges, final Map<MetricName, Counter> counters, final Map<MetricName, Histogram> histograms, final Map<MetricName, Meter> meters, final Map<MetricName, Timer> timers) { if (!corePlugin.isStagemonitorActive()) { return; } long timestamp = clock.getTime(); final Timer.Context time = registry.timer(reportingTimeMetricName).time(); final MetricsOutputStreamHandler metricsOutputStreamHandler = new MetricsOutputStreamHandler(gauges, counters, histograms, meters, timers, timestamp); if (!corePlugin.isOnlyLogElasticsearchMetricReports()) { if (!elasticsearchClient.isElasticsearchAvailable()) { return; } final String url = corePlugin.getElasticsearchUrl() + "/" + getTodaysIndexName() + "/" + METRICS_TYPE + "/_bulk"; httpClient.send("POST", url, CONTENT_TYPE_JSON, metricsOutputStreamHandler, NoopResponseHandler.INSTANCE); } else { try { final ByteArrayOutputStream os = new ByteArrayOutputStream(); metricsOutputStreamHandler.withHttpURLConnection(os); elasticsearchMetricsLogger.info(os.toString("UTF-8")); } catch (IOException e) { logger.warn(e.getMessage(), e); } } time.stop(); }
@Test public void testMDCStagemonitorDeactivated() throws Exception { when(corePlugin.isStagemonitorActive()).thenReturn(false); when(corePlugin.getMeasurementSession()) .thenReturn(new MeasurementSession("MDCSpanEventListenerTest", "testHost", null)); mdcSpanInterceptor.onStart(spanWrapper); assertNull(MDC.getCopyOfContextMap()); }
private void prepareESTest() { when(corePlugin.getElasticsearchConfigurationSourceProfiles()).thenReturn(Collections.singletonList("test")); when(corePlugin.getThreadPoolQueueCapacityLimit()).thenReturn(1000); ElasticsearchClient elasticsearchClient = new ElasticsearchClient(corePlugin, new HttpClient(), -1, Collections.emptyList()); when(corePlugin.getElasticsearchClient()).thenReturn(elasticsearchClient); }
public ElasticsearchUpdateSpanReporter(CorePlugin corePlugin, TracingPlugin tracingPlugin, ElasticsearchTracingPlugin elasticsearchTracingPlugin, ElasticsearchSpanReporter elasticsearchSpanReporter) { this.tracingPlugin = tracingPlugin; this.corePlugin = corePlugin; this.elasticsearchClient = corePlugin.getElasticsearchClient(); this.elasticsearchSpanReporter = elasticsearchSpanReporter; this.httpClient = elasticsearchClient.getHttpClient(); this.elasticsearchTracingPlugin = elasticsearchTracingPlugin; updateBatch = new ArrayList<UpdateDescription>(elasticsearchTracingPlugin.getMaxBatchSize()); updateDescriptionQueue = new ArrayBlockingQueue<UpdateDescription>(1000); updateRunnable = new SpanFlushingRunnable(new UpdateCallable()); final ScheduledThreadPoolExecutor scheduler = ExecutorUtils.createSingleThreadSchedulingDeamonPool("elasticsearch-update-reporter", 10, corePlugin); scheduler.scheduleWithFixedDelay(updateRunnable, elasticsearchTracingPlugin.getFlushDelayMs(), elasticsearchTracingPlugin.getFlushDelayMs(), TimeUnit.MILLISECONDS); }