Skip to content

Commit

Permalink
cleaning up and improving function metrics (#2994)
Browse files Browse the repository at this point in the history
* removing metrics module from functions

* removing other references ot Prometheus metrics server

* removing references to pulsar-functions-metrics

* fix unit tests

* revert test change

* cleaning up and improving function metrics

* slight refactoring

* fix unittest

* moving pulsar-spark tests into its own module
  • Loading branch information
jerrypeng authored Nov 17, 2018
1 parent 784044b commit 23c5505
Show file tree
Hide file tree
Showing 46 changed files with 1,150 additions and 1,666 deletions.
5 changes: 0 additions & 5 deletions distribution/server/src/assemble/bin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -88,11 +88,6 @@
<destName>java-instance.jar</destName>
<outputDirectory>instances</outputDirectory>
</file>
<file>
<source>${basedir}/../../pulsar-functions/metrics/target/PrometheusMetricsServer.jar</source>
<destName>PrometheusMetricsServer.jar</destName>
<outputDirectory>instances</outputDirectory>
</file>
<file>
<source>${basedir}/../../pulsar-functions/java-examples/target/pulsar-functions-api-examples.jar</source>
<destName>api-examples.jar</destName>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import org.apache.pulsar.broker.admin.AdminResource;
import org.apache.pulsar.client.api.Message;
import org.apache.pulsar.common.io.ConnectorDefinition;
import org.apache.pulsar.common.policies.data.FunctionStats;
import org.apache.pulsar.functions.proto.Function.FunctionMetaData;
import org.apache.pulsar.functions.proto.InstanceCommunication.FunctionStatus;
import org.apache.pulsar.functions.worker.WorkerService;
Expand Down Expand Up @@ -164,7 +165,7 @@ public Response getFunctionInstanceStatus(final @PathParam("tenant") String tena

@GET
@ApiOperation(
value = "Displays the status of a Pulsar Function running in cluster mode",
value = "Displays the status of a Pulsar Function",
response = FunctionStatus.class
)
@ApiResponses(value = {
Expand All @@ -179,6 +180,40 @@ public Response getFunctionStatus(final @PathParam("tenant") String tenant,
tenant, namespace, functionName, FunctionsImpl.FUNCTION, uri.getRequestUri());
}

@GET
@ApiOperation(
value = "Displays the stats of a Pulsar Function",
response = FunctionStats.class
)
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Invalid request"),
@ApiResponse(code = 403, message = "The requester doesn't have admin permissions")
})
@Path("/{tenant}/{namespace}/{functionName}/stats")
public Response getFunctionStats(final @PathParam("tenant") String tenant,
final @PathParam("namespace") String namespace,
final @PathParam("functionName") String functionName) throws IOException {
return functions.getFunctionStats(tenant, namespace, functionName, FunctionsImpl.FUNCTION, uri.getRequestUri());
}

@GET
@ApiOperation(
value = "Displays the stats of a Pulsar Function instance",
response = FunctionStats.FunctionInstanceStats.FunctionInstanceStatsData.class
)
@ApiResponses(value = {
@ApiResponse(code = 400, message = "Invalid request"),
@ApiResponse(code = 403, message = "The requester doesn't have admin permissions")
})
@Path("/{tenant}/{namespace}/{functionName}/{instanceId}/stats")
public Response getFunctionInstanceStats(final @PathParam("tenant") String tenant,
final @PathParam("namespace") String namespace,
final @PathParam("functionName") String functionName,
final @PathParam("instanceId") String instanceId) throws IOException {
return functions.getFunctionsInstanceStats(
tenant, namespace, functionName, FunctionsImpl.FUNCTION, instanceId, uri.getRequestUri());
}

@GET
@ApiOperation(
value = "Lists all Pulsar Functions currently deployed in a given namespace",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ public WorkerService get() {
@ApiOperation(value = "Gets the metrics for Monitoring", notes = "Request should be executed by Monitoring agent on each worker to fetch the worker-metrics", response = org.apache.pulsar.common.stats.Metrics.class, responseContainer = "List")
@ApiResponses(value = { @ApiResponse(code = 401, message = "Don't have admin permission") })
public Collection<org.apache.pulsar.common.stats.Metrics> getMetrics() throws Exception {
return worker.getWorkerMetrcis(clientAppId());
return worker.getWorkerMetrics(clientAppId());
}

@GET
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.apache.pulsar.client.admin.PulsarAdminException.NotFoundException;
import org.apache.pulsar.client.admin.PulsarAdminException.PreconditionFailedException;
import org.apache.pulsar.common.io.ConnectorDefinition;
import org.apache.pulsar.common.policies.data.FunctionStats;
import org.apache.pulsar.functions.proto.InstanceCommunication.FunctionStatus;
import org.apache.pulsar.functions.proto.InstanceCommunication.FunctionStatusList;
import org.apache.pulsar.common.functions.FunctionConfig;
Expand Down Expand Up @@ -198,6 +199,39 @@ public interface Functions {
FunctionStatus getFunctionStatus(String tenant, String namespace, String function, int id)
throws PulsarAdminException;

/**
* Gets the current stats of a function instance.
*
* @param tenant
* Tenant name
* @param namespace
* Namespace name
* @param function
* Function name
* @param id
* Function instance-id
* @return
* @throws PulsarAdminException
*/
FunctionStats.FunctionInstanceStats.FunctionInstanceStatsData getFunctionStats(String tenant, String namespace, String function, int id)
throws PulsarAdminException;

/**
* Gets the current stats of a function.
*
* @param tenant
* Tenant name
* @param namespace
* Namespace name
* @param function
* Function name
* @return
* @throws PulsarAdminException
*/

FunctionStats getFunctionStats(String tenant, String namespace, String function)
throws PulsarAdminException;

/**
* Restart function instance
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,36 @@
import com.google.protobuf.AbstractMessage.Builder;
import com.google.protobuf.MessageOrBuilder;
import com.google.protobuf.util.JsonFormat;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

import javax.ws.rs.ClientErrorException;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang3.StringUtils;
import org.apache.pulsar.client.admin.Functions;
import org.apache.pulsar.client.admin.PulsarAdminException;
import org.apache.pulsar.client.api.Authentication;
import org.apache.pulsar.common.functions.FunctionConfig;
import org.apache.pulsar.common.functions.WorkerInfo;
import org.apache.pulsar.common.io.ConnectorDefinition;
import org.apache.pulsar.common.policies.data.ErrorData;
import org.apache.pulsar.common.policies.data.FunctionStats;
import org.apache.pulsar.functions.proto.InstanceCommunication.FunctionStatus;
import org.apache.pulsar.functions.proto.InstanceCommunication.FunctionStatusList;
import org.apache.pulsar.common.functions.FunctionConfig;
import org.apache.pulsar.common.functions.WorkerInfo;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataMultiPart;
import org.glassfish.jersey.media.multipart.file.FileDataBodyPart;

import javax.ws.rs.ClientErrorException;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.GenericType;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Slf4j
public class FunctionsImpl extends BaseResource implements Functions {

Expand Down Expand Up @@ -126,6 +124,33 @@ public FunctionStatus getFunctionStatus(
}
}

@Override
public FunctionStats.FunctionInstanceStats.FunctionInstanceStatsData getFunctionStats(String tenant, String namespace, String function, int id) throws PulsarAdminException {
try {
Response response = request(
functions.path(tenant).path(namespace).path(function).path(Integer.toString(id)).path("stats")).get();
if (!response.getStatusInfo().equals(Response.Status.OK)) {
throw new ClientErrorException(response);
}
return response.readEntity(FunctionStats.FunctionInstanceStats.FunctionInstanceStatsData.class);
} catch (Exception e) {
throw getApiException(e);
}
}

@Override
public FunctionStats getFunctionStats(String tenant, String namespace, String function) throws PulsarAdminException {
try {
Response response = request(
functions.path(tenant).path(namespace).path(function).path("stats")).get();
if (!response.getStatusInfo().equals(Response.Status.OK)) {
throw new ClientErrorException(response);
}
return response.readEntity(FunctionStats.class);
} catch (Exception e) {
throw getApiException(e);
} }

@Override
public void createFunction(FunctionConfig functionConfig, String fileName) throws PulsarAdminException {
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ public class CmdFunctions extends CmdBase {
private final UpdateFunction updater;
private final GetFunction getter;
private final GetFunctionStatus functionStatus;
@Getter
private final GetFunctionStats functionStats;
private final RestartFunction restart;
private final StopFunction stop;
private final ListFunctions lister;
Expand Down Expand Up @@ -638,6 +640,24 @@ void runCmd() throws Exception {
}
}

@Parameters(commandDescription = "Get the current stats of a Pulsar Function")
class GetFunctionStats extends FunctionCommand {

@Parameter(names = "--instance-id", description = "The function instanceId (Get-status of all instances if instance-id is not provided")
protected String instanceId;

@Override
void runCmd() throws Exception {

Gson gson = new GsonBuilder().setPrettyPrinting().create();
if (isBlank(instanceId)) {
System.out.println(gson.toJson(admin.functions().getFunctionStats(tenant, namespace, functionName)));
} else {
System.out.println(gson.toJson(admin.functions().getFunctionStats(tenant, namespace, functionName, Integer.parseInt(instanceId))));
}
}
}

@Parameters(commandDescription = "Restart function instance")
class RestartFunction extends FunctionCommand {

Expand Down Expand Up @@ -878,6 +898,7 @@ public CmdFunctions(PulsarAdmin admin) throws PulsarClientException {
updater = new UpdateFunction();
getter = new GetFunction();
functionStatus = new GetFunctionStatus();
functionStats = new GetFunctionStats();
lister = new ListFunctions();
stateGetter = new StateGetter();
triggerer = new TriggerFunction();
Expand All @@ -893,6 +914,7 @@ public CmdFunctions(PulsarAdmin admin) throws PulsarClientException {
jcommander.addCommand("restart", getRestarter());
jcommander.addCommand("stop", getStopper());
jcommander.addCommand("getstatus", getStatuser());
jcommander.addCommand("stats", getFunctionStats());
jcommander.addCommand("list", getLister());
jcommander.addCommand("querystate", getStateGetter());
jcommander.addCommand("trigger", getTriggerer());
Expand Down
Loading

0 comments on commit 23c5505

Please sign in to comment.