I am following this example for emitting the custom metrics and followed these details for registering the metrics in PCF.
Here is the code:
@RestController
public class CustomMetricsController {
@Autowired
private MeterRegistry registry;
@GetMapping("/high_latency")
public ResponseEntity<Integer> highLatency() throws InterruptedException {
int queueLength=0;
Random random = new Random();
int number = random.nextInt(50);
System.out.println("Generate number is : "+number);
if(number % 2 == 0) {
queueLength=99;
} else {
queueLength=200;
}
return new ResponseEntity<>(queueLength, null, HttpStatus.OK);
}
}
application.yml:
management:
endpoints:
web:
exposure:
include: "metrics,prometheus"
endpoint:
metrics:
enabled: true
prometheus:
enabled: true
build.gradle dependencies part:
Steps I followed to register the custom metrics after app deployment to PCF:
- Installed
metric-registrar
on my local machine - Registered endpoint that emitting some Integer(which I am using for Autoscaler Rule)
cf register-metrics-endpoint api high_latency
After this step I can see one Custom-User-Provided service is bounded with my app in PCF. - Installed
log-cache
plugin on my local to verify the metrics endpoint and here are the logs - At last I added the rule in Autoscaler for custom metric.
This is the error I am getting in Autoscaler event history.
EVENT HISTORY Most Recent: Wed July 17, 2019 at 11:20 AM Autoscaler did not receive any metrics for high_latency during the scaling window. Scaling down will be deferred until these metrics are available.
I looked into this a big. A few things here...
I believe your registration command is wrong, at least for the sample app you referenced.
You're using
cf register-metrics-endpoint api high_latency
, which means you have an app namedapi
and an endpoint on that app athigh_latency
which exports metrics using the Prometheus format. For this sample app, the path should be/actuator/prometheus
, according to the README & my brief test.When I used the command
cf register-metrics-endpoint app-name /actuator/prometheus
, I was able to see the custom metrics in the output fromcf tail
& I do not see them in your included output.Ex: (not showing up in your screenshot)
In the referenced sample app, there is no metric called
high_latency
, so that won't work as the name of your metric, as it will never get generated by the app. You can see all the metrics if you access the/actuator/prometheus
endpoint in your browser. The Prometheus format is text based and pretty easy to read.The last one is tricky and not documented but I can see it in the code for Autoscaler (at the time of writing this). When Autoscaler polls for metrics from LogCache, it only pulls GAUGE & TIMER events, not COUNTER events. If you were to try and use
custom_metric
from the demo app that would not work because it is a COUNTER metric. You'll just see the message about Autoscaler not seeing any metric events during the scaling window. Make sure that you are picking a GAUGE metric to use for scaling.It also does not appear that Autoscaler supports using metrics with associated tags. If for example, you wanted to use
tomcat_servlet_request_seconds_sum{name="dispatcherServlet",}
, I don't think there's a way to tell Autoscaler that thename
tag is required to be a certain value. That info is in LogCache, but I don't think Autoscaler uses it at this time. My quick glance through the code, at the time I write this, seems to indicate it's only looking at the metric name. If you're creating a custom metric, this won't matter. Just don't use any tags for the metric.Hope that helps!