如何从 SpringBoot 应用程序发出自定义指标并在 PCF Autoscaler 中使用它
How to emit custom metrics from SpringBoot application and use it in PCF Autoscaler
我正在关注此 example for emitting the custom metrics and followed these details 在 PCF 中注册指标。
代码如下:
@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
安全配置class:
build.gradle 依赖部分:
我在将应用程序部署到 PCF 后注册自定义指标所遵循的步骤:
- 在我的本地计算机上安装
metric-registrar
- 发出一些整数的注册端点(我将其用于自动缩放器规则)
cf register-metrics-endpoint api high_latency
在这一步之后,我可以看到一个自定义用户提供的服务与我在 PCF 中的应用程序绑定。
- 在我的本地安装了
log-cache
插件来验证指标端点,这里是日志
- 最后我在 Autoscaler 中添加了自定义指标的规则。
这是我在 Autoscaler 事件历史记录中遇到的错误。
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.
我对此进行了很大的调查。这里有几件事...
我认为您的注册命令是错误的,至少对于您引用的示例应用而言是这样。
您正在使用 cf register-metrics-endpoint api high_latency
,这意味着您有一个名为 api
的应用程序和该应用程序上的一个端点 high_latency
,它使用 Prometheus 格式导出指标。对于这个示例应用程序,路径应该是 /actuator/prometheus
,根据自述文件和我的简短测试。
当我使用命令 cf register-metrics-endpoint app-name /actuator/prometheus
时,我能够在 cf tail
的输出中看到自定义指标,但我在您包含的输出中没有看到它们。
例如:(未显示在您的屏幕截图中)
2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] GAUGE tomcat_global_request_max_seconds:2.006000
2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] GAUGE system_cpu_count:4.000000
2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] COUNTER tomcat_sessions_created_sessions_total:12
2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] COUNTER custom_metric_total:15
2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] GAUGE jvm_gc_pause_seconds_sum:0.138000
2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] COUNTER jvm_gc_pause_seconds_count:25
在引用的示例应用程序中,没有名为 high_latency
的指标,因此它不能用作您的指标名称,因为它永远不会由应用程序生成。如果您在浏览器中访问 /actuator/prometheus
端点,您可以看到所有指标。 Prometheus 格式是基于文本的,非常容易阅读。
最后一个很棘手,没有记录,但我可以在 Autoscaler 的代码中看到它(在撰写本文时)。当 Autoscaler 从 LogCache 轮询指标时,它只提取 GAUGE 和 TIMER 事件,而不是 COUNTER 事件。如果您尝试使用演示应用程序中的 custom_metric
,那是行不通的,因为它是一个 COUNTER 指标。您只会看到有关 Autoscaler 在缩放期间未看到任何指标事件的消息 window。确保您正在选择用于缩放的 GAUGE 指标。
Autoscaler 似乎也不支持使用带有关联标签的指标。例如,如果您想使用 tomcat_servlet_request_seconds_sum{name="dispatcherServlet",}
,我认为没有办法告诉 Autoscaler name
标签必须是某个值。该信息在 LogCache 中,但我认为 Autoscaler 目前不会使用它。在我写这篇文章的时候,我快速浏览了一下代码,似乎表明它只是在查看指标名称。如果您要创建自定义指标,这无关紧要。只是不要为指标使用任何标签。
希望对您有所帮助!
我正在关注此 example for emitting the custom metrics and followed these details 在 PCF 中注册指标。
代码如下:
@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
安全配置class:
build.gradle 依赖部分:
我在将应用程序部署到 PCF 后注册自定义指标所遵循的步骤:
- 在我的本地计算机上安装
metric-registrar
- 发出一些整数的注册端点(我将其用于自动缩放器规则)
cf register-metrics-endpoint api high_latency
在这一步之后,我可以看到一个自定义用户提供的服务与我在 PCF 中的应用程序绑定。 - 在我的本地安装了
log-cache
插件来验证指标端点,这里是日志 - 最后我在 Autoscaler 中添加了自定义指标的规则。
这是我在 Autoscaler 事件历史记录中遇到的错误。
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.
我对此进行了很大的调查。这里有几件事...
我认为您的注册命令是错误的,至少对于您引用的示例应用而言是这样。
您正在使用
cf register-metrics-endpoint api high_latency
,这意味着您有一个名为api
的应用程序和该应用程序上的一个端点high_latency
,它使用 Prometheus 格式导出指标。对于这个示例应用程序,路径应该是/actuator/prometheus
,根据自述文件和我的简短测试。当我使用命令
cf register-metrics-endpoint app-name /actuator/prometheus
时,我能够在cf tail
的输出中看到自定义指标,但我在您包含的输出中没有看到它们。例如:(未显示在您的屏幕截图中)
2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] GAUGE tomcat_global_request_max_seconds:2.006000 2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] GAUGE system_cpu_count:4.000000 2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] COUNTER tomcat_sessions_created_sessions_total:12 2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] COUNTER custom_metric_total:15 2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] GAUGE jvm_gc_pause_seconds_sum:0.138000 2019-07-17T22:54:37.83-0400 [custom-metrics-demo/0] COUNTER jvm_gc_pause_seconds_count:25
在引用的示例应用程序中,没有名为
high_latency
的指标,因此它不能用作您的指标名称,因为它永远不会由应用程序生成。如果您在浏览器中访问/actuator/prometheus
端点,您可以看到所有指标。 Prometheus 格式是基于文本的,非常容易阅读。最后一个很棘手,没有记录,但我可以在 Autoscaler 的代码中看到它(在撰写本文时)。当 Autoscaler 从 LogCache 轮询指标时,它只提取 GAUGE 和 TIMER 事件,而不是 COUNTER 事件。如果您尝试使用演示应用程序中的
custom_metric
,那是行不通的,因为它是一个 COUNTER 指标。您只会看到有关 Autoscaler 在缩放期间未看到任何指标事件的消息 window。确保您正在选择用于缩放的 GAUGE 指标。Autoscaler 似乎也不支持使用带有关联标签的指标。例如,如果您想使用
tomcat_servlet_request_seconds_sum{name="dispatcherServlet",}
,我认为没有办法告诉 Autoscalername
标签必须是某个值。该信息在 LogCache 中,但我认为 Autoscaler 目前不会使用它。在我写这篇文章的时候,我快速浏览了一下代码,似乎表明它只是在查看指标名称。如果您要创建自定义指标,这无关紧要。只是不要为指标使用任何标签。
希望对您有所帮助!