自定义指标混乱

Custom metrics confusion

我将 https://micrometer.io 添加到 google 云中的登台服务器。该指标未显示在 "Cloud Run Revision" 资源类型中。仅当我 select "Global" 如此处所示时才可见...

说明非常简单明了(与过度设计的 opencensus 大不相同 api)。事实上,与 opencensus 不同的是,它开箱即用,只是没有记录到 "Cloud Run Revision".

我什至无法在过滤器中选择 service_name,所以一旦我部署到生产环境,指标将同时记录生产和登台,这不是我们想要的。

  1. 如何进一步调试千分尺
  2. 如果有人知道问题可能是什么,那也很好吗? (虽然我不介意学习千分尺并对其进行更多调试)。

目前您的自定义指标中唯一的 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;
    }
};