Provide grafana settings for telemetry (#2138)

* Change a label name for  sw instance to avoid confict.

* Fix a wrong metric name.

* Fix too many counter instances.

* Set uptime to second.

* Fix format.

* Fix format

* Remove two unnecessary counter.

* Provide grafana dashboard settings and remove unnecessary metric.

* Provide a simple UI brief doc. Fix #2137
This commit is contained in:
吴晟 Wu Sheng 2019-01-10 07:27:23 +08:00 committed by Gao Hongtao
parent 6499d4f583
commit 5f57e561c7
13 changed files with 2390 additions and 48 deletions

View File

@ -20,4 +20,4 @@ SkyWalking already support.
- [Observability Analysis Language](oal.md). Introduces the core languages, which is designed for aggregation behaviour definition. - [Observability Analysis Language](oal.md). Introduces the core languages, which is designed for aggregation behaviour definition.
- [Query in OAP](../protocols/README.md#query-protocol). A set of query protocol provided, based on the Observability Analysis Language metric definition. - [Query in OAP](../protocols/README.md#query-protocol). A set of query protocol provided, based on the Observability Analysis Language metric definition.
- UI - UI
- [Overview](ui-overview.md). - [Overview](ui-overview.md). A simple brief about SkyWalking UI.

View File

@ -0,0 +1,14 @@
# Visualization
SkyWalking native UI provides the default visualization solution.
It provides observability related graphs
about overview, service, service instance, endpoint, trace and alarm,
including topology, dependency graph, heatmap, etc.
For most open source users, this UI solution should be good enough to use.
And you have other open source options in visualization.
See [UI setup](../setup/backend/ui-setup.md).
Also, we have already known, many of our users have integrated SkyWalking
into their products.
If you want to do that too, please use [SkyWalking query protocol](../protocols/README.md#query-protocol).

View File

@ -5,16 +5,26 @@ telemetry:
none: none:
``` ```
In order to open, we should set `prometheus` to provider. The endpoint open at http://0.0.0.0:1234/ ## Prometheus
Prometheus is supported as telemetry implementor.
By using this, prometheus collects metric from skywalking backend.
Set `prometheus` to provider. The endpoint open at `http://0.0.0.0:1234/` and `http://0.0.0.0:1234/metrics`.
```yaml ```yaml
telemetry: telemetry:
prometheus: prometheus:
``` ```
You could set host and port Set host and port if needed.
```yaml ```yaml
telemetry: telemetry:
prometheus: prometheus:
host: 127.0.0.1 host: 127.0.0.1
port: 1543 port: 1543
``` ```
### Grafana Visualization
Provide two grafana dashboard settings.
1. Use [SkyWalking trace-mode dashboard](telemetry/trace-mode-grafana.json) when SkyWalking is used with tracing agent.
1. Use [SkyWalking mesh-mode dashboard](telemetry/mesh-mode-grafana.json) when SkyWalking is used with service mesh
telemetry, including istio, envoy.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -38,9 +38,7 @@ public enum PersistenceTimer {
private Boolean isStarted = false; private Boolean isStarted = false;
private final Boolean debug; private final Boolean debug;
private CounterMetric errorCounter; private CounterMetric errorCounter;
private CounterMetric prepareCounter;
private HistogramMetric prepareLatency; private HistogramMetric prepareLatency;
private CounterMetric executeCounter;
private HistogramMetric executeLatency; private HistogramMetric executeLatency;
PersistenceTimer() { PersistenceTimer() {
@ -57,12 +55,8 @@ public enum PersistenceTimer {
MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class); MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class);
errorCounter = metricCreator.createCounter("persistence_timer_bulk_error_count", "Error execution of the prepare stage in persistence timer", errorCounter = metricCreator.createCounter("persistence_timer_bulk_error_count", "Error execution of the prepare stage in persistence timer",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
prepareCounter = metricCreator.createCounter("persistence_timer_bulk_prepare_count", "Execution of the prepare stage in persistence timer",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
prepareLatency = metricCreator.createHistogramMetric("persistence_timer_bulk_prepare_latency", "Latency of the prepare stage in persistence timer", prepareLatency = metricCreator.createHistogramMetric("persistence_timer_bulk_prepare_latency", "Latency of the prepare stage in persistence timer",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
executeCounter = metricCreator.createCounter("persistence_timer_bulk_execute_count", "Execution of the execute stage in persistence timer",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
executeLatency = metricCreator.createHistogramMetric("persistence_timer_bulk_execute_latency", "Latency of the execute stage in persistence timer", executeLatency = metricCreator.createHistogramMetric("persistence_timer_bulk_execute_latency", "Latency of the execute stage in persistence timer",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
@ -83,7 +77,6 @@ public enum PersistenceTimer {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
try { try {
prepareCounter.inc();
HistogramMetric.Timer timer = prepareLatency.createTimer(); HistogramMetric.Timer timer = prepareLatency.createTimer();
List batchAllCollection = new LinkedList(); List batchAllCollection = new LinkedList();
@ -114,7 +107,6 @@ public enum PersistenceTimer {
timer.finish(); timer.finish();
} }
executeCounter.inc();
HistogramMetric.Timer executeLatencyTimer = executeLatency.createTimer(); HistogramMetric.Timer executeLatencyTimer = executeLatency.createTimer();
try { try {
batchDAO.batchPersistence(batchAllCollection); batchDAO.batchPersistence(batchAllCollection);

View File

@ -28,13 +28,10 @@ import org.slf4j.*;
public class MeshGRPCHandler extends ServiceMeshMetricServiceGrpc.ServiceMeshMetricServiceImplBase { public class MeshGRPCHandler extends ServiceMeshMetricServiceGrpc.ServiceMeshMetricServiceImplBase {
private static final Logger logger = LoggerFactory.getLogger(MeshGRPCHandler.class); private static final Logger logger = LoggerFactory.getLogger(MeshGRPCHandler.class);
private CounterMetric counter;
private HistogramMetric histogram; private HistogramMetric histogram;
public MeshGRPCHandler(ModuleManager moduleManager) { public MeshGRPCHandler(ModuleManager moduleManager) {
MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class); MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class);
counter = metricCreator.createCounter("mesh_grpc_in_count", "The count of service mesh telemetry",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
histogram = metricCreator.createHistogramMetric("mesh_grpc_in_latency", "The process latency of service mesh telemetry", histogram = metricCreator.createHistogramMetric("mesh_grpc_in_latency", "The process latency of service mesh telemetry",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
} }
@ -46,7 +43,6 @@ public class MeshGRPCHandler extends ServiceMeshMetricServiceGrpc.ServiceMeshMet
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Received mesh metric: {}", metric); logger.debug("Received mesh metric: {}", metric);
} }
counter.inc();
HistogramMetric.Timer timer = histogram.createTimer(); HistogramMetric.Timer timer = histogram.createTimer();
try { try {
TelemetryDataDispatcher.preProcess(metric); TelemetryDataDispatcher.preProcess(metric);

View File

@ -101,7 +101,7 @@ public class TraceModuleProvider extends ModuleProvider {
SegmentStandardizationWorker standardizationWorker2 = new SegmentStandardizationWorker(getManager(), segmentProducer, SegmentStandardizationWorker standardizationWorker2 = new SegmentStandardizationWorker(getManager(), segmentProducer,
moduleConfig.getBufferPath(), moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart(), moduleConfig.getBufferPath(), moduleConfig.getBufferOffsetMaxFileSize(), moduleConfig.getBufferDataMaxFileSize(), moduleConfig.isBufferFileCleanWhenRestart(),
false); true);
segmentProducerV2.setStandardizationWorker(standardizationWorker2); segmentProducerV2.setStandardizationWorker(standardizationWorker2);
} catch (IOException e) { } catch (IOException e) {
throw new ModuleStartException(e.getMessage(), e); throw new ModuleStartException(e.getMessage(), e);

View File

@ -37,14 +37,11 @@ public class TraceSegmentReportServiceHandler extends TraceSegmentReportServiceG
private static final Logger logger = LoggerFactory.getLogger(TraceSegmentServiceHandler.class); private static final Logger logger = LoggerFactory.getLogger(TraceSegmentServiceHandler.class);
private final SegmentParseV2.Producer segmentProducer; private final SegmentParseV2.Producer segmentProducer;
private CounterMetric counter;
private HistogramMetric histogram; private HistogramMetric histogram;
public TraceSegmentReportServiceHandler(SegmentParseV2.Producer segmentProducer, ModuleManager moduleManager) { public TraceSegmentReportServiceHandler(SegmentParseV2.Producer segmentProducer, ModuleManager moduleManager) {
this.segmentProducer = segmentProducer; this.segmentProducer = segmentProducer;
MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class); MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class);
counter = metricCreator.createCounter("trace_grpc_v6_in_count", "The count of service mesh telemetry",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
histogram = metricCreator.createHistogramMetric("trace_grpc_v6_in_latency", "The process latency of service mesh telemetry", histogram = metricCreator.createHistogramMetric("trace_grpc_v6_in_latency", "The process latency of service mesh telemetry",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
} }
@ -56,7 +53,6 @@ public class TraceSegmentReportServiceHandler extends TraceSegmentReportServiceG
logger.debug("receive segment"); logger.debug("receive segment");
} }
counter.inc();
HistogramMetric.Timer timer = histogram.createTimer(); HistogramMetric.Timer timer = histogram.createTimer();
try { try {
segmentProducer.send(segment, SegmentSource.Agent); segmentProducer.send(segment, SegmentSource.Agent);

View File

@ -44,9 +44,9 @@ public class SegmentParse {
private final SegmentParserListenerManager listenerManager; private final SegmentParserListenerManager listenerManager;
private final SegmentCoreInfo segmentCoreInfo; private final SegmentCoreInfo segmentCoreInfo;
@Setter private SegmentStandardizationWorker standardizationWorker; @Setter private SegmentStandardizationWorker standardizationWorker;
private CounterMetric traceBufferFileRetry; private volatile static CounterMetric TRACE_BUFFER_FILE_RETRY;
private CounterMetric traceBufferFileOut; private volatile static CounterMetric TRACE_BUFFER_FILE_OUT;
private CounterMetric traceParseError; private volatile static CounterMetric TRACE_PARSE_ERROR;
private SegmentParse(ModuleManager moduleManager, SegmentParserListenerManager listenerManager) { private SegmentParse(ModuleManager moduleManager, SegmentParserListenerManager listenerManager) {
this.moduleManager = moduleManager; this.moduleManager = moduleManager;
@ -58,11 +58,11 @@ public class SegmentParse {
this.segmentCoreInfo.setV2(false); this.segmentCoreInfo.setV2(false);
MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class); MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class);
traceBufferFileRetry = metricCreator.createCounter("v5_trace_buffer_file_retry", "The number of retry trace segment from the buffer file, but haven't registered successfully.", TRACE_BUFFER_FILE_RETRY = metricCreator.createCounter("v5_trace_buffer_file_retry", "The number of retry trace segment from the buffer file, but haven't registered successfully.",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
traceBufferFileOut = metricCreator.createCounter("v5_trace_buffer_file_out", "The number of trace segment out of the buffer file", TRACE_BUFFER_FILE_OUT = metricCreator.createCounter("v5_trace_buffer_file_out", "The number of trace segment out of the buffer file",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
traceParseError = metricCreator.createCounter("v5_trace_parse_error", "The number of trace segment out of the buffer file", TRACE_PARSE_ERROR = metricCreator.createCounter("v5_trace_parse_error", "The number of trace segment out of the buffer file",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
} }
@ -84,19 +84,19 @@ public class SegmentParse {
writeToBufferFile(segmentCoreInfo.getSegmentId(), segment); writeToBufferFile(segmentCoreInfo.getSegmentId(), segment);
} else { } else {
// from SegmentSource.Buffer // from SegmentSource.Buffer
traceBufferFileRetry.inc(); TRACE_BUFFER_FILE_RETRY.inc();
} }
return false; return false;
} else { } else {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("This segment id exchange success, id: {}", segmentCoreInfo.getSegmentId()); logger.debug("This segment id exchange success, id: {}", segmentCoreInfo.getSegmentId());
} }
traceBufferFileOut.inc(); TRACE_BUFFER_FILE_OUT.inc();
notifyListenerToBuild(); notifyListenerToBuild();
return true; return true;
} }
} catch (Throwable e) { } catch (Throwable e) {
traceParseError.inc(); TRACE_PARSE_ERROR.inc();
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
return true; return true;
} }
@ -257,7 +257,12 @@ public class SegmentParse {
@Override public boolean call(UpstreamSegment segment) { @Override public boolean call(UpstreamSegment segment) {
SegmentParse segmentParse = new SegmentParse(moduleManager, listenerManager); SegmentParse segmentParse = new SegmentParse(moduleManager, listenerManager);
segmentParse.setStandardizationWorker(standardizationWorker); segmentParse.setStandardizationWorker(standardizationWorker);
return segmentParse.parse(segment, Source.Buffer); boolean parseResult = segmentParse.parse(segment, Source.Buffer);
if (parseResult) {
segmentParse.TRACE_BUFFER_FILE_OUT.inc();
}
return parseResult;
} }
} }
} }

View File

@ -47,9 +47,9 @@ public class SegmentParseV2 {
private final SegmentParserListenerManager listenerManager; private final SegmentParserListenerManager listenerManager;
private final SegmentCoreInfo segmentCoreInfo; private final SegmentCoreInfo segmentCoreInfo;
@Setter private SegmentStandardizationWorker standardizationWorker; @Setter private SegmentStandardizationWorker standardizationWorker;
private CounterMetric traceBufferFileRetry; private volatile static CounterMetric TRACE_BUFFER_FILE_RETRY;
private CounterMetric traceBufferFileOut; private volatile static CounterMetric TRACE_BUFFER_FILE_OUT;
private CounterMetric traceParseError; private volatile static CounterMetric TRACE_PARSE_ERROR;
private SegmentParseV2(ModuleManager moduleManager, SegmentParserListenerManager listenerManager) { private SegmentParseV2(ModuleManager moduleManager, SegmentParserListenerManager listenerManager) {
this.moduleManager = moduleManager; this.moduleManager = moduleManager;
@ -60,13 +60,15 @@ public class SegmentParseV2 {
this.segmentCoreInfo.setEndTime(Long.MIN_VALUE); this.segmentCoreInfo.setEndTime(Long.MIN_VALUE);
this.segmentCoreInfo.setV2(true); this.segmentCoreInfo.setV2(true);
MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class); if (TRACE_BUFFER_FILE_RETRY == null) {
traceBufferFileRetry = metricCreator.createCounter("v6_trace_buffer_file_retry", "The number of retry trace segment from the buffer file, but haven't registered successfully.", MetricCreator metricCreator = moduleManager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class);
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); TRACE_BUFFER_FILE_RETRY = metricCreator.createCounter("v6_trace_buffer_file_retry", "The number of retry trace segment from the buffer file, but haven't registered successfully.",
traceBufferFileOut = metricCreator.createCounter("v6_trace_buffer_file_out", "The number of trace segment out of the buffer file", MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); TRACE_BUFFER_FILE_OUT = metricCreator.createCounter("v6_trace_buffer_file_out", "The number of trace segment out of the buffer file",
traceParseError = metricCreator.createCounter("v6_trace_parse_error", "The number of trace segment out of the buffer file", MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE); TRACE_PARSE_ERROR = metricCreator.createCounter("v6_trace_parse_error", "The number of trace segment out of the buffer file",
MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE);
}
} }
public boolean parse(UpstreamSegment segment, SegmentSource source) { public boolean parse(UpstreamSegment segment, SegmentSource source) {
@ -87,19 +89,19 @@ public class SegmentParseV2 {
writeToBufferFile(segmentCoreInfo.getSegmentId(), segment); writeToBufferFile(segmentCoreInfo.getSegmentId(), segment);
} else { } else {
// from SegmentSource.Buffer // from SegmentSource.Buffer
traceBufferFileRetry.inc(); TRACE_BUFFER_FILE_RETRY.inc();
} }
return false; return false;
} else { } else {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("This segment id exchange success, id: {}", segmentCoreInfo.getSegmentId()); logger.debug("This segment id exchange success, id: {}", segmentCoreInfo.getSegmentId());
} }
traceBufferFileOut.inc();
notifyListenerToBuild(); notifyListenerToBuild();
return true; return true;
} }
} catch (Throwable e) { } catch (Throwable e) {
traceParseError.inc(); TRACE_PARSE_ERROR.inc();
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
return true; return true;
} }
@ -256,7 +258,12 @@ public class SegmentParseV2 {
@Override public boolean call(UpstreamSegment segment) { @Override public boolean call(UpstreamSegment segment) {
SegmentParseV2 segmentParse = new SegmentParseV2(moduleManager, listenerManager); SegmentParseV2 segmentParse = new SegmentParseV2(moduleManager, listenerManager);
segmentParse.setStandardizationWorker(standardizationWorker); segmentParse.setStandardizationWorker(standardizationWorker);
return segmentParse.parse(segment, SegmentSource.Buffer); boolean parseResult = segmentParse.parse(segment, SegmentSource.Buffer);
if (parseResult) {
segmentParse.TRACE_BUFFER_FILE_OUT.inc();
}
return parseResult;
} }
} }
} }

View File

@ -20,7 +20,6 @@ package org.apache.skywalking.oap.server.starter;
import org.apache.skywalking.oap.server.core.RunningMode; import org.apache.skywalking.oap.server.core.RunningMode;
import org.apache.skywalking.oap.server.library.module.*; import org.apache.skywalking.oap.server.library.module.*;
import org.apache.skywalking.oap.server.library.util.TimeBucketUtils;
import org.apache.skywalking.oap.server.starter.config.*; import org.apache.skywalking.oap.server.starter.config.*;
import org.apache.skywalking.oap.server.telemetry.TelemetryModule; import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
import org.apache.skywalking.oap.server.telemetry.api.*; import org.apache.skywalking.oap.server.telemetry.api.*;
@ -45,7 +44,8 @@ public class OAPServerStartUp {
manager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class).createGauge("uptime", manager.find(TelemetryModule.NAME).provider().getService(MetricCreator.class).createGauge("uptime",
"oap server start up time", MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE) "oap server start up time", MetricTag.EMPTY_KEY, MetricTag.EMPTY_VALUE)
.setValue(TimeBucketUtils.INSTANCE.getMinuteTimeBucket(System.currentTimeMillis())); // Set uptime to second
.setValue(System.currentTimeMillis() / 1000);
if (RunningMode.isInitMode()) { if (RunningMode.isInitMode()) {
logger.info("OAP starts up in init mode successfully, exit now..."); logger.info("OAP starts up in init mode successfully, exit now...");

View File

@ -57,7 +57,7 @@ public abstract class BaseMetric<T extends SimpleCollector, C> {
try { try {
if (metricInstance == null) { if (metricInstance == null) {
String[] labelNames = new String[labels.getKeys().length + 1]; String[] labelNames = new String[labels.getKeys().length + 1];
labelNames[0] = "instance"; labelNames[0] = "sw_backend_instance";
for (int i = 0; i < labels.getKeys().length; i++) { for (int i = 0; i < labels.getKeys().length; i++) {
labelNames[i + 1] = labels.getKeys()[i]; labelNames[i + 1] = labels.getKeys()[i];
} }