自定义指标混乱
Custom metrics confusion
我将 https://micrometer.io 添加到 google 云中的登台服务器。该指标未显示在 "Cloud Run Revision" 资源类型中。仅当我 select "Global" 如此处所示时才可见...
说明非常简单明了(与过度设计的 opencensus 大不相同 api)。事实上,与 opencensus 不同的是,它开箱即用,只是没有记录到 "Cloud Run Revision".
我什至无法在过滤器中选择 service_name,所以一旦我部署到生产环境,指标将同时记录生产和登台,这不是我们想要的。
- 如何进一步调试千分尺
- 如果有人知道问题可能是什么,那也很好吗? (虽然我不介意学习千分尺并对其进行更多调试)。
目前您的自定义指标中唯一的 available monitored-resource types 是:
- aws_ec2_instance: Amazon EC2 实例。
- dataflow_job: 数据流作业。
- gce_instance: 计算引擎实例。
- gke_container: GKE 容器实例。
- generic_node:用户指定的计算节点。
- generic_task: 用户自定义任务。
- 全局: 当没有其他资源类型适合时使用此资源。对于大多数用例,generic_node 或 generic_task 是比全局更好的选择。
- k8s_cluster: Kubernetes 集群。
- k8s_container: Kubernetes 容器。
- k8s_node: Kubernetes 节点。
- k8s_pod: Kubernetes pod。
因此,在这种情况下,全局是正确的受监控资源类型,因为还没有 Cloud 运行 受监控资源类型。
为了更好地识别指标,您可以创建指标描述符,Auto-creation or manually
为了完整起见,我现在记录了所有 JVM 统计数据,但在 google 的网站上有一个新的 post 聚合,这似乎是一个新问题...
Google Cloud Metrics and MicroMeter JVM reporting (is this a Micrometer bug or?)
我的代码是(并且使用 revisionName 是 CRITICALL,因为它不会出错!!!)
String projectId = MetadataConfig.getProjectId();
String service = System.getenv("K_SERVICE");
String revisionName = System.getenv("K_REVISION");
String config = System.getenv("K_CONFIGURATION");
String zone = MetadataConfig.getZone();
Map<String, String> map = new HashMap<>();
map.put("namespace", service);
map.put("job", "nothing");
map.put("task_id", revisionName);
map.put("location", zone);
log.info("project="+projectId+" svc="+service+" r="+revisionName+" config="+config+" zone="+zone);
StackdriverConfig stackdriverConfig = new OurGoogleConfig(projectId, map);
//figure out how to put in template better
MeterRegistry googleRegistry = StackdriverMeterRegistry.builder(stackdriverConfig).build();
Metrics.addRegistry(googleRegistry);
//This is what would be used in Development Server
//Metrics.addRegistry(new SimpleMeterRegistry());
//How to expose on @backend perhaps at /@metrics
CompositeMeterRegistry registry = Metrics.globalRegistry;
new ClassLoaderMetrics().bindTo(registry);
new JvmMemoryMetrics().bindTo(registry);
new JvmGcMetrics().bindTo(registry);
new ProcessorMetrics().bindTo(registry);
new JvmThreadMetrics().bindTo(registry);
然后配置很简单...
private static class OurGoogleConfig implements StackdriverConfig {
private String projectId;
private Map<String, String> resourceLabels;
public OurGoogleConfig(String projectId, Map<String, String> resourceLabels) {
this.projectId = projectId;
this.resourceLabels = resourceLabels;
}
@Override
public String projectId() {
return projectId;
}
@Override
public String get(String key) {
return null;
}
@Override
public String resourceType() {
return "generic_task";
}
@Override
public Map<String, String> resourceLabels() {
//they call this EVERY time, so save on memory by only passing the same
//map every time instead of re-creating it...
return resourceLabels;
}
};
我将 https://micrometer.io 添加到 google 云中的登台服务器。该指标未显示在 "Cloud Run Revision" 资源类型中。仅当我 select "Global" 如此处所示时才可见...
说明非常简单明了(与过度设计的 opencensus 大不相同 api)。事实上,与 opencensus 不同的是,它开箱即用,只是没有记录到 "Cloud Run Revision".
我什至无法在过滤器中选择 service_name,所以一旦我部署到生产环境,指标将同时记录生产和登台,这不是我们想要的。
- 如何进一步调试千分尺
- 如果有人知道问题可能是什么,那也很好吗? (虽然我不介意学习千分尺并对其进行更多调试)。
目前您的自定义指标中唯一的 available monitored-resource types 是:
- aws_ec2_instance: Amazon EC2 实例。
- dataflow_job: 数据流作业。
- gce_instance: 计算引擎实例。
- gke_container: GKE 容器实例。
- generic_node:用户指定的计算节点。
- generic_task: 用户自定义任务。
- 全局: 当没有其他资源类型适合时使用此资源。对于大多数用例,generic_node 或 generic_task 是比全局更好的选择。
- k8s_cluster: Kubernetes 集群。
- k8s_container: Kubernetes 容器。
- k8s_node: Kubernetes 节点。
- k8s_pod: Kubernetes pod。
因此,在这种情况下,全局是正确的受监控资源类型,因为还没有 Cloud 运行 受监控资源类型。
为了更好地识别指标,您可以创建指标描述符,Auto-creation or manually
为了完整起见,我现在记录了所有 JVM 统计数据,但在 google 的网站上有一个新的 post 聚合,这似乎是一个新问题...
Google Cloud Metrics and MicroMeter JVM reporting (is this a Micrometer bug or?)
我的代码是(并且使用 revisionName 是 CRITICALL,因为它不会出错!!!)
String projectId = MetadataConfig.getProjectId();
String service = System.getenv("K_SERVICE");
String revisionName = System.getenv("K_REVISION");
String config = System.getenv("K_CONFIGURATION");
String zone = MetadataConfig.getZone();
Map<String, String> map = new HashMap<>();
map.put("namespace", service);
map.put("job", "nothing");
map.put("task_id", revisionName);
map.put("location", zone);
log.info("project="+projectId+" svc="+service+" r="+revisionName+" config="+config+" zone="+zone);
StackdriverConfig stackdriverConfig = new OurGoogleConfig(projectId, map);
//figure out how to put in template better
MeterRegistry googleRegistry = StackdriverMeterRegistry.builder(stackdriverConfig).build();
Metrics.addRegistry(googleRegistry);
//This is what would be used in Development Server
//Metrics.addRegistry(new SimpleMeterRegistry());
//How to expose on @backend perhaps at /@metrics
CompositeMeterRegistry registry = Metrics.globalRegistry;
new ClassLoaderMetrics().bindTo(registry);
new JvmMemoryMetrics().bindTo(registry);
new JvmGcMetrics().bindTo(registry);
new ProcessorMetrics().bindTo(registry);
new JvmThreadMetrics().bindTo(registry);
然后配置很简单...
private static class OurGoogleConfig implements StackdriverConfig {
private String projectId;
private Map<String, String> resourceLabels;
public OurGoogleConfig(String projectId, Map<String, String> resourceLabels) {
this.projectId = projectId;
this.resourceLabels = resourceLabels;
}
@Override
public String projectId() {
return projectId;
}
@Override
public String get(String key) {
return null;
}
@Override
public String resourceType() {
return "generic_task";
}
@Override
public Map<String, String> resourceLabels() {
//they call this EVERY time, so save on memory by only passing the same
//map every time instead of re-creating it...
return resourceLabels;
}
};