This is an automated email from the ASF dual-hosted git repository. nkruber pushed a commit to branch release-1.13 in repository https://gitbox.apache.org/repos/asf/flink.git
The following commit(s) were added to refs/heads/release-1.13 by this push: new 39ad632 [FLINK-23102][rest] Return empty FlameGraph if feature is disabled 39ad632 is described below commit 39ad632a60896c94fb796e46c1bacfea32ea68d8 Author: Yao Zhang <xzhang...@126.com> AuthorDate: Fri Jul 2 14:58:25 2021 +0800 [FLINK-23102][rest] Return empty FlameGraph if feature is disabled --- .../shortcodes/generated/rest_v1_dispatcher.html | 100 +++++++++++++++++++++ .../src/test/resources/rest_api_v1.snapshot | 51 ++++++++++- .../job-overview-drawer-flamegraph.component.html | 10 ++- .../handler/job/JobVertexFlameGraphHandler.java | 41 ++++++++- .../runtime/webmonitor/WebMonitorEndpoint.java | 16 ++-- .../webmonitor/threadinfo/JobVertexFlameGraph.java | 13 ++- 6 files changed, 218 insertions(+), 13 deletions(-) diff --git a/docs/layouts/shortcodes/generated/rest_v1_dispatcher.html b/docs/layouts/shortcodes/generated/rest_v1_dispatcher.html index fca2212..b68cf80 100644 --- a/docs/layouts/shortcodes/generated/rest_v1_dispatcher.html +++ b/docs/layouts/shortcodes/generated/rest_v1_dispatcher.html @@ -3777,6 +3777,106 @@ Using 'curl' you can upload a jar via 'curl -X POST -H "Expect:" -F "jarfile=@pa <table class="rest-api table table-bordered"> <tbody> <tr> + <td class="text-left" colspan="2"><h5><strong>/jobs/:jobid/vertices/:vertexid/flamegraph</strong></h5></td> + </tr> + <tr> + <td class="text-left" style="width: 20%">Verb: <code>GET</code></td> + <td class="text-left">Response code: <code>200 OK</code></td> + </tr> + <tr> + <td colspan="2">Returns flame graph information for a vertex, and may initiate flame graph sampling if necessary.</td> + </tr> + <tr> + <td colspan="2">Path parameters</td> + </tr> + <tr> + <td colspan="2"> + <ul> +<li><code>jobid</code> - 32-character hexadecimal string value that identifies a job.</li> +<li><code>vertexid</code> - 32-character hexadecimal string value that identifies a job vertex.</li> + </ul> + </td> + </tr> + <tr> + <td colspan="2">Query parameters</td> + </tr> + <tr> + <td colspan="2"> + <ul> +<li><code>type</code> (optional): String value that specifies the Flame Graph type. Supported options are: "[FULL, ON_CPU, OFF_CPU]".</li> + </ul> + </td> + </tr> + <tr> + <td colspan="2"> + <div class="book-expand"> + <label> + <div class="book-expand-head flex justify-between"> + <span>Request</span> + <span>▾</span> + </div> + <input type="checkbox" class="hidden"> + <div class="book-expand-content markdown-inner"> + <pre> + <code> +{} </code> + </pre> + </div> + </label> + </div> + </td> + </tr> + <tr> + <td colspan="2"> + <div class="book-expand"> + <label> + <div class="book-expand-head flex justify-between"> + <span>Response</span> + <span>▾</span> + </div> + <input type="checkbox" class="hidden"> + <div class="book-expand-content markdown-inner"> + <pre> + <code> +{ + "type" : "object", + "id" : "urn:jsonschema:org:apache:flink:runtime:webmonitor:threadinfo:JobVertexFlameGraph", + "properties" : { + "data" : { + "type" : "object", + "id" : "urn:jsonschema:org:apache:flink:runtime:webmonitor:threadinfo:JobVertexFlameGraph:Node", + "properties" : { + "children" : { + "type" : "array", + "items" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:apache:flink:runtime:webmonitor:threadinfo:JobVertexFlameGraph:Node" + } + }, + "name" : { + "type" : "string" + }, + "value" : { + "type" : "integer" + } + } + }, + "endTimestamp" : { + "type" : "integer" + } + } +} </code> + </pre> + </div> + </label> + </div> + </td> + </tr> + </tbody> +</table> +<table class="rest-api table table-bordered"> + <tbody> + <tr> <td class="text-left" colspan="2"><h5><strong>/jobs/:jobid/vertices/:vertexid/metrics</strong></h5></td> </tr> <tr> diff --git a/flink-runtime-web/src/test/resources/rest_api_v1.snapshot b/flink-runtime-web/src/test/resources/rest_api_v1.snapshot index bf1f190..7040dd8 100644 --- a/flink-runtime-web/src/test/resources/rest_api_v1.snapshot +++ b/flink-runtime-web/src/test/resources/rest_api_v1.snapshot @@ -2131,6 +2131,55 @@ } } }, { + "url" : "/jobs/:jobid/vertices/:vertexid/flamegraph", + "method" : "GET", + "status-code" : "200 OK", + "file-upload" : false, + "path-parameters" : { + "pathParameters" : [ { + "key" : "jobid" + }, { + "key" : "vertexid" + } ] + }, + "query-parameters" : { + "queryParameters" : [ { + "key" : "type", + "mandatory" : false + } ] + }, + "request" : { + "type" : "any" + }, + "response" : { + "type" : "object", + "id" : "urn:jsonschema:org:apache:flink:runtime:webmonitor:threadinfo:JobVertexFlameGraph", + "properties" : { + "endTimestamp" : { + "type" : "integer" + }, + "data" : { + "type" : "object", + "id" : "urn:jsonschema:org:apache:flink:runtime:webmonitor:threadinfo:JobVertexFlameGraph:Node", + "properties" : { + "name" : { + "type" : "string" + }, + "value" : { + "type" : "integer" + }, + "children" : { + "type" : "array", + "items" : { + "type" : "object", + "$ref" : "urn:jsonschema:org:apache:flink:runtime:webmonitor:threadinfo:JobVertexFlameGraph:Node" + } + } + } + } + } + } + }, { "url" : "/jobs/:jobid/vertices/:vertexid/metrics", "method" : "GET", "status-code" : "200 OK", @@ -3274,4 +3323,4 @@ } } } ] -} +} \ No newline at end of file diff --git a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html index 1c108d6..4a55f4b 100644 --- a/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html +++ b/flink-runtime-web/web-dashboard/src/app/pages/job/overview/flamegraph/job-overview-drawer-flamegraph.component.html @@ -28,10 +28,12 @@ Type: <label nz-radio-button nzValue="full" (click)="selectFrameGraphType()" title="Includes stack traces of threads in all states">Mixed</label> </nz-radio-group> -Measurement: -<span *ngIf="flameGraph.endTimestamp"> - {{ (now - flameGraph.endTimestamp) | humanizeDuration }} ago -</span> +<ng-container [ngSwitch]="flameGraph.endTimestamp"> + <span *ngSwitchCase="-1">The task has already been terminated</span> + <span *ngSwitchCase="-2">The flame graph feature is currently disabled (enable it by setting rest.flamegraph.enabled: true)</span> + <span *ngSwitchCase="-3">We are waiting for the first samples to create a flame graph</span> + <span *ngSwitchDefault>Measurement: {{ (now - flameGraph.endTimestamp) | humanizeDuration }} ago</span> +</ng-container> <div class="flame-graph-area"> <flink-flame-graph [data]="flameGraph['data']" [graphType]="graphType"></flink-flame-graph> diff --git a/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/job/JobVertexFlameGraphHandler.java b/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/job/JobVertexFlameGraphHandler.java index b936477..e082148 100644 --- a/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/job/JobVertexFlameGraphHandler.java +++ b/flink-runtime/src/main/java/org/apache/flink/runtime/rest/handler/job/JobVertexFlameGraphHandler.java @@ -20,6 +20,7 @@ package org.apache.flink.runtime.rest.handler.job; import org.apache.flink.api.common.time.Time; import org.apache.flink.runtime.executiongraph.AccessExecutionJobVertex; +import org.apache.flink.runtime.rest.handler.AbstractRestHandler; import org.apache.flink.runtime.rest.handler.HandlerRequest; import org.apache.flink.runtime.rest.handler.RestHandlerException; import org.apache.flink.runtime.rest.handler.legacy.ExecutionGraphCache; @@ -37,9 +38,12 @@ import org.apache.flink.runtime.webmonitor.threadinfo.JobVertexThreadInfoTracker import org.apache.flink.shaded.netty4.io.netty.handler.codec.http.HttpResponseStatus; +import javax.annotation.Nonnull; + import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; /** Request handler for the job vertex Flame Graph. */ @@ -72,7 +76,7 @@ public class JobVertexFlameGraphHandler throws RestHandlerException { if (jobVertex.getAggregateState().isTerminal()) { - return JobVertexFlameGraph.empty(); + return JobVertexFlameGraph.terminated(); } final Optional<JobVertexThreadInfoStats> threadInfoSample = @@ -102,7 +106,7 @@ public class JobVertexFlameGraphHandler HttpResponseStatus.BAD_REQUEST); } - return operatorFlameGraph.orElse(JobVertexFlameGraph.empty()); + return operatorFlameGraph.orElse(JobVertexFlameGraph.waiting()); } private static FlameGraphTypeQueryParameter.Type getFlameGraphType( @@ -121,4 +125,37 @@ public class JobVertexFlameGraphHandler public void close() throws Exception { threadInfoOperatorTracker.shutDown(); } + + public static AbstractRestHandler<?, ?, ?, ?> disabledHandler( + GatewayRetriever<? extends RestfulGateway> leaderRetriever, + Time timeout, + Map<String, String> responseHeaders) { + return new DisabledJobVertexFlameGraphHandler(leaderRetriever, timeout, responseHeaders); + } + + private static class DisabledJobVertexFlameGraphHandler + extends AbstractRestHandler< + RestfulGateway, + EmptyRequestBody, + JobVertexFlameGraph, + JobVertexFlameGraphParameters> { + protected DisabledJobVertexFlameGraphHandler( + GatewayRetriever<? extends RestfulGateway> leaderRetriever, + Time timeout, + Map<String, String> responseHeaders) { + super( + leaderRetriever, + timeout, + responseHeaders, + JobVertexFlameGraphHeaders.getInstance()); + } + + @Override + protected CompletableFuture<JobVertexFlameGraph> handleRequest( + @Nonnull HandlerRequest<EmptyRequestBody, JobVertexFlameGraphParameters> request, + @Nonnull RestfulGateway gateway) + throws RestHandlerException { + return CompletableFuture.completedFuture(JobVertexFlameGraph.disabled()); + } + } } diff --git a/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/WebMonitorEndpoint.java b/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/WebMonitorEndpoint.java index 6794448..1ff0e17 100644 --- a/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/WebMonitorEndpoint.java +++ b/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/WebMonitorEndpoint.java @@ -32,6 +32,7 @@ import org.apache.flink.runtime.leaderelection.LeaderElectionService; import org.apache.flink.runtime.resourcemanager.ResourceManagerGateway; import org.apache.flink.runtime.rest.RestServerEndpoint; import org.apache.flink.runtime.rest.RestServerEndpointConfiguration; +import org.apache.flink.runtime.rest.handler.AbstractRestHandler; import org.apache.flink.runtime.rest.handler.RestHandlerConfiguration; import org.apache.flink.runtime.rest.handler.RestHandlerSpecification; import org.apache.flink.runtime.rest.handler.cluster.ClusterConfigHandler; @@ -739,8 +740,9 @@ public class WebMonitorEndpoint<T extends RestfulGateway> extends RestServerEndp jobVertexBackPressureHandler.getMessageHeaders(), jobVertexBackPressureHandler)); + final AbstractRestHandler<?, ?, ?, ?> jobVertexFlameGraphHandler; if (clusterConfiguration.get(RestOptions.ENABLE_FLAMEGRAPH)) { - final JobVertexFlameGraphHandler jobVertexFlameGraphHandler = + jobVertexFlameGraphHandler = new JobVertexFlameGraphHandler( leaderRetriever, timeout, @@ -748,11 +750,15 @@ public class WebMonitorEndpoint<T extends RestfulGateway> extends RestServerEndp executionGraphCache, executor, initializeThreadInfoTracker(executor)); - handlers.add( - Tuple2.of( - jobVertexFlameGraphHandler.getMessageHeaders(), - jobVertexFlameGraphHandler)); + } else { + jobVertexFlameGraphHandler = + JobVertexFlameGraphHandler.disabledHandler( + leaderRetriever, timeout, responseHeaders); } + handlers.add( + Tuple2.of( + jobVertexFlameGraphHandler.getMessageHeaders(), + jobVertexFlameGraphHandler)); handlers.add( Tuple2.of( diff --git a/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/threadinfo/JobVertexFlameGraph.java b/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/threadinfo/JobVertexFlameGraph.java index 4ea94bc..96fe0a2 100644 --- a/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/threadinfo/JobVertexFlameGraph.java +++ b/flink-runtime/src/main/java/org/apache/flink/runtime/webmonitor/threadinfo/JobVertexFlameGraph.java @@ -68,10 +68,21 @@ public class JobVertexFlameGraph implements ResponseBody { return "OperatorFlameGraph: endTimestamp=" + endTimestamp + "\n" + getRoot().toString(); } - public static JobVertexFlameGraph empty() { + // Indicates that the task execution has been terminated + public static JobVertexFlameGraph terminated() { return new JobVertexFlameGraph(-1, null); } + // Indicates that the flame graph feature has been disabled + public static JobVertexFlameGraph disabled() { + return new JobVertexFlameGraph(-2, null); + } + + // Indicates that it is waiting for the first samples to creating the flame graph + public static JobVertexFlameGraph waiting() { + return new JobVertexFlameGraph(-3, null); + } + /** Graph node. */ public static class Node {